Funpack第12期-Wio Terminal-传感器测试
看看封面就够了,内容也没什么好看的,如果非要点的话,也可以。
标签
传感器
wio terminal
岁月静好 山河无恙
更新2022-01-10
1105

一、项目说明

      偶得一嵌入式方盒子(wio_terminal),带块屏,有两排扩展接口,接几个传感器玩玩。以下实现了数据采集以图表形式显示的功能。

二、原理介绍

      众所周知,传感器是一类把物理量转为换电信号装置。本次选用心率传感器,紫外线传感器,湿敏传感器三种,原理下:

       心率传感器模块原理:通电后点亮led发射特定波长光波,光照进皮肤后,一部分被吸收一部分被反射。人体血液涌动时会改变反射率,通过测量反射光强度可以获得一条简易心电曲线,最后计算一段时间内有多少个波峰即可获得心率数据。为获得比较稳定信号,我在传感器表面沾了一层透明胶。

FmV1ayXMomf7Olfjengki-eWLt85Fk7xxOW2fQnk_tgdQfEMxdjW4Ebc

       紫外线传感器原理:光携带的能量激发半导体内的电子产生定向移动。但是这个信号太小,需要经过电子器件放大后才能得到高质量稳定信号。图中紫外线传感器的关键在于滤光片,它能屏蔽可见光波段的光,只通过紫外光波段。这个滤光片可以内置也可以外置,像常见的遥控器窗口就是外置的,本文中的传感器的滤光片是内置的,用放大镜可以观察到。

FufgWSRXsQ8GvAmuSg-awmvqWcvOFvsQC8jaX-9Ew0HSXf5eGe7GhXR7

      湿敏传感器原理:两相互交错的栅形电极上覆有湿敏材料,它的电阻会随着湿度的增大而增大。将传感器接入分压电路后,通过测量中间结点电压反算湿度。需要注意的是这种湿敏材料不能承受过高电压,本文中的HDS10传感器电压不可超过0.8V,所以需要并联一个47k电阻进行限压保护。

Fp8fCYjXzlx8lpQ4AifqPcUM-JB9Ftg_NZs53Cwz3RT7-zFkOrfcnv67FnGb9C7JC5ZH-AfkeXBP8mGA6Yjf

三、开发平台

   1.wio terminal 一台;

FpdMPT8Ln1biMIdTnWOeJJ50GWPY

      2.传感器若干;

FqMQn2pdFP-rLDrfLq-BHpmYbiQh

      3.arduino软件一套

      本次选用的几个传感器输出信号均为模拟量,需要用到wio terminal的扩展接口,扩展接口定义如图。

FgpC3qCSYfWD9_kczzYewOs4TNi4

      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显示方法;

      传感器数据是真的难处理。

 
附件下载
terminal_sensor.zip
团队介绍
一个工具人。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号