基于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)把数据上传。
编译打开串口测试。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43058521/article/details/106095361