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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛Jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值