#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define LED1_PIN 12
#define LED2_PIN 13
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
struct LED {
int period;
int duty_cycle;
bool working;
};
LED led1 = {0, 0, false};
LED led2 = {0, 0, false};
unsigned long previousMillis = 0;
void setup() {
Serial.begin(9600);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("00:00");
}
void loop() {
unsigned long currentMillis = millis();
unsigned long elapsedMillis = currentMillis - previousMillis;
if (elapsedMillis >= 1000) {
previousMillis = currentMillis;
// Update and display current time
static unsigned long startTime = millis();
unsigned long elapsedTime = currentMillis - startTime;
unsigned long minutes = elapsedTime / 60000;
unsigned long seconds = (elapsedTime / 1000) % 60;
lcd.setCursor(0, 0);
lcd.print(String(minutes, DEC));
lcd.print(":");
if (seconds < 10) {
lcd.print("0");
}
lcd.print(String(seconds, DEC));
// Display LED settings
lcd.setCursor(0, 1);
if (led1.working) {
lcd.print("1:" + String(led1.period) + ":" + String(led1.duty_cycle) + " ");
} else {
lcd.print("1:OFF ");
}
if (led2.working) {
lcd.print("2:" + String(led2.period) + ":" + String(led2.duty_cycle));
} else {
lcd.print("2:OFF ");
}
}
// Read serial input
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n');
int led_number = input.substring(0, input.indexOf(":")).toInt();
int period = input.substring(input.indexOf(":") + 1, input.lastIndexOf(":")).toInt();
int duty_cycle = input.substring(input.lastIndexOf(":") + 1).toInt();
// Update LED settings
if (led_number == 1) {
led1.period = period;
led1.duty_cycle = duty_cycle;
led1.working = (period != 0);
} else if (led_number == 2) {
led2.period = period;
led2.duty_cycle = duty_cycle;
led2.working = (period != 0);
}
// Output message to serial port
Serial.println("LED" + String(led_number) + " updated: period=" + String(period) + ", duty cycle=" + String(duty_cycle));
}
// Update LED states
updateLED(LED1_PIN, led1);
updateLED(LED2_PIN, led2);
}
void updateLED(int pin, LED &led) {
if (led.working) {
int high_duration = (led.period * led.duty_cycle) / 100;
int low_duration = led.period - high_duration;
int state = (millis() % led.period) < high_duration ? HIGH : LOW;
digitalWrite(pin, state);
} else {
digitalWrite(pin, LOW);
}
}