#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int ledPin = 13;
unsigned long lastMessageTime = 0;
bool ledState = false;
void setup() {
Serial.begin(9600);
lcd.begin(16,2); //Ορίζει τις διαστάσεις (πλάτος και ύψος) της οθόνης
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
if (Serial.available() > 0) {
String TestData= Serial.readStringUntil('\n');
TestData.trim(); // Αφαιρεί whitespace & αλλαγές γραμμής
lcd.clear();
// Εμφάνιση σε 2 γραμμές με κύλιση αν χρειάζεται
if (TestData.length() <= 16) {
lcd.setCursor(0, 0);
lcd.print(TestData);
} else if (TestData.length() <= 32) {
lcd.setCursor(0, 0);
lcd.print(TestData.substring(0, 16));
lcd.setCursor(0, 1);
lcd.print(TestData.substring(16));
} else {
// Αν το μήνυμα είναι >32 χαρακτήρες, το κυλάμε ολόκληρο
for (int i = 0; i <= TestData.length() - 16; i++) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(TestData.substring(i, i + 16));
if (i + 16 < TestData.length()) {
lcd.setCursor(0, 1);
int endIdx = min(i + 32, (int)TestData.length());
lcd.print(TestData.substring(i + 16, endIdx));
}
delay(300);//στην κύλικη κάνει την προβολή ευανάγνωστη
}
}
// Ανάβει το LED
digitalWrite(ledPin, HIGH);//Το LED μένει αναμμένο μέχρι την επόμενη είσοδο.
ledState = true;
lastMessageTime = millis(); // Ενημέρωση χρόνου τελευταίου μηνύματος και το millis μετρά χρόνο από την εκκίνηση του arduino
delay(1000);
lcd.clear();
}
// Αν περάσουν 10 δευτερόλεπτα χωρίς νέο μήνυμα, σβήνει το LED
if (ledState && (millis() - lastMessageTime >= 2000)) {
digitalWrite(ledPin, LOW);
ledState = false;
}
}