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




