#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 11
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// DHT22
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Relay dan indikator
const int relayPin = 7;
const int ledMain = 8;
// LED running
const int led1 = 3;
const int led2 = 4;
const int led3 = 5;
const int led4 = 6;
// Counter suhu
int tempCounter = 0; // 4-bit counter, range 0–15
const int MAX_COUNTER = 15;
const int MIN_COUNTER = 0;
// Pesan LED matrix
#define BUF_SIZE 100
char curMessage[BUF_SIZE] = { "" };
char newMessage[BUF_SIZE] = { "ROMADONA SYARIF HIDAYAH - 241091900109 Monitoring Suhu Otomatis - Sistem Komputer" };
bool newMessageAvailable = true;
// Fungsi baca serial untuk Parola
void readSerial(void) {
static char *cp = newMessage;
while (Serial.available()) {
*cp = (char)Serial.read();
if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE - 2)) {
*cp = '\0';
cp = newMessage;
newMessageAvailable = true;
} else {
cp++;
}
}
}
void setup() {
Serial.begin(9600);
dht.begin();
lcd.begin(16, 2);
lcd.backlight();
// Inisialisasi pin
pinMode(relayPin, OUTPUT);
pinMode(ledMain, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
// LED Matrix
P.begin();
P.displayText(curMessage, PA_LEFT, 25, 100, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
Serial.println("Sistem Monitoring Suhu + LED Running + Counter");
}
void loop() {
// Animasi LED matrix
if (P.displayAnimate()) {
if (newMessageAvailable) {
strcpy(curMessage, newMessage);
newMessageAvailable = false;
}
P.displayReset();
}
readSerial();
// Baca sensor suhu
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Gagal membaca sensor DHT22!");
return;
}
// Update counter suhu berdasarkan nilai
updateTemperatureCounter(temperature);
// Tampilkan ke LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Cnt:");
lcd.print(tempCounter);
lcd.print(" H:");
lcd.print(humidity);
lcd.print("%");
// Kendali relay dan LED utama
if (temperature > 30) {
digitalWrite(relayPin, HIGH);
digitalWrite(ledMain, HIGH);
} else {
digitalWrite(relayPin, LOW);
digitalWrite(ledMain, LOW);
}
// Jalankan LED efek berurutan
runLedSequence();
}
// Fungsi LED running
void runLedSequence() {
digitalWrite(led1, HIGH); delay(20); digitalWrite(led1, LOW);
digitalWrite(led2, HIGH); delay(20); digitalWrite(led2, LOW);
digitalWrite(led3, HIGH); delay(20); digitalWrite(led3, LOW);
digitalWrite(led4, HIGH); delay(20); digitalWrite(led4, LOW);
}
// Fungsi counter suhu 4-bit
void updateTemperatureCounter(float temp) {
if (temp > 20) {
if (tempCounter < MAX_COUNTER) {
tempCounter++;
}
} else {
if (tempCounter > MIN_COUNTER) {
tempCounter--;
}
}
}