วันพุธ, 29 ตุลาคม 2568

ChatGPT ช่วยเขียนโปรแกรม อ่านค่าอุณหภูมิ ความชื้น (SHT20) แสดงผ่านหน้าจอ TFT ST7735

29 ต.ค. 2025
13

ใช้ 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

ขาต่างๆที่เชื่อมหากัน

SHT20ESP8266หมายเหตุ
VCC3.3Vห้ามต่อ 5V
GNDGNDกราวด์ร่วม
SDAD2 (GPIO4)ข้อมูล I2C
SCLD1 (GPIO5)นาฬิกา I2C

TFT (ST7735)ESP8266หมายเหตุ
VCC3.3Vไฟเลี้ยง
GNDGNDกราวด์
CSD8ชิปเซเล็กต์
RSTD3รีเซต
DCD4คอนโทรลข้อมูล
MOSID7ข้อมูล SPI
SCKD5นาฬิกา SPI
LEDD6PWM ปรับความสว่าง

อุปกรณ์รายละเอียด
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);
}