基于STM32F407VET6与RT-Thread系统实现ds18b20数据上传onenet云端
硬件清单
主要硬件为<STM32F407VET6开发板>、<ESP8266WIFI模块>、<DS18B20温度计传感器模块>。
硬件连接:开发板通过串口1与电脑连接、ESP8266WIFI通过串口3与开发板连接、DS18B20通过引脚PE7与开发板连接。
前期工作
温度传感器测试示例
参照以前做过的例程: 温度传感器测试示例.(同时记得打开串口3)
onenet注册与设备创建
没有注册先注册onenet账号,注册后进入开发者中心。
注册设备:全部产品->多协议接入->添加产品
填写产品信息。
确定后,同时添加设备。填写设备的名称,鉴权信息(先随便填吧)
添加成功
ENV软件包下载与配置
在以前工程目录下,进入ENV界面
添加在线软件包驱动ESP8266,同时修改要连接外部的WIFI名称、密码以及要用的串口
打开onenet软件包,修改参数
修改产品信息
修改设备信息
退出,更新软件包,编译工程。
软件包程序调用与测试
打开keil工程
取消掉原温度传感器例程示例
在主函数main.c中添加代码,包括DS18B20初始化,
#define DS18B20_DATA_PIN GET_PIN(E, 7)
double tempp;
static rt_sem_t mqttinit_sem;
static int rt_hw_ds18b20_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.user_data = (void *)DS18B20_DATA_PIN;
rt_hw_ds18b20_init("ds18b20", &cfg);
return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_ds18b20_port);
创建两个线程,使用信号量保持mqtt初始化后进行上传数据。
int main(void)
{ rt_thread_t upload_thread,mqtt_init_thread;
mqttinit_sem=rt_sem_create("mqttinit_sem",//串口2信号量
0,
RT_IPC_FLAG_FIFO);
mqtt_init_thread= rt_thread_create("mqtt_init_thread",//创建线程usart
mqtt_init,
RT_NULL,
1024,
RT_THREAD_PRIORITY_MAX/2-1,
20);
if(mqtt_init_thread != RT_NULL)
{
rt_thread_startup(mqtt_init_thread);
}
upload_thread = rt_thread_create("upload_thread",//创建线程led
upload_temp_data,
"temp_ds18b20",
1024,
RT_THREAD_PRIORITY_MAX/2,
20);
if(upload_thread != RT_NULL)
{
rt_thread_startup(upload_thread);
}
return RT_EOK;
}
两个线程对应的入口函数:mqtt初始化(static void mqtt_init(void *parameter))、数据上传()
static void mqtt_init(void *parameter)
{
uint8_t onenet_mqtt_init_failed_times;
while(1)
{
if(!onenet_mqtt_init())
{
rt_sem_release(mqttinit_sem);
return;
}
rt_thread_mdelay(100);
rt_kprintf("onenet mqtt init failed %d times",onenet_mqtt_init_failed_times++);
}
}
static void upload_temp_data(void *parameter)
{
rt_device_t dev = RT_NULL;
struct rt_sensor_data sensor_data;
rt_size_t res;
if(rt_sem_take(mqttinit_sem,RT_WAITING_FOREVER)== RT_EOK)
{
rt_sem_delete(mqttinit_sem);
}
dev= rt_device_find(parameter);
if (dev==RT_NULL)
{
rt_kprintf("Can't find device:%s\n",parameter);
return;
}
if (rt_device_open(dev,RT_DEVICE_FLAG_RDWR) != RT_EOK)
{
rt_kprintf("Open device failed\n");
return;
}
while(1)
{
res= rt_device_read(dev,0,&sensor_data,1);
if(res !=1)
{
rt_kprintf("read data is failed!size is %d\n",res);
rt_device_close(dev);
return;
}
else
{
if (sensor_data.data.temp >= 0)
{
tempp=(sensor_data.data.temp / 10);
}
else
{
tempp=-abs(sensor_data.data.temp / 10);
}
if(onenet_mqtt_upload_digit("temperature",tempp) != RT_EOK)
{
rt_kprintf("upload temperature has an error,try again!\n");
}
else
{
rt_kprintf("onenet upload OK >>> temp:%d\n",tempp);
}
}
rt_thread_mdelay(100);
}
}
说白了就是用onenet_mqtt_init()初始化协议后,用onenet_mqtt_upload_digit(“temperature”,tempp)把数据上传。
编译打开串口测试。