Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ModbusRTU.h>
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include <SoftwareSerial.h>
- SoftwareSerial S(2, 3);
- #define SCREEN_WIDTH 128
- #define SCREEN_HEIGHT 64
- #define OLED_ADDR 0x3C
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
- ModbusRTU mb;
- int a = 0;
- unsigned long skr = 0;
- unsigned long lastDisplay = 0; // timer untuk update OLED
- bool koil1[3];
- bool koil2[3];
- bool koil3[3];
- bool koil4[3];
- void setup() {
- Serial.begin(9600);
- S.begin(9600);
- mb.begin(&S);
- mb.setBaudrate(9600);
- mb.master();
- pinMode(5, INPUT_PULLUP);
- pinMode(6, INPUT_PULLUP);
- pinMode(7, INPUT_PULLUP);
- pinMode(8, INPUT_PULLUP);
- // Inisialisasi OLED
- if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
- // Jika gagal, diam saja (tidak mengganggu jalannya program)
- for (;;)
- ;
- }
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(SSD1306_WHITE);
- display.setCursor(0, 0);
- display.println("OLED Ready");
- display.display();
- delay(1000);
- display.clearDisplay();
- }
- void loop() {
- // ----- Scheduler Modbus (setiap 100ms) -----
- if (millis() - skr > 100) {
- skr = millis();
- a++;
- if (a > 11) a = 0;
- switch (a) {
- case 0:
- mb.readCoil(1, 0, koil1, 3);
- break;
- case 1:
- mb.readCoil(2, 0, koil2, 3);
- break;
- case 2:
- mb.readCoil(3, 0, koil3, 3);
- break;
- case 3:
- mb.readCoil(4, 0, koil4, 3);
- break;
- case 4:
- mb.writeCoil(1, 1, digitalRead(5));
- break;
- case 5:
- mb.writeCoil(2, 1, digitalRead(6));
- break;
- case 6:
- mb.writeCoil(3, 1, digitalRead(7));
- break;
- case 7:
- mb.writeCoil(4, 1, digitalRead(8));
- break;
- case 8:
- mb.writeCoil(1, 2, digitalRead(5));
- break;
- case 9:
- mb.writeCoil(2, 2, digitalRead(6));
- break;
- case 10:
- mb.writeCoil(3, 2, digitalRead(7));
- break;
- case 11:
- mb.writeCoil(4, 2, digitalRead(8));
- break;
- }
- }
- // Proses komunikasi Modbus
- mb.task();
- // ----- Update OLED setiap 300ms (agar tidak terlalu sering) -----
- if (millis() - lastDisplay > 300) {
- lastDisplay = millis();
- display.clearDisplay();
- display.setCursor(0, 0);
- // Baris 1 : koil1
- display.print("K1: ");
- for (int i = 0; i < 3; i++) {
- display.print(koil1[i] ? "1 " : "0 ");
- }
- display.println();
- // Baris 2 : koil2
- display.print("K2: ");
- for (int i = 0; i < 3; i++) {
- display.print(koil2[i] ? "1 " : "0 ");
- }
- display.println();
- // Baris 3 : koil3
- display.print("K3: ");
- for (int i = 0; i < 3; i++) {
- display.print(koil3[i] ? "1 " : "0 ");
- }
- display.println();
- // Baris 4 : koil4
- display.print("K4: ");
- for (int i = 0; i < 3; i++) {
- display.print(koil4[i] ? "1 " : "0 ");
- }
- display.println();
- display.display();
- }
- }
Advertisement