用Wio Terminal制作一个图形化显示、超温报警的温度计
在LCD屏上显示一个图形化的温度计,并实时显示当前的温度(通过AHT10温度传感器测量)
标签
显示
Funpack参赛
接口
MMA
更新2022-03-29
1672

1 项目需求

  1. 在LCD屏上显示一个图形化的温度计,并实时显示当前的温度(通过AHT10温度传感器测量)
  2. 可以通过按键设定报警温度阈值
  3. 可以对AHT10温度传感器稍微加温,使温度超过设定的阈值,温度图示颜色变红,且蜂鸣器发出报警声音
  4. 给芯片降温到阈值一下,温度传感器颜色变绿,蜂鸣器停止报警

2 完成的功能及达到的性能

  1. 通过开发板上的按键Key_A和Key_C可以改变温度的控制上限值。
  2. 通过I2C连接温度传感器AHT10读取当前温度值,温度值保留1位小数。
  3. 通过控制逻辑当温度值超过温度控制上限值,改变温度计颜色,通过模拟写的方式控制蜂鸣器发声。
  4. 通过Seeed_Arduino_LCD库绘制LCD屏幕的温度计图形,颜色,字体。
  5. 如下完成了项目的需求功能。

 

FsC4nEX1ZHbiFNgxQo6WoVOL8AGv

3 实现思路

FnSyKhsPNVLLXWD3lBqnfVkEfUa3

 

4 实现过程

加载LCD屏幕绘图和读取传感器的库文件。

#include "TFT_eSPI.h"
#include "Wire.h"
#include "ATH20.h"

初始化屏幕buffer,定义Key_A,Key_C输入模式和Buzzer输出模式。

ATH20 ATH;

int ctr_limit=25;
uint32_t current_color=TFT_GREEN;

void setup() {
    tft.begin();
    tft.setRotation(3);
    spr.createSprite(TFT_HEIGHT,TFT_WIDTH);
    Serial.begin(9600);
    ATH.begin();

    pinMode(WIO_KEY_A, INPUT);
    pinMode(WIO_KEY_C, INPUT);

    pinMode(WIO_BUZZER, OUTPUT);
}

在屏幕上输出温度并控制输出温度的位置。位置的计算基于屏幕绘制的温度计零点在y=184的位置。

float humi, temp;
  int ret = ATH.getSensor(&humi, &temp);

  spr.fillSprite(TFT_BLACK);

  ///Set temperature
  spr.setTextColor(TFT_WHITE);
  spr.setTextSize(1);
  spr.drawString("Temp:",80,184-int(temp*2)-10);
  
  
  spr.drawFloat(temp,1,110,184-int(temp*2)-10);

绘制下部调节按钮,通过ctr_limit控制按钮的位置。

spr.drawFastHLine(0,230,320,TFT_WHITE);
  spr.fillRect(160-25+ctr_limit-4,226,8,8,TFT_WHITE);
  spr.drawString("Temp Limit:   C",200,215);
  spr.drawNumber(ctr_limit,268,215);

绘制颜色填充,current_color控制当前的填充颜色。后面通过温度值temp和ctr_limit的比较控制current_color的变化。

spr.drawRoundRect(152,20,16,176,8,TFT_WHITE);
  spr.drawCircle(160,200,14,TFT_WHITE);
  spr.fillCircle(160,200,13,current_color);
  spr.fillRect(153,184,14,4,current_color);

  spr.fillRect(153,184-int(temp*2),14,int(temp*2)+1,current_color);

绘制刻度,每一个LCD位置点在Y方向上代表0.5度,所以最小分辨率是0.5度。则对实测temp温度进行了取整操作。

for (int i = 1; i <= 8; i++) {
    spr.drawFastHLine(152,204-i*20, 13,TFT_PINK);
   }

  for (int i = 1; i <= 14; i++) {
    spr.drawFastHLine(152,189-i*10, 5,TFT_PINK);
   }

  for (int i = 1; i <= 14; i++) {
    spr.drawFastHLine(152,194-i*10, 9,TFT_PINK);
   }

  spr.setTextSize(1);
  spr.setTextColor(TFT_PINK);
  for (int i = 1; i <= 8; i++) {
    spr.drawNumber(i*10-10,172, 200-i*20);

按键控制颜色变化。

if(digitalRead(WIO_KEY_A)==LOW){
    ctr_limit+=1;
    //delay(100);
   }

   if(digitalRead(WIO_KEY_C)==LOW){
    ctr_limit-=1;
    //delay(100);
   }

 

温度值和空直接实现比较,改变填充的颜色corrent_color.

 

if(temp>ctr_limit){
    current_color=TFT_RED;
    analogWrite(WIO_BUZZER,150);
    //delay(1000);
    //analogWrite(WIO_BUZZER,0);
    //delay(1000);
    
  }

  if(temp<ctr_limit or temp==ctr_limit){
    current_color=TFT_GREEN;
    analogWrite(WIO_BUZZER,0);
    
  }

5 收获

之前通过RP2040开发板做过温度计的练习,那时是通过micropython使用ST7789库完成的。Wio Terminal的LCD显示库更加的强大。通过阅读库文件,发现可以使用spr.drawFloat输出浮点数,而不用自己在处理了。另一种处理浮点数的方法是转成字符串再转回浮点数。直接用库更方便。还学习了在单片机里圆整的处理方法。由于使用的LCD库支持buffer的输入方式,更新绘图更方便了且没有可见延时。之前用的ST7789没有DMA的功能,采用了特殊的方法处理屏幕更新变化。综合来看,在细节上处理方面有收获。

 

 

附件下载
wenduji_1.zip
团队介绍
我是一名机械工程师,现在在天津工作。参加硬禾学堂的活动,扩展自己的电路技能。
团队成员
MMA
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号