[ 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
}