dianartanto

Modbus Master dengan Software Serial

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