#include <Arduino.h>
#include "DHT.h"
// =============================
// Konfigurasi PIN
// =============================
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define LDR_PIN 34 // ADC
#define PIR_PIN 27
#define LED_ALARM_PIN 12
#define BUZZER_PIN 14
#define RELAY_LED_PIN 25
// =============================
// Objek DHT
// =============================
DHT dht(DHT_PIN, DHT_TYPE);
// =============================
// Struct Data & Queue
// =============================
// Data sensor yang dikirim dari TaskSensorRead ke TaskLogic
typedef struct {
float suhu;
float kelembapan;
uint16_t ldrValue;
bool pirDetected;
} SensorData_t;
// Command aktuator dari TaskLogic ke TaskActuator
typedef struct {
bool ledAlarmOn;
bool buzzerOn;
bool relayLedOn;
} ActuatorCmd_t;
// Handle Queue
QueueHandle_t qSensor = NULL;
QueueHandle_t qActuatorCmd = NULL;
// (Opsional) variabel global untuk data terakhir sensor (buat TaskCloudPublish nanti)
SensorData_t lastSensorData;
// =============================
// Deklarasi Task Function
// =============================
void TaskSensorRead(void *pvParameters);
void TaskLogic(void *pvParameters);
void TaskActuator(void *pvParameters);
// void TaskCloudPublish(void *pvParameters); // kalau nanti mau pakai cloud
// =============================
// Setup
// =============================
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Starting FreeRTOS IoT Skeleton...");
// Inisialisasi DHT
dht.begin();
// Konfigurasi pin I/O
pinMode(LDR_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED_ALARM_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RELAY_LED_PIN, OUTPUT);
digitalWrite(LED_ALARM_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RELAY_LED_PIN, LOW);
// Buat Queue
qSensor = xQueueCreate(
5, // jumlah item dalam queue
sizeof(SensorData_t) // ukuran tiap item
);
qActuatorCmd = xQueueCreate(
5,
sizeof(ActuatorCmd_t)
);
if (qSensor == NULL || qActuatorCmd == NULL) {
Serial.println("GAGAL membuat Queue!");
while (1) {
delay(1000);
}
}
// Buat Task-task
xTaskCreate(
TaskSensorRead, // fungsi task
"TaskSensorRead", // nama task
4096, // stack size
NULL, // parameter
2, // prioritas
NULL // handle task (optional)
);
xTaskCreate(
TaskLogic,
"TaskLogic",
4096,
NULL,
2,
NULL
);
xTaskCreate(
TaskActuator,
"TaskActuator",
4096,
NULL,
1,
NULL