更多内容,请访问我的网站:https://jiangge12.github.io/
不过功能单一,这不夏天到了,显示器上放一个时钟,实时测量本地室温,看看空调工作是否正常也算是个实用制作。
不用打板,也不用杜邦线,也不用外壳,即插即用,不用了还可以回收零件他用,可以说最简单的实验方式了。
零件准备:
400孔面包板 ( 大号830孔的面包板也行,不过粘在显示器上面显的有些突兀)
NodeMCU ( 其他的 ESP8266 应该也差不多,需要注意引脚排列 )
0.96' OLED ( SSD1306 )
AHT20传感器 ( 手里有 AHT10 也可以,程序一样的 )
面包板布线:
如果喜欢下面这样别人的连线方式,本布线小节可以忽略。
如下图弯折四条硬线,也就是把 ESP8266 的 I2C 引到旁边摆放,便于插OLED和AHT20 。
为什么这么做呢?因为这款 ESP8266 开发板叫 NodeMCU,比较宽,插进面包板就没办法再插杜邦线,这样从肚皮下预埋引线可以达到目的还比较简洁,适合只用到 I2C 接口的实验,其他实验还是另想办法。
下图用绿色细线标识了具体插接孔位,仔细看应该没什么难度。
最后成品是这样的:
代码:( 修改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
}