วันนี้มาแจกโค๊ด 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);
}




