8浏览
查看: 8|回复: 0

[ESP8266/ESP32] FireBeetle 2 ESP32-C5 驱动ST7735 SPI 1.8寸屏幕

[复制链接]
简介
在上一篇文章中,我们已经完成了 BH1750 光照传感器的数据采集与 MQTT 上报,并对 I²C 通讯协议 进行了功能验证。
本篇文章将继续扩展项目功能 —— 我们将使用一块 1.8 寸 TFT 彩色显示屏(驱动芯片:ST7735)实时显示传感器数据,同时借此机会 实践并测试 SPI 通讯协议 的使用。


FireBeetle 2 ESP32-C5 驱动ST7735 SPI 1.8寸屏幕图1


ST7735 是一款由 Sitronix 出品的 TFT-LCD 控制驱动芯片,常用于 1.44~1.8 寸的彩色显示屏。该芯片通过 SPI 接口 与主控(如 ESP32)通信, 而这次我们使用是Arduino进行的编程,得益于强大的库管理器,所以并不需要担心如何编写驱动。只需要按照对应的PIN将杜邦线连接成功即可。 幸运的又是这个ESP32C5的底板非常nice,已经将所有C5的Pin全部引出了,而且还标注了SPI的定义PIN。


1- 首先我们在程序中定义这次我们需要使用到的PIN以便于使用ST7735库
  1. #define TFT_CS   3   // 片选(Chip Select)
  2. #define TFT_DC   4   // 数据/命令选择
  3. #define TFT_RST  25  // 硬件复位
  4. #define TFT_BL   2   // 背光控制
  5. #define TFT_SCLK 23  // SPI 时钟
  6. #define TFT_MOSI 24  // SPI 主输出从输入
复制代码
我这块屏幕是几年前买某宙的,其中SCLK在屏幕上的定义是SCL, MOSI在屏幕上的定义是SDA (因为ESP32-C5作为主机设备,所以连接Master out slaver IN MOSI

2- 初始化屏幕
  1. pinMode(TFT_BL, OUTPUT);
  2. digitalWrite(TFT_BL, HIGH); // 打开背光
  3. SPI.begin(TFT_SCLK, -1, TFT_MOSI);
  4. tft.initR(INITR_BLACKTAB);
复制代码
首先对屏幕进行初始化,这个背光的PIN如果不适用的话可以直接接3.3V或者悬空,这样就可以节省出来一个IO。

3- 初始化屏幕方向显示
  1. tft.setRotation(3);
  2. tft.fillScreen(ST77XX_BLACK);
  3. tft.setTextColor(ST77XX_WHITE);
  4. tft.setTextSize(1);
  5. tft.setCursor(10, 10);
  6. tft.println("ST7735 Ready!");
复制代码
屏幕方向的话可以使用tft.setRotation(); 的函数进行设置。


4- 在主循环中持续读取数据,并且更新显示
  1. tft.fillScreen(ST77XX_BLACK);
  2. tft.setCursor(10, 15);
  3. tft.setTextSize(1);
  4. tft.setTextColor(ST77XX_CYAN);
  5. tft.println("ESP32 Sensor");
  6. tft.setCursor(10, 35);
  7. tft.setTextSize(2);
  8. tft.setTextColor(ST77XX_GREEN);
  9. tft.printf("Lux: %.1f", lux);
复制代码
5- 显示WIFI的状态信息
  1. tft.setTextSize(1);
  2. tft.setCursor(10, 65);
  3. tft.setTextColor(wifi_connected ? ST77XX_YELLOW : ST77XX_RED);
  4. tft.printf("WiFi: %s", wifi_connected ? "Connected" : "Disconnected");
  5. tft.setCursor(10, 80);
  6. tft.setTextColor(mqtt.connected() ? ST77XX_YELLOW : ST77XX_RED);
  7. tft.printf("MQTT: %s", mqtt.connected() ? "OK" : "Retrying...");
复制代码


完整代码如下:

  1. #include <WiFi.h>
  2. #include <WiFiClient.h>
  3. #include <MQTT.h>         
  4. #include <Wire.h>
  5. #include <BH1750.h>      
  6. #include <SPI.h>
  7. #include <Adafruit_GFX.h>
  8. #include <Adafruit_ST7735.h>
  9. // ===== WiFi 配置 =====
  10. #define STA_SSID  "ImmortalWrt-5G"
  11. #define STA_PASS  "mazha1997"
  12. #define AP_SSID   "esp32-v6"
  13. // ===== MQTT 配置 =====
  14. #define MQTT_HOST "192.168.1.153"
  15. #define MQTT_PORT 1884
  16. #define MQTT_USER "root"
  17. #define MQTT_PASS "123456"
  18. #define MQTT_CLIENT_ID "esp32-client"
  19. // ===== ST7735 引脚定义 =====
  20. #define TFT_CS   3
  21. #define TFT_DC   4
  22. #define TFT_RST  25
  23. #define TFT_BL   2
  24. #define TFT_SCLK 23
  25. #define TFT_MOSI 24
  26. // ===== 全局对象 =====
  27. WiFiClient net;
  28. MQTTClient mqtt(256);
  29. BH1750 lightMeter;
  30. Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
  31. // ===== 全局状态 =====
  32. static volatile bool wifi_connected = false;
  33. // ===== MQTT 回调函数 =====
  34. void mqttMessageReceived(String &topic, String &payload) {
  35.   Serial.print("MQTT message received: ");
  36.   Serial.print(topic);
  37.   Serial.print(" => ");
  38.   Serial.println(payload);
  39. }
  40. // ===== MQTT 初始化连接 =====
  41. void mqttConnect() {
  42.   Serial.print("Connecting to MQTT... ");
  43.   while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASS)) {
  44.     Serial.print(".");
  45.     delay(1000);
  46.   }
  47.   Serial.println("\nMQTT connected!");
  48.   mqtt.subscribe("esp32/test");
  49.   mqtt.publish("esp32/status", "ESP32 connected successfully!");
  50. }
  51. // ===== WiFi 事件处理 =====
  52. void wifiOnConnect() {
  53.   Serial.println("STA Connected");
  54.   Serial.print("STA IPv4: ");
  55.   Serial.println(WiFi.localIP());
  56.   mqtt.begin(MQTT_HOST, MQTT_PORT, net);
  57.   mqtt.onMessage(mqttMessageReceived);
  58.   mqttConnect();
  59. }
  60. void wifiOnDisconnect() {
  61.   Serial.println("STA Disconnected");
  62.   delay(1000);
  63.   WiFi.begin(STA_SSID, STA_PASS);
  64. }
  65. void WiFiEvent(WiFiEvent_t event) {
  66.   switch (event) {
  67.     case ARDUINO_EVENT_WIFI_AP_START:
  68.       WiFi.softAPsetHostname(AP_SSID);
  69.       break;
  70.     case ARDUINO_EVENT_WIFI_STA_START:
  71.       WiFi.setHostname(AP_SSID);
  72.       break;
  73.     case ARDUINO_EVENT_WIFI_STA_GOT_IP:
  74.       wifi_connected = true;
  75.       wifiOnConnect();
  76.       break;
  77.     case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
  78.       wifi_connected = false;
  79.       wifiOnDisconnect();
  80.       break;
  81.     default:
  82.       break;
  83.   }
  84. }
  85. // ===== 初始化 =====
  86. void setup() {
  87.   Serial.begin(115200);
  88.   Serial.println("ESP32 Booting...");
  89.   // ===== 初始化 ST7735 =====
  90.   pinMode(TFT_BL, OUTPUT);
  91.   digitalWrite(TFT_BL, HIGH); // 打开背光
  92.   SPI.begin(TFT_SCLK, -1, TFT_MOSI);
  93.   tft.initR(INITR_BLACKTAB);
  94.   tft.setRotation(3);
  95.   tft.fillScreen(ST77XX_BLACK);
  96.   tft.setTextColor(ST77XX_WHITE);
  97.   tft.setTextSize(1);
  98.   tft.setCursor(10, 10);
  99.   tft.println("ST7735 Ready!");
  100.   // ===== 初始化 I2C & BH1750 =====
  101.   Wire.begin(9, 10); // SDA=9, SCL=10
  102.   if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE)) {
  103.     Serial.println("BH1750 initialized successfully.");
  104.   } else {
  105.     Serial.println("BH1750 not detected! Check wiring.");
  106.     tft.setTextColor(ST77XX_RED);
  107.     tft.println("BH1750 ERROR!");
  108.   }
  109.   // ===== 初始化 Wi-Fi =====
  110.   WiFi.disconnect(true);
  111.   WiFi.onEvent(WiFiEvent);
  112.   WiFi.mode(WIFI_MODE_APSTA);
  113.   WiFi.softAPenableIPv6();
  114.   WiFi.softAP(AP_SSID);
  115.   WiFi.enableIPv6();
  116.   WiFi.begin(STA_SSID, STA_PASS);
  117. }
  118. // ===== 主循环 =====
  119. void loop() {
  120.   if (wifi_connected) {
  121.     mqtt.loop();
  122.     if (!mqtt.connected()) {
  123.       mqttConnect();
  124.     }
  125.     static unsigned long lastMsg = 0;
  126.     if (millis() - lastMsg > 10000) {
  127.       lastMsg = millis();
  128.       // ===== 读取 BH1750 光照强度 =====
  129.       float lux = lightMeter.readLightLevel();
  130.       Serial.printf("Light intensity: %.2f lux\n", lux);
  131.       // ===== MQTT 发布数据 =====
  132.       String payload = String("{"lux":") + String(lux, 2) + "}";
  133.       mqtt.publish("esp32/bh1750", payload);
  134.       Serial.println("Published: " + payload);
  135.       // ===== 更新 ST7735 屏幕显示 =====
  136.       tft.fillScreen(ST77XX_BLACK);
  137.       tft.setCursor(10, 15);
  138.       tft.setTextSize(1);
  139.       tft.setTextColor(ST77XX_CYAN);
  140.       tft.println("ESP32 Sensor");
  141.       tft.setCursor(10, 35);
  142.       tft.setTextSize(2);
  143.       tft.setTextColor(ST77XX_GREEN);
  144.       tft.printf("Lux: %.1f", lux);
  145.       tft.setTextSize(1);
  146.       tft.setCursor(10, 65);
  147.       tft.setTextColor(wifi_connected ? ST77XX_YELLOW : ST77XX_RED);
  148.       tft.printf("WiFi: %s", wifi_connected ? "Connected" : "Disconnected");
  149.       tft.setCursor(10, 80);
  150.       tft.setTextColor(mqtt.connected() ? ST77XX_YELLOW : ST77XX_RED);
  151.       tft.printf("MQTT: %s", mqtt.connected() ? "OK" : "Retrying...");
  152.     }
  153.   }
  154.   while (Serial.available()) {
  155.     Serial.write(Serial.read());
  156.   }
  157. }
复制代码


至此便完成了ST7735的驱动。库管理器就是好用,不用费尽心思去调试驱动。还没有测试,不知道Mind + 支不支持这个板子,如果支持的话Block类的编程将会更简单上手。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail