打印
[IOT技术]

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

[复制链接]
855|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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文件中:
/***********************************************************************************************************************
  * [url=home.php?mod=space&uid=288409]@file[/url]    config.h
  * [url=home.php?mod=space&uid=187600]@author[/url]  King
  * [url=home.php?mod=space&uid=895143]@version[/url] V1.00
  * [url=home.php?mod=space&uid=212281]@date[/url]    18-Jan-2023
  * [url=home.php?mod=space&uid=247401]@brief[/url]   ......
  *********************************************************************************************************************/

/* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/
#ifndef __CONFIG_H__
#define __CONFIG_H__

/* Includes ----------------------------------------------------------------------------------------------------------*/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

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

/* Includes ----------------------------------------------------------------------------------------------------------*/
#include "ESP12.h"
#include "LED.h"
#include "MCU.h"
#include "OLED.h"
#include "RGB.h"
#include "json.h"

#define SSID "OpenBSD"
#define PASS "********"
#define WIFI_CONN_STR "AT+CWJAP=\"" SSID "\",\""PASS"\""

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

/*****************************************************END OF FILE******************************************************/



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



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


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


由于心知天气返回的是json字符串:
{"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解析代码,虽然功能极其有限且不完善,但是用于此处的解析足够了:
/* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/
#ifndef __JSON_H__
#define __JSON_H__

/***************************************
name: JSON C函数库 头文件
***************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/***************************************
name: 函数声明
input:
output:
description:
***************************************/
char json_check(char *str); // JSON 校验函数
char json_get_value(char *json, char *json_key, char *json_value); // JSON获取键值
char json_check_value(char *str1, char *str2); // JSON 键值对比函数

#endif

/*****************************************************END OF FILE******************************************************/


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

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


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

目前效果如下:


再次感谢 xld0932 提供的实例。

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


Project_NBK-RD8x3x_NBK-EBS003_New.zip

546.35 KB

使用特权

评论回复
沙发
xld0932| | 2023-3-1 17:40 | 只看该作者

使用特权

评论回复
板凳
updownq| | 2023-3-9 12:05 | 只看该作者
怎么解析json格式的数据?              

使用特权

评论回复
地板
jonas222| | 2023-3-9 12:22 | 只看该作者
这个如何确定的host的ip?              

使用特权

评论回复
5
wangdezhi| | 2023-3-9 12:29 | 只看该作者
这个是http+get实现的吗?

使用特权

评论回复
6
albertaabbot| | 2023-3-9 12:38 | 只看该作者
有的架构实现不了访问是什么原因?

使用特权

评论回复
7
lzbf| | 2023-3-9 12:53 | 只看该作者
可以实现天气图片的保存吗?              

使用特权

评论回复
8
sanfuzi| | 2023-3-9 13:25 | 只看该作者
如何使用esp8266下载一个文,并保存到单片机上。

使用特权

评论回复
9
gygp| | 2023-3-10 10:01 | 只看该作者
esp8266可以直接访问心知天气,更简单。

使用特权

评论回复
10
bestwell| | 2023-3-11 20:13 | 只看该作者
AT指令怎么建立连接tcp?              

使用特权

评论回复
11
51xlf| | 2023-3-11 20:20 | 只看该作者
esp-01s可以实现这个功能吗?

使用特权

评论回复
12
pl202| | 2023-3-11 20:37 | 只看该作者
获取心知天气,有什么要求吗?              

使用特权

评论回复
13
louliana| | 2023-3-11 20:57 | 只看该作者
非常完美的设计,互联网时钟。              

使用特权

评论回复
14
sanfuzi| | 2023-3-11 21:24 | 只看该作者
可以使用arduino开发esp8266吗?

使用特权

评论回复
15
burgessmaggie| | 2023-3-11 21:36 | 只看该作者
这个esp8266的通信频率是115200吗?

使用特权

评论回复
16
gygp| | 2023-3-11 22:04 | 只看该作者
IoT扩展板功能齐全。              

使用特权

评论回复
17
HonestQiao|  楼主 | 2023-3-22 14:45 | 只看该作者
updownq 发表于 2023-3-9 12:05
怎么解析json格式的数据?

使用了一个非常simple的字符串匹配解析json

使用特权

评论回复
18
HonestQiao|  楼主 | 2023-3-22 14:46 | 只看该作者
jonas222 发表于 2023-3-9 12:22
这个如何确定的host的ip?

这个不用自己处理啊,esp8266联网时会自行处理。

使用特权

评论回复
19
HonestQiao|  楼主 | 2023-3-22 14:47 | 只看该作者
wangdezhi 发表于 2023-3-9 12:29
这个是http+get实现的吗?

是的

使用特权

评论回复
20
HonestQiao|  楼主 | 2023-3-22 14:49 | 只看该作者
albertaabbot 发表于 2023-3-9 12:38
有的架构实现不了访问是什么原因?

具体是啥问题?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

85

帖子

2

粉丝