发布时间:2022-12-26 17:00
本篇主要是使用百问网的100ASK_STM32F103_PRO开发板加上ESP8266和DHT11设计一个采集环境温湿度的子系统,将温湿度数据上云,让阿里云服务器转发给订阅了该温湿度数据主体的MQTT客户端,也就是之前做的基于STM32MP157开发板的温湿度监控系统。
适用于百问网的100ASK_STM32F103_PRO开发板。
这个温湿度采集子系统是基于RT-Thread操作系统,使用的ide是RTT的studio,因为可以用它的生态软件包快速实现我们的需求。
新建rt-thread studio的STM32F103的工程就不介绍了,依照官方文档做很简单的,下面开始添加和配置软件包。
如果再RT-Thread Settings的软件包里面搜索不到DHT11的软件包的话,可以去官网的软件包中查看一下分类,然后再去软件包中设置:
在这里面找到DHT11的软件包:
这里油两种,都可以使用,如果不清楚使用的引脚序号是多少的话可以暂时不设置。
mqtt在RT-Thread Settings软件包的IoT-物联网中的:
这里选择的是其中一种,也是前面几篇文章用的mqtt库paho mqtt,使能了示例。
因为我们的方案是使用的ESP8266连接WiFi入网然后再去和阿里云服务器建立连接的,因而就需要使用到ESP8266的库,在RT-Thread Settings里面ESP8266的应用是在AT设备里面设置的,而AT设备也是在IoT-物联网里面的:
我们需要设置连接的WiFi名称和密码,然后和ESP8266连接的串口是哪个也需要指定。
当DHT11、MQTT、AT设备都配置到之后就选择保存,将配置生效生成代码到工程里面去。
在DHT11的示例代码中,使用的引脚是用引脚序号来定义的,如果不熟悉这种用法可以将源码注释掉,改成使用GET_PIN
宏函数来选择GPIO:
// 源代码
#include
#include
#include
#include "dhtxx.h"
#define DATA_PIN PKG_USING_DHTXX_SAMPLE_PIN
修改后的代码:
可以看到这里添加了一个驱动层的头文件,这是因为GET_PIN
是在里面宏定义的,通过此函数可以方便的指定我们用的是哪一组GPIO的哪一个引脚。
DHT的源码是将读取数据的app注册放到了终端去输入指令调用的,我们期望的是每隔固定周期自动读取,因而可以自己创建一个线程:
static void dht_thread_entry(void *parameter)
{
dht_device_t sensor = dht_create(DATA_PIN);
while(1)
{
if(dht_read(sensor))
{
rt_int32_t temp = dht_get_temperature(sensor);
rt_int32_t humi = dht_get_humidity(sensor);
rt_kprintf("Temp: %d, Humi: %d\n", temp, humi);
}
else
{
rt_kprintf("Read dht sensor failed.\n");
}
rt_thread_delay(5000);
}
dht_delete(sensor);
}
static int dht_thread_init(void)
{
rt_thread_t dht_t = rt_thread_create("DHT", \
dht_thread_entry, \
RT_NULL, \
512, \
RT_THREAD_PRIORITY_MAX>>1, \
10);
if(dht_t == RT_NULL)
{
rt_kprintf("Failed to create dht thread.\n\r");
return -1;
}
rt_thread_startup(dht_t);
return 0;
}
INIT_APP_EXPORT(dht_thread_init);
这样F103就会每隔大约5s的时间读取一次温湿度数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAKCcSwu-1657613242193)(LinuxApp-7-TempHumiSubSystem/image-20220706103704730.png)]
可以看到数据是放大了10倍的,如果没有精度需求的哈,可以只保留整数位也就是将数据除以10:
rt_int32_t temp = dht_get_temperature(sensor)/10;
rt_int32_t humi = dht_get_humidity(sensor)/10;
MQTT使用的AT设备是使用UART3连接的ESP8266,但是我们的源码里面是没有使能和定义UART3及其引脚的,因而我们需要去board.h
里面将UART3的设置定义出来:
然后再去MQTT的示例里面修改登录服务器的地址、客户端ID等信息:
接着定义一个静态全局变量is_connect
来表明客户端和服务器是断开还是连接状态,这个标志在paho mqtt的连接成功回调函数和连接断开回调函数中改变: