nodemcu联网检测当前时间,控制RGB灯在不同时间出现不同的渐变光影特效,新颖的方式提醒人时间在流逝
1、项目简介
2、实现逻辑
#初始化网络,初始化成功开始闪烁led
#根据时区获取网络时间
#在不同时间控制每一颗led的色彩,控制的时候是发一串数据,要把之前控制的再刷一遍,受限于ws2812控制协议,必须一串led都要刷新颜色和亮度
#早晨全绿,中午半绿半红,晚上全红
3、应用场景
#室外提示时间
#室内趣味挂件
4、核心代码梳理
Freenove_ESP32_WS2812 strip = Freenove_ESP32_WS2812(LEDS_COUNT, LEDS_PIN, CHANNEL, TYPE_GRB);
u8 m_color[5][3] = { {255, 0, 0}, {0, 255, 0}, {0, 0, 255}, {255, 255, 255}, {0, 0, 0} };
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 8*3600;//这里采用UTC计时,中国为东八区,就是 8*60*60
const int daylightOffset_sec = 0;//同上
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
void led_all(void)
{
for (int i = 0; i < LEDS_COUNT; i++) {
strip.setLedColorData(i, r_value, g_value, b_value);
strip.show();
delay(delayval);
}
}
void setup(void)
{
strip.begin();
strip.setBrightness(150);
//USART
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
Serial.print("START");
WiFi.begin(ssid, password);//连接到网络
while (WiFi.status() != WL_CONNECTED) {//等待网络连接成功
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());//打印模块IP
//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
}
void loop(void)
{
//LED
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
delay(200);
//delay(500);
//time///
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
}
//早晨全绿 6:00 //每3分钟变一个
if((timeinfo.tm_hour >= 6) && (timeinfo.tm_hour <= 10)) //6:00- 10:00
{
test_value = (timeinfo.tm_hour-6)*20 + (timeinfo.tm_min/3);
}
else if((timeinfo.tm_min <= 40) && (timeinfo.tm_hour == 11)) //11:00- 11:40
{
test_value = 113 + (timeinfo.tm_min/3); //113 + 40/3
}
else if((timeinfo.tm_min > 40) && (timeinfo.tm_hour == 11)) //11:40- 12:00
{
test_value = 128 + (timeinfo.tm_min/3);
}
if((timeinfo.tm_hour == 6) && (timeinfo.tm_min == 0)) //6:00
{
test_value = 0;
}
//中午半绿半红 11:40 128 128
if((timeinfo.tm_hour == 11) && (timeinfo.tm_min == 40)) //11:40
{
test_value = 128;
}
if((timeinfo.tm_hour >= 12) && (timeinfo.tm_hour <= 20)) 12:00- 20:00
{
test_value = 128 + (timeinfo.tm_hour-12)*13 + (timeinfo.tm_min/3);
}
else if((timeinfo.tm_min <= 30) && (timeinfo.tm_hour == 21)) //21:00- 21:30
{
test_value = 124 + (timeinfo.tm_min/10); //255 + 30/3
}
//晚上全红 21:30 //每5分钟一个
if((timeinfo.tm_hour == 21) && (timeinfo.tm_min == 30))//21:30
{
test_value = 255;
}
//凌晨切换
if(timeinfo.tm_hour == 24)//24:00
{
test_value = 0;
}
r_value = test_value;
g_value = 255 - test_value;
//ws2812///
led_all();
}
5、部分参考资料
#使用的是5050 SMD RGB LED内置改进版WS2811 ic 256灰度 8位/色彩
6、注意事项
#凌晨的时候灯带从全红变为全绿
#只控制色彩,亮度设置为固定值,亮度也是255级可调
#控制led的时候主要要在库函数里面定义好led的个数
#因为使用的是ESP32自带的控制WS2812的库函数,所以对ws2812不需要太了解
#esp32开发的环境是vscode+platformio,具体可查看往期博客