内容介绍
内容介绍
1 项目需求
- 在LCD屏上显示一个图形化的温度计,并实时显示当前的温度(通过AHT10温度传感器测量)
- 可以通过按键设定报警温度阈值
- 可以对AHT10温度传感器稍微加温,使温度超过设定的阈值,温度图示颜色变红,且蜂鸣器发出报警声音
- 给芯片降温到阈值一下,温度传感器颜色变绿,蜂鸣器停止报警
2 完成的功能及达到的性能
- 通过开发板上的按键Key_A和Key_C可以改变温度的控制上限值。
- 通过I2C连接温度传感器AHT10读取当前温度值,温度值保留1位小数。
- 通过控制逻辑当温度值超过温度控制上限值,改变温度计颜色,通过模拟写的方式控制蜂鸣器发声。
- 通过Seeed_Arduino_LCD库绘制LCD屏幕的温度计图形,颜色,字体。
- 如下完成了项目的需求功能。
3 实现思路
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
查看更多
猜你喜欢