一、项目说明
偶得一嵌入式方盒子(wio_terminal),带块屏,有两排扩展接口,接几个传感器玩玩。以下实现了数据采集以图表形式显示的功能。
二、原理介绍
众所周知,传感器是一类把物理量转为换电信号装置。本次选用心率传感器,紫外线传感器,湿敏传感器三种,原理下:
心率传感器模块原理:通电后点亮led发射特定波长光波,光照进皮肤后,一部分被吸收一部分被反射。人体血液涌动时会改变反射率,通过测量反射光强度可以获得一条简易心电曲线,最后计算一段时间内有多少个波峰即可获得心率数据。为获得比较稳定信号,我在传感器表面沾了一层透明胶。
紫外线传感器原理:光携带的能量激发半导体内的电子产生定向移动。但是这个信号太小,需要经过电子器件放大后才能得到高质量稳定信号。图中紫外线传感器的关键在于滤光片,它能屏蔽可见光波段的光,只通过紫外光波段。这个滤光片可以内置也可以外置,像常见的遥控器窗口就是外置的,本文中的传感器的滤光片是内置的,用放大镜可以观察到。
湿敏传感器原理:两相互交错的栅形电极上覆有湿敏材料,它的电阻会随着湿度的增大而增大。将传感器接入分压电路后,通过测量中间结点电压反算湿度。需要注意的是这种湿敏材料不能承受过高电压,本文中的HDS10传感器电压不可超过0.8V,所以需要并联一个47k电阻进行限压保护。
三、开发平台
1.wio terminal 一台;
2.传感器若干;
3.arduino软件一套
本次选用的几个传感器输出信号均为模拟量,需要用到wio terminal的扩展接口,扩展接口定义如图。
A3,A4,A5这几个扩展口可作为模拟输入,在初始化时需要把这几个接口设置为输入模式。
pinMode(A3,INPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
四、数据处理
科学始于测量,为了方便描述,就需要对获得的模拟信号强度进行量化处理。然而大多数传感器的电信号都不是线性的,这取决于所测信号的传播方式、测量方法以及材料特性。往往需要一套非常复杂的公式以及多个补偿值来拟合。此过程过于复杂,所以我选用图表的形式进行显示,量多量少全靠脑补。
五、代码实现
arduino:一个方便又好玩的工具,前辈们已经打包好了一切。大多时候我们只需要加载库文件,简单修改参数就可以获得不错的效果。
LCD的初始化如下:
TFT_eSPI tft;
TFT_eSprite spr = TFT_eSprite(&tft);
tft.begin();
tft.setRotation(3);
spr.createSprite(TFT_HEIGHT,TFT_WIDTH);
图表的显示需要用到seeed的库 ”seeed_line_chart.h“ 例程注释很详细,如果需要调节更多参数可打开库文件研究源码。
表头相关设置:
//Settings for the line graph title
auto header = text(0, 0) //starting coordinates of title
.value("test") //actual title of the line graph
.align(center) //horizontal alignment of title
.valign(vcenter) //vertical alignment of title
.width(tft.width()) //width of the title
.thickness(3); //thickness of the font
header.height(header.font_height() * 2); //the height of title is the twice the height of the font
header.draw();
图表尺寸及颜色
//Settings for the line graph
auto content = line_chart(20, header.height()); //(x,y) where the line graph begins
content
.height(tft.height() - header.height() * 1.5) //actual height of the line chart
.width(tft.width() - content.x() * 2) //actual width of the line chart
.based_on(0.0) //Starting point of y-axis, must be a float
.show_circle(false) //drawing a cirle at each point, default is on.
.value(data) //passing through the data to line graph
.color(TFT_PURPLE) //Setting the color for the line
.draw();
完成了主线任务,最后再来一个开机动画:
ArcFull转圈圈,假装开机等待;
fillArc(160, 120, ((inc * 2) % 60) * 18, 5, 80, 80, 20, TFT_WHITE);
fillArc(160, 120, (((inc+1) * 2) % 60) * 18, 5, 80, 80, 20, TFT_WHITE);
fillArc(160, 120, (((inc-1) * 2) % 60) * 18, 5, 80, 80, 20, TFT_YELLOW);
fillArc(160, 120, (((inc-2) * 2) % 60) * 18, 5, 80, 80, 20, TFT_BLACK);
再来一串报文,假装系统很.....
tft.setTextSize(1);
tft.drawString("WELCOM ",15,10);
delay(100);
tft.drawString("TFT_INIT.............. ",15,20);
delay(100);
tft.drawString("HUM_INIT .............",15,30);
delay(100);
tft.drawString("KEY_INIT.............. ",15,40);
delay(100);
tft.drawString("PLU_INIT ............",15,50);
delay(100);
tft.drawString("SYS IS OK! ...............",15,60);
delay(100);
tft.drawCentreString("Press any key", 120, 260, 5);
delay(1000);
完结,撒花!
六、心得体会
学了一些LCD显示方法;
传感器数据是真的难处理。