วันจันทร์, 8 กันยายน 2568

MODBUS TCP ESP8266+จอสี TFT 1.8″

วันนี้มาแจกโค๊ด modbus tcp ครับบบ โห…ใช้ Chatgpt มันง่ายขนาดนี้เลยเหรอ!! ไม่ต้องมีความรู้อะไรมากเถียงๆกับ Chatgpt ไม่ถึง 20 นาทีก็ได้โปรเจคเจ็งๆแบบนี้เลย😆รื่องมีอยู่ว่ามีจอ ST7735+ESP8266 เอามาเล่นอะไรดี ที่มันดูเป็นอุตสาหกรรมหน่อย อุ๊ย…esp8266 ต่อไวไฟได้นิ!! มีหน้าจอแสดงผลก็เอามาจำลองเป็นไฟ led โปรเจคนี้จึงบังเกิด

เริ่มจากบอกให้ chatgpt “วาดวงกลมสีแดงแบบมีเส้นรอบวงสีขาว เรียงกันแบบแนวนอนจำนวน 4 ดวง เพื่อใช้ทดลองแทนหลอด led สีแเดงแทน off สีเขียวแทน on” เถียงกันอีกสักพัก ก็ได้งานตามรูปเลย พอได้วงกลมที่แทนหลอด led มาแล้วจะควบคุมอย่างไรให้ดูเป็นมืออาชีพหน่อย ก็นี่เลย modbus tcp/ip บน esp8266 คือคำตอบ ก็พิมพ์ๆไปประมาณว่า ให้ esp เป็น mosbus tcp slave1 แล้วให้ coin registers 1 – 4 เป็นการสั่งงาน led 4 ดวง

กระบวนการเถียงกับ chatgpt ทำไม่ถึง 20 นาที คอมพายผ่าน ทำงานได้ซะงั้น!! ทำงานได้ดีด้วย โค๊ดไม่ต้องเขียนสักตัว มือใหม่อย่างเรา มานั่งอ่านโค๊ดก็ไม่เข้าใจ เอาน่าแค่ทำงานได้ไม่แฮงค์เป็นพอ 555 ก่อนจบ ขอ chatgpt ดึงเวลาจากเนต ใส่มาในจอให้ด้วย โห..อย่างง่าย โปรแกรมสั้นนิดเดียว 😆

อืม…ในอนาคตถ้าอาจารย์ไม่อัพเกรด ต่อไปอาจารย์จะสอนเด็กอย่างไร เป็นเรื่องที่น่ากลุ้มใจแทนจริงๆ อีกหน่อย chatgpt ,gemini เหมาทุกวงการแล้วครับบบ 😅

ส่วนการเขียนโปรแกรมบนจอ HMI เป็น modbus master อ่านค่าจาก esp8266 chatgpt ไม่น่าเขียนได้ ฝากไว้ก่อน เดี๋ยวมาสอนนะใช้เวลาไม่น่าเกิน 20 นาทีครับบบ


#include
<ESP8266WiFi.h>

#include <NTPClient.h>

#include <WiFiUdp.h>

#include <ModbusIP_ESP8266.h>

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_ST7735.h>

// —————————–

// WiFi config

// —————————–

const char* ssid = “YOUR_WIFI_SSID”;

const char* password = “YOUR_WIFI_PASSWORD”;

// —————————–

// Modbus

// —————————–

ModbusIP mb;

const int PORT = 502;

// —————————–

// TFT ST7735 (GPIO ตามที่คุณกำหนด)

// —————————–

#define TFT_CS D8 // CS

#define TFT_RST D3 // RES

#define TFT_DC D4 // DC

#define TFT_BL D0 // Backlight PWM

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// —————————–

// LED แบบวงกลม

// —————————–

const int numLEDs = 4;

int ledX[numLEDs];

int ledY = 64;

int circleRadius = 15;

bool lastState[numLEDs] = {false, false, false, false};

// —————————–

// NTP Client

// —————————–

WiFiUDP ntpUDP;

NTPClient timeClient(ntpUDP, “pool.ntp.org“, 7*3600, 1000); // GMT+7, update ทุก 1 วินาที

// วาดเส้นขอบ LED

void drawLEDFrame(int index) {

tft.drawCircle(ledX[index], ledY, circleRadius, ST77XX_WHITE);

}

// วาดสี LED

void fillLED(int index, bool state) {

uint16_t fillColor = state ? ST77XX_GREEN : ST77XX_RED;

tft.fillCircle(ledX[index], ledY, circleRadius – 1, fillColor);

}

void setup() {

Serial.begin(115200);

// เปิดจอ

tft.initR(INITR_BLACKTAB);

tft.setRotation(3); // หมุนจอ 180 องศา

tft.fillScreen(ST77XX_BLACK);

// ปรับความสว่างจอ 100%

pinMode(TFT_BL, OUTPUT);

analogWrite(TFT_BL, 0); // 0 = 100% ตามที่คุณกำหนด

// ต่อ WiFi

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {

delay(500);

Serial.print(“.”);

}

Serial.println(“\nWiFi Connected”);

// แสดง IP + Port บนจอ (มุมซ้ายบน)

tft.setCursor(0, 0);

tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);

tft.setTextSize(1);

tft.print(WiFi.localIP());

tft.print(“:”);

tft.print(PORT);

// แสดงข้อความ Modbus Coin LED Test ใต้ IP

tft.setCursor(0, 14); // 10 px ต่ำกว่า IP

tft.setTextColor(ST77XX_BLUE, ST77XX_BLACK);

tft.setTextSize(1);

tft.print(“Modbus Coin LED Test”);

// เริ่ม Modbus TCP/IP slave

mb.begin();

mb.addCoil(1);

mb.addCoil(2);

mb.addCoil(3);

mb.addCoil(4);

// คำนวณตำแหน่ง X ให้ LED อยู่กลางจอ

int spacing = 10;

int totalWidth = numLEDs * (circleRadius * 2) + (numLEDs – 1) * spacing;

int startX = (tft.width() – totalWidth) / 2 + circleRadius;

for (int i = 0; i < numLEDs; i++) {

ledX[i] = startX + i * ((circleRadius * 2) + spacing);

drawLEDFrame(i);

fillLED(i, false);

}

// เริ่ม NTP Client

timeClient.begin();

}

void loop() {

mb.task(); // ตรวจสอบคำสั่ง Modbus

timeClient.update(); // อัปเดตเวลา

// อัปเดตสถานะ LED จาก Modbus Coil

for (int i = 0; i < numLEDs; i++) {

bool state = mb.Coil(i + 1);

if (state != lastState[i]) {

fillLED(i, state);

lastState[i] = state;

}

}

// แสดงเวลามุมขวาล่าง

int h = timeClient.getHours();

int m = timeClient.getMinutes();

char buf[6];

sprintf(buf, “%02d:%02d”, h, m);

int16_t x = tft.width() – 6 * 6; // 6 px ต่อ char, 6 char กว้างสุด

int16_t y = tft.height() – 8; // ขึ้น 8 px ให้ไม่ชนขอบ

tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK);

tft.setTextSize(1);

tft.setCursor(x, y);

tft.print(buf);

}