dianartanto

Modbus Master dengan software Modbus Slave

Sep 6th, 2026
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.05 KB | None | 0 0
  1. #include <ModbusRTU.h>
  2. #include <Wire.h>
  3. #include <Adafruit_GFX.h>
  4. #include <Adafruit_SSD1306.h>
  5.  
  6. // OLED I2C (default address 0x3C untuk 128x64)
  7. #define SCREEN_WIDTH 128
  8. #define SCREEN_HEIGHT 64
  9. #define OLED_ADDR    0x3C
  10. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
  11.  
  12. ModbusRTU mb;
  13. int a = 0;
  14. unsigned long skr = 0;
  15. unsigned long lastDisplay = 0;   // timer untuk update OLED
  16.  
  17. bool koil1[3];
  18. bool koil2[3];
  19. bool koil3[3];
  20. bool koil4[3];
  21.  
  22. void setup() {
  23.   Serial.begin(9600, SERIAL_8N1);
  24.   mb.begin(&Serial);
  25.   mb.setBaudrate(9600);
  26.   mb.master();
  27.  
  28.   pinMode(5, INPUT_PULLUP);
  29.   pinMode(6, INPUT_PULLUP);
  30.   pinMode(7, INPUT_PULLUP);
  31.   pinMode(8, INPUT_PULLUP);
  32.  
  33.   // Inisialisasi OLED
  34.   if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
  35.     // Jika gagal, diam saja (tidak mengganggu jalannya program)
  36.     for (;;);
  37.   }
  38.   display.clearDisplay();
  39.   display.setTextSize(2);
  40.   display.setTextColor(SSD1306_WHITE);
  41.   display.setCursor(0, 0);
  42.   display.println("OLED Ready");
  43.   display.display();
  44.   delay(1000);
  45.   display.clearDisplay();
  46. }
  47.  
  48. void loop() {
  49.   // ----- Scheduler Modbus (setiap 100ms) -----
  50.   if (millis() - skr > 100) {
  51.     skr = millis();
  52.     a++;
  53.     if (a > 11) a = 0;
  54.  
  55.     switch (a) {
  56.       case 0:
  57.         mb.readCoil(1, 0, koil1, 3);
  58.         break;
  59.       case 1:
  60.         mb.readCoil(2, 0, koil2, 3);
  61.         break;
  62.       case 2:
  63.         mb.readCoil(3, 0, koil3, 3);
  64.         break;
  65.       case 3:
  66.         mb.readCoil(4, 0, koil4, 3);
  67.         break;
  68.       case 4:
  69.         mb.writeCoil(1, 1, digitalRead(5));
  70.         break;
  71.       case 5:
  72.         mb.writeCoil(2, 1, digitalRead(6));
  73.         break;
  74.       case 6:
  75.         mb.writeCoil(3, 1, digitalRead(7));
  76.         break;
  77.       case 7:
  78.         mb.writeCoil(4, 1, digitalRead(8));
  79.         break;
  80.       case 8:
  81.         mb.writeCoil(1, 2, digitalRead(5));
  82.         break;
  83.       case 9:
  84.         mb.writeCoil(2, 2, digitalRead(6));
  85.         break;
  86.       case 10:
  87.         mb.writeCoil(3, 2, digitalRead(7));
  88.         break;
  89.       case 11:
  90.         mb.writeCoil(4, 2, digitalRead(8));
  91.         break;
  92.     }
  93.   }
  94.  
  95.   // Proses komunikasi Modbus
  96.   mb.task();
  97.  
  98.   // ----- Update OLED setiap 300ms (agar tidak terlalu sering) -----
  99.   if (millis() - lastDisplay > 300) {
  100.     lastDisplay = millis();
  101.     display.clearDisplay();
  102.     display.setCursor(0, 0);
  103.  
  104.     // Baris 1 : koil1
  105.     display.print("K1: ");
  106.     for (int i = 0; i < 3; i++) {
  107.       display.print(koil1[i] ? "1 " : "0 ");
  108.     }
  109.     display.println();
  110.  
  111.     // Baris 2 : koil2
  112.     display.print("K2: ");
  113.     for (int i = 0; i < 3; i++) {
  114.       display.print(koil2[i] ? "1 " : "0 ");
  115.     }
  116.     display.println();
  117.  
  118.     // Baris 3 : koil3
  119.     display.print("K3: ");
  120.     for (int i = 0; i < 3; i++) {
  121.       display.print(koil3[i] ? "1 " : "0 ");
  122.     }
  123.     display.println();
  124.  
  125.     // Baris 4 : koil4
  126.     display.print("K4: ");
  127.     for (int i = 0; i < 3; i++) {
  128.       display.print(koil4[i] ? "1 " : "0 ");
  129.     }
  130.     display.println();
  131.  
  132.     display.display();
  133.   }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment