自制WiFi天气时钟基于Blinker esp-01(8266) u8g2驱动12864 LCD屏-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 25278|回复: 41

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

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

先发个实物展示视频: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. }
复制代码



发表于 2020-5-24 17:59 | 显示全部楼层
编译时卡在 StaticJsonDocument<400> doc;
报错:StaticJsonDocument was not dealared in this scope 请问楼主是何问题。
 楼主| 发表于 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>
发表于 2020-5-24 19:52 | 显示全部楼层
526598 发表于 2020-5-24 18:43
是否加载 JSON库 # include

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

刚刚有试了一下,没发现你说的情况,百度翻译了(我一样不好)一下你说的报错,看样子是不在声明范围,要不这样你把StaticJsonDocument<400> doc;这条拿到最上面,把doc做全局变量使用
发表于 2020-5-25 10:54 | 显示全部楼层
这几天会更新天气相关接口,估计到时候你也得跟着修改下
最新的接口:
https://diandeng.tech/doc/weather-and-air
 楼主| 发表于 2020-5-25 11:45 | 显示全部楼层
奈何col 发表于 2020-5-25 10:54
这几天会更新天气相关接口,估计到时候你也得跟着修改下
最新的接口:
https://diandeng.tech/doc/weather- ...

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

点评

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

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

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

本版积分规则

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

GMT+8, 2024-11-28 14:32 , Processed in 0.413928 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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