// --- LIBRARY ---
#include <LiquidCrystal.h>
#include "HardwareTimer.h"
#include <DHT.h>
// --- KONFIGURASI PIN & OBJEK ---
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define DHTPIN PA0
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define pinCLK PB6
#define pinDT PB7
HardwareTimer *MyEncoder;
#define buzzerPin PA1
#define greenLedPin PA2 // BARIS BARU: Pin untuk LED Hijau
#define redLedPin PA3 // BARIS BARU: Pin untuk LED Merah
// --- Variabel Global ---
unsigned long previousMillis = 0;
const long interval = 2000;
int16_t lastEncoderValue = 0;
const float tempMaksimal = 30.0;
const float tempMinimal = 20.0;
// --- FUNGSI SETUP ---
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(greenLedPin, OUTPUT); // BARIS BARU: Atur pin LED sebagai OUTPUT
pinMode(redLedPin, OUTPUT); // BARIS BARU: Atur pin LED sebagai OUTPUT
pinMode(pinCLK, INPUT);
pinMode(pinDT, INPUT);
TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(digitalPinToPinName(pinCLK), PinMap_PWM);
// ... (sisa inisialisasi encoder sama)
uint32_t channel_1 = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(pinCLK), PinMap_PWM));
uint32_t channel_2 = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(pinDT ), PinMap_PWM));
MyEncoder = new HardwareTimer(Instance);
MyEncoder->setMode(channel_1, TIMER_INPUT_CAPTURE_FALLING, pinCLK);
MyEncoder->setMode(channel_2, TIMER_INPUT_CAPTURE_FALLING, pinDT );
Instance->SMCR |= TIM_ENCODERMODE_TI12;
MyEncoder->setCount(0);
MyEncoder->resume();
lcd.begin(16, 2);
dht.begin();
lcd.clear();
}
// --- FUNGSI LOOP ---
void loop() {
unsigned long currentMillis = millis();
// BAGIAN 1: Membaca sensor dan mengontrol alarm
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.setCursor(0, 0);
lcd.print("Gagal baca DHT!");
} else {
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(t, 1);
lcd.print((char)223);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Lembap: ");
lcd.print(h, 1);
lcd.print("% ");
// MODIFIKASI: Logika untuk alarm (Buzzer dan LED)
if (t > tempMaksimal || t < tempMinimal) {
// Kondisi BAHAYA
digitalWrite(buzzerPin, HIGH); // Nyalakan buzzer
digitalWrite(redLedPin, HIGH); // Nyalakan LED Merah
digitalWrite(greenLedPin, LOW); // Matikan LED Hijau
} else {
// Kondisi AMAN
digitalWrite(buzzerPin, LOW); // Matikan buzzer
digitalWrite(redLedPin, LOW); // Matikan LED Merah
digitalWrite(greenLedPin, HIGH); // Nyalakan LED Hijau
}
}
}
// BAGIAN 2: Membaca encoder secara real-time
int16_t currentEncoderValue = MyEncoder->getCount();
if (currentEncoderValue != lastEncoderValue) {
lastEncoderValue = currentEncoderValue;
lcd.setCursor(12, 0);
lcd.print("P:");
lcd.print(lastEncoderValue);
lcd.print(" ");
}
}Loading
stm32-bluepill
stm32-bluepill