使用 ESP8266 的 NeoPixel 时钟
[复制链接]
来自:https://www.hackster.io/palsayantan/neo ... ock-5bd11c
EspRing 带有2位 ws2812b RGB LED,并且内置有ESP12E模块来控制LED。因此,您会得到一个带有板载微控制器的neopixel环。由于WS2812B led灯可单独寻址,因此我们只需要微控制器的一个数据引脚以及VCC和GND即可控制。顾名思义,我们可以控制每个像素的颜色和亮度。您可以为每个像素分配不同的颜色,并使用它创建令人着迷的动画和效果。由于该模块具有可访问wifi的功能,因此您可以通过无线对其进行重新编程或更改效果。它具有稳压器,可将esp8266的电压从5v降至3.3v。
因此,ESP模块连接到wifi网络,并从NTP服务器获取当前时间。请注意,您需要相应地更改时区,以获取您所在位置的当地时间。板上有12个LED连接到GPIO5。为直观显示时间,我为HOUR,MINUTE和SECOND选择了不同的颜色。
在获得时间之后,我们需要将Minute和Second除以5,因为我们有12个led和60/5 = 12。小时是24小时制,因此我们也需要更改它。最后,我根据时间设置LED的颜色。可以轻松更改。
原理图(PCB)
代码
#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#include <WiFiUdp.h>
#include <NTPClient.h> // include NTPClient library
#include <TimeLib.h> // include Arduino time library
// set Wi-Fi SSID and password
const char *ssid = "SSID";
const char *password = "PASSWORD";
WiFiUDP ntpUDP;
// 'time.nist.gov' is used (default server) with +1 hour offset (3600 seconds) 60 seconds (60000 milliseconds) update interval
NTPClient timeClient(ntpUDP, "time.nist.gov", 19800, 60000); //GMT+5:30 : 5*3600+30*60=19800
#define PIN 5
#define NUMPIXELS 12
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int Second, Minute, Hour, hour_;
int period = 1000;
unsigned long time_now = 0;
void setup(void)
{
Serial.begin(115200);
delay(10);
pixels.begin();
pixels.clear();
for (int i = 0; i < 12; i++) {
pixels.setPixelColor(i, pixels.Color( 0, 0, 0)); //Black
}
pixels.show();
WiFi.begin(ssid, password);
Serial.print("Connecting.");
while ( WiFi.status() != WL_CONNECTED )
{
delay(500);
Serial.print(".");
}
Serial.println("connected");
timeClient.begin();
delay(10);
}
void loop()
{
if (WiFi.status() == WL_CONNECTED) // check WiFi connection status
{
timeClient.update();
unsigned long unix_epoch = timeClient.getEpochTime(); // get UNIX Epoch time
Second = second(unix_epoch) / 5; // get seconds from the UNIX Epoch time
Minute = minute(unix_epoch) / 5; // get minutes (0 - 59)
hour_ = hour(unix_epoch); // get hours (0 - 23)
if (hour_ > 12) {
Hour = hour_ - 12;
}
else
Hour = hour_;
while (millis() > time_now + period) {
time_now = millis();
pixels.clear();
pixels.setPixelColor(Second, pixels.Color( 0, 0, 32)); // Blue
pixels.setPixelColor(Second - 1, pixels.Color( 0, 0, 16)); // Bluee
pixels.setPixelColor(Second - 2, pixels.Color( 0, 0, 8)); // Blueee
pixels.setPixelColor(Minute, pixels.Color( 0, 128, 0)); // Green
pixels.setPixelColor(Hour, pixels.Color(128, 0, 0)); // Red
pixels.show();
}
}
}
|