跳到主要内容

WiFi远程温湿度采集器

一、实现的功能描述

在开发板上通过OLED屏幕显示当前的温度和湿度数据,并将温湿度数据每隔3秒通过TCP连接上传给远程服务器。

本例程的通信是基于TCP方式,如果希望改成UDP、MQTT方式,或者更多详细细节,可以参考前面的

《WiFi通信(TCP/UDP/MQTT)》教程。

二、本实验教学目的

掌握基于ShineBlink的:

  • WiFi TCP通信

  • SHT3X温湿度传感器的使用

  • OLED屏幕显示

三、本实验涉及的模块

WiFi模块,STH3X温湿度传感器、以及OLED屏幕在开发板上的位置如下:

C2DevKit

四、完整源代码

UID = LIB_GetSysUniID() --也可以自己定义,比如UID = "001"
--设置sht3x传感器占用SCL0和SDA0引脚,并启动传感器以10Hz工作,选择最高精度
LIB_Sht3xConfig("IIC0","10","HIGH")
--设置0.96寸oled模块占用SCL1和SDA1引脚
LIB_0_96_OledConfig("IIC1")
--WiFi工作相关参数配置
server_addr = "192.168.1.7" --这里也可以写服务器域名,比如"abc.com"等
server_port = 8888
ap_ssid = "mywifi" --路由器账号
ap_passwd = "abc123" --路由器密码
--初始化WiFi TCP模式
LIB_IntWifiTcpConfig(ap_ssid,ap_passwd,server_addr,server_port,0)
--使能10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")
timer0 = 0
--定义10毫秒定时器回调函数
function LIB_10msTimerCallback()
timer0 = timer0 + 10
end
t = 0.0
h = 0.0
--开始大循环
while(GC(1) == true)
do
--每隔3秒向服务器上传一串json字符串,包含C2M自身唯一ID,以及温湿度数据
if timer0 >= 3000 then
timer0 = 0
json_str = string.format("{\"id\":%s, \"temp\":%.2f, \"humi\":%.2f}", UID, t, h)
--TCP发送时需要将字符串转换成table数组才能发送
LIB_IntWifiTcpSend(LIB_StrToTab(json_str))
end
--查询sht3x传感器是否出数
sht3x_flag,sht3x_temp,sht3x_humi = LIB_Sht3xGetResult()
--如果传感器有新的温湿度数据就显示并更新t和h值
if sht3x_flag == 1 then
--在oled的第一行和第二行分别显示温度(摄氏度)和湿度(百分比)
LIB_0_96_OledPuts("1","1",string.format("temprature: %.2f", sht3x_temp))
LIB_0_96_OledPuts("2","1",string.format("humidity: %.2f", sht3x_humi))
t = sht3x_temp
h = sht3x_humi
end
end

**注意:**上面代码中每隔3秒中将开发板自身的设备 UID 发送给TCP服务器的用意是帮助服务器识别当前开发板的身份,因为在很多TCP/UDP通信场景中是无法通过IP地址来识别Client身份的。

  • UID可以通过LIB_GetSysUniID()函数获取到每个C2M模块的唯一UID用来帮助服务器识别硬件的身份,这样可以保证设备身份的唯一性:
--以下代码会给 UID 赋予一个9字节的唯一ID字符串,例如"0AB95E15E803F78402"
UID= LIB_GetSysUniID()
  • UID也可以由开发者自己定义,如果设备数量不多的话
UID = "001"

开发者可以通过在产品量产的过程中通过UART串口将UID批量打印出来贴在产品外壳上面,shineblink.com官网技术文档中有如何通过热敏打印机批量自动化打印每个设备唯一二维码标签的教程,感兴趣请查阅。

五、实验现象

将上面代码中的WiFi路由器账号和密码设置成您的,并将代码复制到开发板的虚拟TF卡中开始运行后,我们就可以在OLED屏幕显示当前的温度和湿度数据。然后我们在电脑端打开《网络调试助手》工具,并开启IP地址为“192.168.1.7”端口为8888的TCP Server,接下来在工具页面中就可以看到每隔3秒开发板上传的温湿度json字符串数据。注意:我们的开发板和电脑需要连在同一个路由器之下。

pic1

pic2

六、常见问题

如果当您运行代码后发现无法正常通信,别着急,从以下几个方面找问题:

  • ap_ssid 和 ap_passwd 是否设置对了?
  • 服务器地址server_addr和端口号server_port是否设置对了?服务器是否正常工作?
  • 您用的AP,是否正确设置成2.4G网络了?因为目前很多手机和路由器支持5G WiFi网络,但5G网络不适用于物联网设备。

也可以利用函数来判断开发板是否连上了AP,示例如下:

--读取系统信息,其中包含WiFi是否连上路由器或Ap的信息
Rst,Crash,HeapSpace,ApCon=LIB_GetC2KeyDbgInfo()
if ApCon == 1 then
LIB_GpioWrite("D0", 0) --WiFi已连上AP,红灯亮
else
LIB_GpioWrite("D0", 1) --WiFi未连上AP,红灯灭
end