顯示包含「Arduino WS2812B」標籤的文章。顯示所有文章
顯示包含「Arduino WS2812B」標籤的文章。顯示所有文章

2022年3月10日星期四

WS2812B Timer Module

        這陣子一直想買個時鐘,但是市面上又沒有自己喜歡的,於是自己來做一個,花了快一個月終於完成,話不多說,上成品~


這次會分享功能評估->電路設計->外殼製作->程式碼->組裝測試

功能評估

1. 想要顯示時間,顯示時跟分即可

2. 可以改變顏色

3. 不希望太多腳

4.可以自動校正時間 

LED選用思考:

如果是使用傳統的4PIN RGB LED 可能會需要寫一堆腳位定及拉一堆電路,是否有串列式的?

後來我想到之前曾經玩過的WS2812B 可以滿足我的需求!!就決定是它了!

 MCU 選用思考:     

 自動校正時間?需要可以連到網路,那需要有網路功能的晶片,但是又不想外掛網路模組,那就選擇ESP32!  

            (做專題前需要評估一下 自己想要的功能與效果->可以參考這篇)

電路設計

        既然要拿WS2812B設計時鐘,就要先了解一下元件的規格

        尺寸



腳位功能

電器特性 

 

 

為電路設計軟體建立WS2812B的原件


設計電路

電路板設計PCBLAYOUT

發包送洗等待~

 

外殼設計

在等待電路板回來的過程,可以先畫一下3D外殼,減少等待時間



(對孔用的)

(含外殼鎖孔)

 

(檔光片)

3D外殼設計完後就是開3D列印機給它印下去啦~等待等待😎😎

印完的成品

 (對孔用的)

 

(含外殼鎖孔-外面)

(外殼鎖孔-裡面)

(檔光片)

撰寫程式碼

這時候呢~先拿手邊現有的WS2812B燈條進行測試,參考這篇測試

 https://850121.blogspot.com/2022/03/arduino-ws2812b.html


 電路板焊接

        PCB板回來後先焊接元件並測試(這個時候直接使用寫好的範例驗證功能)這個時候也是考驗耐心啊,附上影片及照片


 


(焊接過程) 

電路功能驗證

焊接完成後接著進行電路驗證,這是決定這批電路板是生是死啊😂😂 

上影片!

燒錄測試程式碼後幸好可以動!!!👏👏👏😍😍😍

組裝

        接下來將3D外殼及電路組合在一起,這個時候會發現,3D列印的外殼會有些許公差,需要進行反覆微調並列印,直到契合

(組合完成圖-1)

 (組合完成圖-2)


(組合完成圖-3)

 成品展示


ESP32 NTP 時鐘文章

程式碼


參考資料 

https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf

https://850121.blogspot.com/2022/03/arduino-ws2812b.html

2022年3月7日星期一

Arduino WS2812B

    最近想說來玩一下七彩的LED燈,但是又不想要使用傳統的RGB LED燈,主要原因有會增加許多IO控制的腳位,而WS2812B可以三條線(電源正負及一條訊號就解決了),而且可以串接~

先上結果影片



目標

    透過城市控WS2812BLED 的顏色及狀態

材料

  • ws2812b 燈條
  • Arduino NANO 一片
  • NANO 擴展板
  • 杜邦縣若干條

開發環境

    arduino IDE


步驟

1.軟體安裝 軟體連結

2.電路接線

                (接線完成) 

3.安裝WS2812X library 

輸入WS2812F

4.燒錄範例程式碼測試

依照腳位與實際LED顆數修改,像我的燈條只有4顆,那就將範例原本的13改成4

(還未修改前是13)
(修改後是4)

5. 當你看到所有的LED都會亮了,恭喜你/你成功了 


 如果遇到問題,可能原因在下面

 1.USB PROT供電不足,有時候可能會導致燒錄失敗

          解決方式有兩個

1.先拔掉WS2812B接入電源線,再進行燒錄,完成後再把電接回去

2.將燈條的公電部分額外供電並共地(雖然目前的LED數不多,但以後串接很多顆後,一定需要)

2. 接線接反

顏色都接對啊但是燈不亮-> 那有可能訊號的腳位接錯了,注意看下圖

如果一端不亮再換另一端 



參考資料

https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf

https://github.com/kitesurfer1404/WS2812FX

2022年3月6日星期日

ESP32 NTP Timer with WS2812B

        之前都是透過RTC 時鐘去設定時間後,再從RTC時鐘模組去取得時間,這次為了減少模組的使用,我們透過連線有線網路後去取得NTP時鐘,理由嗎,減少時間誤差,有些時候運作久了時間就會跑掉,話不多說Let's start!

前置作業

一、準備材料

開發板:ESP32 NodeMCU 

模 組:WS2812B 時鐘模組(文章連結)


 

開發環境 

Arduino IDE

Library  WS2812FX.h 連結https://github.com/kitesurfer1404/WS2812FX 

二、電路接線


步驟說明

步驟一、電路接線

請依照電路接線完成

步驟二、安裝WS2812FX Library

參考這篇 連結 https://850121.blogspot.com/2022/03/arduino-ws2812b.html

步驟三、複製程式

Git 連結 https://github.com/windyman24/ESP32-NTP-Timer-with-WS2812B

步驟四、編譯並上傳


#include "WS2812FX.h"
#include "WiFi.h"
#include "time.h"
const char* ssid = "Your Wifi SSID";
const char* password = "Your Wifi PASSWORD";
//NTP Time
int timezone = 8 * 3600;//Set Time zone ,In Taiwan is +8, so Time zone is 8 * 3600
int dst = 0;
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
//WS2812B define
#define LED_COUNT 30
#define LED_PIN 4
#define OFF 0x000000
#define TIMER_MS 5000

WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);

unsigned long LightColor = 0x006633;
int Def_min = 0;
int Def_Second = 0;
int Second = 0;
int minu = 0;
int hour = 0;

//Set blink time without delay
unsigned long previousMillis = 0;
const long interval = 1000;
int DotState = false;// Dot State

bool GotTime = false;//Got NTP TIME Flag
/*
 * Control Dot ON or OFF
 */
void ShowDots(int EN)
{
  if (EN == true)
  {
    ws2812fx.setPixelColor(14, LightColor);
    ws2812fx.setPixelColor(15, LightColor);
  }
  else
  {
    ws2812fx.setPixelColor(14, OFF);
    ws2812fx.setPixelColor(15, OFF);
  }
}
/*
 * Set Number,Input which Seg and its number
 */
void ShowNumber(int SegNum, int num)
{
  int ShowSegNum = SegNum * 7;
  if (SegNum > 1)ShowSegNum += 2;
  switch (num)
  {
    case 0:
      ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(2 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(5 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
      break;
    case 1:
      ws2812fx.setPixelColor(0 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(2 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(6 + ShowSegNum, OFF);
      break;
    case 2:
      ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(3 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(5 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(6 + ShowSegNum, OFF);
      break;
    case 3:
      ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(6 + ShowSegNum, OFF);
      break;
    case 4:
      ws2812fx.setPixelColor(0 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
      break;
    case 5:
      ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(1 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
      break;
    case 6:
      ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(1 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(5 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
      break;
    case 7:
      ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(2 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(6 + ShowSegNum, OFF);
      break;
    case 8:
      ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(5 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
      break;
    case 9:
      ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
      ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
      ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
      break;
  }
}
/*
 * Set hour and minute ,and set to Seg
 */
int TimeConvert(int hour, int minu)
{
  int hour_H = hour / 10;
  int hour_L = hour % 10;
  int min_H = minu / 10;
  int min_L = minu % 10;

  ShowNumber(3, hour_H);
  ShowNumber(2, hour_L);
  ShowNumber(1, min_H);
  ShowNumber(0, min_L);

  ws2812fx.show();
}
void setup() {

  Serial.begin(115200);
  //Wifi setting and connect
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Wifi Connected Success!");
  Serial.print("NodeMCU IP Address : ");
  Serial.println(WiFi.localIP() );
  
  
  ws2812fx.init();
  ws2812fx.setBrightness(1000);
  ws2812fx.setSpeed(SPEED_MIN);
  ws2812fx.setColor(LightColor);
  ws2812fx.setMode(FX_MODE_BREATH);
  ws2812fx.start();

  //Get the NTP time
  configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
  Serial.println("\nWaiting for Internet time");

  Def_Second = p_tm->tm_sec;
  Def_min = p_tm->tm_min;
  Serial.print("Def_Second:");
  Serial.println(Def_Second);
  Serial.print("Def_min:");
  Serial.println(p_tm->tm_min);

  while (!GotTime) {
    configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
    now = time(nullptr);
    p_tm = localtime(&now);
    Second = p_tm->tm_sec;
    minu = p_tm->tm_min;
    Serial.print("Second:");
    Serial.println(Second);
    Serial.print("min:");
    Serial.println(p_tm->tm_min);
    if (Def_min != minu)  GotTime = true;
    else Serial.print("*");
    demo();
  }
  
  Serial.println("\nTime response....OK");

  minu = p_tm->tm_min;
  hour = p_tm->tm_hour;
  Serial.print(hour);
  Serial.print(":");
  Serial.println(minu);
  TimeConvert(hour, minu);
}
/*
 * Use to reconnet the NTP time
 */
void CheckTime()
{
  configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
  now = time(nullptr);
  p_tm = localtime(&now);
  Second = p_tm->tm_sec;
  minu = p_tm->tm_min;
}
/*
 * Use to demo show 0~9
 */
void demo()
{
  for (int i = 0; i < 10; i++)
  {
    ShowNumber(0, i);
    ShowNumber(1, i);
    ShowNumber(2, i);
    ShowNumber(3, i);
    ws2812fx.show();
    delay(300);
  }
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Second++;
    if (Second > 59)
    {
      minu++;
      Second = 0;
    }
    if (minu > 59)
    {
      hour++;
      minu = 0;
      CheckTime();//every hour regulate the time
    }
    if (hour > 23)
    {
      hour = 0;
      minu = 0;
    }
    TimeConvert(hour, minu);
    ShowDots(DotState = !DotState);
    ws2812fx.setColor(LightColor++);
  }  
  yield();
}
參考來源

https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/

https://850121.blogspot.com/2022/03/arduino-ws2812b.html

https://github.com/windyman24/ESP32-NTP-Timer-with-WS2812B

打賞按讚