嵌入式技术论坛
直播中

韩刚龙

8年用户 1017经验值
私信 关注
[经验]

如何去实现一种基于RT-Thread的物联网温湿度传感器的设计

直接上代码,先看软件包配置 RT_Thread_setting

这里需要注意的是:
1、AT_DEVICE的包配置,如下图,修改一下串口的缓冲区大小

2、onenet相应信息的填写,如下图

主/产品 API key 对应的是onenet里Master-API KEY
API 秘钥 对应的是onenet里access key
身份验证信息就是自己设置的身份验证信息
然后看代码
DHT11部分

自动初始化
static void read_temp_entry(void *parameter)

{

char result;

rt_device_t dev = RT_NULL;

rt_size_t res;

rt_uint8_t get_data_freq = 1; /* 1Hz */

dev = rt_device_find("temp_dht11");

if (dev == RT_NULL)

{

return;

}

if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)

{

rt_kprintf("open device failed!
");

return;

}

rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)(&get_data_freq));

while (1)

{

res = rt_device_read(dev, 0, &sensor_data, 1);

if (res != 1)

{

rt_kprintf("read data failed! result is %d
", res);

rt_device_close(dev);

return;

}

else

{

if (sensor_data.data.temp >= 0)

{

uint8_t temp = (sensor_data.data.temp & 0xffff) >> 0; // get temp

uint8_t humi = (sensor_data.data.temp & 0xffff0000) >> 16; // get humi

sensor_data.data.temp = temp;

sensor_data.data.humi = humi;

rt_kprintf("temp:%d, humi:%d
" ,temp, humi);

rt_mb_send(&data_box,&sensor_data);

}

}

rt_thread_delay(2000);

}

}
例程线程 例程线程里添加了邮箱发送,以及利用了RT-Thread自带的sensor框架,讲数据存储在sensor的数据结构中
int onenet_mqtt_init(void)

{

int result = 0;

if (init_ok)

{

LOG_D("onenet mqtt already init!");

return 0;

}

if (onenet_get_info() < 0)

{

result = -1;

goto __exit;

}

onenet_mqtt.onenet_info = &onenet_info;

onenet_mqtt.cmd_rsp_cb = RT_NULL;

if (onenet_mqtt_entry() < 0)

{

result = -2;

goto __exit;

}

__exit:

if (!result)

{

LOG_I("RT-Thread OneNET package(V%s) initialize success.", ONENET_SW_VERSION);

init_ok = RT_TRUE;

}

else

{

LOG_E("RT-Thread OneNET package(V%s) initialize failed(%d).", ONENET_SW_VERSION, result);

}

return result;

}

INIT_APP_EXPORT(onenet_mqtt_init);

将onenet_mqtt_init做成自动初始化

static void onenet_upload_entry(void *parameter)

{

int value = 0;

struct rt_sensor_data my_data;

while (1)

{

if(rt_mb_recv(&data_box, &my_data, RT_WAITING_FOREVER) == RT_EOK)

{

if (onenet_mqtt_upload_digit("temperature", (uint8_t)(my_data.data.temp)/10) < 0)

{

LOG_E("upload has an error, stop uploading");

break;

}

else

{

LOG_D("buffer : {"temperature":%d}",(uint8_t)(my_data.data.temp)/10);

}

if (onenet_mqtt_upload_digit("humi", (uint8_t)(my_data.data.humi)/10) < 0)

{

LOG_E("upload has an error, stop uploading");

break;

}

else

{

LOG_D("buffer : {"humi":%d}", (uint8_t)(my_data.data.humi)/10);

}

}

rt_thread_delay(rt_tick_from_millisecond(2 * 100));

}

}

修改cycle线程,接收邮箱信息,将油箱信息发送给onenet云。


原作者:jia868

更多回帖

发帖
×
20
完善资料,
赚取积分