Untitled
unknown
plain_text
a year ago
20 kB
5
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