#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <Wire.h>
#include "RTClib.h"
SemaphoreHandle_t interruptSemaphore, semLED1, semLED2, semLED3;
RTC_DS1307 rtc;
int LED1 = 19;
int LED2 = 5;
int LED3 = 4;
const int BUTTON = 2;
const String strWaktuMulai = "12:40:00";
const String strWaktuAkhir = "13:30:00";
bool forceTurnOff = false;
long debouncing_time = 150;
volatile unsigned long last_micros;
void debounceInterrupt() {
if((long)(micros() - last_micros) >= debouncing_time * 1000) {
Serial.println("Button di tekan!");
forceTurnOff = !forceTurnOff;
xSemaphoreGiveFromISR(interruptSemaphore, NULL);
last_micros = micros();
}
}
void TaskLed(void *pvParameters) {
int data = *(int *) pvParameters;
SemaphoreHandle_t sem;
if (data == LED1) {
sem = semLED1;
} else if (data == LED2) {
sem = semLED2;
} else if (data == LED3) {
sem = semLED3;
}
while(1) {
xSemaphoreTake(sem, portMAX_DELAY);
DateTime time = rtc.now();
Serial.println(data);
if(time.timestamp(DateTime::TIMESTAMP_TIME) >= strWaktuMulai && time.timestamp(DateTime::TIMESTAMP_TIME) <= strWaktuAkhir) {
if (!forceTurnOff) {
ledControlHigh(data);
vTaskDelay(200 / portTICK_PERIOD_MS);
} else {
ledControlLow(data);
vTaskDelay(200 / portTICK_PERIOD_MS);
}
} else {
forceTurnOff = false;
ledControlLow(data);
vTaskDelay(200 / portTICK_PERIOD_MS);
}
xSemaphoreGive(sem);
}
}
void TaskMonitoring(void *pvParameters) {
(void) pvParameters;
while (1) {
Serial.print("Status LED1: ");
Serial.println(digitalRead(LED1) == HIGH ? "HIGH" : "LOW");
Serial.print("Status LED2: ");
Serial.println(digitalRead(LED2) == HIGH ? "HIGH" : "LOW");
Serial.print("Status LED3: ");
Serial.println(digitalRead(LED3) == HIGH ? "HIGH" : "LOW");
vTaskDelay(5000 / portTICK_PERIOD_MS); // Menunggu 5 detik sebelum mencetak status lagi
}
}
void setup () {
Serial.begin(9600);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
rtc.begin();
semLED1 = xSemaphoreCreateBinary();
semLED2 = xSemaphoreCreateBinary();
semLED3 = xSemaphoreCreateBinary();
xTaskCreate(TaskLed, "LED1", 2048, (void *)&LED1, 2, NULL); // merah
xTaskCreate(TaskLed, "LED2", 2048, (void *)&LED2, 3, NULL); // kuning
xTaskCreate(TaskLed, "LED3", 2048, (void *)&LED3, 1, NULL); // hijau
xTaskCreate(TaskMonitoring, "Monitoring", 2048, NULL, 1, NULL);
if (semLED1 != NULL && semLED2 != NULL && semLED3 != NULL) {
xSemaphoreGive(semLED1); // LED1 akan menyala pertama kali
xSemaphoreGive(semLED2); // LED2 akan menyala setelah LED1 menyala
xSemaphoreGive(semLED3); // LED3 akan menyala setelah LED2 menyala
}
interruptSemaphore = xSemaphoreCreateBinary();
if (interruptSemaphore != NULL) {
attachInterrupt(digitalPinToInterrupt(BUTTON), debounceInterrupt, RISING);
}
}
void loop() {
delay(10); // this speeds up the simulation
}
void ledControlHigh(int pin) {
digitalWrite(pin, HIGH);
}
void ledControlLow(int pin) {
digitalWrite(pin, LOW);
}