今天,教大家如何通过RT_thread studio移植代码来实现温度采集温度数据
第一步创建工程
我使用的是STM32ZET6开发板(其实什么开发板都一样)只要支撑BSP开发即可实现;
模式配置
设置配置,并保存 “Ctrl+S”
第二步代码移植
打开从RT_thread 中github下载的例程。如果找不到的,可以从这里下载
基于RT_thread分布式温度采集系统
下载后,找到这两个文件
再将文件复制到刚刚创建的RT_thread studio 创建的Demo中
这里注意了,将两个文件放在driver的文件夹中
其他的目录的我没尝试过,不过,我是按照例程放在此目录下的;
在工程内部点击同步即可:
在此文件夹中,右击,点击 同步scons配置此项目即可添加刚刚的两个文件夹到工程内;
第三代码添加
在main中添加此代码即可完成本次第一周的代码工作;
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-05-30 RT-Thread first version
*/
#include <rtthread.h>
#include "board.h"
#include <stdlib.h>
#include <rtdevice.h>
#include <sensor.h>
#include "sensor_dallas_ds18b20.h"
#include <rtdbg.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
//#define LED0_PIN GET_PIN(F, 0)
#define DS18B20_DATA_PIN GET_PIN(G, 9)
static void read_temp_entry(void *parameter)
{
rt_device_t dev = RT_NULL;
struct rt_sensor_data sensor_data;
rt_size_t res;
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;
}
rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100);
while (1)
{
res = rt_device_read(dev, 0, &sensor_data, 1);
if (res != 1)
{
rt_kprintf("read data failed!size is %d\n", res);
rt_device_close(dev);
return;
}
else
{
if (sensor_data.data.temp > 0)
{
rt_kprintf("temp:%3d.%dC, timestamp:%5d\n",
sensor_data.data.temp / 10,
sensor_data.data.temp % 10,
sensor_data.timestamp);
}
else
{
rt_kprintf("temp:-%2d.%dC, timestamp:%5d\n",
abs(sensor_data.data.temp) / 10,
abs(sensor_data.data.temp) % 10,
sensor_data.timestamp);
}
}
rt_thread_mdelay(100);
}
}
int main(void)
{
rt_thread_t ds18b20_thread;
ds18b20_thread = rt_thread_create("18b20tem", read_temp_entry, "temp_ds18b20",
640, RT_THREAD_PRIORITY_MAX / 2, 20);
if (ds18b20_thread != RT_NULL)
{
rt_thread_startup(ds18b20_thread);
}
return RT_EOK;
}
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_ENV_EXPORT(rt_hw_ds18b20_port);
第四 编译及调试下载
五、结果演示
这就是这个例程的全部过程,我是边看边做边写的,所以还需要理解哈!