查看: 1247|回复: 19

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

[复制链接]
  • TA的每日心情
    无聊
    2020-11-4 08:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2020-11-3 20:19 | 显示全部楼层 |阅读模式
    本帖最后由 安少 于 2020-11-4 13:58 编辑

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

    程序的编写借鉴了blinker的示例,单片机菜鸟 的OLED教程,526598 的天气信息提取,1812z的部分优化代码的方法

    1. /*********************************************************************************************************
    2.   日期:2020/11/03
    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头文件
    14. #include <ArduinoJson.h>         //包含ArduinoJson头文件,用于解析从点灯获取到的天气数据
    15. #include <Blinker.h>             //包含Blinker头文件,用于连接点灯科技
    16. #include <DHT.h>                 //包含DHT头文件,用于温湿度传感器获取数据
    17. #include <U8g2lib.h>             //包含u8g2头文件,用于OLED显示

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

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

    29. #define TEXTE_ip "tex-ip"
    30. /*********************************************************************************************************
    31.   定义全局变量

    32. *********************************************************************************************************/
    33. char auth[] = "*************";  //你的设备key

    34. String location = "********************"; //定义天气地址

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

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

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

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

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

    51. int tian1 = 0;
    52. int shi1  = 0;
    53. int fen1  = 0;
    54. int miao1 = 0;

    55. char w_weather[12] = "";   //天气
    56. char w_temp[10]    = "";   //室外温度
    57. char w_humi[24]    = "";   //室外湿度
    58. char w_wind[10]    = "";   //风向
    59. char w_power[10]   = "";   //风力

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

    65. *********************************************************************************************************/
    66. BlinkerText Text_ip(TEXTE_ip);

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

    70. BlinkerButton Btn_time("btn-A1");
    71. BlinkerButton Btn_temp_humi("btn-A2");
    72. BlinkerButton Btn_wifi("btn-A3");
    73. BlinkerButton Btn_Refresh("btn-A4");
    74. BlinkerButton Btn_OLED("btn-A5");
    75. BlinkerButton Btn_weather("btn-A6");
    76. BlinkerButton Btn_air("btn-A7");
    77. BlinkerButton Btn_fmq("btn-A8");
    78. BlinkerButton Btn_xyd("btn-A9");

    79. //BlinkerBridge BridgeDevice1(BRIDGE_1);
    80. /*********************************************************************************************************
    81.   读取DHT11传感器的温湿度数据

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

    96.     temp_read = t - 0.6;   //校准温度
    97.     humi_read = h - 11;    //校准湿度

    98.     if (a1 == 1) {
    99.       Blinker.delay(2000);
    100.     }
    101.   }
    102. }
    103. /*********************************************************************************************************
    104.   云存储回调函数

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

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

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

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

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

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

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

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

    258.   u8g2.setFont(u8g2_font_ncenB08_tr);
    259.   u8g2.drawStr(122, 8, "3");
    260.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);

    261.   u8g2.setCursor(0, 25);
    262.   u8g2.print(w_weather1);

    263.   u8g2.setCursor(0, 40);
    264.   u8g2.print(w_temp1);

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

    273.   u8g2.setFont(u8g2_font_ncenB08_tr);
    274.   u8g2.drawStr(122, 8, "3");
    275.   u8g2.setFont(u8g2_font_wqy13_t_gb2312b);

    276.   u8g2.setCursor(0, 25);
    277.   u8g2.print(w_wind1);

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

    301. *********************************************************************************************************/
    302. void airData(const String & data) {
    303.   //BLINKER_LOG("空气质量: ", data);
    304.   DynamicJsonDocument jsonBuffer(512);
    305.   DeserializationError error = deserializeJson(jsonBuffer, data);
    306.   JsonObject doc = jsonBuffer.as<JsonObject>();
    307.   if (data[0] == '{') {
    308.     strcpy(a_aqi, jsonBuffer["aqi"]);       //空气质量
    309.     strcpy(a_level, jsonBuffer["level"]);   //空气等级
    310.     strcpy(a_pm25, jsonBuffer["pm25"]);     //pm2.5
    311.     a2 = 1;
    312.     a4 = 1;
    313.   }
    314.   else {
    315.     BLINKER_LOG("airData_error!");
    316.     //Serial.println(error.c_str());
    317.     delay(1000);
    318.     a2 = 1;
    319.     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.   Blinker.delay(5000);
    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.   Blinker.delay(5000);
    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.     b0 = 2;
    657.     b1 = 0;
    658.     b2 = 0;
    659.     b3 = 0;
    660.     b4 = 0;
    661.     Blinker.vibrate();
    662.     fmq_1m();
    663.     huidiaoneirong();
    664.   }
    665.   else if (state == "off") {
    666.     b0 = 0;
    667.     b1 = 1;
    668.     b2 = 1;
    669.     b3 = 1;
    670.     b4 = 1;
    671.     Blinker.vibrate();
    672.     fmq_1m();
    673.     huidiaoneirong();
    674.   }
    675. }
    676. /*********************************************************************************************************
    677.   按键操作OLED显示时间

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

    704. *********************************************************************************************************/
    705. void Btn_temp_humi_callback(const String & state) {
    706.   //BLINKER_LOG("get button state2: ", state);
    707.   if (state == "on") {
    708.     b0 = 0;
    709.     b1 = 0;
    710.     b2 = 2;
    711.     b3 = 0;
    712.     b4 = 0;
    713.     Blinker.vibrate();
    714.     fmq_1m();
    715.     huidiaoneirong();
    716.   }
    717.   else if (state == "off") {
    718.     b0 = 0;
    719.     b1 = 1;
    720.     b2 = 1;
    721.     b3 = 1;
    722.     b4 = 1;
    723.     Blinker.vibrate();
    724.     fmq_1m();
    725.     huidiaoneirong();
    726.   }
    727. }
    728. /*********************************************************************************************************
    729.   按键操作OLED显示天气

    730. *********************************************************************************************************/
    731. void Btn_weather_callback(const String & state) {
    732.   //BLINKER_LOG("get button state3: ", state);
    733.   if (state == "on") {
    734.     b0 = 0;
    735.     b1 = 0;
    736.     b2 = 0;
    737.     b3 = 2;
    738.     b4 = 0;
    739.     Blinker.vibrate();
    740.     fmq_1m();
    741.     huidiaoneirong();
    742.   }
    743.   else if (state == "off") {
    744.     b0 = 0;
    745.     b1 = 1;
    746.     b2 = 1;
    747.     b3 = 1;
    748.     b4 = 1;
    749.     Blinker.vibrate();
    750.     fmq_1m();
    751.     huidiaoneirong();
    752.   }
    753. }
    754. /*********************************************************************************************************
    755.   按键操作OLED显示空气质量

    756. *********************************************************************************************************/
    757. void Btn_air_callback(const String & state) {
    758.   //BLINKER_LOG("get button state3: ", state);
    759.   if (state == "on") {
    760.     b0 = 0;
    761.     b1 = 0;
    762.     b2 = 0;
    763.     b3 = 0;
    764.     b4 = 2;
    765.     Blinker.vibrate();
    766.     fmq_1m();
    767.     huidiaoneirong();
    768.   }
    769.   else if (state == "off") {
    770.     b0 = 0;
    771.     b1 = 1;
    772.     b2 = 1;
    773.     b3 = 1;
    774.     b4 = 1;
    775.     Blinker.vibrate();
    776.     fmq_1m();
    777.     huidiaoneirong();
    778.   }
    779. }
    780. /*********************************************************************************************************
    781.   按键操作OLED屏幕滚动

    782. *********************************************************************************************************/
    783. void Btn_Refresh_callback(const String & state) {
    784.   //BLINKER_LOG("get button state4: ", state);
    785.   b0 = 0;
    786.   b1 = 1;
    787.   b2 = 1;
    788.   b3 = 1;
    789.   b4 = 1;
    790.   c2 = 0;
    791.   Blinker.vibrate();
    792.   fmq_1m();
    793.   dingshiguanbioled();
    794.   huidiaoneirong();
    795. }
    796. /*********************************************************************************************************
    797.   按键操作开关OLED屏幕

    798. *********************************************************************************************************/
    799. void Btn_OLED_callback(const String & state) {
    800.   //BLINKER_LOG("get button state5: ", state);
    801.   if (state == "on") {
    802.     a1 = 0;
    803.     c2 = 1;
    804.     Blinker.vibrate();
    805.     fmq_1m();
    806.     huidiaoneirong();
    807.     u8g2.setPowerSave(a1);
    808.   }
    809.   else if (state == "off") {
    810.     a1 = 1;
    811.     c2 = 1;
    812.     Blinker.vibrate();
    813.     fmq_1m();
    814.     huidiaoneirong();
    815.     u8g2.setPowerSave(a1);
    816.   }
    817. }
    818. /*********************************************************************************************************
    819.   按键操作蜂鸣器

    820. *********************************************************************************************************/
    821. void Btn_fmq_callback(const String & state) {
    822.   //BLINKER_LOG("get button state5: ", state);
    823.   if (state == "on") {
    824.     c1 = 1;
    825.     Blinker.vibrate();
    826.     digitalWrite(fmq1, LOW);
    827.     huidiaoneirong();
    828.   }
    829.   else if (state == "off") {
    830.     c1 = 0;
    831.     Blinker.vibrate();
    832.     digitalWrite(fmq1, HIGH);
    833.     huidiaoneirong();
    834.   }
    835. }
    836. /*********************************************************************************************************
    837.   按键操作小夜灯

    838. *********************************************************************************************************/
    839. void Btn_xyd_callback(const String & state) {
    840.   //BLINKER_LOG("get button state5: ", state);
    841.   if (state == "on") {
    842.     c3 = 1;
    843.     fmq_1m();
    844.     Blinker.vibrate();
    845.     digitalWrite(xyd1, HIGH);
    846.     digitalWrite(xyd2, HIGH);
    847.     huidiaoneirong();
    848.   }
    849.   else if (state == "off") {
    850.     c3 = 0;
    851.     fmq_1m();
    852.     Blinker.vibrate();
    853.     digitalWrite(xyd1, LOW);
    854.     digitalWrite(xyd2, LOW);
    855.     huidiaoneirong();
    856.     Blinker.delay(50);
    857.     digitalWrite(xyd2, HIGH);
    858.   }
    859. }
    860. /*********************************************************************************************************
    861.   按键状态回调函数

    862. *********************************************************************************************************/
    863. void huidiaoneirong() {
    864.   if (b0 == 0) {
    865.     Btn_wifi.icon("fal fa-wifi");
    866.     Btn_wifi.text("WiFi信息");
    867.     Btn_wifi.print("off");
    868.   }
    869.   if (b0 == 1) {
    870.     Btn_wifi.icon("fal fa-wifi");
    871.     Btn_wifi.text("WiFi信息");
    872.     Btn_wifi.print("off");
    873.   }
    874.   if (b0 == 2) {
    875.     Btn_wifi.icon("fal fa-wifi");
    876.     Btn_wifi.text("显示WiFi信息");
    877.     Btn_wifi.print("on");
    878.   }

    879.   if (b1 == 0) {
    880.     Btn_time.text("时间");
    881.     Btn_time.print("off");
    882.   }
    883.   if (b1 == 1) {
    884.     Btn_time.text("时间");
    885.     Btn_time.print("off");
    886.   }
    887.   if (b1 == 2) {
    888.     Btn_time.text("显示时间");
    889.     Btn_time.print("on");
    890.   }

    891.   if (b2 == 0) {
    892.     Btn_temp_humi.text("温湿度");
    893.     Btn_temp_humi.print("off");
    894.   }
    895.   if (b2 == 1) {
    896.     Btn_temp_humi.text("温湿度");
    897.     Btn_temp_humi.print("off");
    898.   }
    899.   if (b2 == 2) {
    900.     Btn_temp_humi.text("显示温湿度");
    901.     Btn_temp_humi.print("on");
    902.   }

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

    915.   if (b4 == 0) {
    916.     Btn_air.text("空气信息");
    917.     Btn_air.print("off");
    918.   }
    919.   if (b4 == 1) {
    920.     Btn_air.text("空气信息");
    921.     Btn_air.print("off");
    922.   }
    923.   if (b4 == 2) {
    924.     Btn_air.text("显示空气信息");
    925.     Btn_air.print("on");
    926.   }
    927.   if (c2 == 0 ) {
    928.     if (a1 == 0 ) {
    929.       Btn_OLED.icon("fas fa-toggle-on");
    930.       Btn_OLED.text("屏幕自动打开");
    931.       Btn_OLED.print("on");
    932.     }
    933.   }
    934.   if (c2 == 0 ) {
    935.     if (a1 == 1 ) {
    936.       Btn_OLED.icon("fas fa-toggle-off");
    937.       Btn_OLED.text("屏幕自动关闭");
    938.       Btn_OLED.print("off");
    939.     }
    940.   }
    941.   if (c2 == 1 ) {
    942.     if (a1 == 0 ) {
    943.       Btn_OLED.icon("fas fa-toggle-on");
    944.       Btn_OLED.text("屏幕手动打开");
    945.       Btn_OLED.print("on");
    946.     }
    947.   }
    948.   if (c2 == 1 ) {
    949.     if (a1 == 1 ) {
    950.       Btn_OLED.icon("fas fa-toggle-off");
    951.       Btn_OLED.text("屏幕手动关闭");
    952.       Btn_OLED.print("off");
    953.     }
    954.   }
    955.   Blinker.delay(100);

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

    966.   if (c3 == 0 ) {
    967.     Btn_xyd.icon("fal fa-lightbulb");
    968.     Btn_xyd.text("小夜灯关闭");
    969.     Btn_xyd.print("off");
    970.   }
    971.   if (c3 == 1 ) {
    972.     Btn_xyd.icon("fal fa-lightbulb-on");
    973.     Btn_xyd.text("小夜灯打开");
    974.     Btn_xyd.print("on");
    975.   }
    976. }
    977. /*********************************************************************************************************
    978.   收到指令蜂鸣器响一声

    979. *********************************************************************************************************/
    980. void fmq_1m() {
    981.   c1 = 0;
    982.   digitalWrite(fmq1, LOW);
    983.   Blinker.delay(50);
    984.   digitalWrite(fmq1, HIGH);
    985. }
    986. /*********************************************************************************************************
    987.   OLED关闭后不显示内容

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

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

    1063.     }
    1064.   }

    1065.   u8g2.setPowerSave(a1);

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

    1079. *********************************************************************************************************/
    1080. void heartbeat() {
    1081.   HUMI.print(humi_read);        //给blinkerapp回传湿度数据
    1082.   TEMP.print(temp_read);        //给blinkerapp回传温度数据
    1083.   Number1.icon("fal fa-wifi");
    1084.   Number1.print(WiFi.RSSI());
    1085.   Text_ip.print(WiFi.localIP().toString().c_str());
    1086.   huidiaoneirong();
    1087. }
    1088. /*********************************************************************************************************
    1089.   将设置代码放在此处,运行一次

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

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

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

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

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

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

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

    1128. *********************************************************************************************************/
    1129. void loop() {
    1130.   Blinker.run();       //运行Blinker

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

    1136. }
    复制代码
  • TA的每日心情
    无聊
    2020-11-4 08:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

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

    正面照

    正面照
  • TA的每日心情
    无聊
    2020-11-4 08:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

     楼主| 发表于 2020-11-4 01:06 来自手机 | 显示全部楼层
    设备的背面,分成了两块洞洞板,一块是负责供电和通过US B口输出5v给小夜灯供电,通过继电器控制,另一个块是主控板的背面。船型开关用的三档型,一档电池供电;中间挡关机;二档下载程序时用来给电池充电。用电池供电不能连接主控板下载程序会短路保护,同理,下载程序时不能用电池供电。
    IMG_20201103_193424.jpg
    IMG_20201103_193649.jpg
  • TA的每日心情
    无聊
    2020-11-4 08:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

     楼主| 发表于 2020-11-4 01:08 来自手机 | 显示全部楼层
    显示DHT11获取到的温湿度
    IMG_20201103_195036.jpg
  • TA的每日心情
    无聊
    2020-11-4 08:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

     楼主| 发表于 2020-11-4 01:18 来自手机 | 显示全部楼层
    在WIFI信息页面,分成两部分显示,第一部分主要显示的是信号强度,WIFI名称,WIFI密码,路由器IP,设备IP,MAC地址;第二部分,显示的是随便运行时间。每一页的状态栏都会显示WIFI、时间、温度、页数这些简略信息。
    IMG_20201104_011122.jpg
    IMG_20201103_195210.jpg
  • TA的每日心情
    无聊
    2020-11-4 08:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

     楼主| 发表于 2020-11-4 01:24 来自手机 | 显示全部楼层
    天气页面,显示通过blinker获取到的天气信息,信息过多也是分成了两部分,基本的天气情况,温湿度,风力风向这些信息
    IMG_20201104_011953.jpg
    IMG_20201104_011956.jpg
  • TA的每日心情
    无聊
    2020-11-4 08:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

     楼主| 发表于 2020-11-4 01:28 来自手机 | 显示全部楼层
    空气质量页面,也是通过blinker获取到的信息,获取到的信息过多,我就保留了三条,空气质量、空气等级和微颗粒物(PM2.5)。
    IMG_20201104_012527.jpg
  • TA的每日心情
    无聊
    2020-11-4 08:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

     楼主| 发表于 2020-11-4 01:52 来自手机 | 显示全部楼层
    app界面设计:
    一、设备回传的设备IP地址、信号强度、温湿度数据;这里的都是数据跟随心跳包刷新。
    二、图表组件,看图就能明白意思。
    三、OLED界面独立显示及开关按键、蜂鸣器、小夜灯开关。在程序里每个开关都是互锁的状态,让某一个页面单独显示,就会关闭其他页面;当然也可以通过自动按键来让屏幕滚动显示。
    OLED屏幕的显示与不显示也可以通过按键控制;在程序里设定了,零点自动关闭和七点自动开启,但是避开这两时间点和手动操作互不影响。
    关闭了屏幕,不仅屏幕不显示,APP单独显示页面的按键按下了不会让屏幕显示然后内容。
    自动按钮会刷新一切,除了页面滚动,也会判断舒服需要开关屏幕,小夜灯和蜂鸣器除外。
    蜂鸣器除了能一直响,在按下按键的时候也会有响声反馈。
    每一次按下按键,蜂鸣器会响一声的同时也会给手机振动一次的指令。
    小夜灯没啥说的就是一个普通的开关,只是电路用来高电平控制,一个io口输出的电压不够得用两个,讲程序了,在讲这个的逻辑。
    Screenshot_20201104_012857_iot.clz.me.jpg
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    关于给esp8266编程和给arduino编程的一些疑问
    关于给esp8266编程和给ard
    本人大一学生,目前正在做创新作业,已经进行到了最后一步:arduino从onenet上调取数
    OLED 128*64自制可达10000000个选项的菜单(已更新)
    OLED 128*64自制可达10000
    OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
    【Arduino】168种传感器模块系列实验(104)---MAX30102手腕心率
    【Arduino】168种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    arduinoT12焊台 控制器 炫酷UI
    arduinoT12焊台 控制器 炫
    *声明:本项目源于https://github.com/wagiminator/ATmega-Soldering-Station 采用CC3
    关于如何修改ATMEGA328P的PWM频率
    关于如何修改ATMEGA328P的
    在arduino开发中用到最多的就是atmega328p这个avr芯片了,常用的Nano, Uno开发板都是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表