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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: 安少

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

  [复制链接]
 楼主| 发表于 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. }
复制代码
 楼主| 发表于 2021-3-17 18:37 | 显示全部楼层
  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 = 000000; //定义天气地址,官网查询地址数字代码

  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. }
复制代码


发表于 2021-3-17 18:38 | 显示全部楼层
新手像楼主学习
 楼主| 发表于 2021-3-17 18:40 | 显示全部楼层
wactor8431 发表于 2021-3-17 17:23
请问 如何解决? 参数空?

修改前:String location = "guangxi-jinchengjiangqu"; //定义天气地址
修改后:int location = 451200; //定义天气地址
最新dev3.0的库地址改成了数字,替换这一句行
 楼主| 发表于 2021-3-17 18:41 | 显示全部楼层
3137234383 发表于 2021-3-16 16:08
老哥,我可以问一下吗?如果要使用新版的天气接口,那天气信息获取那部分的代码要怎么改
我不太理解新 ...

修改前:String location = "guangxi-jinchengjiangqu"; //定义天气地址
修改后:int location = 451200; //定义天气地址
最新dev3.0的库地址改成了数字,替换这一句行
发表于 2021-3-18 09:05 | 显示全部楼层
安少 发表于 2021-3-17 18:40
修改前:String location = "guangxi-jinchengjiangqu"; //定义天气地址
修改后:int location = 451200; ...

由于不懂。修改后,有变成 这里不对了:Blinker.weatherForecast(location);
      Blinker.aqi(location);
发表于 2021-3-18 11:40 | 显示全部楼层
安少 发表于 2021-3-17 18:41
修改前:String location = "guangxi-jinchengjiangqu"; //定义天气地址
修改后:int location = 451200; ...

是的,改了这里能正常显示了,多谢老哥
 楼主| 发表于 2021-3-18 12:41 | 显示全部楼层
3137234383 发表于 2021-3-18 11:40
是的,改了这里能正常显示了,多谢老哥

关于地区的编码可以在官网查到
发表于 2021-3-19 10:11 | 显示全部楼层
安少 发表于 2021-3-18 12:41
关于地区的编码可以在官网查到

是的,我之前把拼音改成了数字但是没有显示天气。
忘记改成int型数据了(尴尬)
发表于 2021-3-19 15:17 | 显示全部楼层
作为一个新手 看的有点头大
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 03:28 , Processed in 0.082925 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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