IPV6+Home Assistant[ESP32+MQTT+ILI9488]远程留言墙
- 1 背景
- 2 Home Assistant 配置
- 2-1 配置 yaml
- 2-2 效果
- 3 ESP32 配置
- 3-1 使用 TFF_eSPI 库
- 3-2 修改默认的SPI屏幕配置文件
- 3-3 接线
- 3-4 ESP32 工程代码
- 4 测试
- 4-1 留言板设置内容
- 4-2 ESP32 屏幕显示
- 5 后记
1 背景
在前面我们的几个小节已经对Home Assistant的功能有了一定的了解:
【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)
【IPV6从入门到起飞】5-2 IPV6+Home Assistant(ESP32+MQTT+DHT11+BH1750)传感器采集上传监测
【IPV6从入门到起飞】5-3 IPV6+Home Assistant(ESP32+MQTT+GPIO)远程控制灯
在这一小节我们通过ESP32 接上ILI9488(SPI,320x480)屏幕,实现Home Assistant的留言功能。
简述如下:
在Home Assistant进行留言,在ESP32的屏幕上实时显示留言的内容。
下面开始实现我们的方案。
2 Home Assistant 配置
2-1 配置 yaml
还是一样的操作,在 config/configuration.yaml
添加以下的内容:
在根节点下添加
input_text:
message_board:
name: "留言板"
initial: "说点什么吧^_^"
max: 1000
automation:
- alias: "Send Message to ESP32"
trigger:
platform: state
entity_id: input_text.message_board
action:
service: mqtt.publish
data:
topic: "home/esp32/message"
payload: "{{ states('input_text.message_board') }}"
2-2 效果
重启或者重新加载配置后,在我们的概览页新增了以下的内容:
3 ESP32 配置
3-1 使用 TFF_eSPI 库
搜索安装这个
3-2 修改默认的SPI屏幕配置文件
因为我们要使用到 <TFT_eSPI.h>,里面包含了 <User_Setup_Select.h>
而 <User_Setup_Select.h> 使用了 <User_Setup.h>
所以我们修改<User_Setup.h> 文件的配置即可
目录可参考以下路径:
C:\Users\Administrator\Documents\Arduino\libraries\TFT_eSPI
以下是我的配置
#define ILI9488_DRIVER
#define TFT_WIDTH 320
#define TFT_HEIGHT 480
// The hardware SPI can be mapped to any pins
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 15 // Chip select control pin
#define TFT_DC 22 // Data Command control pin
#define TFT_RST 4 // Reset pin (could connect to RST pin)
// #define TOUCH_CS 21
// Section 3. Define the fonts that are to be used here
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// Section 4. Other options
#define SPI_FREQUENCY 27000000
#define SPI_READ_FREQUENCY 20000000
#define SPI_TOUCH_FREQUENCY 2500000
#define USE_HSPI_PORT //这条重要
参考了博客 https://blog.51cto.com/u_16213687/10731709
3-3 接线
按照上面的配置 pin 对 pin 连接即可,注意要BL给3.3v
3-4 ESP32 工程代码
#include <TFT_eSPI.h> // 引入 TFT_eSPI 库
#include <WiFi.h> // 引入 WiFi 库
#include <PubSubClient.h> // 引入 PubSubClient 库
// WiFi 和 MQTT 配置
const char* ssid = "mywifi_2.4G"; // 替换为您的 WiFi SSID
const char* password = "12345666"; // 替换为您的 WiFi 密码
const char* mqtt_server = "192.168.66.118"; // 替换为您的 MQTT 代理地址
TFT_eSPI tft = TFT_eSPI(); // 创建 TFT_eSPI 对象
WiFiClient espClient; // 创建 WiFi 客户端
PubSubClient client(espClient); // 创建 MQTT 客户端
void setup() {
tft.init(); // 初始化显示器
tft.setRotation(3); // 设置显示方向为 3
tft.fillScreen(TFT_BLACK); // 清屏并填充黑色背景
tft.setFreeFont(&FreeSans12pt7b); // 使用 FreeSans 字体,大小为 12pt
// 设置文本颜色和大小
tft.setTextColor(TFT_WHITE);
tft.setTextSize(2);
// 连接到 WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
// 连接到 MQTT 代理
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
reconnect();
}
void loop() {
client.loop(); // 处理 MQTT 消息
}
// MQTT 连接
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32Client")) {
client.subscribe("home/esp32/message"); // 订阅留言主题
} else {
delay(5000);
}
}
}
// 处理接收到的消息
void callback(char* topic, byte* payload, unsigned int length) {
// 清屏
tft.fillScreen(TFT_BLACK);
// 将消息转换为字符串并显示
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
// 设置光标位置并显示消息
tft.setCursor(40, 40);
tft.println(message);
}
4 测试
4-1 留言板设置内容
4-2 ESP32 屏幕显示
5 后记
在折腾ESP32驱动ili9488屏幕时花了好长的时间,绕了一些弯路
目前的屏幕响应速度很快,更新后基本上是秒刷的
缺点:目前只支持英文的显示,后续在看看能不能支持中文的显示
更多玩法后续持续更新,欢迎关注探讨~