Project Sensor — Arduino Mega simulation

An interactive Arduino Mega circuit simulation you can run free in your browser on Velxio, by juliwicksmancay.

Components

Sketch code

/*
 * SERVER UTAMA MONITORING KANDANG AYAM - Arduino Mega 2560
 * VERSI: kipas per node (relay di tiap node ESP32), LCD 16x2 I2C
 *
 * Koneksi UART:
 *   Node 1 -> Serial1 (RX1=19, TX1=18)
 *   Node 2 -> Serial2 (RX2=17, TX2=16)
 *   Node 3 -> Serial3 (RX3=15, TX3=14)
 *   Node 4 -> tergantung pengaturan NODE4_PAKAI_RX0TX0 di bawah
 *
 * LCD 16x2 I2C: SDA = pin 20, SCL = pin 21, alamat 0x27 (atau 0x3F)
 * Buzzer: pin 8 | LED hijau/kuning/merah: pin 22/23/24
 * (Relay kipas TIDAK lagi di Mega; relay ada di tiap node ESP32.)
 *
 * Protokol:
 *   Mega -> node : "?F1\n" (kipas ON) atau "?F0\n" (kipas OFF)
 *   Node -> Mega : $<id>,<suhu>,<rh>,<status_sensor>,<status_kipas>*<checksum>\n
 *
 * Logika kipas per node (dihitung Mega):
 *   - Sensor node error          : kipas node itu ON (fail-safe)
 *   - Selain itu                 : kipas node ON jika suhu node ITU >= T_KIPAS_NODE_ON
 *                                  (histeresis 1 derajat). Node lain tidak ikut menyala.
 *   - Node offline               : Mega tidak bisa memerintah; node mengatur kipasnya sendiri
 *   - Status global (AMAN/WASPADA/BAHAYA) hanya memengaruhi LED, buzzer, dan LCD.
 *     Opsi KIPAS_SEMUA_SAAT_BAHAYA = 1 membuat semua kipas ikut menyala saat BAHAYA.
 *
 * Library: LiquidCrystal I2C (Frank de Brabander).
 */

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// 1 = Node 4 di Serial0 (pin 0 = RX0, pin 1 = TX0). Tidak ada log ke Serial Monitor.
//     Cabut kabel pin 0/1 saat upload ke board asli.
// 0 = Node 4 di SoftwareSerial (RX = pin 10, TX = pin 11). Serial Monitor tetap aktif.
#define NODE4_PAKAI_RX0TX0 1

#if !NODE4_PAKAI_RX0TX0
#include <SoftwareSerial.h>
SoftwareSerial serialNode4(10, 11);       // RX, TX
#endif

#define JUMLAH_NODE 4

Stream* portNode[JUMLAH_NODE];            // diisi di setup()

LiquidCrystal_I2C lcd(0x27, 16, 2);       // 16 kolom x 2 baris

const byte PIN_BUZZER     = 8;
const byte PIN_LED_HIJAU  = 22;
const byte PIN_LED_KUNING = 23;
const byte PIN_LED_MERAH  = 24;

// ======================= AMBANG BATAS =======================
const float THI_WASPADA    = 75.0;
const float THI_BAHAYA     = 82.0;
const float T_NODE_WASPADA = 30.0;
const float T_NODE_BAHAYA  = 33.0;
const float HISTERESIS     = 1.0;
const float T_KIPAS_NODE_ON = 28.0;   // kipas node ON jika suhu node itu >= ini (OFF jika <= ini - histeresis)

// 0 = kipas HANYA ditentukan suhu node masing-masing (status global tidak memengaruhi kipas)
// 1 = saat status BAHAYA, semua kipas ikut menyala
#define KIPAS_SEMUA_SAAT_BAHAYA 0

const unsigned long INTERVAL_POLLING = 2500;
const unsigned long TIMEOUT_BALASAN  = 1000;   // ms (hardware asli: 300 cukup; simulator lebih lambat)
const unsigned long INTERVAL_HALAMAN = 3000;   // ganti halaman LCD tiap 3 detik
const byte JUMLAH_HALAMAN = 4;

// ======================= VARIABEL GLOBAL =======================
float suhu[JUMLAH_NODE];
float lembab[JUMLAH_NODE];
bool  valid[JUMLAH_NODE];
byte  nodeState[JUMLAH_NODE] = {2, 2, 2, 2};   // 0=OK, 1=

More projects by juliwicksmancay