自制WiFi天气温湿度时钟,Blinker esp-01(8266) 128*64 OLED屏-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 48734|回复: 120

[分享] 自制WiFi天气温湿度时钟,Blinker esp-01(8266) 128*64 OLED屏

  [复制链接]
发表于 2020-11-3 20:19 | 显示全部楼层 |阅读模式
本帖最后由 安少 于 2021-2-4 17:09 编辑

先看程序;作品在下面,可以慢慢看。
程序写的比较跳,初学着可能比较难理解,讲程序了一点一点抽出来将。

程序的编写借鉴了blinker的示例,单片机菜鸟 的OLED教程,526598 的天气信息提取,1812z的部分优化代码的方法
  1. /*********************************************************************************************************
  2.   日期:2021/01/28
  3.   功能:WiFi+DHT11+OLED+有源蜂鸣器+继电器 8266端
  4.   作者:安少
  5.   128X64OLED显示 DHT11获取温度 蜂鸣器蜂鸣 继电器工作
  6.   调用Blinker、ESP8266、ArduinoJson、DHT、u8g2库文件
  7. *********************************************************************************************************/
  8. #define BLINKER_WIFI //定义wifi模块
  9. #define BLINKER_WITHOUT_SSL //非SSL加密通信接入,省堆栈
  10. #define BLINKER_PRINT Serial //给debug打开串口
  11. #define BLINKER_ESP_SMARTCONFIG //定义EspTouch/SmartConfig模式进行配网,可以用APP配网
  12. #define BLINKER_ALIGENIE_SENSOR //连接天猫精灵,定义设备类型为传感器
  13. #include <ESP8266WiFi.h> //包含ESP8266头文件,8266必须要使用的头文件
  14. #include <ArduinoJson.h> //包含ArduinoJson头文件,用于解析从点灯获取到的天气数据
  15. #include <Blinker.h> //包含Blinker头文件,用于连接点灯科技
  16. #include <DHT.h> //包含DHT头文件,用于温湿度传感器获取数据
  17. #include <U8g2lib.h> //包含u8g2头文件,用于OLED显示
  18. #include <EEPROM.h> //包含EEPROM头文件,用于EEPROM存储

  19. #ifdef U8X8_HAVE_HW_I2C          //定义OLED连接方式为I2C
  20. #include <Wire.h>
  21. #endif
  22. #ifdef U8X8_HAVE_HW_SPI          //定义OLED连接方式为SPI
  23. #include <SPI.h>
  24. #endif

  25. U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 14, /* data=*/ 2);
  26. //定义128X64四针OLED模块连接管脚io14、io2
  27. #define DHTPIN 5 //定义DHT11模块连接管脚io5
  28. #define DHTTYPE DHT11 //使用温度湿度模块的类型为DHT11
  29. DHT dht(DHTPIN, DHTTYPE); //生成DHT对象,参数是引脚和DHT的类型

  30. #define TEXTE_ip "tex-ip"
  31. #define Slider_1 "ran-shuaxin"

  32. /*********************************************************************************************************
  33.   定义全局变量

  34. *********************************************************************************************************/
  35. char auth[] = "***************"; //你的设备key

  36. String location = "guangxi-jinchengjiangqu"; //定义天气地址

  37. float humi_read = 0, temp_read = 0; //定义浮点型全局变量 储存传感器读取的温湿度数据

  38. const int fmq1 = 13; //定义蜂鸣器引脚
  39. const int xyd1 = 12; //定义小夜灯引脚
  40. const int xyd2 = 04; //定义小夜灯辅助引脚

  41. int a1 = 0; //用于开关OLED
  42. int a2 = 0; //用于上电更新天气
  43. int a3 = 0; //用于间隔更新天气
  44. int a4 = 0; //用于联网更新天气

  45. int b0 = 0; //用于OLED页面的
  46. int b1 = 1;
  47. int b2 = 1;
  48. int b3 = 1;
  49. int b4 = 1;

  50. int c1 = 0; //用于蜂鸣器
  51. int c2 = 0; //用于控制OLED
  52. int c3 = 0; //用于小夜灯

  53. int tian1 = 0;
  54. int shi1  = 0;
  55. int fen1  = 0;
  56. int miao1 = 0;


  57. int shua1 = 0;
  58. int shua2 = 0;

  59. char w_weather[12] = ""; //天气
  60. char w_temp[10]    = ""; //室外温度
  61. char w_humi[24]    = ""; //室外湿度
  62. char w_wind[10]    = ""; //风向
  63. char w_power[10]   = ""; //风力

  64. char a_aqi[12]   = ""; //空气质量
  65. char a_level[12] = ""; //空气等级
  66. char a_pm25[10]  = ""; //pm2.5
  67. /*********************************************************************************************************
  68.   新建数据类型组件对象,作用:将数据传输到手机blinker app

  69. *********************************************************************************************************/
  70. BlinkerText Text_ip(TEXTE_ip);
  71. BlinkerSlider Slider1(Slider_1);

  72. BlinkerNumber HUMI("humi"); //定义湿度数据键名
  73. BlinkerNumber TEMP("temp"); //定义温度数据键名
  74. BlinkerNumber Number1("num-xinhao"); //定义信号强度键名

  75. BlinkerButton Btn_time("btn-A1");
  76. BlinkerButton Btn_temp_humi("btn-A2");
  77. BlinkerButton Btn_wifi("btn-A3");
  78. BlinkerButton Btn_Refresh("btn-A4");
  79. BlinkerButton Btn_OLED("btn-A5");
  80. BlinkerButton Btn_weather("btn-A6");
  81. BlinkerButton Btn_air("btn-A7");
  82. BlinkerButton Btn_fmq("btn-A8");
  83. BlinkerButton Btn_xyd("btn-A9");

  84. //BlinkerBridge BridgeDevice1(BRIDGE_1);
  85. /*********************************************************************************************************
  86.   读取DHT11传感器的温湿度数据

  87. *********************************************************************************************************/
  88. void DHT11_1() {
  89.   float h = dht.readHumidity(); //读取DHT11传感器的湿度 并赋值给h
  90.   float t = dht.readTemperature(); //读取传感器的温度   并赋值给t
  91.   if (isnan(h) || isnan(t)) { //判断是否成功读取到温湿度数据
  92.     BLINKER_LOG("读取温湿度失败!");
  93.     if (a1 == 1) {
  94.       Blinker.delay(2000);
  95.     }
  96.   }
  97.   else { //成功读取到数据
  98.     //打印
  99.     // BLINKER_LOG("Humidity: ", h, " %");
  100.     // BLINKER_LOG("Temperature: ", t, " *C");

  101.     temp_read = t - 0.6;   //校准温度
  102.     humi_read = h - 11;    //校准湿度
  103.   }
  104. }
  105. /*********************************************************************************************************
  106.   云存储回调函数

  107. *********************************************************************************************************/
  108. void dataStorage() {
  109.   Blinker.dataStorage("temp", temp_read);
  110.   Blinker.dataStorage("humi", humi_read);
  111. }
  112. /*********************************************************************************************************
  113.   天猫精灵温湿度回调函数

  114. *********************************************************************************************************/
  115. void aligenieQuery(int32_t queryCode) {
  116.   switch (queryCode) {
  117.     case BLINKER_CMD_QUERY_ALL_NUMBER :
  118.       BLINKER_LOG("AliGenie Query All");
  119.       BlinkerAliGenie.temp(temp_read);
  120.       BlinkerAliGenie.humi(humi_read);
  121.       BlinkerAliGenie.print();
  122.       break;
  123.     case BLINKER_CMD_QUERY_TEMP_NUMBER :
  124.       BlinkerAliGenie.temp(temp_read);
  125.       BlinkerAliGenie.print();
  126.       break;
  127.     case BLINKER_CMD_QUERY_HUMI_NUMBER :
  128.       BlinkerAliGenie.humi(humi_read);
  129.       BlinkerAliGenie.print();
  130.       break;
  131.     default :
  132.       BlinkerAliGenie.temp(20);
  133.       BlinkerAliGenie.humi(20);
  134.       BlinkerAliGenie.print();
  135.       break;
  136.   }
  137. }
  138. /*********************************************************************************************************
  139.   获取DHT11状态并用OLED显示

  140. *********************************************************************************************************/
  141. void DTH11_OLED() {
  142.   String wendu;
  143.   wendu = String("") + "室内温度:" + temp_read + "°C";
  144.   String shidu;
  145.   shidu = String("") + "室内湿度:" + humi_read + "%RH";

  146.   u8g2.setFont(u8g2_font_ncenB08_tr);
  147.   u8g2.drawStr(122, 8, "2");
  148.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);
  149.   u8g2.setCursor(0, 25);
  150.   u8g2.print(wendu);

  151.   u8g2.setCursor(0, 40);
  152.   u8g2.print(shidu);
  153. }
  154. /*********************************************************************************************************
  155.   给一个地址获取天气数据
  156.   功能;通过地址参数获取天气信息延时一秒后在空气信息
  157.   输入参数:给 weather 输入地址参数
  158.   输入参数:给 aqi 输入地址参数
  159. *********************************************************************************************************/
  160. void tianqi() {
  161.   Blinker.weather(location);
  162.   Blinker.delay(1000);
  163.   Blinker.aqi(location);
  164. }
  165. /*********************************************************************************************************
  166.   开机更新天气信息
  167.   功能:开机等待五秒后获取天气信息
  168.   变量:a2 判断是否获取过天气信息
  169.   调用函数:tianqi();
  170.   运行流程:a2等于0则调用天气地址函数获取天气信息,否则不执行调用天气地址函数获取天气信息并跳出当前函数
  171. *********************************************************************************************************/
  172. void kjgxtq() {
  173.   if (a2 == 0) {
  174.     Blinker.delay(5000);
  175.     tianqi();
  176.     BLINKER_LOG("开机是否更新天气", a2);
  177.   }
  178. }
  179. /*********************************************************************************************************
  180.   间隔更新天气信息
  181.   功能:间隔一定的时间后在获取天气信息
  182.   变量:a3 判断是否到达预定时间
  183.   变量:hour 获取当前小时
  184.   变量:min 获取当前分钟
  185.   调用函数:tianqi();
  186.   运行流程:a3等于对则调用天气地址函数获取天气信息,否则不执行调用天气地址函数获取天气信息并跳出当前函数
  187. *********************************************************************************************************/
  188. void jggxtq() {
  189.   int8_t hour = Blinker.hour();//时
  190.   int8_t min  = Blinker.minute();//分

  191.   if (hour == 0) {
  192.     a3 = 0;
  193.   }
  194.   if (hour == 4) {
  195.     a3 = 4;
  196.   }
  197.   if (hour == 8) {
  198.     a3 = 8;
  199.   }
  200.   if (hour == 10) {
  201.     a3 = 10;
  202.   }
  203.   if (hour == 12) {
  204.     a3 = 12;
  205.   }
  206.   if (hour == 14) {
  207.     a3 = 14;
  208.   }
  209.   if (hour == 16) {
  210.     a3 = 16;
  211.   }
  212.   if (hour == 18) {
  213.     a3 = 18;
  214.   }
  215.   if (hour == 20) {
  216.     a3 = 20;
  217.   }
  218.   if (hour == 22) {
  219.     a3 = 22;
  220.   }
  221.   if (hour == a3) {
  222.     if (min == 0) {
  223.       tianqi();//间隔更新天气
  224.       Blinker.delay(40000);
  225.     }
  226.   }
  227. }
  228. /*********************************************************************************************************
  229.   天气回调函数

  230. *********************************************************************************************************/
  231. void weatherData(const String & data) {
  232.   //BLINKER_LOG("天气: ", data);
  233.   DynamicJsonDocument jsonBuffer(400);
  234.   DeserializationError error = deserializeJson(jsonBuffer, data);
  235.   JsonObject doc = jsonBuffer.as<JsonObject>();
  236.   if (data[0] == '{') {
  237.     strcpy(w_weather, jsonBuffer["weather"]); //天气
  238.     strcpy(w_temp, jsonBuffer["temp"]); //室外温度
  239.     strcpy(w_humi, jsonBuffer["humi"]); //室外湿度
  240.     strcpy(w_wind, jsonBuffer["wind"]); //风向
  241.     strcpy(w_power, jsonBuffer["power"]); //风力
  242.   }
  243.   else {
  244.     //天气获取失败
  245.     BLINKER_LOG("weatherData_error!");
  246.     delay(1000);
  247.     return;
  248.   }
  249. }
  250. /*********************************************************************************************************
  251.   获取天气信息并用OLED显示

  252. *********************************************************************************************************/
  253. void weather_OLED() {
  254.   String w_weather1;
  255.   w_weather1 = String("") + "天气预报:" + w_weather;
  256.   String w_temp1;
  257.   w_temp1 = String("") + "室外温度:" + w_temp + "°C";
  258.   String w_humi1;
  259.   w_humi1 = String("") + "室外湿度:" + w_humi + "%RH";

  260.   u8g2.setFont(u8g2_font_ncenB08_tr);
  261.   u8g2.drawStr(122, 8, "3");
  262.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);

  263.   u8g2.setCursor(0, 25);
  264.   u8g2.print(w_weather1);

  265.   u8g2.setCursor(0, 40);
  266.   u8g2.print(w_temp1);

  267.   u8g2.setCursor(0, 55);
  268.   u8g2.print(w_humi1);
  269. }
  270. void weather_OLED2() {
  271.   String w_wind1;
  272.   w_wind1 = String("") + "室外风向:" + w_wind;
  273.   String w_power1;
  274.   w_power1 = String("") + "室外风力:" + w_power + "级";

  275.   u8g2.setFont(u8g2_font_ncenB08_tr);
  276.   u8g2.drawStr(122, 8, "3");
  277.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);

  278.   u8g2.setCursor(0, 25);
  279.   u8g2.print(w_wind1);

  280.   u8g2.setCursor(0, 40);
  281.   u8g2.print(w_power1);
  282. }
  283. void w_OLED() {
  284.   u8g2.clearBuffer();
  285.   u8g2.firstPage();
  286.   Wifi_OLED();
  287.   time_OLED2();
  288.   DTH11_OLED2();
  289.   weather_OLED();
  290.   u8g2.nextPage();
  291. }
  292. void w_OLED2() {
  293.   u8g2.clearBuffer();
  294.   u8g2.firstPage();
  295.   Wifi_OLED();
  296.   time_OLED2();
  297.   DTH11_OLED2();
  298.   weather_OLED2();
  299.   u8g2.nextPage();
  300. }
  301. /*********************************************************************************************************
  302.   空气质量回调函数

  303. *********************************************************************************************************/
  304. void airData(const String & data) {
  305.   //BLINKER_LOG("空气质量: ", data);
  306.   DynamicJsonDocument jsonBuffer(512);
  307.   DeserializationError error = deserializeJson(jsonBuffer, data);
  308.   JsonObject doc = jsonBuffer.as<JsonObject>();
  309.   if (data[0] == '{') {
  310.     strcpy(a_aqi, jsonBuffer["aqi"]); //空气质量
  311.     strcpy(a_level, jsonBuffer["level"]); //空气等级
  312.     strcpy(a_pm25, jsonBuffer["pm25"]); //pm2.5
  313.     a2 = 1; a4 = 1;
  314.   }
  315.   else {
  316.     BLINKER_LOG("airData_error!");
  317.     //Serial.println(error.c_str());
  318.     delay(1000);
  319.     a2 = 1; a4 = 1;
  320.     return;
  321.   }
  322. }

  323. /*********************************************************************************************************
  324.   获取空气信息并用OLED显示

  325. *********************************************************************************************************/
  326. void aqi_OLED() {
  327.   String a_aqi1;
  328.   a_aqi1 = String("") + "空气质量:" + a_aqi;
  329.   String a_level1;
  330.   a_level1 = String("") + "空气等级:" + a_level;
  331.   String a_pm251;
  332.   a_pm251 = String("") + "微颗粒物:" + a_pm25;

  333.   u8g2.setFont(u8g2_font_ncenB08_tr);
  334.   u8g2.drawStr(122, 8, "4");
  335.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);

  336.   u8g2.setCursor(0, 25);
  337.   u8g2.print(a_aqi1);

  338.   u8g2.setCursor(0, 40);
  339.   u8g2.print(a_level1);

  340.   u8g2.setCursor(0, 55);
  341.   u8g2.print(a_pm251);
  342. }
  343. /*********************************************************************************************************
  344.   获取WiFi状态并用OLED显示

  345. *********************************************************************************************************/
  346. void Wifi_OLED() {
  347.   u8g2.setFont(u8g2_font_ncenB08_tr);
  348.   u8g2.drawHLine(0, 10, 128);
  349.   u8g2.drawHLine(0, 63, 128);
  350.   uint8 status; //记录连接状态
  351.   status = wifi_station_get_connect_status(); //获得连接的状态
  352.   if (status == STATION_GOT_IP) {
  353.     u8g2.drawStr(0, 8, "Wifi");
  354.     if (a4 == 0) {
  355.       a2 = 0;
  356.       BLINKER_LOG("联网是否更新天气", a4);
  357.     }
  358.   }
  359.   else {
  360.     u8g2.drawStr(0, 8, "----");
  361.     a2 = 1;
  362.     BLINKER_LOG("联网是否更新天气", a4);
  363.   }
  364. }
  365. /*********************************************************************************************************
  366.   获取ip并用OLED显示

  367. *********************************************************************************************************/
  368. void ip_OLED() {
  369.   u8g2.setFont(u8g2_font_ncenB08_tr);
  370.   u8g2.drawHLine(0, 10, 128);
  371.   u8g2.drawHLine(0, 63, 128);
  372.   u8g2.drawStr(122, 8, "0");

  373.   u8g2.drawStr(0, 21, "SSID");
  374.   u8g2.drawStr(31, 21, ":");
  375.   u8g2.setCursor(34, 21);
  376.   u8g2.print(WiFi.SSID());

  377.   u8g2.drawStr(0, 31, "Pswd");
  378.   u8g2.drawStr(31, 31, ":");
  379.   u8g2.setCursor(34, 31);
  380.   u8g2.print(WiFi.psk());

  381.   u8g2.drawStr(0, 41, "GaIP");
  382.   u8g2.drawStr(31, 41, ":");
  383.   u8g2.setCursor(34, 41);
  384.   u8g2.print(WiFi.gatewayIP());

  385.   u8g2.drawStr(0, 51, "LoIP");
  386.   u8g2.drawStr(31, 51, ":");
  387.   u8g2.setCursor(34, 51);
  388.   u8g2.print(WiFi.localIP());

  389.   u8g2.drawStr(0, 61, "MAC");
  390.   u8g2.drawStr(29, 61, ":");
  391.   u8g2.setCursor(33, 61);
  392.   u8g2.print(WiFi.macAddress());

  393.   u8g2.setCursor(0, 8);
  394.   u8g2.print(WiFi.RSSI());
  395. }
  396. /*********************************************************************************************************
  397.   获取运行时间并用OLED显示

  398. *********************************************************************************************************/
  399. void yxsj_OLED() {
  400.   String fh; String tianbl; String shibl; String fenbl; String miaobl;

  401.   u8g2.setFont(u8g2_font_ncenB08_tr);
  402.   u8g2.drawStr(122, 8, "0");
  403.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);
  404.   u8g2.setCursor(0, 25);
  405.   u8g2.print("运行时间:");

  406.   time_t run_time = Blinker.runTime(); //获取运行时间,单位为秒
  407.   tian1 =  run_time / 86400; //转化为天
  408.   shi1  = (run_time - tian1 * 86400 ) / 3600; //转化为时
  409.   fen1  = (run_time - tian1 * 86400 - shi1 * 3600) / 60; //转化为分
  410.   miao1 =  run_time - tian1 * 86400 - shi1 * 3600 - fen1 * 60; //转化为秒
  411.   if (tian1 < 10) {
  412.     tianbl = String("") + "0" + tian1;
  413.   }
  414.   else {
  415.     tianbl = String("") + tian1;
  416.   }
  417.   if (shi1 < 10) {
  418.     shibl = String("") + "0" + shi1;
  419.   }
  420.   else {
  421.     shibl = String("") + shi1;
  422.   }
  423.   if (fen1 < 10) {
  424.     fenbl = String("") + "0" + fen1;
  425.   }
  426.   else {
  427.     fenbl = String("") + fen1;
  428.   }
  429.   if (miao1 < 10) {
  430.     miaobl = String("") + "0" + miao1;
  431.   }
  432.   else {
  433.     miaobl = String("") + miao1;
  434.   }

  435.   if (tian1 == 0 & shi1 == 0 & fen1 == 0) {
  436.     fh = String("") + miaobl + "秒";
  437.   }
  438.   else if (tian1 == 0 & shi1 == 0 ) {
  439.     fh = String("") + fenbl + "分" + miaobl + "秒";
  440.   }
  441.   else if (tian1 == 0) {
  442.     fh = String("") + shibl + "时" + fenbl + "分" + miaobl + "秒";
  443.   }
  444.   else {
  445.     fh = String("") + tianbl + "天" + shibl + "时" + fenbl + "分" + miaobl + "秒";
  446.   }
  447.   u8g2.setCursor(0, 40);
  448.   u8g2.print(fh);
  449. }
  450. void ip_OLED_0() {
  451.   u8g2.clearBuffer();
  452.   u8g2.firstPage();
  453.   ip_OLED();
  454.   time_OLED2();
  455.   DTH11_OLED2();
  456.   u8g2.nextPage();
  457. }
  458. void yxsj_OLED_0() {
  459.   u8g2.clearBuffer();
  460.   u8g2.firstPage();
  461.   yxsj_OLED();
  462.   Wifi_OLED();
  463.   time_OLED2();
  464.   DTH11_OLED2();
  465.   u8g2.nextPage();
  466. }
  467. /*********************************************************************************************************
  468.   获取时间状态并用OLED显示

  469. *********************************************************************************************************/
  470. void time_OLED() {
  471.   u8g2.setFont(u8g2_font_ncenB08_tr);
  472.   u8g2.drawStr(122, 8, "1");
  473.   int16_t year = Blinker.year(); //年
  474.   if (year > 0) {
  475.     time_1();
  476.   }
  477.   else {
  478.     u8g2.setFont(u8g2_font_ncenB12_tr);
  479.     u8g2.drawStr(10, 36, "Time not set"); //返回错误值
  480.   }
  481. }
  482. void time_1() {
  483.   String rq; String sj;
  484.   String monthbl; String mdaybl;
  485.   String hourbl; String minbl; String secbl;

  486.   int16_t year  = Blinker.year(); //年
  487.   int8_t  month = Blinker.month(); //月
  488.   int8_t  mday  = Blinker.mday(); //日
  489.   int8_t  wday  = Blinker.wday(); //星期
  490.   int8_t  hour  = Blinker.hour(); //时
  491.   int8_t  min   = Blinker.minute(); //分
  492.   int8_t  sec   = Blinker.second(); //秒

  493.   if (month < 10) {
  494.     monthbl = String("") + "0" + month;
  495.   }
  496.   else {
  497.     monthbl = String("") + month;
  498.   }
  499.   if (mday < 10) {
  500.     mdaybl = String("") + "0" + mday;
  501.   }
  502.   else {
  503.     mdaybl = String("") + mday;
  504.   }

  505.   if (hour < 10) {
  506.     hourbl = String("") + "0" + hour;
  507.   }
  508.   else {
  509.     hourbl = String("") + hour;
  510.   }
  511.   if (min < 10) {
  512.     minbl = String("") + "0" + min;
  513.   }
  514.   else {
  515.     minbl = String("") + min;
  516.   }
  517.   if (sec < 10) {
  518.     secbl = String("") + "0" + sec;
  519.   }
  520.   else {
  521.     secbl = String("") + sec;
  522.   }

  523.   u8g2.setFont(u8g2_font_ncenB12_tr);
  524.   rq = String("") + year + "/"  + monthbl + "/" + mdaybl;
  525.   u8g2.setCursor(20, 26); //显示位置
  526.   u8g2.print(rq);
  527.   sj = String("") + hourbl + ":"  + minbl + ":" + secbl;
  528.   u8g2.setCursor(30, 44); //显示位置
  529.   u8g2.print(sj);

  530.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);
  531.   u8g2.setCursor(46, 60);
  532.   if (wday == 0) {
  533.     u8g2.print("星期日");
  534.   }
  535.   if (wday == 1) {
  536.     u8g2.print("星期一");
  537.   }
  538.   if (wday == 2) {
  539.     u8g2.print("星期二");
  540.   }
  541.   if (wday == 3) {
  542.     u8g2.print("星期三");
  543.   }
  544.   if (wday == 4) {
  545.     u8g2.print("星期四");
  546.   }
  547.   if (wday == 5) {
  548.     u8g2.print("星期五");
  549.   }
  550.   if (wday == 6) {
  551.     u8g2.print("星期六");
  552.   }
  553. }
  554. /*********************************************************************************************************
  555.   OLED显示中间时间

  556. *********************************************************************************************************/
  557. void time_OLED2() {
  558.   u8g2.setFont(u8g2_font_ncenB08_tr);
  559.   int8_t hour = Blinker.hour(); //时
  560.   if (hour > -1) {
  561.     time_2();
  562.   }
  563.   else {
  564.     u8g2.drawStr(37, 8, "--:--"); //返回错误值
  565.   }
  566. }
  567. void time_2() {
  568.   String sj2; String hourbl2; String minbl2;
  569.   int8_t hour = Blinker.hour(); //时
  570.   int8_t min = Blinker.minute(); //分

  571.   if (hour < 10) {
  572.     hourbl2 = String("") + "0" + hour;
  573.   }
  574.   else {
  575.     hourbl2 = String("") + hour;
  576.   }
  577.   if (min < 10) {
  578.     minbl2 = String("") + "0" + min;
  579.   }
  580.   else {
  581.     minbl2 = String("") + min;
  582.   }

  583.   sj2 = String("") + hourbl2 + ":"  + minbl2 ;
  584.   u8g2.setCursor(37, 8); //显示位置
  585.   u8g2.print(sj2);
  586. }
  587. /*********************************************************************************************************
  588.   OLED显示右上角温度

  589. *********************************************************************************************************/
  590. void DTH11_OLED2() {
  591.   DHT11_1();
  592.   String wendu2;
  593.   wendu2 = String("") + temp_read + "*C";
  594.   u8g2.setFont(u8g2_font_ncenB08_tr);
  595.   u8g2.setCursor(75, 8);
  596.   u8g2.print(wendu2);
  597. }
  598. /*********************************************************************************************************
  599.   OLED第零屏显示,WiFi,ip

  600. *********************************************************************************************************/
  601. void OLED_0() {
  602.   ip_OLED_0();
  603.   yanshi();
  604.   Blinker.run();
  605.   yxsj_OLED_0();
  606. }
  607. /*********************************************************************************************************
  608.   OLED第一屏显示,时间

  609. *********************************************************************************************************/
  610. void OLED_1() {
  611.   u8g2.clearBuffer();
  612.   u8g2.firstPage();
  613.   Wifi_OLED();
  614.   time_OLED();
  615.   DTH11_OLED2();
  616.   u8g2.nextPage();
  617. }
  618. /*********************************************************************************************************
  619.   OLED第二屏显示,WiFi,温度

  620. *********************************************************************************************************/
  621. void OLED_2() {
  622.   u8g2.clearBuffer();
  623.   u8g2.firstPage();
  624.   Wifi_OLED();
  625.   DTH11_OLED();
  626.   time_OLED2();
  627.   u8g2.nextPage();
  628. }
  629. /*********************************************************************************************************
  630.   OLED第三屏显示,天气

  631. *********************************************************************************************************/
  632. void OLED_3() {
  633.   w_OLED();
  634.   yanshi();
  635.   Blinker.run();
  636.   w_OLED2();
  637. }
  638. /*********************************************************************************************************
  639.   OLED第四屏显示,空气

  640. *********************************************************************************************************/
  641. void OLED_4() {
  642.   u8g2.clearBuffer();
  643.   u8g2.firstPage();
  644.   Wifi_OLED();
  645.   time_OLED2();
  646.   DTH11_OLED2();
  647.   aqi_OLED();
  648.   u8g2.nextPage();
  649. }
  650. /*********************************************************************************************************
  651.   按键操作OLED显示WiFi

  652. *********************************************************************************************************/
  653. void Btn_wifi_callback(const String & state) {
  654.   //BLINKER_LOG("get button state3: ", state);
  655.   if (state == "on") {
  656.     if (a1 == 0) {
  657.       b0 = 2; b1 = 0; b2 = 0; b3 = 0; b4 = 0; //单独显示WiFi
  658.       Blinker.vibrate();
  659.       fmq_1m();
  660.       huidiaoneirong();
  661.     }
  662.   }
  663.   else if (state == "off") {
  664.     if (a1 == 0) {
  665.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1; //恢复屏幕滚动显示
  666.       Blinker.vibrate();
  667.       fmq_1m();
  668.       huidiaoneirong();
  669.     }
  670.   }
  671. }
  672. /*********************************************************************************************************
  673.   按键操作OLED显示时间

  674. *********************************************************************************************************/
  675. void Btn_time_callback(const String & state) {
  676.   //BLINKER_LOG("get button state1: ", state);
  677.   if (state == "on") {
  678.     if (a1 == 0) {
  679.       b0 = 0; b1 = 2; b2 = 0; b3 = 0; b4 = 0;
  680.       Blinker.vibrate();
  681.       fmq_1m();
  682.       huidiaoneirong();
  683.     }
  684.   }
  685.   else if (state == "off") {
  686.     if (a1 == 0) {
  687.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  688.       Blinker.vibrate();
  689.       fmq_1m();
  690.       huidiaoneirong();
  691.     }
  692.   }
  693. }
  694. /*********************************************************************************************************
  695.   按键操作OLED显示温湿度

  696. *********************************************************************************************************/
  697. void Btn_temp_humi_callback(const String & state) {
  698.   //BLINKER_LOG("get button state2: ", state);
  699.   if (state == "on") {
  700.     if (a1 == 0) {
  701.       b0 = 0; b1 = 0; b2 = 2; b3 = 0; b4 = 0;
  702.       Blinker.vibrate();
  703.       fmq_1m();
  704.       huidiaoneirong();
  705.     }
  706.   }
  707.   else if (state == "off") {
  708.     if (a1 == 0) {
  709.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  710.       Blinker.vibrate();
  711.       fmq_1m();
  712.       huidiaoneirong();
  713.     }
  714.   }
  715. }
  716. /*********************************************************************************************************
  717.   按键操作OLED显示天气

  718. *********************************************************************************************************/
  719. void Btn_weather_callback(const String & state) {
  720.   //BLINKER_LOG("get button state3: ", state);
  721.   if (state == "on") {
  722.     if (a1 == 0) {
  723.       b0 = 0; b1 = 0; b2 = 0; b3 = 2; b4 = 0;
  724.       Blinker.vibrate();
  725.       fmq_1m();
  726.       huidiaoneirong();
  727.     }
  728.   }
  729.   else if (state == "off") {
  730.     if (a1 == 0) {
  731.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  732.       Blinker.vibrate();
  733.       fmq_1m();
  734.       huidiaoneirong();
  735.     }
  736.   }
  737. }
  738. /*********************************************************************************************************
  739.   按键操作OLED显示空气质量

  740. *********************************************************************************************************/
  741. void Btn_air_callback(const String & state) {
  742.   //BLINKER_LOG("get button state3: ", state);
  743.   if (state == "on") {
  744.     if (a1 == 0) {
  745.       b0 = 0; b1 = 0; b2 = 0; b3 = 0; b4 = 2;
  746.       Blinker.vibrate();
  747.       fmq_1m();
  748.       huidiaoneirong();
  749.     }
  750.   }
  751.   else if (state == "off") {
  752.     if (a1 == 0) {
  753.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  754.       Blinker.vibrate();
  755.       fmq_1m();
  756.       huidiaoneirong();
  757.     }
  758.   }
  759. }
  760. /*********************************************************************************************************
  761.   按键操作OLED屏幕滚动

  762. *********************************************************************************************************/
  763. void Btn_Refresh_callback(const String & state) {
  764.   //BLINKER_LOG("get button state4: ", state);
  765.   b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1; c2 = 0;
  766.   Blinker.vibrate();
  767.   fmq_1m();
  768.   dingshiguanbioled();
  769.   huidiaoneirong();
  770. }
  771. /*********************************************************************************************************
  772.   按键操作开关OLED屏幕

  773. *********************************************************************************************************/
  774. void Btn_OLED_callback(const String & state) {
  775.   //BLINKER_LOG("get button state5: ", state);
  776.   if (state == "on") {
  777.     a1 = 0; c2 = 1; b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  778.     Blinker.vibrate();
  779.     fmq_1m();
  780.     huidiaoneirong();
  781.     u8g2.setPowerSave(a1);
  782.   }
  783.   else if (state == "off") {
  784.     a1 = 1; c2 = 1; b0 = 0; b1 = 0; b2 = 0; b3 = 0; b4 = 0;
  785.     Blinker.vibrate();
  786.     fmq_1m();
  787.     huidiaoneirong();
  788.     u8g2.setPowerSave(a1);
  789.   }
  790. }
  791. /*********************************************************************************************************
  792.   按键操作蜂鸣器

  793. *********************************************************************************************************/
  794. void Btn_fmq_callback(const String & state) {
  795.   //BLINKER_LOG("get button state5: ", state);
  796.   if (state == "on") {
  797.     c1 = 1;
  798.     Blinker.vibrate();
  799.     digitalWrite(fmq1, LOW);
  800.     Btn_fmq.icon("fal fa-bell-on");
  801.     Btn_fmq.text("蜂鸣器打开");
  802.     Btn_fmq.print("on");
  803.   }
  804.   else if (state == "off") {
  805.     c1 = 0;
  806.     Blinker.vibrate();
  807.     digitalWrite(fmq1, HIGH);
  808.     Btn_fmq.icon("fal fa-bell");
  809.     Btn_fmq.text("蜂鸣器关闭");
  810.     Btn_fmq.print("off");
  811.   }
  812. }
  813. /*********************************************************************************************************
  814.   按键操作小夜灯

  815. *********************************************************************************************************/
  816. void Btn_xyd_callback(const String & state) {
  817.   //BLINKER_LOG("get button state5: ", state);
  818.   if (state == "on") {
  819.     c3 = 1;
  820.     fmq_1m();
  821.     Blinker.vibrate();
  822.     digitalWrite(xyd1, HIGH);
  823.     digitalWrite(xyd2, HIGH);
  824.     huidiaoneirong();
  825.   }
  826.   else if (state == "off") {
  827.     c3 = 0;
  828.     fmq_1m();
  829.     Blinker.vibrate();
  830.     digitalWrite(xyd1, LOW);
  831.     digitalWrite(xyd2, LOW);
  832.     huidiaoneirong();
  833.     Blinker.delay(50);
  834.     digitalWrite(xyd2, HIGH);
  835.   }
  836. }
  837. /*********************************************************************************************************
  838.   切屏滑动条

  839. *********************************************************************************************************/
  840. void slider1_callback(int32_t value)
  841. {
  842.   BLINKER_LOG("get slider value: ", value);
  843.   EEPROM.begin(4000);
  844.   EEPROM.write(2449, value);
  845.   Slider1.print(value);
  846.   EEPROM.end();
  847. }

  848. /*********************************************************************************************************
  849.   按键状态回调函数

  850. *********************************************************************************************************/
  851. void huidiaoneirong() {
  852.   if (b0 == 0) {
  853.     Btn_wifi.icon("fal fa-wifi");
  854.     Btn_wifi.text("WiFi信息");
  855.     Btn_wifi.print("off");
  856.   }
  857.   if (b0 == 1) {
  858.     Btn_wifi.icon("fal fa-wifi");
  859.     Btn_wifi.text("WiFi信息");
  860.     Btn_wifi.print("off");
  861.   }
  862.   if (b0 == 2) {
  863.     Btn_wifi.icon("fal fa-wifi");
  864.     Btn_wifi.text("显示WiFi信息");
  865.     Btn_wifi.print("on");
  866.   }

  867.   if (b1 == 0) {
  868.     Btn_time.text("时间");
  869.     Btn_time.print("off");
  870.   }
  871.   if (b1 == 1) {
  872.     Btn_time.text("时间");
  873.     Btn_time.print("off");
  874.   }
  875.   if (b1 == 2) {
  876.     Btn_time.text("显示时间");
  877.     Btn_time.print("on");
  878.   }

  879.   if (b2 == 0) {
  880.     Btn_temp_humi.text("温湿度");
  881.     Btn_temp_humi.print("off");
  882.   }
  883.   if (b2 == 1) {
  884.     Btn_temp_humi.text("温湿度");
  885.     Btn_temp_humi.print("off");
  886.   }
  887.   if (b2 == 2) {
  888.     Btn_temp_humi.text("显示温湿度");
  889.     Btn_temp_humi.print("on");
  890.   }

  891.   if (b3 == 0) {
  892.     Btn_weather.text("天气信息");
  893.     Btn_weather.print("off");
  894.   }
  895.   if (b3 == 1) {
  896.     Btn_weather.text("天气信息");
  897.     Btn_weather.print("off");
  898.   }
  899.   if (b3 == 2) {
  900.     Btn_weather.text("显示天气信息");
  901.     Btn_weather.print("on");
  902.   }

  903.   if (b4 == 0) {
  904.     Btn_air.text("空气信息");
  905.     Btn_air.print("off");
  906.   }
  907.   if (b4 == 1) {
  908.     Btn_air.text("空气信息");
  909.     Btn_air.print("off");
  910.   }
  911.   if (b4 == 2) {
  912.     Btn_air.text("显示空气信息");
  913.     Btn_air.print("on");
  914.   }

  915.   if (c2 == 0 ) {
  916.     if (a1 == 0 ) {
  917.       Btn_OLED.icon("fas fa-toggle-on");
  918.       Btn_OLED.text("屏幕自动打开");
  919.       Btn_OLED.print("on");
  920.     }
  921.   }
  922.   if (c2 == 0 ) {
  923.     if (a1 == 1 ) {
  924.       Btn_OLED.icon("fas fa-toggle-off");
  925.       Btn_OLED.text("屏幕自动关闭");
  926.       Btn_OLED.print("off");
  927.     }
  928.   }
  929.   if (c2 == 1 ) {
  930.     if (a1 == 0 ) {
  931.       Btn_OLED.icon("fas fa-toggle-on");
  932.       Btn_OLED.text("屏幕手动打开");
  933.       Btn_OLED.print("on");
  934.     }
  935.   }
  936.   if (c2 == 1 ) {
  937.     if (a1 == 1 ) {
  938.       Btn_OLED.icon("fas fa-toggle-off");
  939.       Btn_OLED.text("屏幕手动关闭");
  940.       Btn_OLED.print("off");
  941.     }
  942.   }

  943.   if (c3 == 0 ) {
  944.     Btn_xyd.icon("fal fa-lightbulb");
  945.     Btn_xyd.text("小夜灯关闭");
  946.     Btn_xyd.print("off");
  947.   }
  948.   if (c3 == 1 ) {
  949.     Btn_xyd.icon("fal fa-lightbulb-on");
  950.     Btn_xyd.text("小夜灯打开");
  951.     Btn_xyd.print("on");
  952.   }

  953.   Blinker.delay(1000);
  954.   if (c1 == 0 ) {
  955.     Btn_fmq.icon("fal fa-bell");
  956.     Btn_fmq.text("蜂鸣器关闭");
  957.     Btn_fmq.print("off");
  958.   }
  959.   if (c1 == 1 ) {
  960.     Btn_fmq.icon("fal fa-bell-on");
  961.     Btn_fmq.text("蜂鸣器打开");
  962.     Btn_fmq.print("on");
  963.   }

  964.   Number1.icon("fal fa-wifi");
  965.   Number1.print(WiFi.RSSI());
  966.   Text_ip.print(WiFi.localIP().toString().c_str());

  967.   EEPROM.begin(4000);
  968.   int shua3 = EEPROM.read(2449);
  969.   shua2 = shua3;
  970.   Slider1.print(shua2);
  971.   EEPROM.end();

  972. }

  973. /*********************************************************************************************************
  974.   收到指令蜂鸣器响一声

  975. *********************************************************************************************************/
  976. void fmq_1m() {
  977.   c1 = 0;
  978.   digitalWrite(fmq1, LOW);
  979.   Blinker.delay(50);
  980.   digitalWrite(fmq1, HIGH);
  981. }
  982. /*********************************************************************************************************
  983.   滑动条存储在EEPROM的延时函数

  984. *********************************************************************************************************/
  985. void yanshi() {
  986.   EEPROM.begin(4000);
  987.   int shua3 = EEPROM.read(2449);
  988.   shua2 = shua3;
  989.   EEPROM.end();
  990.   shua1 = shua2 * 1000;
  991.   Blinker.delay(shua1);
  992. }
  993. /*********************************************************************************************************
  994.   OLED关闭后不显示内容

  995. *********************************************************************************************************/
  996. void shifouxianshi() {
  997.   if (a1 == 0) {
  998.     if (b0 == 1) {
  999.       OLED_0();
  1000.       yanshi();
  1001.       Blinker.run();
  1002.     }
  1003.     if (b0 == 2) {
  1004.       OLED_0();
  1005.       yanshi();
  1006.     }
  1007.     if (b1 == 1) {
  1008.       OLED_1();
  1009.       yanshi();
  1010.       Blinker.run();
  1011.     }
  1012.     if (b1 == 2) {
  1013.       OLED_1();
  1014.       yanshi();
  1015.     }
  1016.     if (b2 == 1) {
  1017.       OLED_2();
  1018.       yanshi();
  1019.       Blinker.run();
  1020.     }
  1021.     if (b2 == 2) {
  1022.       OLED_2();
  1023.       yanshi();
  1024.     }
  1025.     if (b3 == 1) {
  1026.       OLED_3();
  1027.       yanshi();
  1028.       Blinker.run();
  1029.     }
  1030.     if (b3 == 2) {
  1031.       OLED_3();
  1032.       yanshi();
  1033.     }
  1034.     if (b4 == 1) {
  1035.       OLED_4();
  1036.       yanshi();
  1037.       Blinker.run();
  1038.     }
  1039.     if (b4 == 2) {
  1040.       OLED_4();
  1041.       yanshi();
  1042.     }
  1043.   }
  1044.   if (a1 == 1) {
  1045.     b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  1046.   }
  1047. }
  1048. /*********************************************************************************************************
  1049.   定时关闭OLED

  1050. *********************************************************************************************************/
  1051. void dingshiguanbioled() {
  1052.   int8_t hour = Blinker.hour();//时
  1053.   int8_t min  = Blinker.minute();//分
  1054.   if (hour < 7 ) { //小于7时自动关闭屏幕
  1055.     if (c2 == 0) {
  1056.       a1 = 1;
  1057.     }
  1058.   }
  1059.   if (hour <= -1 ) { //未获取到时间自动打开屏幕
  1060.     if (c2 == 0)   {
  1061.       a1 = 0;
  1062.     }
  1063.   }
  1064.   if (hour >= 7 ) { //等于、大于7时自动打开屏幕
  1065.     if (c2 == 0)  {
  1066.       a1 = 0;
  1067.     }
  1068.   }

  1069.   u8g2.setPowerSave(a1);

  1070.   if (hour == 0 ) { //零点切换自动模式
  1071.     if (min < 2 ) {
  1072.       c2 = 0;
  1073.     }
  1074.   }
  1075.   if (hour == 7 ) { //七点切换自动模式
  1076.     if (min < 2 ) {
  1077.       c2 = 0;
  1078.     }
  1079.   }
  1080. }
  1081. /*********************************************************************************************************
  1082.   给blinkerapp回传数据

  1083. *********************************************************************************************************/
  1084. void heartbeat() {
  1085.   HUMI.print(humi_read); //给blinkerapp回传湿度数据
  1086.   TEMP.print(temp_read); //给blinkerapp回传温度数据
  1087.   huidiaoneirong();
  1088. }
  1089. /*********************************************************************************************************
  1090.   将设置代码放在此处,运行一次

  1091. *********************************************************************************************************/
  1092. void setup() {
  1093.   //初始化端口
  1094.   Serial.begin(115200);

  1095.   Blinker.begin(auth); //初始化blinker
  1096.   BLINKER_DEBUG.stream(Serial);
  1097.   BLINKER_DEBUG.debugAll();

  1098.   pinMode(fmq1, OUTPUT); //蜂鸣器引脚设置为输出模式
  1099.   pinMode(xyd1, OUTPUT); //小夜灯引脚设置为输出模式
  1100.   pinMode(xyd2, OUTPUT); //小夜灯引脚设置为输出模式
  1101.   digitalWrite(fmq1, HIGH); //蜂鸣器引脚高电平输出
  1102.   digitalWrite(xyd1, LOW); //小夜灯引脚低电平输出
  1103.   digitalWrite(xyd2, HIGH); //小夜灯引脚高电平输出

  1104.   u8g2.begin(); //初始化OLED
  1105.   u8g2.enableUTF8Print();
  1106.   u8g2.clearBuffer();
  1107.   u8g2.clearDisplay();
  1108.   u8g2.setPowerSave(0);

  1109.   dht.begin(); //初始化DHT传感器

  1110.   Blinker.setTimezone(8.0);
  1111.   Blinker.attachHeartbeat(heartbeat); //将传感器获取的数据传给blinker app上
  1112.   Blinker.attachDataStorage(dataStorage); //注册回调函数,开启历史数据存储功能
  1113.   BlinkerAliGenie.attachQuery(aligenieQuery); //天猫精灵回调函数,回调温湿度数据给天猫精灵
  1114.   Blinker.attachWeather(weatherData); //注册回调函数,获取天气信息
  1115.   Blinker.attachAir(airData); //注册回调函数,获取空气质量信息

  1116.   Btn_time.attach(Btn_time_callback);
  1117.   Btn_temp_humi.attach(Btn_temp_humi_callback);
  1118.   Btn_wifi.attach(Btn_wifi_callback);
  1119.   Btn_Refresh.attach(Btn_Refresh_callback);
  1120.   Btn_OLED.attach(Btn_OLED_callback);
  1121.   Btn_weather.attach(Btn_weather_callback);
  1122.   Btn_air.attach(Btn_air_callback);
  1123.   Btn_fmq.attach(Btn_fmq_callback);
  1124.   Btn_xyd.attach(Btn_xyd_callback);
  1125.   Slider1.attach(slider1_callback);
  1126. }
  1127. /*********************************************************************************************************
  1128.   把主代码放在这里,重复运行
  1129.   通过循环不断读取温湿度传感器获取的数据

  1130. *********************************************************************************************************/
  1131. void loop() {
  1132.   Blinker.run(); //运行Blinker

  1133.   DHT11_1(); //开机获取环境温度
  1134.   kjgxtq(); //开机获取天气信息
  1135.   jggxtq(); //间隔更新天气信息
  1136.   dingshiguanbioled(); //定时关闭OLED
  1137.   shifouxianshi(); //关闭屏幕后不运行显部分相关程序
  1138. }
复制代码


 楼主| 发表于 2020-11-3 20:26 | 显示全部楼层
主控:8266-12F
DHT11温湿度传感器
128*64OLED屏幕
蜂鸣器

正面照

正面照
 楼主| 发表于 2020-11-4 01:06 来自手机 | 显示全部楼层
设备的背面,分成了两块洞洞板,一块是负责供电和通过US B口输出5v给小夜灯供电,通过继电器控制,另一个块是主控板的背面。船型开关用的三档型,一档电池供电;中间挡关机;二档下载程序时用来给电池充电。用电池供电不能连接主控板下载程序会短路保护,同理,下载程序时不能用电池供电。
IMG_20201103_193424.jpg
IMG_20201103_193649.jpg
 楼主| 发表于 2020-11-4 01:08 来自手机 | 显示全部楼层
显示DHT11获取到的温湿度
IMG_20201103_195036.jpg
 楼主| 发表于 2020-11-4 01:18 来自手机 | 显示全部楼层
在WIFI信息页面,分成两部分显示,第一部分主要显示的是信号强度,WIFI名称,WIFI密码,路由器IP,设备IP,MAC地址;第二部分,显示的是随便运行时间。每一页的状态栏都会显示WIFI、时间、温度、页数这些简略信息。
IMG_20201104_011122.jpg
IMG_20201103_195210.jpg
 楼主| 发表于 2020-11-4 01:24 来自手机 | 显示全部楼层
天气页面,显示通过blinker获取到的天气信息,信息过多也是分成了两部分,基本的天气情况,温湿度,风力风向这些信息
IMG_20201104_011953.jpg
IMG_20201104_011956.jpg
 楼主| 发表于 2020-11-4 01:28 来自手机 | 显示全部楼层
空气质量页面,也是通过blinker获取到的信息,获取到的信息过多,我就保留了三条,空气质量、空气等级和微颗粒物(PM2.5)。
IMG_20201104_012527.jpg
 楼主| 发表于 2020-11-4 01:52 来自手机 | 显示全部楼层
app界面设计:
一、设备回传的设备IP地址、信号强度、温湿度数据;这里的都是数据跟随心跳包刷新。
二、图表组件,看图就能明白意思。
三、OLED界面独立显示及开关按键、蜂鸣器、小夜灯开关。在程序里每个开关都是互锁的状态,让某一个页面单独显示,就会关闭其他页面;当然也可以通过自动按键来让屏幕滚动显示。
OLED屏幕的显示与不显示也可以通过按键控制;在程序里设定了,零点自动关闭和七点自动开启,但是避开这两时间点和手动操作互不影响。
关闭了屏幕,不仅屏幕不显示,APP单独显示页面的按键按下了不会让屏幕显示然后内容。
自动按钮会刷新一切,除了页面滚动,也会判断舒服需要开关屏幕,小夜灯和蜂鸣器除外。
蜂鸣器除了能一直响,在按下按键的时候也会有响声反馈。
每一次按下按键,蜂鸣器会响一声的同时也会给手机振动一次的指令。
小夜灯没啥说的就是一个普通的开关,只是电路用来高电平控制,一个io口输出的电压不够得用两个,讲程序了,在讲这个的逻辑。
Screenshot_20201104_012857_iot.clz.me.jpg
 楼主| 发表于 2021-3-17 18:35 | 显示全部楼层
  1. /*********************************************************************************************************
  2.   日期:2021/03/12
  3.   功能:WiFi+DHT11+OLED+有源蜂鸣器+继电器 8266端
  4.   作者:安少
  5.   128X64OLED显示 DHT11获取温度 蜂鸣器蜂鸣 继电器工作
  6.   调用Blinker、ESP8266、ArduinoJson、DHT、u8g2库文件
  7.   更新:按键清除WiFi配置。
  8. *********************************************************************************************************/
  9. #define BLINKER_WIFI //定义wifi模块
  10. //#define BLINKER_WITHOUT_SSL //非SSL加密通信接入,省堆栈(最新dev3.0默认不加密)
  11. #define BLINKER_PRINT Serial //给debug打开串口
  12. #define BLINKER_ESP_SMARTCONFIG //定义EspTouch/SmartConfig模式进行配网,可以用APP配网
  13. #define BLINKER_ALIGENIE_SENSOR //连接天猫精灵,定义设备类型为传感器
  14. #include <ESP8266WiFi.h> //包含ESP8266头文件,8266必须要使用的头文件
  15. #include <ArduinoJson.h> //包含ArduinoJson头文件,用于解析从点灯获取到的天气数据
  16. #include <Blinker.h> //包含Blinker头文件,用于连接点灯科技
  17. #include <DHT.h> //包含DHT头文件,用于温湿度传感器获取数据
  18. #include <U8g2lib.h> //包含u8g2头文件,用于OLED显示
  19. #include <EEPROM.h> //包含EEPROM头文件,用于EEPROM存储

  20. #ifdef U8X8_HAVE_HW_I2C          //定义OLED连接方式为I2C
  21. #include <Wire.h>
  22. #endif
  23. #ifdef U8X8_HAVE_HW_SPI          //定义OLED连接方式为SPI
  24. #include <SPI.h>
  25. #endif

  26. U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 14, /* data=*/ 2);
  27. //定义128X64四针OLED模块连接管脚io14、io2
  28. #define DHTPIN 5 //定义DHT11模块连接管脚io5
  29. #define DHTTYPE DHT11 //使用温度湿度模块的类型为DHT11
  30. DHT dht(DHTPIN, DHTTYPE); //生成DHT对象,参数是引脚和DHT的类型

  31. #define TEXTE_ip "tex-ip"
  32. #define Slider_1 "ran-shuaxin"

  33. /*********************************************************************************************************
  34.   定义全局变量

  35. *********************************************************************************************************/
  36. char auth[] = "***********"; //你的设备key

  37. int location = 0000000; //定义天气地址,官网查询地址数字代码

  38. float humi_read = 0, temp_read = 0; //定义浮点型全局变量 储存传感器读取的温湿度数据

  39. const int fmq1 = 13; //定义蜂鸣器引脚
  40. const int xyd1 = 12; //定义小夜灯引脚
  41. const int xyd2 = 4; //定义小夜灯辅助引脚
  42. const int wifirst = 16;//定义按键清除WiFi配置引脚

  43. int a1 = 0; //用于开关OLED
  44. int a2 = 0; //用于上电更新天气
  45. int a3 = 0; //用于间隔更新天气
  46. int a4 = 0; //用于联网更新天气

  47. int b0 = 0; //用于OLED页面的
  48. int b1 = 1;
  49. int b2 = 1;
  50. int b3 = 1;
  51. int b4 = 1;

  52. int c1 = 0; //用于蜂鸣器
  53. int c2 = 0; //用于控制OLED
  54. int c3 = 0; //用于小夜灯
  55. int wifirstState = 0;//清除WiFi配置

  56. int tian1 = 0;
  57. int shi1  = 0;
  58. int fen1  = 0;
  59. int miao1 = 0;

  60. int shua1 = 0;
  61. int shua2 = 0;

  62. char w_weather[12] = ""; //天气
  63. char w_temp[10]    = ""; //室外温度
  64. char w_humi[24]    = ""; //室外湿度
  65. char w_wind[10]    = ""; //风向
  66. char w_power[10]   = ""; //风力

  67. char a_aqi[12]   = ""; //空气质量
  68. char a_level[12] = ""; //空气等级
  69. char a_pm25[10]  = ""; //pm2.5
  70. /*********************************************************************************************************
  71.   新建数据类型组件对象,作用:将数据传输到手机blinker app

  72. *********************************************************************************************************/
  73. BlinkerText Text_ip(TEXTE_ip);
  74. BlinkerSlider Slider1(Slider_1);
  75. BlinkerNumber HUMI("humi"); //定义湿度数据键名
  76. BlinkerNumber TEMP("temp"); //定义温度数据键名
  77. BlinkerNumber Number1("num-xinhao"); //定义信号强度键名

  78. BlinkerButton Btn_time("btn-A1");
  79. BlinkerButton Btn_temp_humi("btn-A2");
  80. BlinkerButton Btn_wifi("btn-A3");
  81. BlinkerButton Btn_Refresh("btn-A4");
  82. BlinkerButton Btn_OLED("btn-A5");
  83. BlinkerButton Btn_weather("btn-A6");
  84. BlinkerButton Btn_air("btn-A7");
  85. BlinkerButton Btn_fmq("btn-A8");
  86. BlinkerButton Btn_xyd("btn-A9");
  87. BlinkerButton Btn_WIFIEE("btn-A10");
  88. /*********************************************************************************************************
  89.   读取DHT11传感器的温湿度数据

  90. *********************************************************************************************************/
  91. void DHT11_1() {
  92.   float h = dht.readHumidity(); //读取DHT11传感器的湿度 并赋值给h
  93.   float t = dht.readTemperature(); //读取传感器的温度   并赋值给t
  94.   if (isnan(h) || isnan(t)) { //判断是否成功读取到温湿度数据
  95.     BLINKER_LOG("读取温湿度失败!");
  96.     if (a1 == 1) {
  97.       Blinker.delay(2000);
  98.     }
  99.   }
  100.   else { //成功读取到数据
  101.     //打印
  102.     // BLINKER_LOG("Humidity: ", h, " %");
  103.     // BLINKER_LOG("Temperature: ", t, " *C");

  104.     temp_read = t - 0.6;   //校准温度
  105.     humi_read = h - 11;    //校准湿度
  106.   }
  107. }
  108. /*********************************************************************************************************
  109.   云存储回调函数

  110. *********************************************************************************************************/
  111. void dataStorage() {
  112.   Blinker.dataStorage("temp", temp_read);
  113.   Blinker.dataStorage("humi", humi_read);
  114. }
  115. /*********************************************************************************************************
  116.   天猫精灵温湿度回调函数

  117. *********************************************************************************************************/
  118. void aligenieQuery(int32_t queryCode) {
  119.   switch (queryCode) {
  120.     case BLINKER_CMD_QUERY_ALL_NUMBER :
  121.       BLINKER_LOG("AliGenie Query All");
  122.       BlinkerAliGenie.temp(temp_read);
  123.       BlinkerAliGenie.humi(humi_read);
  124.       BlinkerAliGenie.print();
  125.       break;
  126.     case BLINKER_CMD_QUERY_TEMP_NUMBER :
  127.       BlinkerAliGenie.temp(temp_read);
  128.       BlinkerAliGenie.print();
  129.       break;
  130.     case BLINKER_CMD_QUERY_HUMI_NUMBER :
  131.       BlinkerAliGenie.humi(humi_read);
  132.       BlinkerAliGenie.print();
  133.       break;
  134.     default :
  135.       BlinkerAliGenie.temp(20);
  136.       BlinkerAliGenie.humi(20);
  137.       BlinkerAliGenie.print();
  138.       break;
  139.   }
  140. }

  141. /*********************************************************************************************************
  142.   获取DHT11状态并用OLED显示

  143. *********************************************************************************************************/
  144. void DTH11_OLED() {
  145.   String wendu;
  146.   wendu = String("") + "室内温度:" + temp_read + "°C";
  147.   String shidu;
  148.   shidu = String("") + "室内湿度:" + humi_read + "%RH";

  149.   u8g2.setFont(u8g2_font_ncenB08_tr);
  150.   u8g2.drawStr(122, 8, "2");
  151.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);
  152.   u8g2.setCursor(0, 25);
  153.   u8g2.print(wendu);

  154.   u8g2.setCursor(0, 40);
  155.   u8g2.print(shidu);
  156. }
  157. /*********************************************************************************************************
  158.   给一个地址获取天气数据
  159.   功能;通过地址参数获取天气信息延时一秒后在空气信息
  160.   输入参数:给 weather 输入地址参数
  161.   输入参数:给 aqi 输入地址参数
  162. *********************************************************************************************************/
  163. void tianqi() {
  164.   Blinker.weather(location);
  165.   Blinker.delay(1000);
  166.   Blinker.aqi(location);
  167. }
  168. /*********************************************************************************************************
  169.   开机更新天气信息
  170.   功能:开机等待五秒后获取天气信息
  171.   变量:a2 判断是否获取过天气信息
  172.   调用函数:tianqi();
  173.   运行流程:a2等于0则调用天气地址函数获取天气信息,否则不执行调用天气地址函数获取天气信息并跳出当前函数
  174. *********************************************************************************************************/
  175. void kjgxtq() {
  176.   if (a2 == 0) {
  177.     Blinker.delay(5000);
  178.     tianqi();
  179.     BLINKER_LOG("开机是否更新天气", a2);
  180.   }
  181. }
  182. /*********************************************************************************************************
  183.   间隔更新天气信息
  184.   功能:间隔一定的时间后在获取天气信息
  185.   变量:a3 判断是否到达预定时间
  186.   变量:hour 获取当前小时
  187.   变量:min 获取当前分钟
  188.   调用函数:tianqi();
  189.   运行流程:a3等于对则调用天气地址函数获取天气信息,否则不执行调用天气地址函数获取天气信息并跳出当前函数
  190. *********************************************************************************************************/
  191. void jggxtq() {
  192.   int8_t hour = Blinker.hour();//时
  193.   int8_t min  = Blinker.minute();//分

  194.   if (hour == 0) {
  195.     a3 = 0;
  196.   }
  197.   if (hour == 4) {
  198.     a3 = 4;
  199.   }
  200.   if (hour == 8) {
  201.     a3 = 8;
  202.   }
  203.   if (hour == 10) {
  204.     a3 = 10;
  205.   }
  206.   if (hour == 12) {
  207.     a3 = 12;
  208.   }
  209.   if (hour == 14) {
  210.     a3 = 14;
  211.   }
  212.   if (hour == 16) {
  213.     a3 = 16;
  214.   }
  215.   if (hour == 18) {
  216.     a3 = 18;
  217.   }
  218.   if (hour == 20) {
  219.     a3 = 20;
  220.   }
  221.   if (hour == 22) {
  222.     a3 = 22;
  223.   }
  224.   if (hour == a3) {
  225.     if (min == 0) {
  226.       tianqi();//间隔更新天气
  227.       Blinker.delay(40000);
  228.     }
  229.   }
  230. }
  231. /*********************************************************************************************************
  232.   天气回调函数

  233. *********************************************************************************************************/
  234. void weatherData(const String & data) {
  235.   //BLINKER_LOG("天气: ", data);
  236.   DynamicJsonDocument jsonBuffer(400);
  237.   DeserializationError error = deserializeJson(jsonBuffer, data);
  238.   JsonObject doc = jsonBuffer.as<JsonObject>();
  239.   if (data[0] == '{') {
  240.     strcpy(w_weather, jsonBuffer["weather"]); //天气
  241.     strcpy(w_temp, jsonBuffer["temp"]); //室外温度
  242.     strcpy(w_humi, jsonBuffer["humi"]); //室外湿度
  243.     strcpy(w_wind, jsonBuffer["wind"]); //风向
  244.     strcpy(w_power, jsonBuffer["power"]); //风力
  245.   }
  246.   else {
  247.     //天气获取失败
  248.     BLINKER_LOG("weatherData_error!");
  249.     delay(1000);
  250.     return;
  251.   }
  252. }
  253. /*********************************************************************************************************
  254.   获取WiFi状态并在左上角显示

  255. *********************************************************************************************************/
  256. void Wifi_OLED() {
  257.   u8g2.setFont(u8g2_font_ncenB08_tr);
  258.   u8g2.drawHLine(0, 10, 128);
  259.   u8g2.drawHLine(0, 63, 128);
  260.   uint8 status; //记录连接状态
  261.   status = wifi_station_get_connect_status(); //获得连接的状态
  262.   if (status == STATION_GOT_IP) {
  263.     u8g2.drawStr(0, 8, "WiFi");
  264.     if (a4 == 0) {
  265.       a2 = 0;
  266.       BLINKER_LOG("联网是否更新天气", a4);
  267.     }
  268.   }
  269.   else {
  270.     u8g2.drawStr(0, 8, "----");
  271.     a2 = 1;
  272.     BLINKER_LOG("联网是否更新天气", a4);
  273.   }
  274. }
  275. /*********************************************************************************************************
  276.   获取时间信息

  277. *********************************************************************************************************/
  278. void time_1() {
  279.   String rq; String sj;
  280.   String monthbl; String mdaybl;
  281.   String hourbl; String minbl; String secbl;

  282.   int16_t year  = Blinker.year(); //年
  283.   int8_t  month = Blinker.month(); //月
  284.   int8_t  mday  = Blinker.mday(); //日
  285.   int8_t  wday  = Blinker.wday(); //星期
  286.   int8_t  hour  = Blinker.hour(); //时
  287.   int8_t  min   = Blinker.minute(); //分
  288.   int8_t  sec   = Blinker.second(); //秒

  289.   if (month < 10) {
  290.     monthbl = String("") + "0" + month;
  291.   }
  292.   else {
  293.     monthbl = String("") + month;
  294.   }
  295.   if (mday < 10) {
  296.     mdaybl = String("") + "0" + mday;
  297.   }
  298.   else {
  299.     mdaybl = String("") + mday;
  300.   }

  301.   if (hour < 10) {
  302.     hourbl = String("") + "0" + hour;
  303.   }
  304.   else {
  305.     hourbl = String("") + hour;
  306.   }
  307.   if (min < 10) {
  308.     minbl = String("") + "0" + min;
  309.   }
  310.   else {
  311.     minbl = String("") + min;
  312.   }
  313.   if (sec < 10) {
  314.     secbl = String("") + "0" + sec;
  315.   }
  316.   else {
  317.     secbl = String("") + sec;
  318.   }

  319.   u8g2.setFont(u8g2_font_ncenB12_tr);
  320.   rq = String("") + year + "/"  + monthbl + "/" + mdaybl;
  321.   u8g2.setCursor(20, 26); //显示位置
  322.   u8g2.print(rq);
  323.   sj = String("") + hourbl + ":"  + minbl + ":" + secbl;
  324.   u8g2.setCursor(30, 44); //显示位置
  325.   u8g2.print(sj);

  326.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);
  327.   u8g2.setCursor(46, 60);
  328.   if (wday == 0) {
  329.     u8g2.print("星期日");
  330.   }
  331.   if (wday == 1) {
  332.     u8g2.print("星期一");
  333.   }
  334.   if (wday == 2) {
  335.     u8g2.print("星期二");
  336.   }
  337.   if (wday == 3) {
  338.     u8g2.print("星期三");
  339.   }
  340.   if (wday == 4) {
  341.     u8g2.print("星期四");
  342.   }
  343.   if (wday == 5) {
  344.     u8g2.print("星期五");
  345.   }
  346.   if (wday == 6) {
  347.     u8g2.print("星期六");
  348.   }
  349. }
  350. /*********************************************************************************************************
  351.   获取时间状态并用OLED显示

  352. *********************************************************************************************************/
  353. void time_OLED() {
  354.   u8g2.setFont(u8g2_font_ncenB08_tr);
  355.   u8g2.drawStr(122, 8, "1");
  356.   int16_t year = Blinker.year(); //年
  357.   if (year > 0) {
  358.     time_1();
  359.   }
  360.   else {
  361.     u8g2.setFont(u8g2_font_ncenB12_tr);
  362.     u8g2.drawStr(10, 36, "Time not set"); //返回错误值
  363.   }
  364. }
  365. /*********************************************************************************************************
  366.   OLED显示中间时间

  367. *********************************************************************************************************/
  368. void time_2() {
  369.   String sj2; String hourbl2; String minbl2;
  370.   int8_t hour = Blinker.hour(); //时
  371.   int8_t min = Blinker.minute(); //分

  372.   if (hour < 10) {
  373.     hourbl2 = String("") + "0" + hour;
  374.   }
  375.   else {
  376.     hourbl2 = String("") + hour;
  377.   }
  378.   if (min < 10) {
  379.     minbl2 = String("") + "0" + min;
  380.   }
  381.   else {
  382.     minbl2 = String("") + min;
  383.   }

  384.   sj2 = String("") + hourbl2 + ":"  + minbl2 ;
  385.   u8g2.setCursor(37, 8); //显示位置
  386.   u8g2.print(sj2);
  387. }
  388. /*********************************************************************************************************
  389.   OLED显示中上时间

  390. *********************************************************************************************************/
  391. void time_OLED2() {
  392.   u8g2.setFont(u8g2_font_ncenB08_tr);
  393.   int8_t hour = Blinker.hour(); //时
  394.   if (hour > -1) {
  395.     time_2();
  396.   }
  397.   else {
  398.     u8g2.drawStr(37, 8, "--:--"); //返回错误值
  399.   }
  400. }
  401. /*********************************************************************************************************
  402.   OLED显示右上角温度

  403. *********************************************************************************************************/
  404. void DTH11_OLED2() {
  405.   DHT11_1();
  406.   String wendu2;
  407.   wendu2 = String("") + temp_read + "*C";
  408.   u8g2.setFont(u8g2_font_ncenB08_tr);
  409.   u8g2.setCursor(75, 8);
  410.   u8g2.print(wendu2);
  411. }
  412. /*********************************************************************************************************
  413.   获取天气信息并用OLED显示
  414.   功能:显示天气预报、室外温度、室外湿度信息
  415.   变量:w_weather1 将天气预报信息整合
  416.   变量:w_temp1 将室外温度信息整合
  417.   变量:w_humi1 将室外湿度信息整合
  418. *********************************************************************************************************/
  419. void weather_OLED() {
  420.   String w_weather1;
  421.   w_weather1 = String("") + "天气预报:" + w_weather;
  422.   String w_temp1;
  423.   w_temp1 = String("") + "室外温度:" + w_temp + "°C";
  424.   String w_humi1;
  425.   w_humi1 = String("") + "室外湿度:" + w_humi + "%RH";

  426.   u8g2.setFont(u8g2_font_ncenB08_tr);
  427.   u8g2.drawStr(122, 8, "3");
  428.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);

  429.   u8g2.setCursor(0, 25);
  430.   u8g2.print(w_weather1);

  431.   u8g2.setCursor(0, 40);
  432.   u8g2.print(w_temp1);

  433.   u8g2.setCursor(0, 55);
  434.   u8g2.print(w_humi1);
  435. }
  436. /*********************************************************************************************************
  437.   获取天气信息并用OLED显示
  438.   功能:显示室外风向、室外风力信息
  439.   变量:w_wind1 将室外风向信息整合
  440.   变量:w_power1 将室外风力信息整合
  441. *********************************************************************************************************/
  442. void weather_OLED2() {
  443.   String w_wind1;
  444.   w_wind1 = String("") + "室外风向:" + w_wind;
  445.   String w_power1;
  446.   w_power1 = String("") + "室外风力:" + w_power + "级";

  447.   u8g2.setFont(u8g2_font_ncenB08_tr);
  448.   u8g2.drawStr(122, 8, "3");
  449.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);

  450.   u8g2.setCursor(0, 25);
  451.   u8g2.print(w_wind1);

  452.   u8g2.setCursor(0, 40);
  453.   u8g2.print(w_power1);
  454. }
  455. void w_OLED() {
  456.   u8g2.clearBuffer();
  457.   u8g2.firstPage();
  458.   Wifi_OLED();
  459.   time_OLED2();
  460.   DTH11_OLED2();
  461.   weather_OLED();
  462.   u8g2.nextPage();
  463. }
  464. void w_OLED2() {
  465.   u8g2.clearBuffer();
  466.   u8g2.firstPage();
  467.   Wifi_OLED();
  468.   time_OLED2();
  469.   DTH11_OLED2();
  470.   weather_OLED2();
  471.   u8g2.nextPage();
  472. }
  473. /*********************************************************************************************************
  474.   空气质量回调函数

  475. *********************************************************************************************************/
  476. void airData(const String & data) {
  477.   //BLINKER_LOG("空气质量: ", data);
  478.   DynamicJsonDocument jsonBuffer(512);
  479.   DeserializationError error = deserializeJson(jsonBuffer, data);
  480.   JsonObject doc = jsonBuffer.as<JsonObject>();
  481.   if (data[0] == '{') {
  482.     strcpy(a_aqi, jsonBuffer["aqi"]); //空气质量
  483.     strcpy(a_level, jsonBuffer["level"]); //空气等级
  484.     strcpy(a_pm25, jsonBuffer["pm25"]); //pm2.5
  485.     a2 = 1; a4 = 1;
  486.   }
  487.   else {
  488.     BLINKER_LOG("airData_error!");
  489.     //Serial.println(error.c_str());
  490.     delay(1000);
  491.     a2 = 1; a4 = 1;
  492.     return;
  493.   }
  494. }
  495. /*********************************************************************************************************
  496.   获取空气信息并用OLED显示

  497. *********************************************************************************************************/
  498. void aqi_OLED() {
  499.   String a_aqi1;
  500.   a_aqi1 = String("") + "空气质量:" + a_aqi;
  501.   String a_level1;
  502.   a_level1 = String("") + "空气等级:" + a_level;
  503.   String a_pm251;
  504.   a_pm251 = String("") + "微颗粒物:" + a_pm25;

  505.   u8g2.setFont(u8g2_font_ncenB08_tr);
  506.   u8g2.drawStr(122, 8, "4");
  507.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);

  508.   u8g2.setCursor(0, 25);
  509.   u8g2.print(a_aqi1);

  510.   u8g2.setCursor(0, 40);
  511.   u8g2.print(a_level1);

  512.   u8g2.setCursor(0, 55);
  513.   u8g2.print(a_pm251);
  514. }
  515. /*********************************************************************************************************
  516.   获取ip相关信息
  517.   调用函数:WiFi.SSID 获取WiFi名称
  518.   调用函数:WiFi.psk  获取WiFi密码
  519.   调用函数:WiFi.gatewayIP 获取网关IP
  520.   调用函数:WiFi.localIP 获取本地IP
  521.   调用函数:WiFi.macAddress 获取  MAC地址
  522.   调用函数:WiFi.RSSI 获取WiFi信号强度
  523. *********************************************************************************************************/
  524. void ip_OLED() {
  525.   u8g2.setFont(u8g2_font_ncenB08_tr);
  526.   u8g2.drawHLine(0, 10, 128);
  527.   u8g2.drawHLine(0, 63, 128);
  528.   u8g2.drawStr(122, 8, "0");

  529.   u8g2.drawStr(0, 21, "SSID");
  530.   u8g2.drawStr(31, 21, ":");
  531.   u8g2.setCursor(34, 21);
  532.   u8g2.print(WiFi.SSID());

  533.   u8g2.drawStr(0, 31, "Pswd");
  534.   u8g2.drawStr(31, 31, ":");
  535.   u8g2.setCursor(34, 31);
  536.   u8g2.print(WiFi.psk());

  537.   u8g2.drawStr(0, 41, "GaIP");
  538.   u8g2.drawStr(31, 41, ":");
  539.   u8g2.setCursor(34, 41);
  540.   u8g2.print(WiFi.gatewayIP());

  541.   u8g2.drawStr(0, 51, "LoIP");
  542.   u8g2.drawStr(31, 51, ":");
  543.   u8g2.setCursor(34, 51);
  544.   u8g2.print(WiFi.localIP());

  545.   u8g2.drawStr(0, 61, "MAC");
  546.   u8g2.drawStr(29, 61, ":");
  547.   u8g2.setCursor(33, 61);
  548.   u8g2.print(WiFi.macAddress());

  549.   u8g2.setCursor(0, 8);
  550.   u8g2.print(WiFi.RSSI());
  551. }
  552. /*********************************************************************************************************
  553.   获取ip相关信息并用OLED显示

  554. *********************************************************************************************************/
  555. void ip_OLED_0() {
  556.   u8g2.clearBuffer();
  557.   u8g2.firstPage();
  558.   ip_OLED();
  559.   time_OLED2();
  560.   DTH11_OLED2();
  561.   u8g2.nextPage();
  562. }
  563. /*********************************************************************************************************
  564.   获取运行时间信息

  565. *********************************************************************************************************/
  566. void yxsj_OLED() {
  567.   String fh; String tianbl; String shibl; String fenbl; String miaobl;

  568.   u8g2.setFont(u8g2_font_ncenB08_tr);
  569.   u8g2.drawStr(122, 8, "0");
  570.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);
  571.   u8g2.setCursor(0, 25);
  572.   u8g2.print("运行时间:");

  573.   time_t run_time = Blinker.runTime(); //获取运行时间,单位为秒
  574.   tian1 =  run_time / 86400; //转化为天
  575.   shi1  = (run_time - tian1 * 86400 ) / 3600; //转化为时
  576.   fen1  = (run_time - tian1 * 86400 - shi1 * 3600) / 60; //转化为分
  577.   miao1 =  run_time - tian1 * 86400 - shi1 * 3600 - fen1 * 60; //转化为秒
  578.   if (tian1 < 10) {
  579.     tianbl = String("") + "0" + tian1;
  580.   }
  581.   else {
  582.     tianbl = String("") + tian1;
  583.   }
  584.   if (shi1 < 10) {
  585.     shibl = String("") + "0" + shi1;
  586.   }
  587.   else {
  588.     shibl = String("") + shi1;
  589.   }
  590.   if (fen1 < 10) {
  591.     fenbl = String("") + "0" + fen1;
  592.   }
  593.   else {
  594.     fenbl = String("") + fen1;
  595.   }
  596.   if (miao1 < 10) {
  597.     miaobl = String("") + "0" + miao1;
  598.   }
  599.   else {
  600.     miaobl = String("") + miao1;
  601.   }

  602.   if (tian1 == 0 & shi1 == 0 & fen1 == 0) {
  603.     fh = String("") + miaobl + "秒";
  604.   }
  605.   else if (tian1 == 0 & shi1 == 0 ) {
  606.     fh = String("") + fenbl + "分" + miaobl + "秒";
  607.   }
  608.   else if (tian1 == 0) {
  609.     fh = String("") + shibl + "时" + fenbl + "分" + miaobl + "秒";
  610.   }
  611.   else {
  612.     fh = String("") + tianbl + "天" + shibl + "时" + fenbl + "分" + miaobl + "秒";
  613.   }
  614.   u8g2.setCursor(0, 40);
  615.   u8g2.print(fh);
  616. }
  617. /*********************************************************************************************************
  618.   获取运行时间并用OLED显示

  619. *********************************************************************************************************/
  620. void yxsj_OLED_0() {
  621.   u8g2.clearBuffer();
  622.   u8g2.firstPage();
  623.   yxsj_OLED();
  624.   Wifi_OLED();
  625.   time_OLED2();
  626.   DTH11_OLED2();
  627.   u8g2.nextPage();
  628. }
  629. /*********************************************************************************************************
  630.   滑动条存储在EEPROM的延时函数

  631. *********************************************************************************************************/
  632. void yanshi() {
  633.   EEPROM.begin(2450);
  634.   int shua3 = EEPROM.read(2449);
  635.   shua2 = shua3;
  636.   EEPROM.end();
  637.   shua1 = shua2 * 1000;
  638.   Blinker.delay(shua1);
  639. }
  640. /*********************************************************************************************************
  641.   OLED第零屏显示,WiFi,ip

  642. *********************************************************************************************************/
  643. void OLED_0() {
  644.   ip_OLED_0();
  645.   yanshi();
  646.   Blinker.run();
  647.   yxsj_OLED_0();
  648. }
  649. /*********************************************************************************************************
  650.   OLED第一屏显示,时间

  651. *********************************************************************************************************/
  652. void OLED_1() {
  653.   u8g2.clearBuffer();
  654.   u8g2.firstPage();
  655.   Wifi_OLED();
  656.   time_OLED();
  657.   DTH11_OLED2();
  658.   u8g2.nextPage();
  659. }
  660. /*********************************************************************************************************
  661.   OLED第二屏显示,WiFi,温度

  662. *********************************************************************************************************/
  663. void OLED_2() {
  664.   u8g2.clearBuffer();
  665.   u8g2.firstPage();
  666.   Wifi_OLED();
  667.   DTH11_OLED();
  668.   time_OLED2();
  669.   u8g2.nextPage();
  670. }
  671. /*********************************************************************************************************
  672.   OLED第三屏显示,天气

  673. *********************************************************************************************************/
  674. void OLED_3() {
  675.   w_OLED();
  676.   yanshi();
  677.   Blinker.run();
  678.   w_OLED2();
  679. }
  680. /*********************************************************************************************************
  681.   OLED第四屏显示,空气

  682. *********************************************************************************************************/
  683. void OLED_4() {
  684.   u8g2.clearBuffer();
  685.   u8g2.firstPage();
  686.   Wifi_OLED();
  687.   time_OLED2();
  688.   DTH11_OLED2();
  689.   aqi_OLED();
  690.   u8g2.nextPage();
  691. }
  692. /*********************************************************************************************************
  693.   按键状态回调函数

  694. *********************************************************************************************************/
  695. void huidiaoneirong() {
  696.   if (b0 == 0) {
  697.     Btn_wifi.icon("fal fa-wifi");
  698.     Btn_wifi.text("WiFi信息");
  699.     Btn_wifi.print("off");
  700.   }
  701.   if (b0 == 1) {
  702.     Btn_wifi.icon("fal fa-wifi");
  703.     Btn_wifi.text("WiFi信息");
  704.     Btn_wifi.print("off");
  705.   }
  706.   if (b0 == 2) {
  707.     Btn_wifi.icon("fal fa-wifi");
  708.     Btn_wifi.text("显示WiFi信息");
  709.     Btn_wifi.print("on");
  710.   }

  711.   if (b1 == 0) {
  712.     Btn_time.text("时间");
  713.     Btn_time.print("off");
  714.   }
  715.   if (b1 == 1) {
  716.     Btn_time.text("时间");
  717.     Btn_time.print("off");
  718.   }
  719.   if (b1 == 2) {
  720.     Btn_time.text("显示时间");
  721.     Btn_time.print("on");
  722.   }

  723.   if (b2 == 0) {
  724.     Btn_temp_humi.text("温湿度");
  725.     Btn_temp_humi.print("off");
  726.   }
  727.   if (b2 == 1) {
  728.     Btn_temp_humi.text("温湿度");
  729.     Btn_temp_humi.print("off");
  730.   }
  731.   if (b2 == 2) {
  732.     Btn_temp_humi.text("显示温湿度");
  733.     Btn_temp_humi.print("on");
  734.   }

  735.   if (b3 == 0) {
  736.     Btn_weather.text("天气信息");
  737.     Btn_weather.print("off");
  738.   }
  739.   if (b3 == 1) {
  740.     Btn_weather.text("天气信息");
  741.     Btn_weather.print("off");
  742.   }
  743.   if (b3 == 2) {
  744.     Btn_weather.text("显示天气信息");
  745.     Btn_weather.print("on");
  746.   }

  747.   if (b4 == 0) {
  748.     Btn_air.text("空气信息");
  749.     Btn_air.print("off");
  750.   }
  751.   if (b4 == 1) {
  752.     Btn_air.text("空气信息");
  753.     Btn_air.print("off");
  754.   }
  755.   if (b4 == 2) {
  756.     Btn_air.text("显示空气信息");
  757.     Btn_air.print("on");
  758.   }

  759.   if (c2 == 0 ) {
  760.     if (a1 == 0 ) {
  761.       Btn_OLED.icon("fas fa-toggle-on");
  762.       Btn_OLED.text("屏幕自动打开");
  763.       Btn_OLED.print("on");
  764.     }
  765.   }
  766.   if (c2 == 0 ) {
  767.     if (a1 == 1 ) {
  768.       Btn_OLED.icon("fas fa-toggle-off");
  769.       Btn_OLED.text("屏幕自动关闭");
  770.       Btn_OLED.print("off");
  771.     }
  772.   }
  773.   if (c2 == 1 ) {
  774.     if (a1 == 0 ) {
  775.       Btn_OLED.icon("fas fa-toggle-on");
  776.       Btn_OLED.text("屏幕手动打开");
  777.       Btn_OLED.print("on");
  778.     }
  779.   }
  780.   if (c2 == 1 ) {
  781.     if (a1 == 1 ) {
  782.       Btn_OLED.icon("fas fa-toggle-off");
  783.       Btn_OLED.text("屏幕手动关闭");
  784.       Btn_OLED.print("off");
  785.     }
  786.   }

  787.   if (c3 == 0 ) {
  788.     Btn_xyd.icon("fal fa-lightbulb");
  789.     Btn_xyd.text("小夜灯关闭");
  790.     Btn_xyd.print("off");
  791.   }
  792.   if (c3 == 1 ) {
  793.     Btn_xyd.icon("fal fa-lightbulb-on");
  794.     Btn_xyd.text("小夜灯打开");
  795.     Btn_xyd.print("on");
  796.   }

  797.   Blinker.delay(1000);
  798.   if (c1 == 0 ) {
  799.     Btn_fmq.icon("fal fa-bell");
  800.     Btn_fmq.text("蜂鸣器关闭");
  801.     Btn_fmq.print("off");
  802.   }
  803.   if (c1 == 1 ) {
  804.     Btn_fmq.icon("fal fa-bell-on");
  805.     Btn_fmq.text("蜂鸣器打开");
  806.     Btn_fmq.print("on");
  807.   }

  808.   Number1.icon("fal fa-wifi");
  809.   Number1.print(WiFi.RSSI());
  810.   Text_ip.print(WiFi.localIP().toString().c_str());

  811.   EEPROM.begin(2450);
  812.   int shua3 = EEPROM.read(2449);
  813.   shua2 = shua3;
  814.   Slider1.print(shua2);
  815.   EEPROM.end();

  816. }
  817. /*********************************************************************************************************
  818.   收到指令蜂鸣器响一声

  819. *********************************************************************************************************/
  820. void fmq_1m() {
  821.   if(c1 == 1 ) {
  822.   digitalWrite(fmq1, LOW);
  823.   Blinker.delay(50);
  824.   digitalWrite(fmq1, HIGH);
  825.   }
  826. }
  827. /*********************************************************************************************************
  828.   按键操作OLED显示WiFi

  829. *********************************************************************************************************/
  830. void Btn_wifi_callback(const String & state) {
  831.   //BLINKER_LOG("get button state3: ", state);
  832.   if (state == "on") {
  833.     if (a1 == 0) {
  834.       b0 = 2; b1 = 0; b2 = 0; b3 = 0; b4 = 0; //单独显示WiFi
  835.       Blinker.vibrate();
  836.       fmq_1m();
  837.       huidiaoneirong();
  838.     }
  839.   }
  840.   else if (state == "off") {
  841.     if (a1 == 0) {
  842.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1; //恢复屏幕滚动显示
  843.       Blinker.vibrate();
  844.       fmq_1m();
  845.       huidiaoneirong();
  846.     }
  847.   }
  848. }
  849. /*********************************************************************************************************
  850.   按键操作OLED显示时间

  851. *********************************************************************************************************/
  852. void Btn_time_callback(const String & state) {
  853.   //BLINKER_LOG("get button state1: ", state);
  854.   if (state == "on") {
  855.     if (a1 == 0) {
  856.       b0 = 0; b1 = 2; b2 = 0; b3 = 0; b4 = 0;
  857.       Blinker.vibrate();
  858.       fmq_1m();
  859.       huidiaoneirong();
  860.     }
  861.   }
  862.   else if (state == "off") {
  863.     if (a1 == 0) {
  864.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  865.       Blinker.vibrate();
  866.       fmq_1m();
  867.       huidiaoneirong();
  868.     }
  869.   }
  870. }
  871. /*********************************************************************************************************
  872.   按键操作OLED显示温湿度

  873. *********************************************************************************************************/
  874. void Btn_temp_humi_callback(const String & state) {
  875.   //BLINKER_LOG("get button state2: ", state);
  876.   if (state == "on") {
  877.     if (a1 == 0) {
  878.       b0 = 0; b1 = 0; b2 = 2; b3 = 0; b4 = 0;
  879.       Blinker.vibrate();
  880.       fmq_1m();
  881.       huidiaoneirong();
  882.     }
  883.   }
  884.   else if (state == "off") {
  885.     if (a1 == 0) {
  886.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  887.       Blinker.vibrate();
  888.       fmq_1m();
  889.       huidiaoneirong();
  890.     }
  891.   }
  892. }
  893. /*********************************************************************************************************
  894.   按键操作OLED显示天气

  895. *********************************************************************************************************/
  896. void Btn_weather_callback(const String & state) {
  897.   //BLINKER_LOG("get button state3: ", state);
  898.   if (state == "on") {
  899.     if (a1 == 0) {
  900.       b0 = 0; b1 = 0; b2 = 0; b3 = 2; b4 = 0;
  901.       Blinker.vibrate();
  902.       fmq_1m();
  903.       huidiaoneirong();
  904.     }
  905.   }
  906.   else if (state == "off") {
  907.     if (a1 == 0) {
  908.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  909.       Blinker.vibrate();
  910.       fmq_1m();
  911.       huidiaoneirong();
  912.     }
  913.   }
  914. }
  915. /*********************************************************************************************************
  916.   按键操作OLED显示空气质量

  917. *********************************************************************************************************/
  918. void Btn_air_callback(const String & state) {
  919.   //BLINKER_LOG("get button state3: ", state);
  920.   if (state == "on") {
  921.     if (a1 == 0) {
  922.       b0 = 0; b1 = 0; b2 = 0; b3 = 0; b4 = 2;
  923.       Blinker.vibrate();
  924.       fmq_1m();
  925.       huidiaoneirong();
  926.     }
  927.   }
  928.   else if (state == "off") {
  929.     if (a1 == 0) {
  930.       b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  931.       Blinker.vibrate();
  932.       fmq_1m();
  933.       huidiaoneirong();
  934.     }
  935.   }
  936. }
  937. /*********************************************************************************************************
  938.   定时关闭OLED

  939. *********************************************************************************************************/
  940. void dingshiguanbioled() {
  941.   int8_t hour = Blinker.hour();//时
  942.   int8_t min  = Blinker.minute();//分
  943.   if (hour < 7 ) { //小于7时自动关闭屏幕
  944.     if (c2 == 0) {
  945.       a1 = 1;
  946.     }
  947.   }
  948.   if (hour <= -1 ) { //未获取到时间自动打开屏幕
  949.     if (c2 == 0)   {
  950.       a1 = 0;
  951.     }
  952.   }
  953.   if (hour >= 7 ) { //等于、大于7时自动打开屏幕
  954.     if (c2 == 0)  {
  955.       a1 = 0;
  956.     }
  957.   }

  958.   u8g2.setPowerSave(a1);

  959.   if (hour == 0 ) { //零点切换自动模式
  960.     if (min < 2 ) {
  961.       c2 = 0;
  962.     }
  963.   }
  964.   if (hour == 7 ) { //七点切换自动模式
  965.     if (min < 2 ) {
  966.       c2 = 0;
  967.     }
  968.   }
  969. }
  970. /*********************************************************************************************************
  971.   按键操作OLED屏幕滚动

  972. *********************************************************************************************************/
  973. void Btn_Refresh_callback(const String & state) {
  974.   //BLINKER_LOG("get button state4: ", state);
  975.   b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1; c2 = 0;
  976.   Blinker.vibrate();
  977.   fmq_1m();
  978.   dingshiguanbioled();
  979.   huidiaoneirong();
  980. }
  981. /*********************************************************************************************************
  982.   按键操作开关OLED屏幕

  983. *********************************************************************************************************/
  984. void Btn_OLED_callback(const String & state) {
  985.   //BLINKER_LOG("get button state5: ", state);
  986.   if (state == "on") {
  987.     a1 = 0; c2 = 1; b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  988.     Blinker.vibrate();
  989.     fmq_1m();
  990.     huidiaoneirong();
  991.     u8g2.setPowerSave(a1);
  992.   }
  993.   else if (state == "off") {
  994.     a1 = 1; c2 = 1; b0 = 0; b1 = 0; b2 = 0; b3 = 0; b4 = 0;
  995.     Blinker.vibrate();
  996.     fmq_1m();
  997.     huidiaoneirong();
  998.     u8g2.setPowerSave(a1);
  999.   }
  1000. }
  1001. /*********************************************************************************************************
  1002.   按键操作蜂鸣器

  1003. *********************************************************************************************************/
  1004. void Btn_fmq_callback(const String & state) {
  1005.   //BLINKER_LOG("get button state5: ", state);
  1006.   if (state == "on") {
  1007.     c1 = 1;
  1008.     Blinker.vibrate();
  1009.     fmq_1m();
  1010.     Btn_fmq.icon("fal fa-bell-on");
  1011.     Btn_fmq.text("蜂鸣器打开");
  1012.     Btn_fmq.print("on");
  1013.   }
  1014.   else if (state == "off") {
  1015.     c1 = 0;
  1016.     Blinker.vibrate();
  1017.     Btn_fmq.icon("fal fa-bell");
  1018.     Btn_fmq.text("蜂鸣器关闭");
  1019.     Btn_fmq.print("off");
  1020.   }
  1021. }
  1022. /*********************************************************************************************************
  1023.   按键操作小夜灯

  1024. *********************************************************************************************************/
  1025. void Btn_xyd_callback(const String & state) {
  1026.   //BLINKER_LOG("get button state5: ", state);
  1027.   if (state == "on") {
  1028.     c3 = 1;
  1029.     fmq_1m();
  1030.     Blinker.vibrate();
  1031.     digitalWrite(xyd1, HIGH);
  1032.     digitalWrite(xyd2, HIGH);
  1033.     huidiaoneirong();
  1034.   }
  1035.   else if (state == "off") {
  1036.     c3 = 0;
  1037.     fmq_1m();
  1038.     Blinker.vibrate();
  1039.     digitalWrite(xyd1, LOW);
  1040.     digitalWrite(xyd2, LOW);
  1041.     huidiaoneirong();
  1042.     Blinker.delay(50);
  1043.     digitalWrite(xyd2, HIGH);
  1044.   }
  1045. }
  1046. /*********************************************************************************************************
  1047.   切屏滑动条

  1048. *********************************************************************************************************/
  1049. void slider1_callback(int32_t value)
  1050. {
  1051.   BLINKER_LOG("get slider value: ", value);
  1052.   Blinker.vibrate();
  1053.   huidiaoneirong();
  1054.   EEPROM.begin(2450);
  1055.   EEPROM.write(2449, value);
  1056.   Slider1.print(value);
  1057.   EEPROM.end();
  1058. }
  1059. /**********************************************************************************************************
  1060.   WiFi配置清除

  1061. **********************************************************************************************************/
  1062. void Btn_WIFIEE_callback(const String & state) {
  1063.   Blinker.reset();
  1064. }
  1065. void wifirst1(){
  1066.   wifirstState = digitalRead(wifirst);
  1067.   if(wifirstState == HIGH){
  1068.     Blinker.reset();
  1069.   }
  1070. }
  1071. /*********************************************************************************************************
  1072.   OLED关闭后不显示内容

  1073. *********************************************************************************************************/
  1074. void shifouxianshi() {
  1075.   if (a1 == 0) {
  1076.     if (b0 == 1) {
  1077.       OLED_0(); yanshi();
  1078.       Blinker.run();
  1079.     }
  1080.     if (b0 == 2) {
  1081.       OLED_0();yanshi();
  1082.     }
  1083.     if (b1 == 1) {
  1084.       OLED_1();yanshi();
  1085.       Blinker.run();
  1086.     }
  1087.     if (b1 == 2) {
  1088.       OLED_1(); yanshi();
  1089.     }
  1090.     if (b2 == 1) {
  1091.       OLED_2();yanshi();
  1092.       Blinker.run();
  1093.     }
  1094.     if (b2 == 2) {
  1095.       OLED_2();yanshi();
  1096.     }
  1097.     if (b3 == 1) {
  1098.       OLED_3();yanshi();
  1099.       Blinker.run();
  1100.     }
  1101.     if (b3 == 2) {
  1102.       OLED_3();yanshi();
  1103.     }
  1104.     if (b4 == 1) {
  1105.       OLED_4();yanshi();
  1106.       Blinker.run();
  1107.     }
  1108.     if (b4 == 2) {
  1109.       OLED_4();yanshi();
  1110.     }
  1111.   }
  1112.   if (a1 == 1) {
  1113.     b0 = 0; b1 = 1; b2 = 1; b3 = 1; b4 = 1;
  1114.   }
  1115. }
  1116. /*********************************************************************************************************
  1117.   给blinkerapp回传数据

  1118. *********************************************************************************************************/
  1119. void heartbeat() {
  1120.   HUMI.print(humi_read); //给blinkerapp回传湿度数据
  1121.   TEMP.print(temp_read); //给blinkerapp回传温度数据
  1122.   huidiaoneirong();
  1123. }
  1124. /*********************************************************************************************************
  1125.   将设置代码放在此处,运行一次

  1126. *********************************************************************************************************/
  1127. void setup() {
  1128.   //初始化端口
  1129.   Serial.begin(115200);

  1130.   Blinker.begin(auth); //初始化blinker
  1131.   BLINKER_DEBUG.stream(Serial);
  1132.   BLINKER_DEBUG.debugAll();

  1133.   pinMode(fmq1, OUTPUT); //蜂鸣器引脚设置为输出模式
  1134.   pinMode(xyd1, OUTPUT); //小夜灯引脚设置为输出模式
  1135.   pinMode(xyd2, OUTPUT); //小夜灯引脚设置为输出模式

  1136.   pinMode(wifirst, INPUT);//按键清除WiFi配置设置为输入模式

  1137.   digitalWrite(fmq1, HIGH); //蜂鸣器引脚高电平输出
  1138.   digitalWrite(xyd1, LOW); //小夜灯引脚低电平输出
  1139.   digitalWrite(xyd2, HIGH); //小夜灯引脚高电平输出

  1140.   u8g2.begin(); //初始化OLED
  1141.   u8g2.enableUTF8Print();
  1142.   u8g2.clearBuffer();
  1143.   u8g2.clearDisplay();
  1144.   u8g2.setPowerSave(0);

  1145.   dht.begin(); //初始化DHT传感器

  1146.   Blinker.setTimezone(8.0);
  1147.   Blinker.attachHeartbeat(heartbeat); //将传感器获取的数据传给blinker app上
  1148.   Blinker.attachDataStorage(dataStorage); //注册回调函数,开启历史数据存储功能
  1149.   BlinkerAliGenie.attachQuery(aligenieQuery); //天猫精灵回调函数,回调温湿度数据给天猫精灵
  1150.   Blinker.attachWeather(weatherData); //注册回调函数,获取天气信息
  1151.   Blinker.attachAir(airData); //注册回调函数,获取空气质量信息

  1152.   Btn_time.attach(Btn_time_callback);
  1153.   Btn_temp_humi.attach(Btn_temp_humi_callback);
  1154.   Btn_wifi.attach(Btn_wifi_callback);
  1155.   Btn_Refresh.attach(Btn_Refresh_callback);
  1156.   Btn_OLED.attach(Btn_OLED_callback);
  1157.   Btn_weather.attach(Btn_weather_callback);
  1158.   Btn_air.attach(Btn_air_callback);
  1159.   Btn_fmq.attach(Btn_fmq_callback);
  1160.   Btn_xyd.attach(Btn_xyd_callback);
  1161.   Slider1.attach(slider1_callback);
  1162.   Btn_WIFIEE.attach(Btn_WIFIEE_callback);
  1163. }
  1164. /*********************************************************************************************************
  1165.   把主代码放在这里,重复运行
  1166.   通过循环不断读取温湿度传感器获取的数据

  1167. *********************************************************************************************************/
  1168. void loop() {
  1169.   Blinker.run(); //运行Blinker

  1170.   wifirst1();//按键清除WiFi配置
  1171.   DHT11_1(); //开机获取环境温度
  1172.   kjgxtq(); //开机获取天气信息
  1173.   jggxtq(); //间隔更新天气信息
  1174.   dingshiguanbioled(); //定时关闭OLED
  1175.   shifouxianshi(); //关闭屏幕后不运行显部分相关程序
  1176. }
复制代码
发表于 2020-12-10 10:46 | 显示全部楼层
wactor8431 发表于 2020-12-10 10:44
为什么时区要 改为 这样,才没有时差 Blinker.setTimezone(-8.0);    我们中国不是8 吗? ...

  时间对了,日期却晚了1天
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 01:42 , Processed in 0.122978 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表