WiFi 时钟+本地温度

更多内容,请访问我的网站: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
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值