技能梳理9@RGB+WS2812+ESP32

145 阅读2分钟

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,具体可查看往期博客

完整可运行项目地址