项目背景
月球灯,是一种以月亮为主题的装饰灯。它采用独特的设计风格,将月亮的神秘与浪漫完美地融合在一起,营造出一种温馨、舒适的氛围。很多短视频平台上有各种各样的月球灯造型,都非常的漂亮。
由于作者一直很喜欢用ws2812做一些时钟相关的项目,借这次的ESP32-C3的活动,就想做一个既能显示时间,又能增加氛围感的月球灯。
步骤1 材料清单
材料清单
- ws2812灯带 X60颗
- esp32-c3 X1pcs
- 直径33cm茶盘 X1pcs
- 超轻黏土 X若干
- 石英砂 X若干
- 颜料 X若干
步骤2 电路连接
该电路接线比较简单,只需要将灯带的信号端连接至ESP32的2号脚,然后电源接入3.3V,GND接到GND就可以了。
步骤3 程序设计
导入库文件并进行配网,使用NTP获取实时时间。
代码
#include <WiFi.h>
#include <Adafruit_NeoPixel.h>
#include "time.h"
#include "SPI.h"
const char *ssid = "yourssid"; //WIFI名称
const char *password = "yourpassword"; //WIFI密码
const char *ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0;
定义灯带连接引脚,接到P2引脚。
代码
int j,k = 0;
#define PIN 2
#define NUMPIXELS 60 // Popular NeoPixel ring size
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
struct tm timeinfo;
获取网络时间,并将时间通过换算,对应到相关的LED灯带的灯号,从而控制灯的亮灭。
代码
while (j <= 60){
pixels.setBrightness(255);
pixels.clear(); // Set all pixel colors to 'off'
if (!getLocalTime(&timeinfo))
{
Serial.println("Failed to obtain time");
return;
}
int hour = timeinfo.tm_hour;
int min = timeinfo.tm_min;
int sec = timeinfo.tm_sec;
int day = timeinfo.tm_mday;
int mon = timeinfo.tm_mon + 1;
delay(500);
printLocalTime();
int hour_d = hour%12*5;
int min_d = min%60;
int min_r = min%5;
int sec_d = sec%60;
//if(sec_d>11) sec_d = 0;
Serial.println(timeinfo.tm_hour);
pixels.setPixelColor(hour_d, pixels.Color(0, 7, 0));
pixels.setPixelColor(min_d, pixels.Color(min_r*5+1, 0, (5-min_r)*5));
pixels.setPixelColor(sec_d, pixels.Color(sec_d*5+1, 0, (5-sec_d)*5));
pixels.show();
delay(500);
j += 1;
}
k = 0;
串口打印当前时间
代码
void printLocalTime()
{
if (!getLocalTime(&timeinfo))
{
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%F %T %A"); // 格式化输出
}
每运行一段时间后,进行氛围和时间显示功能的切换。
代码
void loop()
{
while (j <= 60){
pixels.setBrightness(255);
pixels.clear(); // Set all pixel colors to 'off'
if (!getLocalTime(&timeinfo))
{
Serial.println("Failed to obtain time");
return;
}
int hour = timeinfo.tm_hour;
int min = timeinfo.tm_min;
int sec = timeinfo.tm_sec;
int day = timeinfo.tm_mday;
int mon = timeinfo.tm_mon + 1;
delay(500);
printLocalTime();
int hour_d = hour%12*5;
int min_d = min%60;
int min_r = min%5;
int sec_d = sec%60;
//if(sec_d>11) sec_d = 0;
Serial.println(timeinfo.tm_hour);
pixels.setPixelColor(hour_d, pixels.Color(0, 7, 0));
pixels.setPixelColor(min_d, pixels.Color(min_r*5+1, 0, (5-min_r)*5));
pixels.setPixelColor(sec_d, pixels.Color(sec_d*5+1, 0, (5-sec_d)*5));
pixels.show();
delay(500);
j += 1;
}
k = 0;
while (k <= 60){
if (timeinfo.tm_hour >= 20){
pixels.setBrightness(155);
for(int i = 0; i <= NUMPIXELS; i++){
pixels.setPixelColor(i, pixels.Color(255, 255, 255));
pixels.show();
}
delay(1000);
}
else{
pixels.setBrightness(255);
for(int i = 0; i <= NUMPIXELS; i++){
pixels.setPixelColor(i, pixels.Color(255, 255, 255));
pixels.show();
}
delay(1000);
}
k += 1;
}
j = 0;
}
步骤4 作品展示
时间功能:
氛围效果展示:
附件
许培享2023.12.10
漂亮
花生编程2023.07.23
赞赞赞赞赞
花生编程2023.07.23
厉害厉害
三春牛-创客2023.07.20
赞赞赞赞
三春牛-创客2023.07.20
厉害
腿毛利小五郎2023.07.04
666
hacker_2023.05.26
赞!!!
hacker_2023.05.24
非常的好