/*
Dibuat Oleh
Nama : Efrino Wahyu Eko Pambudi
NIM : 3.34.22.1.07
Kelas : IK - 2B
*/
#include <LiquidCrystal_I2C.h>
const uint8_t redPin = 14;
const uint8_t amberPin = 12;
const uint8_t greenPin = 13;
int LED_BUILTIN = 0;
int32_t counter = 0;
uint32_t redStartAtMs = 0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
SemaphoreHandle_t xSemaphore = NULL; // Membuat objek semaphore
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(amberPin, OUTPUT);
pinMode(greenPin, OUTPUT);
lcd.init();
lcd.backlight();
xSemaphore = xSemaphoreCreateBinary(); // Membuat semaphore sebagai binary
Serial.begin(115200);
xTaskCreatePinnedToCore(
task1,
"task1",
1000,
NULL,
1,
NULL,
0
);
xTaskCreatePinnedToCore(
task2,
"task2",
4000, // Perbesar ukuran tumpukan karena penggunaan LCD
NULL,
1,
NULL,
0
);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
void task1(void* pvParameters) {
while (1) {
redStartAtMs = millis();
counter = 7;
xSemaphoreGive(xSemaphore); // Melepaskan semaphore
digitalWrite(redPin, HIGH);
delay(8000UL);
digitalWrite(redPin, LOW);
digitalWrite(amberPin, HIGH);
delay(3000UL);
digitalWrite(redPin, LOW);
digitalWrite(amberPin, LOW);
digitalWrite(greenPin, HIGH);
delay(9000UL);
digitalWrite(greenPin, LOW);
digitalWrite(amberPin, HIGH);
delay(3000);
digitalWrite(amberPin, LOW);
}
}
void task2(void* pvParameters) {
while (1) {
if (xSemaphoreTake(xSemaphore, 22000UL)) { // timeout kurang dari waktu siklus
while (counter > 0) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(counter--);
delay(1000UL);
if (counter <= 0) {
lcd.clear();
}
}
}
}
}