一、 介绍用本板卡最终实现了什么功能
使用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管脚接口图如下所示:
二、各功能对应的主要代码片段及解释
在Arduino ide软件中除了按照Wio Terminal的官网安装必要的驱动库外,还需要安装本项目使用到的单总线温湿度传感器DHT11驱动库:
十分好用的液晶驱动库:
震动传感器和人体红外热释电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传感器位置如下:
震动传感器在检测到震动时,管脚会输出高电平,无震动时为低电平。
PIR传感器在检测到人体时,管脚会输电高电平,没有检测到人体时为低电平。
屏幕第一行和第二行显示的是DHT11温湿度传感器的数据,当前温度T是24.4℃,当前湿度H是46.0%;第三行显示人体红外热释电传感器PIR和震动传感器SHOCK读取值都为0。
四、对本活动的心得体会(包括意见或建议)
- funpack活动非常好,发布的任务有梯度,满足各个阶段的电子爱好者需求,项目时间充足,有指导培训,十分nice。
- 希望2022继续起来!