[IOT技术] 基于新定义NBK-EBS003 IoT扩展板的互联网时钟和温度牌

[复制链接]
 楼主| HonestQiao 发表于 2023-2-28 23:52 | 显示全部楼层 |阅读模式
本帖最后由 HonestQiao 于 2023-3-1 00:56 编辑

首先感谢xld0932提供了一个完整的实例:【新提醒】新定义NBK-EBS003 IoT功能扩展板,云端与显示的契合!
本来想给EBS003扩展板的ESP-12F刷支持MQTT的固件,从而可以和MQTT通讯进行IoT数据上报和远程控制。但烧录没成功,应该是引脚处理不当。
后来基于xld0932的实例,进行了完善,实现了这个小小的互联网时钟和温度牌。
xld0932的实例完成了99.99%的工作,我只做了0.01%的修改,特此感谢。

要使用xld0932提供的实例,首先需要做两件事情:
  • 准备一个让ESP-12F连接的WiFI,也就是SSID和密码
  • 在心知天气注册一个账号,开通免费服务,获取对应的秘钥

以上的两个信息,因为涉及到个人定制,所以我稍微修改了实例提供的代码,将修改的部分,集中于config.h文件中:
  1. /***********************************************************************************************************************
  2.   * [url=home.php?mod=space&uid=288409]@file[/url]    config.h
  3.   * [url=home.php?mod=space&uid=187600]@author[/url]  King
  4.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.00
  5.   * [url=home.php?mod=space&uid=212281]@date[/url]    18-Jan-2023
  6.   * [url=home.php?mod=space&uid=247401]@brief[/url]   ......
  7.   *********************************************************************************************************************/

  8. /* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/
  9. #ifndef __CONFIG_H__
  10. #define __CONFIG_H__

  11. /* Includes ----------------------------------------------------------------------------------------------------------*/
  12. #include <math.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>

  16. /* Includes ----------------------------------------------------------------------------------------------------------*/
  17. #include "rd8_conf.h"

  18. /* Includes ----------------------------------------------------------------------------------------------------------*/
  19. #include "TimeSlice.h"

  20. /* Includes ----------------------------------------------------------------------------------------------------------*/
  21. #include "ESP12.h"
  22. #include "LED.h"
  23. #include "MCU.h"
  24. #include "OLED.h"
  25. #include "RGB.h"
  26. #include "json.h"

  27. #define SSID "OpenBSD"
  28. #define PASS "********"
  29. #define WIFI_CONN_STR "AT+CWJAP="" SSID "",""PASS"""

  30. #define API_KEY "S**************g"
  31. #define API_CITY "beijing"
  32. #define API_URL "https://api.seniverse.com/v3/weather/now.json?key=" API_KEY "&location=" API_CITY "&language=zh-Hans&unit=c"
  33. #define API_REQUEST_STR "GET " API_URL "\r\n"
  34. #endif

  35. /*****************************************************END OF FILE******************************************************/



对应的WiFi连接部分,则修改位置在ESP12.c文件中:
  1.     /* 连接WiFi */
  2.     /* AT+CWJAP="SSID","PASS" */
  3.     if (ESP12_AT_SendCommand(WIFI_CONN_STR, "OK", 8000) == 0)
  4.     {
  5.         if (ESP12_AT_SendCommand(NULL, "OK", 8000) == 0)
  6.         {
  7.             OLED_Clear();
  8.             OLED_ShowString(0, 0, "WiFi Connect Error!", 16);
  9.             return;
  10.         }
  11.     }



对应心知天气数据获取的部分,同样修改该文件:
  1. void ESP12_TxHandler(void)
  2. {
  3.     if (1 == ESP12_InitFlag)
  4.     {
  5.         /* 每间隔5秒获取一次天气信息, 服务器限制每分钟最多20次!!! */
  6.         ESP12_SendString(API_REQUEST_STR);
  7.     }
  8. }


上述API Key的获取,可以访问心知天气(https://www.seniverse.com/),注册后开通免费服务,在从如下界面获取:
iShot_2023-03-01_00.52.51.png

由于心知天气返回的是json字符串:
  1. {"results":[{"location":{"id":"****************","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"晴","code":"1","temperature":"6"},"last_update":"2023-03-01T00:10:13+08:00"}]}


C51资源有限,所以原实例简单起见,直接显示从temperature往后的所有字符如。
经过摸索,找到了一个非常简化的可用于C51的json解析代码,虽然功能极其有限且不完善,但是用于此处的解析足够了:
  1. /* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/
  2. #ifndef __JSON_H__
  3. #define __JSON_H__

  4. /***************************************
  5. name: JSON C函数库 头文件
  6. ***************************************/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. /***************************************
  11. name: 函数声明
  12. input:
  13. output:
  14. description:
  15. ***************************************/
  16. char json_check(char *str); // JSON 校验函数
  17. char json_get_value(char *json, char *json_key, char *json_value); // JSON获取键值
  18. char json_check_value(char *str1, char *str2); // JSON 键值对比函数

  19. #endif

  20. /*****************************************************END OF FILE******************************************************/


这个库只能做最基础的处理,json_get_value()用于获取对应key的值。就获取第一个找到的,如果有多个重复的,抱歉。
在这篇分享提供的代码中,已经提供了这两个库,可以直接调用即可。

然后,将显示的部分,进行如下的处理:
  1. if (!bStatus) {
  2.                 bStatus = 1;
  3.                 OLED_Clear();
  4.                 OLED_ShowString(0, 0, "Date Time:", 16);
  5.                 OLED_ShowString(0, 2, "D: ", 16);
  6.                 OLED_ShowString(0, 4, "T: ", 16);
  7.                 OLED_ShowString(0, 6, "Temp:", 16);
  8.             }
  9.             OLED_ShowString(50, 6, "        ", 16);
  10.             if(json_get_value((char *)ESP12_Buffer, "temperature", json_value))
  11.             {
  12.                 OLED_ShowString(50, 6, json_value, 16);
  13.             }
  14.             
  15.             if(json_get_value((char *)ESP12_Buffer, "last_update", json_value))
  16.             {
  17.                 strncpy(date, json_value, 10);
  18.                 strncpy(time, json_value+11, 8);
  19.                 OLED_ShowString(18, 2, date, 16);
  20.                 OLED_ShowString(18, 4, time, 16);
  21.             }


这个地方,本来想把这个时间作为一个基础,来按秒递增,从而实现互联网时钟的功能。
但是实际调用后发现,这个时间,不是当前的时间,而是当前天气数据更新的时间。所以就不能用作时钟的更新显示了。
后续将会定时调用 https://f.m.suning.com/api/ct.do,来获取最新的时间戳,并结合定时器,来实现按秒走动的时钟。

目前效果如下:
1.jpg

再次感谢 xld0932 提供的实例。

后续完善:
1. 通过在线api获取最新的时间戳,然后用于时钟的显示
2. 研究如何给板载的ESP-12F刷MQTT固件,实现进一步的数据上报和远程控制。


Project_NBK-RD8x3x_NBK-EBS003_New.zip

546.35 KB, 下载次数: 8

xld0932 发表于 2023-3-1 17:40 | 显示全部楼层
updownq 发表于 2023-3-9 12:05 | 显示全部楼层
怎么解析json格式的数据?              
jonas222 发表于 2023-3-9 12:22 | 显示全部楼层
这个如何确定的host的ip?              
wangdezhi 发表于 2023-3-9 12:29 | 显示全部楼层
这个是http+get实现的吗?
albertaabbot 发表于 2023-3-9 12:38 | 显示全部楼层
有的架构实现不了访问是什么原因?
lzbf 发表于 2023-3-9 12:53 | 显示全部楼层
可以实现天气图片的保存吗?              
sanfuzi 发表于 2023-3-9 13:25 | 显示全部楼层
如何使用esp8266下载一个文,并保存到单片机上。
gygp 发表于 2023-3-10 10:01 | 显示全部楼层
esp8266可以直接访问心知天气,更简单。
bestwell 发表于 2023-3-11 20:13 | 显示全部楼层
AT指令怎么建立连接tcp?              
51xlf 发表于 2023-3-11 20:20 | 显示全部楼层
esp-01s可以实现这个功能吗?
pl202 发表于 2023-3-11 20:37 | 显示全部楼层
获取心知天气,有什么要求吗?              
louliana 发表于 2023-3-11 20:57 | 显示全部楼层
非常完美的设计,互联网时钟。              
sanfuzi 发表于 2023-3-11 21:24 | 显示全部楼层
可以使用arduino开发esp8266吗?
burgessmaggie 发表于 2023-3-11 21:36 | 显示全部楼层
这个esp8266的通信频率是115200吗?
gygp 发表于 2023-3-11 22:04 | 显示全部楼层
IoT扩展板功能齐全。              
 楼主| HonestQiao 发表于 2023-3-22 14:45 | 显示全部楼层
updownq 发表于 2023-3-9 12:05
怎么解析json格式的数据?

使用了一个非常simple的字符串匹配解析json
 楼主| HonestQiao 发表于 2023-3-22 14:46 | 显示全部楼层
jonas222 发表于 2023-3-9 12:22
这个如何确定的host的ip?

这个不用自己处理啊,esp8266联网时会自行处理。
 楼主| HonestQiao 发表于 2023-3-22 14:47 | 显示全部楼层
wangdezhi 发表于 2023-3-9 12:29
这个是http+get实现的吗?

是的
 楼主| HonestQiao 发表于 2023-3-22 14:49 | 显示全部楼层
albertaabbot 发表于 2023-3-9 12:38
有的架构实现不了访问是什么原因?

具体是啥问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

110

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

42

主题

110

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部