写在最前面

华清远见教育集团
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上报一次,这里通过串口来实现,将结构体变量中的信息发送出去

 

 

最后通过串口助手捕获数据包

然后我们就可以在串口助手,查看程序上报的数据流了