查看: 2036|回复: 36

[分享] 自制WiFi天气时钟基于Blinker esp-01(8266) u8g2驱动12864 LCD屏

[复制链接]
  • TA的每日心情
    开心
    2020-7-6 09:30
  • 签到天数: 37 天

    [LV.5]常住居民I

    发表于 2020-5-23 21:54 | 显示全部楼层 |阅读模式
    本帖最后由 526598 于 2020-7-1 00:07 编辑

    先发个实物展示视频:https://www.bilibili.com/video/BV12k4y1679Q/
    https://www.bilibili.com/video/BV12k4y1679Q/
    mmexport1590238045689.jpg
    第一次发分享贴,语言不通顺之处请见谅
    使用材料清单:
    ESP8266- 01 无标题1.jpg
    LCD12864(推荐3.3v) 12864.jpg
    万用板/电路板/洞洞板10*15(半张) 无标题3.jpg
    单排针/单排座/双排座(可用两个单排座代替) timg (1).jpg
    3.3v/ 5v电源板(按实际情况可自由选择) 无标题.jpg
    Esp刷写器 无标题2.jpg
    细导线,螺丝,尼龙柱
    代码来自:
    天气信息于Blinker点灯平台获取
    Lcd12864 驱动为u8g2
    参考资料及部分代码来自:https://www.arduino.cn/thread-41193-1-1.html
    时间字体:u8g2_font_logisoso28_tf
    日期字体:u8g2_font_wqy12_t_gb2312a
    天气图标:u8g2_font_open_iconic_weather_4x_t
    温度字体:u8g2_font_wqy16_t_gb2312b
    字体请参考u8g2库文件 (win10)C:\Users\Administrator\Documents\Arduino\libraries\u8g2\src\clib\u8g2.h
    U8g2lib库在Arduino中 项目-加载库-管理库-搜索u8g2-安装即可或参考https://github.com/olikraus/u8g2
    手动下载地址(未在其他机器测试):http://downloads.arduino.cc/libraries/github.com/olikraus/U8g2-2.27.6.zip
    其他型号LCD参考Arduino开发软件的文件-示例-u8g2,任选里面有好多注释掉的连接方式仔细看备注
    其他问题后面补充,有疑问请留言,所学有限尽量回答,见谅
    连接图
    微信图片_20200523204041.png 微信图片_20200523204259.png
    源程序见下方
    ----0202-05-25--代码调整,降低天气获取频率-----
    1. #define BLINKER_WIFI
    2. #include <Blinker.h>
    3. #include <Arduino.h>
    4. #include <Arduino_JSON.h>
    5. #include <SPI.h>
    6. #include <U8g2lib.h>
    7. char auth[] = "Your Device Secret Key";
    8. char ssid[] = "Your WiFi network SSID or name";
    9. char pswd[] = "Your WiFi network WPA password or WEP key";

    10. char home_add[]="jilin"; //地址代码获取天气用
    11. char* icon_index[3]={"A","C","E"};//图标在天气字库里分别代表 云,雨,晴
    12. int sel_icon=0;
    13. float humi_read, temp_read;
    14. int wind_wifi,weather_wifi,wind_ang_wifi;
    15. int temp_wifi=18;
    16. bool first_weadher=true;

    17. StaticJsonDocument<400> doc;

    18. int row_i=15-1;//汉字坐标向下偏移一像素 坐标为左下角减一 高度=16(0-15)
    19. //以此推算,12864可显示(128/16)*(64/16)=8列4行共32个汉字
    20. //U8G2_ST7920_128X64_F_HW_SPI u8g2(U8G2_R0, /* CS=*/ 15, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS
    21. //U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 14, /* data=*/ 13, /* CS=*/ 15, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS
    22. U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 0, /* data=*/ 2, /* CS=*/ 1, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS
    23. void dis_Time(){
    24.   char str_week[]="";
    25.   char str_date[]="";
    26.   char str_big_Time[]="";
    27.   char str_small_second[]="";
    28.   int num_temp=0;
    29.   char str_temp[6];
    30.   if(Blinker.second()>=0){
    31.     do {
    32.       u8g2.clearBuffer();
    33.       num_temp=Blinker.year()%100;
    34.       if(num_temp<10){
    35.         strcat(str_date,"0");
    36.       }
    37.       itoa(num_temp,str_temp,10);   //日期
    38.       strcat(str_date,str_temp);
    39.       num_temp=Blinker.month();               
    40.       itoa(num_temp,str_temp,10);
    41.       strcat(str_date,"-");
    42.       if(Blinker.month()<10){
    43.         strcat(str_date,"0");
    44.       }
    45.       strcat(str_date,str_temp);
    46.       num_temp=Blinker.mday();
    47.       itoa(num_temp,str_temp,10);
    48.       strcat(str_date,"-");
    49.       strcat(str_date,str_temp);
    50.       num_temp=Blinker.wday();
    51.       char* week_str[8]={"日","一","二","三","四","五","六","日"};
    52.       strcat(str_date,"星期");
    53.       strcat(str_date,week_str[Blinker.wday()]);
    54.       Serial.print("日期:");
    55.       Serial.print(str_date);
    56.       u8g2.setFont(u8g2_font_wqy12_t_gb2312a); // 汉字 14*26
    57.       u8g2.setCursor(0, 54);
    58.       u8g2.print(str_date);
    59.       num_temp=Blinker.wday();   
    60.       itoa(num_temp,str_temp,10);   //星期
    61.       strcat(str_week,str_temp);
    62.       num_temp=Blinker.hour();
    63.       itoa(num_temp,str_temp,10);   //时分
    64.       if(Blinker.hour()<10){
    65.         strcat(str_big_Time,"0");
    66.       }
    67.       strcat(str_big_Time,str_temp);      
    68.       num_temp=Blinker.minute();
    69.       itoa(num_temp,str_temp,10);
    70.       strcat(str_big_Time,":");
    71.       if(Blinker.minute()<10){
    72.         strcat(str_big_Time,"0");
    73.       }
    74.       strcat(str_big_Time,str_temp);
    75.       Serial.print("时分:");
    76.       Serial.print(str_big_Time);
    77.       u8g2.setFont(u8g2_font_logisoso28_tf ); // 大字 14*26
    78.       u8g2.setCursor(0, 34);
    79.       u8g2.print(str_big_Time);
    80.       num_temp=Blinker.second();
    81.       itoa(num_temp,str_temp,10); //秒
    82.       if(Blinker.second()<10){
    83.         strcat(str_small_second,"0");
    84.       }
    85.       strcat(str_small_second,str_temp);
    86.       Serial.print("秒:");
    87.       Serial.println(str_small_second);
    88.       u8g2.drawLine(88, 2, 88, 61);    //分割线
    89.       int8_t sec = Blinker.second();
    90.       int8_t minute = Blinker.minute();
    91.       if((sec%10) > 5)// 每5秒更新一次参考地址:https://www.arduino.cn/forum.php ... B%E5%A4%A9%E6%B0%94
    92.         {
    93.           if((minute > 58) or (first_weadher=true))//每一小时获取一次天气信息,参考https://diandeng.tech/doc/weather
    94.           {
    95.             Blinker.weather();//默认查询设备ip所属地区的当前时刻的天气情况  
    96.             first_weadher=false ; //开机第一次更新默认查询设备ip所属地区的当前时刻的天气情况
    97.           }
    98.           if(weather_wifi == 0)
    99.           {
    100.             sel_icon=0;
    101.           }
    102.           else if (weather_wifi < 101)
    103.           {
    104.             sel_icon=2;
    105.           }
    106.           else if (weather_wifi < 201)
    107.           {
    108.             sel_icon=0;
    109.           }
    110.           else if (weather_wifi < 501)
    111.           {
    112.             sel_icon=1;
    113.           }
    114.         }
    115.       //判断天气情况
    116.       u8g2.setFont(u8g2_font_open_iconic_weather_4x_t ); // 天气图标 32*32
    117.       u8g2.setCursor(96, 34);
    118.       u8g2.print(icon_index[sel_icon]);
    119.       u8g2.setFont(u8g2_font_wqy16_t_gb2312b ); // 大字 16*16
    120.       u8g2.setCursor(96, 55);
    121.       char b_b_tmp[25];
    122.       itoa(temp_wifi, b_b_tmp, 10);
    123.       strcat(b_b_tmp,"℃");
    124.       u8g2.print(b_b_tmp);
    125.      } while ( u8g2.nextPage() );
    126.   }
    127. }
    128. void weatherData(const String & data)
    129. {
    130.     BLINKER_LOG("weather: ", data);
    131.     DeserializationError error = deserializeJson(doc, data);
    132.     if(error)
    133.     {
    134.      //显示获取失败
    135.       return;
    136.     }
    137.     const char* cloud = doc["cloud"]; // "0"
    138.     const char* cond_code = doc["cond_code"]; // "101"
    139.     const char* cond_txt = doc["cond_txt"]; // ""
    140.     const char* fl = doc["fl"]; // "31"
    141.     const char* hum = doc["hum"]; // "81"
    142.     const char* pcpn = doc["pcpn"]; // "0.0"
    143.     const char* pres = doc["pres"]; // "997"
    144.     const char* tmp = doc["tmp"]; // "28"
    145.     const char* vis = doc["vis"]; // "16"
    146.     const char* wind_deg = doc["wind_deg"]; // "159"
    147.     const char* wind_dir = doc["wind_dir"]; // 风向
    148.     const char* wind_sc = doc["wind_sc"]; // "2"
    149.     const char* wind_spd = doc["wind_spd"]; // "9"  
    150.     temp_wifi = atoi(tmp);//atoi是将字符型转化为数字 详见菜鸟教程:https://www.runoob.com/cprogramming/c-function-atoi.html
    151.     wind_wifi = atoi(wind_spd);
    152.     weather_wifi = atoi(cond_code);
    153.     wind_ang_wifi = atoi(wind_deg);
    154. }
    155. void dataRead(const String & data)
    156. {
    157.     BLINKER_LOG("Blinker readString: ", data);
    158.     uint32_t BlinkerTime = millis();
    159.     Blinker.vibrate();        
    160.     Blinker.print("millis", BlinkerTime);
    161.     digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    162. }
    163. void setup()
    164. {
    165.     Serial.begin(115200);
    166.     BLINKER_DEBUG.stream(Serial);
    167.     pinMode(LED_BUILTIN, OUTPUT);
    168.     digitalWrite(LED_BUILTIN, LOW);
    169.     Blinker.begin(auth, ssid, pswd);
    170.     Blinker.attachData(dataRead);
    171.     Blinker.attachWeather(weatherData);
    172.     Blinker.setTimezone(8.0);
    173.     u8g2.begin();   //选择U8G2模式,或者U8X8模式
    174.     u8g2.enableUTF8Print(); //  UTF8 输出(汉字显示不是很好,勉强够用)
    175.     Blinker.delay(3000);//此处预留开机动画位置
    176. }
    177. void loop()
    178. {   
    179.     Blinker.run();
    180.     dis_Time();
    181.     Blinker.delay(1000);
    182. }
    复制代码



  • TA的每日心情
    开心
    2020-6-29 14:59
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2020-5-24 17:59 | 显示全部楼层
    编译时卡在 StaticJsonDocument<400> doc;
    报错:StaticJsonDocument was not dealared in this scope 请问楼主是何问题。
  • TA的每日心情
    开心
    2020-7-6 09:30
  • 签到天数: 37 天

    [LV.5]常住居民I

     楼主| 发表于 2020-5-24 18:43 | 显示全部楼层
    tnn0220 发表于 2020-5-24 17:59
    编译时卡在 StaticJsonDocument doc;
    报错:StaticJsonDocument was not dealared in this scope 请问楼主 ...

    是否加载 JSON库 # include <Arduino_JSON.h>
  • TA的每日心情
    开心
    2020-6-29 14:59
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2020-5-24 19:52 | 显示全部楼层
    526598 发表于 2020-5-24 18:43
    是否加载 JSON库 # include

    加载了 JSON库,还试了ArduinoJson.h库也是一样报错。另外你的视频看不了,能上传屏幕显示效果图片吗?
  • TA的每日心情
    开心
    2020-7-6 09:30
  • 签到天数: 37 天

    [LV.5]常住居民I

     楼主| 发表于 2020-5-25 09:01 | 显示全部楼层
    tnn0220 发表于 2020-5-24 19:52
    加载了 JSON库,还试了ArduinoJson.h库也是一样报错。另外你的视频看不了,能上传屏幕显示效果图片吗? ...

    刚刚有试了一下,没发现你说的情况,百度翻译了(我一样不好)一下你说的报错,看样子是不在声明范围,要不这样你把StaticJsonDocument<400> doc;这条拿到最上面,把doc做全局变量使用
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2020-5-25 10:54 | 显示全部楼层
    这几天会更新天气相关接口,估计到时候你也得跟着修改下
    最新的接口:
    https://diandeng.tech/doc/weather-and-air
  • TA的每日心情
    开心
    2020-7-6 09:30
  • 签到天数: 37 天

    [LV.5]常住居民I

     楼主| 发表于 2020-5-25 11:45 | 显示全部楼层
    奈何col 发表于 2020-5-25 10:54
    这几天会更新天气相关接口,估计到时候你也得跟着修改下
    最新的接口:
    https://diandeng.tech/doc/weather- ...

    收到,我加群了,想获取更多设备额度?直接在群里发手机号么?

    点评

    发给群主号,一周处理一次  详情 回复 发表于 2020-5-25 12:08
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2020-5-25 12:08 | 显示全部楼层
    526598 发表于 2020-5-25 11:45
    收到,我加群了,想获取更多设备额度?直接在群里发手机号么?

    发给群主号,一周处理一次
  • TA的每日心情
    开心
    2020-5-8 15:23
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2020-5-26 11:08 | 显示全部楼层
    你好 代码对我帮助很大,我在调试的时候发现一个问题
    [mw_shl_code=arduino,true]          if((minute > 58) or (first_weadher=true))//每一小时获取一次天气信息,参考https://diandeng.tech/doc/weather
              {[/mw_shl_code]
    这里应该改为 first_weadher==true
  • TA的每日心情
    开心
    2020-7-6 09:30
  • 签到天数: 37 天

    [LV.5]常住居民I

     楼主| 发表于 2020-5-26 17:27 | 显示全部楼层
    chuan_demo 发表于 2020-5-26 11:08
    你好 代码对我帮助很大,我在调试的时候发现一个问题
    [mw_shl_code=arduino,true]          if((minute > 5 ...

    多谢提醒,已改正
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    ESP8266电池供电如何接线?
    ESP8266电池供电如何接线
    小白一枚,最近捣腾ESP8266-12F[/backcolor],在烧录架上烧录好Blinker程序是正常运行
    莫斯精灵
    莫斯精灵
      在抗战和谍情影片中无线电台发出的嘀嘀嗒嗒声大家一定印象深刻吧?其实就是将信
    AM广播环境监测仪
    AM广播环境监测仪
    #描述 之前在论坛看到一个帖子,可以让UNO产生1MHz-AM 调幅波并短距离发送电报。
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表