|
本帖最后由 zengcym 于 2019-12-20 14:53 编辑
上一贴中介绍了使用ESP8266 安卓APP自定义控制WS2812B彩灯串
链接:ESP8266 安卓APP自定义控制WS2812B彩灯串
帖子中的圆形60串WS2812全彩LED可以拿来制作另一个新奇的另类时钟
该时钟链接到网络NTP服务器获取时间,间隔一定时间同步互联网时间,同时使用wifi热点配置wifi密码,方便使用。
效果图如下,在每分钟及小时整点时会有动态动画显示。
相关的工具,软件配置等可参考上贴。
硬件接线:
代码:
- // Based on code from https://github.com/umarsear/Esp8266_NeoPixel_clock
- // as described in https://www.instructables.com/id/NeoPixel-NTP-Clock-Using-ESP8266/
- #include <NtpClientLib.h>
- #include <ESP8266WiFi.h>
- #include <DNSServer.h>
- #include <ESP8266WebServer.h>
- #include <WiFiManager.h> //https://github.com/tzapu/WiFiManager WiFi Configuration Magic
- #include <Adafruit_NeoPixel.h>
- #define NUMPIXELS 60 // number of NeoPixel LEDs
- #define PIN 0 // digital pin on ESP8266 for the NeoPixel data line
- #define mirror_hands 0 //true // In case the NeoPixel ring is wired anti-clockwise.
- #define minFrameMax 63
- #define hourFrameMax 60
- #define DELAY 50
- #define DAYBRIGHT 100
- #define DAYMID 20
- #define DAYLO 3
- #define NIGHTBRIGHT 20
- #define NIGHTMID 5
- #define NIGHTLO 2
- int bright = DAYBRIGHT;
- int mid = DAYMID;
- int lo = DAYLO;
- byte hour_hand, minute_hand, second_hand, previous_second;
- int minFrame=0;
- int hourFrame=0;
- byte hourPattern=1;
- byte minPattern=1;
- int staticPattern[64] = {0,1,2,3,4,5,6,7,
- 8,7,6,5,4,3,2,1,
- 0,1,2,3,4,5,6,7,
- 8,7,6,5,4,3,2,1,
- 0,1,2,3,4,5,6,7,
- 8,7,6,5,4,3,2,1,
- 0,1,2,3,4,5,6,7,
- 8,7,6,5,4,3,2,1};
- Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
- void setup() {
- Serial.begin(115200);
- WiFiManager wifiManager; // wifi configuration wizard
- wifiManager.autoConnect("NeoPixel_Clock", "secret"); // configuration for the access point, set your own secret.
- Serial.println("WiFi Client connected!");
- NTP.begin("ntp1.aliyun.com", 8, true); // get time from NTP server pool.
- NTP.setInterval(63);
- pixels.begin();
- pixels.setBrightness(254);
- }
- // clear all the leds to off
- void clearHands() {
- for (byte i=0; i<=NUMPIXELS;i++) {
- pixels.setPixelColor(i,pixels.Color(0,0,0));
- }
- // set up static 'ticks' around face.
- pixels.setPixelColor(0,pixels.Color(0,0,bright)); //blue
- pixels.setPixelColor(30,pixels.Color(0,0,mid));
- pixels.setPixelColor(15,pixels.Color(0,0,mid));
- pixels.setPixelColor(45,pixels.Color(0,0,mid));
- /* yellow
- pixels.setPixelColor(0,pixels.Color(bright,bright,0));
- pixels.setPixelColor(30,pixels.Color(mid,mid,0));
- pixels.setPixelColor(15,pixels.Color(mid,mid,0));
- pixels.setPixelColor(45,pixels.Color(mid,mid,0));
- */
-
- pixels.setPixelColor(5,pixels.Color(0,0,lo));
- pixels.setPixelColor(10,pixels.Color(0,0,lo));
- pixels.setPixelColor(20,pixels.Color(0,0,lo));
- pixels.setPixelColor(25,pixels.Color(0,0,lo));
- pixels.setPixelColor(35,pixels.Color(0,0,lo));
- pixels.setPixelColor(40,pixels.Color(0,0,lo));
- pixels.setPixelColor(50,pixels.Color(0,0,lo));
- pixels.setPixelColor(55,pixels.Color(0,0,lo));
- }
- void animateStatics(int frame) {
- for (int i =0; i<staticPattern[frame/2]; i++) {
- pixels.setPixelColor(i,pixels.getPixelColor(i)+pixels.Color(0,0,mid));
- pixels.setPixelColor(30+i,pixels.getPixelColor(30+i)+pixels.Color(0,0,mid));
- pixels.setPixelColor(15+i,pixels.getPixelColor(15+i)+pixels.Color(0,0,mid));
- pixels.setPixelColor((45+i)%60,pixels.getPixelColor((45+i)%60)+pixels.Color(0,0,mid));
- pixels.setPixelColor((0-i+60)%60,pixels.getPixelColor((0-i+60)%60)+pixels.Color(0,0,mid));
- pixels.setPixelColor(30-i,pixels.getPixelColor(30-i)+pixels.Color(0,0,mid));
- pixels.setPixelColor(15-i,pixels.getPixelColor(15-i)+pixels.Color(0,0,mid));
- pixels.setPixelColor(45-i,pixels.getPixelColor(45-i)+pixels.Color(0,0,mid));
- }
- }
- void drawHands(){
- calcTime();
- // show all the LED's, only the ones we have set with a color will be visible.
- pixels.show();
- // just a debug string, can be removed
- Serial.printf("hour:%d (%d), minute:%d (%d) second:%d (%d)\n",hour(),hour_hand,minute(),minute_hand,second(),second_hand);
- }
- void calcTime() {
- clearHands();
- calcHour();
- calcMinute();
- calcSeconds();
- }
- /*
- void calcHour() {
- pixels.setPixelColor(hour_hand,pixels.Color(bright,0,0));
- pixels.setPixelColor((hour_hand+59)%60,pixels.Color(mid,0,0));
- pixels.setPixelColor((hour_hand+1)%60,pixels.Color(mid,0,0));
- }
- void calcMinute() {
- // if hour and minute are the same led, use a different color to show that
- pixels.setPixelColor(minute_hand,pixels.getPixelColor(minute_hand)+pixels.Color(0,bright,0));
- }
- void calcSeconds() {
- // draw the second LED, using medium brightness white
- pixels.setPixelColor(second_hand,pixels.Color(bright,bright,bright));
- pixels.setPixelColor((second_hand+1)%60,pixels.getPixelColor((second_hand+1)%60)+pixels.Color(mid,mid,mid));
- pixels.setPixelColor((second_hand+2)%60,pixels.getPixelColor((second_hand+2)%60)+pixels.Color(lo,lo,lo));
- }
- */
- void calcHour() {
- pixels.setPixelColor(hour_hand,pixels.Color(0,bright,bright)); //rgb
- // pixels.setPixelColor((hour_hand+59)%60,pixels.Color(mid,0,0));
- // pixels.setPixelColor((hour_hand+1)%60,pixels.Color(mid,0,0));
- }
- void calcMinute() {
- // if hour and minute are the same led, use a different color to show that
- pixels.setPixelColor(minute_hand,pixels.getPixelColor(minute_hand)+pixels.Color(bright,0,bright));
- }
- void calcSeconds() {
- // draw the second LED, using medium brightness white
- pixels.setPixelColor(second_hand,pixels.Color(bright,bright,bright));
- // pixels.setPixelColor((second_hand+1)%60,pixels.getPixelColor((second_hand+1)%60)+pixels.Color(mid,mid,mid));
- // pixels.setPixelColor((second_hand+2)%60,pixels.getPixelColor((second_hand+2)%60)+pixels.Color(lo,lo,lo));
- }
- void animateHour(int frame, byte pattern) {
- Serial.printf("Animating for the hour change %d frame %d\n",hour(),frame);
- calcHands();
- clearHands();
- calcMinute();
- calcSeconds();
- if (pattern == 4) {
- calcHour();
- calcMinute();
- calcSeconds();
- animateStatics(frame);
- pixels.show();
- return;
- }
- if (frame <= 30) {
- int i=frame;
- switch (pattern) {
- case 1:
- for (int j=0; j<i; j++) {
- pixels.setPixelColor((hour_hand+j)%60,pixels.Color(bright,0,0));
- pixels.setPixelColor((hour_hand+60-j)%60,pixels.Color(bright,0,0));
- }
- break;
- case 2:
- pixels.setPixelColor((hour_hand+i)%60,pixels.Color(bright,0,0));
- pixels.setPixelColor((hour_hand+60-i)%60,pixels.Color(bright,0,0));
- break;
- case 3:
- pixels.setPixelColor((hour_hand+i)%60,pixels.Color(bright,0,0));
- pixels.setPixelColor((hour_hand+i+59)%60,pixels.Color(mid,0,0));
- pixels.setPixelColor((hour_hand+i+1)%60,pixels.Color(mid,0,0));
- break;
- }
- } else if (frame >30 && frame<=60) {
- int i=minFrameMax-frame-3;
- switch (pattern) {
- case 1:
- for (int j=0; j<i; j++) {
- pixels.setPixelColor((hour_hand+j)%60,pixels.Color(bright,0,0));
- pixels.setPixelColor((hour_hand+60-j)%60,pixels.Color(bright,0,0));
- }
- break;
- case 2:
- pixels.setPixelColor((hour_hand+i)%60,pixels.Color(bright,0,0));
- pixels.setPixelColor((hour_hand+60-i)%60,pixels.Color(bright,0,0));
- break;
- case 3:
- pixels.setPixelColor((hour_hand+i)%60,pixels.Color(bright,0,0));
- pixels.setPixelColor((hour_hand+i+59)%60,pixels.Color(mid,0,0));
- pixels.setPixelColor((hour_hand+i+1)%60,pixels.Color(mid,0,0));
- break;
- }
- }
- pixels.show();
- }
- void animateMinute(int frame, byte pattern) {
- Serial.printf("Animating for the minute change %d Frame %d pattern %d\n",minute(),frame, pattern);
- calcHands();
- clearHands();
- calcHour();
- calcSeconds();
- if (pattern == 4) {
- calcMinute();
- animateStatics(frame);
- pixels.show();
- return;
- }
-
- if (frame <= 30) {
- int i=frame;
- if (pattern == 1 || pattern == 3) {
- pixels.setPixelColor((minute_hand+i)%60,pixels.getPixelColor((minute_hand+i)%60)+pixels.Color(0,bright,0));
- }
- if (pattern < 3) {
- pixels.setPixelColor((minute_hand+60-i)%60,pixels.getPixelColor((minute_hand+60-i)%60)+pixels.Color(0,bright,0));
- }
- if (i>0) {
- if (pattern == 1 || pattern == 3) {
- pixels.setPixelColor((minute_hand+i+59)%60,pixels.getPixelColor((minute_hand+i+59)%60)+pixels.Color(0,mid,0));
- }
- if (pattern < 3) {
- pixels.setPixelColor((minute_hand+61-i)%60,pixels.getPixelColor((minute_hand+61-i)%60)+pixels.Color(0,mid,0));
- }
- }
- if (i>1) {
- if (pattern == 1 || pattern == 3) {
- pixels.setPixelColor((minute_hand+i+58)%60,pixels.getPixelColor((minute_hand+i+58)%60)+pixels.Color(0,lo,0));
- }
- if (pattern < 3) {
- pixels.setPixelColor((minute_hand+62-i)%60,pixels.getPixelColor((minute_hand+62-i)%60)+pixels.Color(0,lo,0));
- }
- }
- } else if (frame >30 && frame<=60) {
- int i=minFrameMax-frame-3;
- if (pattern == 1 || pattern == 3) {
- pixels.setPixelColor((minute_hand+60-i)%60,pixels.getPixelColor((minute_hand+60-i)%60)+pixels.Color(0,bright,0));
- pixels.setPixelColor((minute_hand+59-i)%60,pixels.getPixelColor((minute_hand+59-i)%60)+pixels.Color(0,mid,0));
- pixels.setPixelColor((minute_hand+58-i)%60,pixels.getPixelColor((minute_hand+58-i)%60)+pixels.Color(0,lo,0));
- }
- if (pattern < 3) {
- pixels.setPixelColor((minute_hand+i)%60,pixels.getPixelColor((minute_hand+i)%60)+pixels.Color(0,bright,0));
- pixels.setPixelColor((minute_hand+i+1)%60,pixels.getPixelColor((minute_hand+i+1)%60)+pixels.Color(0,mid,0));
- pixels.setPixelColor((minute_hand+i+2)%60,pixels.getPixelColor((minute_hand+i+2)%60)+pixels.Color(0,lo,0));
- }
- } else {
- pixels.setPixelColor(minute_hand,pixels.getPixelColor(minute_hand)+pixels.Color(0,bright,0));
- if (pattern == 1 || pattern == 3) {
- pixels.setPixelColor((minute_hand+1)%60,pixels.getPixelColor((minute_hand+1)%60)+pixels.Color(0,lo,0));
- }
- if (pattern < 3) {
- pixels.setPixelColor((minute_hand+59)%60,pixels.getPixelColor((minute_hand+59)%60)+pixels.Color(0,lo,0));
- }
- }
- pixels.show();
- }
- void calcHands() {
-
- byte hour_offset;
-
- minute_hand=minute();
- if (minute_hand>=10) {
- hour_offset=(minute_hand / 10)-1;
- } else {
- hour_offset=0;
- }
-
- if (hour() >= 12) {
- hour_hand = ((hour() - 12) * 5) + hour_offset;
- }
- else {
- hour_hand = (hour() * 5) + hour_offset;
- }
-
- if (mirror_hands) {
- hour_hand=60-hour_hand;
- minute_hand=60-minute_hand;
- second_hand=(60-second());
- if (second_hand==60) {
- second_hand=0;
- }
- if (minute_hand==60) {
- minute_hand=0;
- }
- if (hour_hand==60) {
- hour_hand=0;
- }
- } else {
- second_hand=second();
- }
- }
- void loop() {
- calcHands();
- if (minute()==0 && second()<3 && hourFrame==0 ) {
- hourFrame=hourFrameMax;
- hourPattern=random(1,5);
- } else if (second()==0 && minFrame==0) {
- minFrame=minFrameMax;
- minPattern=random(1,5);
- }
- if (hour()>=23 || hour()<=7) {
- if (bright != NIGHTBRIGHT) {
- bright = NIGHTBRIGHT;
- mid = NIGHTMID;
- lo = NIGHTLO;
- }
- } else if (bright == NIGHTBRIGHT) {
- bright = DAYBRIGHT;
- mid = DAYMID;
- lo = DAYLO;
- }
- delay(DELAY);
-
- if (hourFrame>0) {
- animateHour(hourFrameMax-hourFrame, hourPattern);
- hourFrame--;
- } else if (minFrame>0) {
- animateMinute(minFrameMax-minFrame, minPattern);
- minFrame--;
- } else if (second_hand!=previous_second) {
- previous_second=second_hand;
- drawHands();
- }
- }
复制代码 相关说明:
1. 需要在上一贴的基础上再增加第三方库文件,可在库管理器中查找添加
NtpClientLib
Adafruit_NeoPixel
也可直接下载附件,解压到相关文件夹
2. 代码配置
- #define NUMPIXELS 60 // number of NeoPixel LEDs
- #define PIN 0 // digital pin on ESP8266 for the NeoPixel data line
- #define mirror_hands 0 //true // In case the NeoPixel ring is wired anti-clockwise.
复制代码 #define NUMPIXELS 60, 设置LED数量60;
#define PIN 0, 设置驱动脚,使用gpio脚 0(D3);
#define mirror_hands 0 , 设置时钟逆时针或顺时针,这个和LED的接法相关,当发现时钟走时反向不对时可更改,值为0 或者 1;
- wifiManager.autoConnect("NeoPixel_Clock", "secret"); // configuration for the access point, set your own secret.
复制代码 "NeoPixel_Clock" 引号内内容为屏配置wifi时热点名称,可任意配置里喜欢的名称。
- NTP.begin("ntp1.aliyun.com", 8, true); // get time from NTP server pool.
- NTP.setInterval(63);
- pixels.begin();
- pixels.setBrightness(254);
复制代码
NTP.begin("ntp1.aliyun.com", 8, true); "ntp1.aliyun.com"为设置NTP服务器地址,可替换腾讯或国家授时中心等,这里使用的阿里的NTP服务器。第二个参数8,为时区设置,北京时间为8.
NTP.setInterval(63); NTP同步时间间隔,单位为秒,可以设置大些的值,比如24小时:24*60*60,同步后即断开链接,使用ESP8266内部计时器走时,间隔一定时间同步足以保证时间精度。
pixels.setBrightness(254); 设置亮度
- pixels.setPixelColor(0,pixels.Color(0,0,bright)); //blue
- pixels.setPixelColor(30,pixels.Color(0,0,mid));
- pixels.setPixelColor(15,pixels.Color(0,0,mid));
- pixels.setPixelColor(45,pixels.Color(0,0,mid));
- /* yellow
- pixels.setPixelColor(0,pixels.Color(bright,bright,0));
- pixels.setPixelColor(30,pixels.Color(mid,mid,0));
- pixels.setPixelColor(15,pixels.Color(mid,mid,0));
- pixels.setPixelColor(45,pixels.Color(mid,mid,0));
- */
-
- pixels.setPixelColor(5,pixels.Color(0,0,lo));
- pixels.setPixelColor(10,pixels.Color(0,0,lo));
- pixels.setPixelColor(20,pixels.Color(0,0,lo));
- pixels.setPixelColor(25,pixels.Color(0,0,lo));
- pixels.setPixelColor(35,pixels.Color(0,0,lo));
- pixels.setPixelColor(40,pixels.Color(0,0,lo));
- pixels.setPixelColor(50,pixels.Color(0,0,lo));
- pixels.setPixelColor(55,pixels.Color(0,0,lo));
复制代码 这段代码可以设置显示的钟盘几个基点的颜色和亮度。
- void calcHour() {
- pixels.setPixelColor(hour_hand,pixels.Color(0,bright,bright)); //rgb
- // pixels.setPixelColor((hour_hand+59)%60,pixels.Color(mid,0,0));
- // pixels.setPixelColor((hour_hand+1)%60,pixels.Color(mid,0,0));
- }
- void calcMinute() {
- // if hour and minute are the same led, use a different color to show that
- pixels.setPixelColor(minute_hand,pixels.getPixelColor(minute_hand)+pixels.Color(bright,0,bright));
- }
- void calcSeconds() {
- // draw the second LED, using medium brightness white
- pixels.setPixelColor(second_hand,pixels.Color(bright,bright,bright));
- // pixels.setPixelColor((second_hand+1)%60,pixels.getPixelColor((second_hand+1)%60)+pixels.Color(mid,mid,mid));
- // pixels.setPixelColor((second_hand+2)%60,pixels.getPixelColor((second_hand+2)%60)+pixels.Color(lo,lo,lo));
- }
复制代码 设置时,分,秒的颜色及亮度。
熟悉代码后可以根据自己的喜好调整各种显示颜色及亮度。
代码打包
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|