Untitled
unknown
plain_text
5 months ago
20 kB
4
Indexable
// pripojenie potrebných knihovien // displej #include <UTFT.h> #include <TFT_Touch.h> #include <virtuabotixRTC.h> // Led strip #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> // Required for 16 MHz Adafruit Trinket #endif // prehravac #include "DFRobotDFPlayerMini.h" // rfid #include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance // deklaracia fontov pre použité písma extern uint8_t SmallFont[]; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFont[]; extern uint8_t GroteskBold32x64[]; // vytvorenie premennnych pre nastavenie dotykového displeja #define HMIN 0 // minimum pre suradnicu X #define HMAX 4095 // maximum pre suradnicu X #define VMIN 0 // minimum pre suradnicu Y #define VMAX 4095 // maximum pre suradnicu Y #define XYSWAP 1 // nastavenie pre správnu orientaciu os X a Y // nastavenie velkosti displeja pre správnu detekciu dotyku #define HRES 320 // počet pixelov na osi X #define VRES 240 // počet pixelov na osi Y // LCD displej UTFT displej(ILI9341_16, 38, 39, 40, 41); TFT_Touch dotyk = TFT_Touch(5, 6, 4, 3); // CLOCK virtuabotixRTC myRTC(10, 11, 12); // LED pásik #define NUMPIXELS 10 Adafruit_NeoPixel LED = Adafruit_NeoPixel(NUMPIXELS, A1, NEO_GRB + NEO_KHZ800); // Prehravanie hudby DFRobotDFPlayerMini myDFPlayer; bool play = false; int song = 0; unsigned long previousMillis = 5000; // Premenná na uloženie predchádzajúceho času const long interval = 5000; // Nastavenie intervalu na 5000 milisekúnd (5 sekúnd) // Definujeme enum pre obrazovky enum Screen { MAIN_SCREEN, // Hlavná obrazovka ALARM_SCREEN, // Obrazovka pre nastavenie budíka RGB_SCREEN, // Obrazovka pre nastavenie RGB LED FAVORITE_ALARMS_SCREEN // Nová obrazovka pre obľúbené časy }; // Aktuálne zobrazená obrazovka Screen currentScreen = MAIN_SCREEN; // Premenné pre RGB int R = 0; int G = 0; int B = 0; int xR = 0; int xG = 0; int xB = 0; int dR = 32; int dG = 32; int dB = 32; bool LED_on = true; bool svetlo_auto = false; int svetlo = 0; char date[12]; char time[12]; bool budikPlayed = false; int lastMin = 0; // Premenné pre budík int alarmHour = 0; int alarmMinute = 0; bool settingAlarm = false; // Indikátor, či sa nastavuje budík void setup() { Serial.begin(9600); Serial1.begin(9600); Serial.println(F("Pripravené prijímať UID.")); Serial3.begin(9600); myDFPlayer.begin(Serial3); pinMode(13, OUTPUT); digitalWrite(13, 1); // seconds, minutes, hours, day of the week, day of the month, month, year //myRTC.setDS1302Time(00, 04, 23, 5, 6, 12, 2024); initialize_display(); LED.begin(); LED.setBrightness(50); myDFPlayer.setTimeOut(500); myDFPlayer.volume(15); myDFPlayer.EQ(0); SPI.begin(); mfrc522.PCD_Init(); } void loop() { unsigned long currentMillis = millis(); // Každých 5 sekúnd aktualizujeme čas, ak nie sme v režime nastavovania budíka if ((unsigned long)(currentMillis - previousMillis) >= interval && currentScreen == MAIN_SCREEN) { previousMillis = currentMillis; // Kontrola osvetlenia svetlo = analogRead(A0); Serial.println(svetlo); if (svetlo_auto == true){ if (svetlo < 350){ LED_on = true; for(int i=0; i<NUMPIXELS; i++) { LED.setPixelColor(i, R, G, B); LED.show(); } } else if (svetlo > 400){ LED_on = false; for(int i=0; i<NUMPIXELS; i++) { LED.setPixelColor(i, 0, 0, 0); LED.show(); } } } if (Serial1.available() > 0) { // Ak sú dostupné dáta na Serial1 String uid = Serial1.readStringUntil('\n'); // Prečítať UID ako reťazec do ukončenia riadku Serial.print(F("Prijaté UID: ")); Serial.println(uid); // Zobraziť prijaté UID // Príklad spracovania UID if (uid == "33:D0:FB:F7") { Serial.println(F("Zapína sa rozprávka č. 1")); myDFPlayer.play(1); song = 1; play = true; initialize_display(); } else if (uid == "83:3A:62:2D") { Serial.println(F("Zapína sa rozprávka č. 2")); myDFPlayer.play(2); song = 2; play = true; initialize_display(); } else if (uid == "3:38:51:13") { Serial.println(F("Zapína sa rozprávka č. 3")); myDFPlayer.play(3); song = 3; play = true; initialize_display(); } else { Serial.println(F("Neznáme UID.")); } } myRTC.updateTime(); // Zobrazenie aktuálneho času Serial.println(myRTC.seconds); Serial.println(myRTC.minutes); int hodiny = myRTC.hours; int minuty = myRTC.minutes; sprintf(date, "%02d. %02d. %04d", myRTC.dayofmonth, myRTC.month, myRTC.year); sprintf(time, " %02d:%02d ", hodiny, minuty); Serial.println(time); displej.setColor(255, 255, 255); displej.setFont(SmallFont); displej.print(date, CENTER, 135); displej.setFont(GroteskBold32x64); displej.print(time, CENTER, 70); if (minuty != lastMin){ lastMin = minuty; budikPlayed = false; } if (budikPlayed == false && hodiny == alarmHour && minuty == alarmMinute){ Serial.println(F("BUDIIIIIK")); myDFPlayer.play(3); budikPlayed = true; song = 10; play = true; initialize_display(); } } // Kontrola dotyku if (dotyk.Pressed()) { unsigned int dotykX = dotyk.RawX(); unsigned int dotykY = dotyk.RawY(); displej.setColor(255, 255, 255); displej.setBackColor(0, 0, 0); displej.setFont(SmallFont); displej.print(" ", 270, 10); displej.print(" ", 270, 30); displej.printNumI(dotykX, 270, 10); displej.printNumI(dotykY, 270, 30); // Správa dotykov podľa aktuálnej obrazovky if (currentScreen == MAIN_SCREEN) { handleMainScreenTouch(dotykX, dotykY); } else if (currentScreen == ALARM_SCREEN) { handleAlarmScreenTouch(dotykX, dotykY); } else if (currentScreen == FAVORITE_ALARMS_SCREEN) { handleFavoriteAlarmsTouch(dotykX, dotykY); } else if (currentScreen == RGB_SCREEN) { handleRGBScreenTouch(dotykX, dotykY); } } //delay(2); } // Funkcia na spracovanie dotyku na hlavnej obrazovke void handleMainScreenTouch(unsigned int dotykX, unsigned int dotykY) { // Ak je dotyk v oblasti, kde sa zobrazuje čas if (dotykX > 1200 && dotykX < 3100 && dotykY > 1900 && dotykY < 2800) { changeScreen(ALARM_SCREEN); // Prepneme na obrazovku pre budík } // Ak je dotyk v oblasti LED štvorca else if (dotykX > 1450 && dotykX < 2850 && dotykY > 3350 && dotykY < 3800) { changeScreen(RGB_SCREEN); // Prepneme na obrazovku pre ovladanie LED } // Ak je dotyk v oblasti prehravania hudby else if (dotykX > 1900 & dotykX < 2500 & dotykY > 300 & dotykY < 1100) { if (play == true) { play = false; displej.setColor(0, 0, 0); displej.fillCircle(160, 205, 22); displej.setColor(255, 255, 255); displej.drawLine(155, 196, 170, 205); displej.drawLine(155, 214, 170, 205); displej.drawLine(155, 196, 155, 214); myDFPlayer.pause(); } else{ play = true; displej.setColor(0, 0, 0); displej.fillCircle(160, 205, 22); displej.setColor(255, 255, 255); displej.drawLine(155, 196, 155, 214); displej.drawLine(165, 196, 165, 214); myDFPlayer.start(); } } } // Funkcia na spracovanie dotyku na obrazovke nastavenia budíka void handleAlarmScreenTouch(unsigned int dotykX, unsigned int dotykY) { // Nastavenie hodín if (dotykX > 700 && dotykX < 1200 && dotykY > 2150 && dotykY < 2700) { alarmHour = (alarmHour + 1) % 24; showAlarmScreen(); // Aktualizácia obrazovky } else if (dotykX > 700 && dotykX < 1200 && dotykY > 1600 && dotykY < 2150) { if (alarmHour > 0){ alarmHour = (alarmHour - 1) % 24;} else{alarmHour = 23;} showAlarmScreen(); // Aktualizácia obrazovky } // Nastavenie minút else if (dotykX > 3150 && dotykX < 3650 && dotykY > 2150 && dotykY < 2700) { alarmMinute = (alarmMinute + 1) % 60; showAlarmScreen(); // Aktualizácia obrazovky } else if (dotykX > 3150 && dotykX < 3650 && dotykY > 160 && dotykY < 2150) { if (alarmMinute > 0){ alarmMinute = (alarmMinute - 1) % 60;} else{alarmMinute = 59;} showAlarmScreen(); // Aktualizácia obrazovky } // Potvrdenie budíka else if (dotykX > 1300 && dotykX < 3000 && dotykY > 650 && dotykY < 1200) { changeScreen(MAIN_SCREEN); // Prepneme späť na hlavnú obrazovku } else if (dotykX > 380 && dotykX < 1000 && dotykY > 2900 && dotykY < 3890) { changeScreen(FAVORITE_ALARMS_SCREEN); } } void handleFavoriteAlarmsTouch(unsigned int dotykX, unsigned int dotykY) { // Šípka späť if (dotykX > 340 && dotykX < 1050 && dotykY > 2900 && dotykY < 4000) { changeScreen(ALARM_SCREEN); } // LAVY STLPEC if (dotykX > 900 && dotykX < 2100 && dotykY > 2000 && dotykY < 2800) { alarmHour = 6; alarmMinute = 0; changeScreen(ALARM_SCREEN); } if (dotykX > 900 && dotykX < 2100 && dotykY > 1150 && dotykY < 1999) { alarmHour = 6; alarmMinute = 30; changeScreen(ALARM_SCREEN); } if (dotykX > 900 && dotykX < 2100 && dotykY > 330 && dotykY < 1149) { alarmHour = 7; alarmMinute = 0; changeScreen(ALARM_SCREEN); } // PRAVY STLPEC if (dotykX > 2150 && dotykX < 3500 && dotykY > 2000 && dotykY < 2800) { alarmHour = 7; alarmMinute = 30; changeScreen(ALARM_SCREEN); } if (dotykX > 2150 && dotykX < 3500 && dotykY > 1150 && dotykY < 1999) { alarmHour = 8; alarmMinute = 0; changeScreen(ALARM_SCREEN); } if (dotykX > 2150 && dotykX < 3500 && dotykY > 330 && dotykY < 1149) { alarmHour = 8; alarmMinute = 30; changeScreen(ALARM_SCREEN); } } void handleRGBScreenTouch(unsigned int dotykX, unsigned int dotykY) { if (dotykX > 700 && dotykX < 3820 && dotykY > 2200 && dotykY < 2600) { xR = dotykX; R = map(xR,700,3820,0,255); dR = map(xR,700,3820,31,309); } if (dotykX > 700 && dotykX < 3820 && dotykY > 1500 && dotykY < 2000) { xG = dotykX; G = map(xG,700,3820,0,255); dG = map(xG,700,3820,31,309); } if (dotykX > 700 && dotykX < 3820 && dotykY > 970 && dotykY < 1350) { xB = dotykX; B = map(xB,700,3820,0,255); dB = map(xB,700,3820,31,309); } if (dotykX > 520 && dotykX < 1000 && dotykY > 250 && dotykY < 900) { R = 255; G = 255; B = 255; } if (dotykX > 1090 && dotykX < 1555 && dotykY > 250 && dotykY < 900) { R = 255; G = 127; B = 80; } if (dotykX > 1650 && dotykX < 2100 && dotykY > 250 && dotykY < 900) { R = 153; G = 255; B = 204; } if (dotykX > 2200 && dotykX < 2700 && dotykY > 250 && dotykY < 900) { R = 255; G = 255; B = 0; } if (dotykX > 2770 && dotykX < 3250 && dotykY > 250 && dotykY < 900) { R = 0; G = 255; B = 255; } if (dotykX > 3350 && dotykX < 3800 && dotykY > 250 && dotykY < 900) { R = 255; G = 0; B = 255; } // Zapnutie / Vypnutie Led pásika if (dotykX > 1550 && dotykX < 2750 && dotykY > 2750 && dotykY < 3200) { if (LED_on == false) {LED_on = true;} else {LED_on = false;} } if (dotykX > 3000 && dotykX < 3650 && dotykY > 2750 && dotykY < 3200) { if (svetlo_auto == false) {svetlo_auto = true;} else {svetlo_auto = false;} } if (svetlo_auto == true){ displej.setColor(0, 255, 0); displej.fillRoundRect(241, 51, 289, 74); } if (svetlo_auto == false){ displej.setColor(255, 0, 0); displej.fillRoundRect(241, 51, 289, 74); } displej.setColor(R, G, B); displej.fillRoundRect(110, 50, 210, 75); if (LED_on == false){ displej.setColor(255, 255, 255); displej.setFont(SmallFont); displej.print("OFF", CENTER, 57); displej.setColor(255, 0, 0); for(int i=0; i<NUMPIXELS; i++) { LED.setPixelColor(i, 0, 0, 0); LED.show(); } } if (LED_on == true){ displej.setColor(255, 255, 255); for(int i=0; i<NUMPIXELS; i++) { LED.setPixelColor(i, R, G, B); LED.show(); } } displej.drawRoundRect(110, 50, 210, 75); // R displej.setColor(255, 0, 0); displej.fillRect(32, 94, (dR-1), 102); displej.setColor(0, 0, 0); displej.fillRect(dR, 94, 309, 102); // G displej.setColor(0, 255, 0); displej.fillRect(32, 134, (dG-1), 142); displej.setColor(0, 0, 0); displej.fillRect(dG, 134, 309, 142); // B displej.setColor(0, 0, 255); displej.fillRect(32, 174, (dB-1), 182); displej.setColor(0, 0, 0); displej.fillRect(dB, 174, 309, 182); if (dotykX > 380 && dotykX < 1000 && dotykY > 2900 && dotykY < 3890) { changeScreen(MAIN_SCREEN); } } // Funkcia na prepínanie medzi obrazovkami void changeScreen(Screen newScreen) { currentScreen = newScreen; if (currentScreen == MAIN_SCREEN) { initialize_display(); // Vrátime sa na hlavnú obrazovku } else if (currentScreen == ALARM_SCREEN) { showAlarmScreen(); // Zobrazíme obrazovku na nastavenie budíka } else if (currentScreen == RGB_SCREEN) { showRGBScreen(); // Zobrazíme obrazovku na nastavenie budíka } else if (currentScreen == FAVORITE_ALARMS_SCREEN) { showFavoriteAlarmsScreen(); } } void showRGBScreen(){ displej.clrScr(); // MENU displej.setColor(255, 255, 255); displej.drawRoundRect(10, 10, 60, 60); displej.drawLine(35-8, 35, 35+8, 25); displej.drawLine(35-8, 35, 35+8, 45); // AUTO displej.setColor(255, 255, 255); displej.drawRoundRect(240, 50, 290, 75); displej.setFont(SmallFont); displej.print("AUTO", 251, 35); displej.setFont(BigFont); displej.print("RGB LED", CENTER, 25); displej.print("R", 10, 90); displej.print("G", 10, 130); displej.print("B", 10, 170); displej.setColor(255, 255, 255); displej.drawRect(30, 93, 310, 103); // R - Slider, posunuté o 15 pixelov nahor displej.drawRect(30, 133, 310, 143); displej.drawRect(30, 173, 310, 183); displej.setColor(255, 255, 255); displej.fillRoundRect(15, 195, 55, 235); displej.setColor(255, 127, 80); displej.fillRoundRect(65, 195, 105, 235); displej.setColor(153, 255, 204); displej.fillRoundRect(115, 195, 155, 235); displej.setColor(255, 255, 0); displej.fillRoundRect(165, 195, 205, 235); displej.setColor(0, 255, 255); displej.fillRoundRect(215, 195, 255, 235); displej.setColor(255, 0, 255); displej.fillRoundRect(265, 195, 305, 235); displej.setColor(255, 255, 255); displej.drawRoundRect(15, 195, 55, 235); displej.drawRoundRect(65, 195, 105, 235); displej.drawRoundRect(115, 195, 155, 235); displej.drawRoundRect(165, 195, 205, 235); displej.drawRoundRect(215, 195, 255, 235); displej.drawRoundRect(265, 195, 305, 235); handleRGBScreenTouch(0, 0); } // Zobrazenie obrazovky pre nastavenie budíka void showAlarmScreen() { displej.clrScr(); displej.setColor(255, 255, 255); displej.setFont(BigFont); displej.print("BUDIK", CENTER, 25); // MENU displej.setColor(255, 255, 255); displej.drawRoundRect(10, 10, 60, 60); displej.drawLine(20, 25, 50, 25); displej.drawLine(20, 35, 50, 35); displej.drawLine(20, 45, 50, 45); displej.setColor(0, 255, 0); displej.fillRect(30, 80, 70, 110); displej.fillRect(250, 80, 290, 110); displej.setColor(255, 0, 0); displej.fillRect(30, 111, 70, 140); displej.fillRect(250, 111, 290, 140); // TIME char budik[12]; sprintf(budik, "%02d:%02d", alarmHour, alarmMinute); displej.setColor(255, 255, 255); displej.setFont(GroteskBold32x64); displej.print(budik, CENTER, 80); displej.setFont(BigFont); displej.setColor(255, 255, 255); displej.print("NASTAVIT", CENTER, 180); // Tlačidlo na potvrdenie } void showFavoriteAlarmsScreen() { displej.clrScr(); displej.setFont(BigFont); displej.setColor(255, 255, 255); displej.print("BUDIKY", CENTER, 25); // MENU - šípka späť displej.drawRoundRect(10, 10, 60, 60); displej.drawLine(45, 20, 25, 35); displej.drawLine(45, 50, 25, 35); const int favoriteAlarms1[3][2] = { {6, 0}, {6, 30}, {7, 0} }; const int favoriteAlarms2[3][2] = { {7, 30}, {8, 0}, {8, 30} }; // Vypíše časy for (int i = 0; i < 3; i++) { int x = 60; int y = 90 + (i*50); char timeBuffer[10]; sprintf(timeBuffer, "%02d:%02d", favoriteAlarms1[i][0], favoriteAlarms1[i][1]); // Tlač na konzolu (debug) Serial.print("Time: "); Serial.print(timeBuffer); Serial.print(" X: "); Serial.print(x); Serial.print(" Y: "); Serial.println(y); displej.print(timeBuffer, x, y); } // Vypíše časy for (int i = 0; i < 3; i++) { int x = 180; int y = 90 + (i*50); char timeBuffer[10]; sprintf(timeBuffer, "%02d:%02d", favoriteAlarms2[i][0], favoriteAlarms2[i][1]); // Tlač na konzolu (debug) Serial.print("Time: "); Serial.print(timeBuffer); Serial.print(" X: "); Serial.print(x); Serial.print(" Y: "); Serial.println(y); displej.print(timeBuffer, x, y); } } // Inicializácia hlavnej obrazovky void initialize_display() { dotyk.setCal(HMIN, HMAX, VMIN, VMAX, HRES, VRES, XYSWAP); displej.InitLCD(); displej.clrScr(); // MENU displej.setColor(255, 255, 255); displej.drawRoundRect(10, 10, 60, 60); displej.drawLine(20, 25, 50, 25); displej.drawLine(20, 35, 50, 35); displej.drawLine(20, 45, 50, 45); // RGB LED displej.setColor(R, G, B); displej.fillRoundRect(100, 10, 220, 35); displej.setColor(255, 255, 255); displej.drawRoundRect(100, 10, 220, 35); // TIME displej.setColor(255, 255, 255); displej.setFont(GroteskBold32x64); displej.print(":", CENTER, 70); myRTC.updateTime(); // Zobrazenie aktuálneho času int hodiny = myRTC.hours; int minuty = myRTC.minutes; sprintf(date, "%02d. %02d. %04d", myRTC.dayofmonth, myRTC.month, myRTC.year); sprintf(time, " %02d:%02d ", hodiny, minuty); displej.setColor(255, 255, 255); displej.setFont(SmallFont); displej.print(date, CENTER, 135); displej.setFont(GroteskBold32x64); displej.print(time, CENTER, 70); // SONG displej.setFont(SmallFont); if (song == 0){ displej.print("Pesnicka", CENTER, 155); } if (song == 1){ displej.print(" ", CENTER, 155); displej.print("Sol nad zlato", CENTER, 155); } if (song == 2){ displej.print(" ", CENTER, 155); displej.print("Dlhy, Siroky, Bystrozraky", CENTER, 155); } if (song == 3){ displej.print(" ", CENTER, 155); displej.print("Zlatovlaska", CENTER, 155); } if (song == 10){ displej.print(" ", CENTER, 155); displej.print("BUDIK", CENTER, 155); } displej.drawCircle(160, 205, 23); if (play == false){ displej.drawLine(155, 196, 170, 205); displej.drawLine(155, 214, 170, 205); displej.drawLine(155, 196, 155, 214); } if (play == true){ displej.drawLine(155, 196, 155, 214); displej.drawLine(165, 196, 165, 214); } displej.drawRoundRect(90, 190, 120, 220); displej.drawLine(100, 205, 110, 210); displej.drawLine(100, 205, 110, 200); displej.drawRoundRect(200, 190, 230, 220); displej.drawLine(210, 200, 220, 205); displej.drawLine(210, 210, 220, 205); }
Editor is loading...
Leave a Comment