写在最前面
华清远见教育集团
15年专注高端IT培训
做良心教育,做专业教育,做受人尊敬的职业教育创客学院官网:http://www.makeru.com.cn/
华清远见创客学院嵌入式课程链接:http://www.makeru.com.cn/emb
华清远见创客学院物联网课程链接:http://www.makeru.com.cn/iot
正文
底层实现对数据的采集、分类、打包、发送,同时还要可以接收并解析上位机传递下来的命令。这意味不是仅仅采集到数据就OK了的,还要把数据表述成上位机想要的格式。这里使用STM32F407的芯片实现的程序,由于原理上是一样的,所以不论用什么芯片来设计都不影响。还有就是由于笔者能力和时间比较仓促的缘故,还不能实现对多个数据源的采集。以后有机会的话可以多多学做下程序移植。
本文的重点从程序上分析,分析整个程序对数据采集-上报过程中的设计思想。
硬件资源
- LED灯 DS0(PF9) DS1(PF10)
- 定时器3(TIM3),配置为10ms中断一次,实现对不同时间段的标记
- 串口1 PA9(TX) PA10(RX) 用于输出程序运行时的提示信息
- 串口2 PA2(TX) PA3(RX) 用于完成与上位机的交互
- 按键 KEY0 PE4 KEY1 PE3 KEY2 P32 WK_UP PA0 作为输入设备,直接控制底层硬件(还没有实现控制环)
- 温度湿度传感器 DHT11(PG9) 作为输入设备,采集数据上传
- 光敏传感器 LSENS(PF7 - ADC3) 作为输入设备,采集数据上传
- 六轴姿态传感器 MPU6050(通过IIC读取) 作为输入设备,采集x-y-z轴陀螺仪(姿态角)原始数据上传
对上报数据的格式进行构造
参考这一篇的介绍:https://mp.csdn.net/postedit/84898279
数据头+数据类型+仓库号+温度+湿度+光度
typedef struct storage_goods_info
{
unsigned char goods_type; // Goods type for example: APPLE, BANANA, PEAR, ...
unsigned int goods_count; // Number of goods of each type.
} __attribute__((packed)) GOODS;
typedef struct storage_info
{
char index[2];
unsigned char storage_status; // Storage No.
unsigned char led_status; // Device status.
unsigned char buzzer_status; // Device status.
unsigned char key_status; // Device status.
float temperature; // The current temperature of curtain reposity.
float temperatureMIN; // The lowest limit to temperature for curtain reposity.
float temperatureMAX; // The highest limit to temperature for curtain reposity.
float humidity; // The current humidity of curtain reposity.
float humidityMIN; // The lowest limit to humidity for curtain reposity.
float humidityMAX; // The highest limit to humidity for curtain reposity.
float illumination; // The strength of lightnss.
float illuminationMIN; // The lowest limit to strength of lightnss for curtain reposity.
float illuminationMAX; // The highest limit to strength of lightnss for curtain reposity.
struct storage_goods_info goods_info[GOODS_NUM]; // Goods info for all types of goods.
} __attribute__((packed)) REPO_ENV;
主程序思路
在main中进行轮询,当标记变量被触发的时候,开始对传感器进行数据采集。通过定时器计时触发标记符来管理这个过程。
数据采集到变量
这里利用的第三方库函数来实现采集,分别采集的是温度湿度值和光强度,数据通过传感器被直接采集到相关变量上。
变量中的数据封装到结构体
按照预先定义的数据格式,将数据打包成一个数据包。
结构体中的数据串口发送
定时器1s触发一次To1SFlag标记,主程序的循环中实时判断这个标记。每隔1s上报一次,这里通过串口来实现,将结构体变量中的信息发送出去
最后通过串口助手捕获数据包
然后我们就可以在串口助手,查看程序上报的数据流了