Funpack第12期之Wio Terminal传感器数据采集LCD屏幕显示
Funpack第12期活动项目,使用Wio Terminal的扩展接口完成了任务一:利用扩展接口,自由选择连接三到五个传感器,并将采集的数据显示在LCD屏幕上,并解释数据的含义。
标签
嵌入式系统
eelover
更新2022-01-05
822

一、 介绍用本板卡最终实现了什么功能

使用Wio Terminal板卡的扩展接口连接了DHT11温湿度传感器、震动传感器和人体红外热释电(PIR)传感器,并将采集的数据显示在LCD屏幕上。完成了Funpack第12期任务一:“利用扩展接口,自由选择连接三到五个传感器,并将采集的数据显示在LCD屏幕上,并解释数据的含义。”

Wio Terminal是基于SAMD51的微控制器,具有 Realtek RTL8720DN 支持的无线连接,与Arduino和MicroPython兼容。它的运行速度为 120MHz (最高可达200MHz), 4MB 外部闪存和 192KB RAM。它同时支持蓝牙和Wi-Fi,配有 a 2.4” LCD屏幕, 板载IMU(LIS3DHTR),麦克风,蜂鸣器,microSD卡槽,光传感器和红外发射器(IR 940nm)。 还有两个多功能Grove端口和40个Raspberry pi兼容的GPIO引脚。官方资料链接如下:

Wio Terminal管脚接口图如下所示:

FkkH_k-ZgXzUjd8eVPVdMZjwPyze

 

FsTST9otEkGSr61xIUPPC_cZ8Idw

 

二、各功能对应的主要代码片段及解释

在Arduino ide软件中除了按照Wio Terminal的官网安装必要的驱动库外,还需要安装本项目使用到的单总线温湿度传感器DHT11驱动库:

FoQ_S-OXu-IMwdgIOstj8TWZASrc

十分好用的液晶驱动库:

FgLQdnHT2K6Fxvs6UsRB81PcnlxT

震动传感器和人体红外热释电PIR传感器都只需要用Wio Terminal的一个管脚读取其输出的高低电平即可。

完整代码如下:

#include "DHT.h"
#include <Seeed_Arduino_FreeRTOS.h>
#include <Arduino_GFX_Library.h>

#define TFT_BL LCD_BACKLIGHT
Arduino_DataBus *bus = new Arduino_HWSPI(LCD_DC /* DC */, LCD_SS_PIN /* CS */);
Arduino_GFX *gfx = new Arduino_ILI9341(bus, -1 /* RST */, 3 /* rotation */);

DHT dht(A0, DHT11);//DHT11温湿度传感器对象

TaskHandle_t Handle_displayTask;//任务句柄
TaskHandle_t Handle_displayTask2;//任务句柄
SemaphoreHandle_t xSemaphore = NULL;//互斥锁

static void taskDisplay(void* pvParameters) {
  float t, h;
  int pir=0,shock=0;
  while (1)
  {
    h = dht.readHumidity();//读取湿度
    t = dht.readTemperature();//读取温度
    if(xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE)
    {
      gfx->fillRect(100, 0, 120, 100, BLACK);
      gfx->setTextSize(8 /* x scale */, 8 /* y scale */, 2 /* pixel_margin */);
      gfx->setTextColor(GREEN, BLACK);
      gfx->setCursor(0, 20);
      gfx->printf("T:%.1f", t);
      gfx->fillRect(100, 120, 120, 100, BLACK);
      gfx->setTextColor(ORANGE, BLACK);
      gfx->setCursor(0, 120);
      gfx->printf("H:%.1f", h);
      xSemaphoreGive( xSemaphore );
    }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
  }
}

static void taskDisplay2(void* pvParameters) {
  int pir=0,shock=0;
  while (1)
  {
    pir = digitalRead(D2);//读取PIR传感器
    shock = digitalRead(D4);//读取震动传感器
    if(xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE)
    {
      gfx->setTextSize(2 /* x scale */, 2 /* y scale */, 2 /* pixel_margin */);
      gfx->setCursor(40, 200);
      gfx->setTextColor(RED, BLACK);
      gfx->printf("PIR:%d", pir);
      gfx->setCursor(200, 200);
      gfx->setTextColor(BLUE, BLACK);
      gfx->printf("SHOCK:%d", shock);
      xSemaphoreGive( xSemaphore );
    }
    vTaskDelay(50 / portTICK_PERIOD_MS);
  }
}

void setup()
{
  pinMode(D2, INPUT);//D2管脚连接PIR传感器
  pinMode(D4, INPUT);//D4管脚连接震动传感器
  
  dht.begin();

  gfx->begin();
  gfx->fillScreen(BLACK);
  pinMode(TFT_BL, OUTPUT);
  digitalWrite(TFT_BL, HIGH);

  gfx->setTextColor(WHITE, BLACK);
  gfx->setTextSize(2 /* x scale */, 2 /* y scale */);
  gfx->setCursor(80, 100);
  gfx->print("eetree & digkey");
  gfx->setCursor(120, 150);
  gfx->print("funpack12");
  vNopDelayMS(2000);
  gfx->fillScreen(BLACK);

//创建互斥锁和任务
  xSemaphore = xSemaphoreCreateMutex();
  xTaskCreate(taskDisplay, "Task Display", 512, NULL, tskIDLE_PRIORITY + 2, &Handle_displayTask);
  xTaskCreate(taskDisplay2, "Task Display2", 512, NULL, tskIDLE_PRIORITY + 3, &Handle_displayTask2);

  vTaskStartScheduler();
}

void loop()
{

}

使用到了FreeRTOS嵌入式实时操作系统,创建了二个任务用于读取传感器数据并刷新屏幕显示。

 

三、功能展示及说明(可插入图片进行展示并说明)

 

DHT11单总线温湿度传感器、震动传感器和人体红外热释电PIR传感器位置如下:

Fh3t6YuhxZ0AjuLR3m-J6dULHOYC

震动传感器在检测到震动时,管脚会输出高电平,无震动时为低电平。

PIR传感器在检测到人体时,管脚会输电高电平,没有检测到人体时为低电平。

屏幕第一行和第二行显示的是DHT11温湿度传感器的数据,当前温度T是24.4℃,当前湿度H是46.0%;第三行显示人体红外热释电传感器PIR和震动传感器SHOCK读取值都为0。

四、对本活动的心得体会(包括意见或建议)

  • funpack活动非常好,发布的任务有梯度,满足各个阶段的电子爱好者需求,项目时间充足,有指导培训,十分nice。
  • 希望2022继续起来!

 

附件下载
Funpack12-WioTerminal.ino
项目arduino代码
团队介绍
电子爱好者
团队成员
eelover
单片机爱好者
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号