当你第一次点亮ST7735S TFT彩屏时,那种兴奋感可能很快就会被"现在能做什么"的困惑取代。这块1.8英寸的彩色屏幕远不止是显示几行文字的简单外设,它可以是你的微型画布、信息中心和交互界面。下面这5个项目将帮你突破基础测试阶段,真正发挥这块屏幕的潜力。
硬件清单:
这个项目最吸引人的地方在于,你可以在不到30行代码内创建一个实时环境监测系统。关键是要理解传感器数据如何映射到屏幕坐标系:
cpp复制#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
DHT dht(2, DHT11);
void setup() {
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST7735_BLACK);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
tft.setCursor(10, 30);
tft.setTextColor(ST7735_WHITE);
tft.print("Temp: ");
tft.print(t);
tft.println(" C");
tft.setCursor(10, 60);
tft.print("Humidity: ");
tft.print(h);
tft.println(" %");
delay(2000);
}
显示优化技巧:
setTextSize(2)放大关键数据drawRect创建数据框提升可读性fillRect实现的简易柱状图显示变化趋势DS3231实时时钟模块与ST7735S的组合,可以打造误差每月仅±2分钟的高精度桌面时钟。关键在于如何优雅地显示时间:
| 显示元素 | 实现方法 | 优化建议 |
|---|---|---|
| 数字时钟 | tft.setTextSize(3) |
使用自定义字体更美观 |
| 日期显示 | tft.print(day()) |
添加星期几显示 |
| 秒针动画 | drawCircle+fillCircle |
使用不同颜色区分时/分/秒 |
cpp复制#include <RTClib.h>
RTC_DS3231 rtc;
void displayTime() {
DateTime now = rtc.now();
tft.fillRect(0, 40, 128, 60, ST7735_BLACK);
tft.setCursor(15, 50);
tft.print(now.hour());
tft.print(":");
if(now.minute()<10) tft.print("0");
tft.print(now.minute());
}
进阶改造:
drawLine制作模拟时钟界面利用ST7735S的16位色深特性,可以创建流畅的启动动画。先从简单的位图显示开始:
cpp复制void drawBitmap(int16_t x, int16_t y, const uint16_t *bitmap) {
for(int j=0; j<HEIGHT; j++){
for(int i=0; i<WIDTH; i++){
tft.drawPixel(x+i, y+j, bitmap[j*WIDTH+i]);
}
}
}
cpp复制// 横向擦除动画
for(int i=0; i<128; i+=5){
tft.drawLine(i,0,i,160,ST7735_BLACK);
delay(30);
}
专业技巧:
pushColor加速位图渲染drawPixel制作粒子效果在160x128的分辨率下,贪吃蛇这类经典游戏反而能展现独特的复古魅力。核心逻辑可以分为三个部分:
游戏数据结构:
cpp复制struct Point { int x,y; };
Point snake[100];
Point food;
int length = 3;
int dir = 0; // 0=右,1=下,2=左,3=上
游戏主循环关键代码:
cpp复制void moveSnake() {
// 移动蛇身
for(int i=length-1; i>0; i--){
snake[i] = snake[i-1];
}
// 根据方向移动蛇头
switch(dir){
case 0: snake[0].x++; break;
case 1: snake[0].y++; break;
case 2: snake[0].x--; break;
case 3: snake[0].y--; break;
}
// 检测吃食物
if(snake[0].x==food.x && snake[0].y==food.y){
length++;
spawnFood();
}
}
显示优化方案:
fillRect绘制蛇身方块drawRoundRect美化游戏边框虽然Arduino不能直接获取电脑数据,但可以通过串口接收处理后的信息,打造一个酷炫的监控面板:
Arduino端代码框架:
cpp复制void serialEvent() {
while(Serial.available()) {
String input = Serial.readStringUntil('\n');
int cpu = input.substring(0,3).toInt();
int mem = input.substring(4,7).toInt();
// 更新CPU显示
tft.fillRect(10, 30, cpu, 10, ST7735_RED);
// 更新内存显示
tft.fillRect(10, 60, mem, 10, ST7735_BLUE);
}
}
PC端Python示例(通过串口发送数据):
python复制import serial
import psutil
arduino = serial.Serial('COM3', 9600)
while True:
cpu = int(psutil.cpu_percent())
mem = int(psutil.virtual_memory().percent)
arduino.write(f"{cpu:03d}{mem:03d}\n".encode())
time.sleep(1)
面板设计要素:
drawRect创建刻度背景setTextColor实现的颜色预警fillCircle构成的雷达图显示多参数每个项目都可以作为独立起点,更可以作为更大作品的组成部分。比如将环境监测数据通过WiFi模块上传,或者在游戏基础上添加蓝牙手柄支持。ST7735S虽然尺寸不大,但配合Arduino的扩展能力,完全可以成为各种创意项目的视觉交互中心。