ใช้ ChatGPT ช่วยเขียนโปรแกรม ใช้ ESP8266 อ่านค่าอุณหภูมิ ความชื้น จากตัวเซ็นเซอร์ SHT20 แสดงผลผ่านจอ TFT ST7735
เซ็นเซอร์ SHT20
3.3V สายสีแดง ,GND สายสีดำ ,SCL สายสีเหลือง ,SDA สายสีเขียว
ขาที่ใช้ติดต่อจอ TFT ST7735
// ---------- TFT Pin map ----------
#define TFT_CS D8
#define TFT_RST D3
#define TFT_DC D4
#define TFT_SDA D7 // MOSI
#define TFT_SCL D5 // SCK
#define TFT_LED D6 // Backlight (PWM)
ขาที่ใช้ติดต่อเซ็นเซอร์ SHT20
SDA ขา D2
SCL ขา D1
ขาต่างๆที่เชื่อมหากัน
| SHT20 | ESP8266 | หมายเหตุ |
|---|---|---|
| VCC | 3.3V | ห้ามต่อ 5V |
| GND | GND | กราวด์ร่วม |
| SDA | D2 (GPIO4) | ข้อมูล I2C |
| SCL | D1 (GPIO5) | นาฬิกา I2C |
| TFT (ST7735) | ESP8266 | หมายเหตุ |
|---|---|---|
| VCC | 3.3V | ไฟเลี้ยง |
| GND | GND | กราวด์ |
| CS | D8 | ชิปเซเล็กต์ |
| RST | D3 | รีเซต |
| DC | D4 | คอนโทรลข้อมูล |
| MOSI | D7 | ข้อมูล SPI |
| SCK | D5 | นาฬิกา SPI |
| LED | D6 | PWM ปรับความสว่าง |
| อุปกรณ์ | รายละเอียด |
|---|---|
| ESP8266 (NodeMCU / Wemos D1 mini) | ไมโครคอนโทรลเลอร์ Wi-Fi |
| SHT20 | เซนเซอร์วัดอุณหภูมิ-ความชื้น (I²C) |
| TFT 1.8″ ST7735 | จอแสดงผล SPI |
| สายไฟ Jumper | สำหรับต่อวงจร |
| รายการ | ค่ามาตรฐาน |
|---|---|
| ช่วงอุณหภูมิ | -40°C ถึง +125°C |
| ความแม่นยำ | ±0.3°C |
| ช่วงความชื้น | 0–100 %RH |
| ความแม่นยำความชื้น | ±2 %RH |
| แหล่งจ่ายไฟ | 2.1–3.6V (บางโมดูลมี LDO รองรับ 5V) |
| สื่อสาร | I²C (Address 0x40) |
| เวลาแปลงค่า | ~85 ms |
โปรแกรม
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <math.h>
// ---------- TFT Pin map ----------
#define TFT_CS D8
#define TFT_RST D3
#define TFT_DC D4
#define TFT_SDA D7
#define TFT_SCL D5
#define TFT_LED D6
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#define SHT20_ADDR 0x40
float lastTemp = -999.0;
float lastHumi = -999.0;
float readTemperature() {
Wire.beginTransmission(SHT20_ADDR);
Wire.write(0xF3);
Wire.endTransmission();
delay(100);
Wire.requestFrom(SHT20_ADDR, 2);
uint16_t rawT = (Wire.read() << 8) | Wire.read();
return -46.85 + 175.72 * rawT / 65536.0;
}
float readHumidity() {
Wire.beginTransmission(SHT20_ADDR);
Wire.write(0xF5);
Wire.endTransmission();
delay(100);
Wire.requestFrom(SHT20_ADDR, 2);
uint16_t rawH = (Wire.read() << 8) | Wire.read();
return -6.0 + 125.0 * rawH / 65536.0;
}
void drawStaticUI() {
tft.fillScreen(ST77XX_BLACK);
// Title
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.setCursor(2, 5);
tft.println("SHT20 Monitor");
// Temp box
tft.fillRect(5, 40, 150, 35, ST77XX_RED);
tft.drawRect(5, 40, 150, 35, ST77XX_WHITE);
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(10, 48);
tft.setTextSize(2);
tft.print("Temp");
// Humi box
tft.fillRect(5, 80, 150, 35, ST77XX_BLUE);
tft.drawRect(5, 80, 150, 35, ST77XX_WHITE);
tft.setCursor(10, 88);
tft.print("Humi");
}
void updateTemp(float t) {
float t_round = floor(t * 10.0 + 0.5) / 10.0;
if (fabs(t_round - lastTemp) < 0.05) return; // ไม่เปลี่ยนไม่วาดซ้ำ
lastTemp = t_round;
tft.setTextSize(2);
tft.setTextColor(ST77XX_WHITE, ST77XX_RED); // ตัวอักษรขาว พื้นแดง
tft.setCursor(70, 48);
tft.printf("%4.1f C", t_round);
}
void updateHumi(float h) {
float h_round = floor(h * 10.0 + 0.5) / 10.0;
if (fabs(h_round - lastHumi) < 0.05) return;
lastHumi = h_round;
tft.setTextSize(2);
tft.setTextColor(ST77XX_WHITE, ST77XX_BLUE);
tft.setCursor(70, 88);
tft.printf("%4.1f %%", h_round);
}
void setup() {
Serial.begin(115200);
Wire.begin(D2, D1);
tft.initR(INITR_BLACKTAB);
tft.setRotation(3);
analogWriteRange(1023);
analogWrite(TFT_LED, 0);
drawStaticUI();
}
void loop() {
float temp = readTemperature();
float hum = readHumidity();
Serial.printf("Temp: %.2f Hum: %.2f\n", temp, hum);
updateTemp(temp);
updateHumi(hum);
delay(2000);
}



เรื่องที่เกี่ยวข้อง