[ WiFi 时钟 ]
[ WiFi 天气时钟 ]
[ WiFi 时钟+本地温度 ]
夏天到了,显示器上放一个时钟,顺便实时测量本地室温,看看空调工作是否正常也算是个实用制作。
用到零件共 4 个:
400孔面包板 ( 大号830孔的也行,不过粘在显示器上面显的有些突兀)
NodeMCU ( 其他的ESP8266应该也差不多,需要注意引脚排列 )
0.96' OLED ( SSD1306 )
AHT20传感器 ( 手里有AHT10也可以,程序一样的 )
上面已经给出连接示意图,仔细点看应该没什么难度。
不废话,直接上代码:( 修改SSID即可 )
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(/*旋转0123*/U8G2_R0, /*reset=255*/U8X8_PIN_NONE, /*SCL*/D1, /*SDA*/D2); #include <Adafruit_AHT10.h>
Adafruit_AHT10 aht; #include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
WiFiUDP Udp;
NTPClient timeClient(Udp, "cn.pool.ntp.org"); // 哪个服务器稳定就用哪个,比如还可以选 ntp1.aliyun.com
time_t currentDisplayTime;
String Sync_status;
int Sync_status_display_seconds;
String HH;
String MM;
String Sec; //SS变量名已被占用
String t;
String h;void setup(){ aht.begin();u8g2.begin();u8g2.enableUTF8Print(); // 启用中文显示,但库不全 u8g2.setContrast(0);u8g2.setFont(u8g2_font_ncenB14_tr); u8g2.clearBuffer(); u8g2.setCursor( 0,32); u8g2.print("WiFi"); u8g2.sendBuffer(); WiFi.begin("SSID", "your_password");while(WiFi.status()!= WL_CONNECTED){delay(1000);u8g2.print(".");u8g2.sendBuffer();}Udp.begin(8888); // UDP 侦听端口,任意指定 u8g2.setCursor( 0,60); u8g2.print("Connected!"); u8g2.sendBuffer();delay(2000);setSyncProvider(getNtpTime);setSyncInterval(60); // NTP网络同步间隔时间,单位秒
} void loop(){if (now()!= currentDisplayTime){ currentDisplayTime = now();prepare_data();refresh_OLED_display();}
}void prepare_data(){sensors_event_t aht_humidity, aht_temp; // 定义两个结构体aht.getEvent(&aht_humidity, &aht_temp); // 采集一次传感器,写入两个结构体t = String(aht_temp.temperature,1);h = String(aht_humidity.relative_humidity,0);int years = year(),months = month(),days = day(),hours = hour(),minutes = minute(),seconds = second(),weekdays = weekday();HH="";MM="";Sec="";if (hours < 10)HH += 0; HH += hours;if (minutes < 10)MM += 0; MM += minutes;if (seconds < 10)Sec += 0; Sec += seconds;
}void refresh_OLED_display(){u8g2.clearBuffer(); u8g2.setCursor( 0,41); u8g2.setFont(u8g2_font_logisoso42_tr); u8g2.print(HH+":"+MM);u8g2.setCursor(54,29); u8g2.setFont(u8g2_font_unifont_t_chinese2);u8g2.print(Sec); u8g2.drawHLine(0,43,128); if(Sync_status_display_seconds > 0){Sync_status_display_seconds --;u8g2.setCursor(12,62); u8g2.setFont(u8g2_font_ncenB14_tr); u8g2.print(Sync_status); } else{u8g2.setCursor( 60,64); u8g2.print("C"); u8g2.setCursor(110,64); u8g2.print("%"); u8g2.setCursor( 10,64); u8g2.setFont(u8g2_font_ncenB18_tr);u8g2.print(t); u8g2.setCursor( 80,64); u8g2.setFont(u8g2_font_ncenB18_tr);u8g2.print(h); }u8g2.sendBuffer();
}time_t getNtpTime(){Sync_status_display_seconds = 5;if(timeClient.update()) Sync_status="Sync OK!";else Sync_status="Sync Failed!";return(timeClient.getEpochTime()+28800); // GMT+8, 3600*8
}