potřeboval bych pár návrhů, jak by se dalo řešit výběr barvy pro RGB LED pomocí tlačítek a displeje. Má představa je taková, že si v menu nastavení budu listovat mezi předdefinovanými barvami (modrá, bílá atd.) a jejím potvrzením se barva nastaví. Tzn. že na displeji bude zobrazovaná např. červená a v kódu pro diodu bude zapsáno R = 255, G = 0,B = 0. Tady pro náhled celý kód:
Kód: Vybrat vše
#include <LiquidCrystal.h>
#include <IRremote.h>
#include <EEPROM.h>
#define ANALOG_SENSOR_PIN A0
#define Prodleva_Zap 50
#define Prodleva_A0 1500
#define Prodleva_Vyp 5000
#define Prodleva_Dis 3000
#define Prodleva_Res 30000
#define HTPiStav 0
#define HTPiPozadavek 1
#define NasPozadavek 2
#define LightBerryStav 3
#define LightBerryPozadavek 4
#define Navigace 5
unsigned long aktualMillis; //aktualni cas
unsigned long predchoziMillis = 0;
unsigned long PosledniCteniA0 = 0;
unsigned long CasZmenyZap = 0; // promenna pro ulozeni casu zmeny stavu tlacitka
unsigned long CasZmenyVyp = 0; // promenna pro ulozeni casu zmeny stavu tlacitka
unsigned long CasZmenyRes = 0; // promenna pro ulozeni casu pro restart HTPi
unsigned long CasZmenyDis = 0; // promenna pro ulozeni casu pro zmeni obrazovky
unsigned long interval;
unsigned long readingTime; // cas posledniho cteni
unsigned long readingUpdate; // cas posledniho stisku tlacitka
unsigned long mimoradnaUdalost;
unsigned long ENTER;
unsigned long VLEVO;
unsigned long VPRAVO;
unsigned long NAHORU;
unsigned long DOLU;
const long timeoutUpdate = 60000;
char barva[10] = "";
char barva1[10] = "cervena";
char barva2[10] = "zelena";
char barva3[10] = "modra";
char barva4[10] = "bila";
char barva5[10] = "fialova";
char barva6[10] = "zluta";
bool MinulyStavZap = 1; // priznak predchoziho stavu tlacitka (1 .. stisknuto)
bool MinulyStavVyp = 1; // priznak predchoziho stavu tlacitka (1 .. stisknuto)
bool MinulyStavRes = 1; // priznak predchoziho stavu komunikace
bool zmenaObrazovka = true; // zmena obrazovky
boolean udalost = true;
boolean displayUpdate = true; // nastaveni zda se ma aktualizovat displej
byte mode = 0; // nastaveni modu rozbrazeni a ceteni
const int LED_HTPi = 2;
const int LED_Arduino = 3;
const int LED_G = 4;
const int LED_O = 5;
const int LED_R = 6;
const int RGB_B = 11;
const int RGB_G = 12;
const int RGB_R = 13;
const int RasPi_PW = 22;
const int RasPi_G = 23;
const int RasPi_O = 24;
const int RasPi_R = 25;
const int RasPi_NAS = 26;
const int RasPi_Vyp = 27;
const int RasPi_Res = 28;
const int RasPi_Rez = 29;
const int HTPi = 30;
const int LED_grabber = 31;
const int Rez1 = 32;
const int Rez2 = 33;
const int rs = 34;
const int en = 35;
const int d4 = 36;
const int d5 = 37;
const int d6 = 38;
const int d7 = 39;
const int IrLED = 40;
const int SW = 41;
const int LB_Rez1 = 50;
const int LB_Rez2 = 51;
const int LB_Rez3 = 52;
const int LB_Rez4 = 53;
const int timeout = 500;
const int timeoutButton = 400;
int LightAnalogValue;
int jas = 255, jasB = 255, jasG = 255, jasR = 255, jasW = 240, jasMax, jasMin;
int LED_AH;
int LED_A;
int LED_H;
int krok = 1;
int obrazovka = 0;
int obrazovkaMax = 5;
int vyberBarvy = 0;
LiquidCrystal LCD(rs, en, d4, d5, d6, d7);
IRrecv irrecv(IrLED);
decode_results results;
// sipka nahoru
byte newChar1[8] = {
0b00100,
0b01110,
0b10101,
0b00100,
0b00000,
0b00000,
0b00000,
0b00000
};
// sipka dolu
byte newChar2[8] = {
0b00000,
0b00000,
0b00000,
0b00000,
0b00100,
0b10101,
0b01110,
0b00100
};
// sipka vpravo
byte newChar3[8] = {
B00000,
B00100,
B00010,
B11111,
B00010,
B00100,
B00000,
B00000
};
// sipka vlevo
byte newChar4[8] = {
B00000,
B00100,
B01000,
B11111,
B01000,
B00100,
B00000,
B00000
};
void stav1()
{
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(" Stav HTPi ");
LCD.setCursor(0, 1);
if (digitalRead(RasPi_PW) == HIGH) LCD.print("HTPi je vypnuto");
else if (digitalRead(RasPi_PW) == LOW) LCD.print("HTPi je zapnuto");
else LCD.print(" neznamy stav ");
}
void stav2()
{
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Stav LightBerry");
LCD.setCursor(0, 1);
if (LB_Rez1 == LOW) LCD.print("rezerva");
else if (LB_Rez2 == LOW) LCD.print("rezerva");
else LCD.print(" neznamy stav ");
}
void pozadavek1()
{
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(" Pozadavek HTPi ");
LCD.setCursor(0, 1);
if (RasPi_Vyp == LOW) LCD.print("vypni HTPi");
else if (RasPi_Res == LOW) LCD.print("restartuj HTPi");
else if (RasPi_Rez == LOW) LCD.print("rezerva");
else LCD.print("zadny pozadavek");
}
void pozadavek2()
{
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(" Pozadavek NAS ");
LCD.setCursor(0, 1);
if (digitalRead(RasPi_NAS) == LOW && digitalRead(RasPi_PW) == LOW) LCD.print("pripojit disky");
else if (digitalRead(RasPi_NAS) == 1 && digitalRead(RasPi_PW) == LOW) LCD.print("odpojit disky");
else LCD.print("zadny pozadavek");
}
void pozadavek3()
{
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Poz. LightBerry");
LCD.setCursor(0, 1);
if (LB_Rez3 == LOW) LCD.print("rezerva");
else if (LB_Rez4 == LOW) LCD.print("rezerva");
else LCD.print("zadny pozadavek");
}
void navigace()
{
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Pohyb v menu");
LCD.setCursor(0, 1);
LCD.write((uint8_t)1);
LCD.setCursor(2, 1);
LCD.print("OK");
LCD.setCursor (5, 1);
LCD.write((uint8_t)0);
LCD.setCursor (7, 1);
LCD.write((uint8_t)2);
LCD.setCursor (9, 1);
LCD.write((uint8_t)3);
}
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // zacatek cteni pinu v seriovem monitoru
LCD.createChar(0, newChar3); // sipka vpravo
LCD.createChar(1, newChar4); // sipka vlevo
LCD.createChar(2, newChar1); // sipka nahoru
LCD.createChar(3, newChar2); // sipka dolu
// **KONFIGURACE PRO DISPLAY 16x2**
LCD.begin(16, 2); // pocet radu a znaku u LCD
analogWrite(LED_Arduino, 255);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(" HTPi v2 ");
LCD.setCursor(0, 1);
LCD.print("inicializace....");
delay(2000);
if (EEPROM.read(0) > 254 || EEPROM.read(1) < 0) // kdyz nejsou hodnoty v povolenem rozsahu
{
EEPROM.update(0, 254); // nastav minimalni hodnotu rozsahu
EEPROM.update(1, 180); // nastav maximalni hodnotu rozsahu
}
if (EEPROM.read(2) < 0 && EEPROM.read(2) > 200) // kdyz nejsou hodnoty v povolenem rozsahu
{
EEPROM.update(2, 80); // nastav minimalni hodnotu rozsahu
}
pinMode(IrLED, INPUT_PULLUP); // vstup od IRLED
pinMode(RasPi_PW, INPUT_PULLUP); // zpetna vazba od RasPi seplo samodrz
pinMode(RasPi_G, INPUT_PULLUP); // zpetna vazba od RasPi rozsvit zelenou
pinMode(RasPi_O, INPUT_PULLUP); // zpetna vazba od RasPi rozsvit oranzovou
pinMode(RasPi_R, INPUT_PULLUP); // zpetna vazba od RasPi rozsvit cervenou
pinMode(SW, INPUT_PULLUP); // SW tlacitko
pinMode(LB_Rez1, INPUT_PULLUP); // lightberry rezerva
pinMode(LB_Rez2, INPUT_PULLUP); // lightberry rezerva
pinMode(LB_Rez3, OUTPUT); // lightberry rezerva
pinMode(LB_Rez4, OUTPUT); // lightberry rezerva
pinMode(LED_HTPi, OUTPUT); // podsvetleni pro display HTPi
pinMode(LED_Arduino, OUTPUT); // podsvetleni pro display Arduino
pinMode(LED_G, OUTPUT); // zelena diody
pinMode(LED_O, OUTPUT); // oranzova dioda
pinMode(LED_R, OUTPUT); // cervena dioda
pinMode(RGB_B, OUTPUT); // modra dioda
pinMode(RGB_G, OUTPUT); // zelena dioda
pinMode(RGB_R, OUTPUT); // cervena dioda
pinMode(RasPi_NAS, OUTPUT); // pozadavek na pripojeni NAS
pinMode(RasPi_Vyp, OUTPUT); // pozadavek na vypnuti
pinMode(RasPi_Res, OUTPUT); // pozadavek na restart
pinMode(RasPi_Rez, OUTPUT); // pozadavek rezerva
pinMode(HTPi, OUTPUT); // napajeni pro HTPi
pinMode(LED_grabber, OUTPUT); // napajeni LED pasku
pinMode(Rez1, OUTPUT); // napajeni SSR
pinMode(Rez2, OUTPUT); // napajeni SSR
digitalWrite(RGB_B, HIGH); // Zhasni B
digitalWrite(RGB_G, HIGH); // Zhasni G
digitalWrite(RGB_R, HIGH); // Zhasni R
digitalWrite(RasPi_NAS, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Vyp, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Res, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Rez, HIGH); // nuluj komunikaci s RasPi
digitalWrite(LB_Rez3, HIGH); // nuluj komunikaci s Lightberry
digitalWrite(LB_Rez4, HIGH); // nuluj komunikaci s Lightberry
jasMin = EEPROM.read(0);
jasMax = EEPROM.read(1);
interval = EEPROM.read(2);
}
void loop() {
aktualMillis = millis();
if (mode == 0) // kdyz je mod 0 zobrazeni cteni napeti
{ // kazdych 200 milisekund (timeout) precteme data
if(aktualMillis - CasZmenyDis > Prodleva_Dis)
{
CasZmenyDis = aktualMillis;
obrazovka++;
if (obrazovka > obrazovkaMax) obrazovka = 0;
zmenaObrazovka = true;
}
if (zmenaObrazovka)
{
zmenaObrazovka = false;
switch(obrazovka)
{
case HTPiStav:
stav1();
break;
case HTPiPozadavek:
pozadavek1();
break;
case NasPozadavek:
pozadavek2();
break;
case LightBerryStav:
stav2();
break;
case LightBerryPozadavek:
pozadavek3();
break;
case Navigace:
navigace();
break;
}
}
if (displayUpdate == true) // zkontrolujeme zda je na disleji pozadovany text (true = neni)
{
displayUpdate = false;
if ((unsigned long)(millis() - readingTime) >= timeout ) // cekame na uplynuti timeout
{
readingTime = millis(); // nastavime novy cas pro pristi zpracovani
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("****HTPi v2****");
LCD.setCursor(0, 1);
LCD.print("navrat do smycky");
}
}
else if (mode == 1 && displayUpdate == true) // zobrazeni minimalni nastavene hodnoty
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("LED tlacitko:"); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print("pulzace"); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (10, 1); // nastavime pozici kurzoru na 11 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(12, 1);
LCD.print("OK");
LCD.setCursor (15, 1); // nastavime pozici kurzoru na 16 misto 2 radku
LCD.write((uint8_t)0);
}
else if (mode == 11 && displayUpdate == true) // zobrazeni minimalni nastavene hodnoty
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Min. hodnota:"); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(EEPROM.read(0)); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (10, 1); // nastavime pozici kurzoru na 11 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(12, 1);
LCD.print("OK");
LCD.setCursor (15, 1); // nastavime pozici kurzoru na 16 misto 2 radku
LCD.write((uint8_t)0);
}
else if (mode == 12 && displayUpdate == true) // zobrazeni maximalni nastavene hodnoty
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Max. hodnota:"); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(EEPROM.read(1)); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (10, 1); // nastavime pozici kurzoru na 11 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(12, 1);
LCD.print("OK");
LCD.setCursor (15, 1); // nastavime pozici kurzoru na 16 misto 2 radku
LCD.write((uint8_t)0);
}
else if (mode == 13 && displayUpdate == true) // zobrazeni maximalni nastavene hodnoty
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Rychlost:"); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(EEPROM.read(2)); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (10, 1); // nastavime pozici kurzoru na 11 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(12, 1);
LCD.print("OK");
LCD.setCursor (15, 1); // nastavime pozici kurzoru na 16 misto 2 radku
LCD.write((uint8_t)0);
}
else if (mode == 14 && displayUpdate == true) // zobrazeni maximalni nastavene hodnoty
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Barva:"); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(EEPROM.read(3)); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (10, 1); // nastavime pozici kurzoru na 11 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(12, 1);
LCD.print("OK");
}
else if (mode == 111) // zobrazeni nastaveni min hodnoty
{
if (displayUpdate)
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Nastav Min."); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (8, 1); // nastavime pozici kurzoru na 9 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(10, 1);
LCD.print("OK");
LCD.setCursor(13, 1);
LCD.write((uint8_t)2); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(15, 1);
LCD.write((uint8_t)3); // zobrazime text pro zobrazeni hodnoty
// tyto dva radky zajisti zobrazeni hodnot pri opakovanem stisknuti vyber
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(EEPROM.read(0)); // zobrazime text pro zobrazeni hodnoty
}
LCD.setCursor (4, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(jasMin); // zobrazime text pro zobrazeni hodnoty
}
else if (mode == 121) // zobrazeni nastaveni max hodnoty
{
if (displayUpdate)
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Nastav Max."); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (8, 1); // nastavime pozici kurzoru na 9 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(10, 1);
LCD.print("OK");
LCD.setCursor(13, 1);
LCD.write((uint8_t)2); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(15, 1);
LCD.write((uint8_t)3);
// tyto dva radky zajisti zobrazeni hodnot pri opakovanem stisknuti vyber
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(EEPROM.read(1)); // zobrazime text pro zobrazeni hodnoty
}
LCD.setCursor (4, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(jasMax); // zobrazime text pro zobrazeni hodnoty
}
else if (mode == 131) // zobrazeni nastaveni max hodnoty
{
if (displayUpdate)
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Nastav Rychlost"); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (8, 1); // nastavime pozici kurzoru na 9 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(10, 1);
LCD.print("OK");
LCD.setCursor(13, 1);
LCD.write((uint8_t)2); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(15, 1);
LCD.write((uint8_t)3);
// tyto dva radky zajisti zobrazeni hodnot pri opakovanem stisknuti vyber
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(EEPROM.read(2)); // zobrazime text pro zobrazeni hodnoty
}
LCD.setCursor (4, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(interval); // zobrazime text pro zobrazeni hodnoty
}
else if (mode == 141) // zobrazeni nastaveni max hodnoty
{
if (displayUpdate)
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Nastav Barvu"); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (8, 1); // nastavime pozici kurzoru na 9 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(10, 1);
LCD.print("OK");
LCD.setCursor(13, 1);
LCD.write((uint8_t)2); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(15, 1);
LCD.write((uint8_t)3);
}
LCD.setCursor (0, 1); // nastavime pozici kurzoru na 1 misto 2 radku
LCD.print(TextFromEEPROM(50,10)); // zobrazime text pro zobrazeni hodnoty
}
else if (mode == 2 && displayUpdate == true) // zobrazeni pro ulozeni tovatniho nastaveni
{
displayUpdate = false;
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Tovarni nastav."); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor (10, 1); // nastavime pozici kurzoru na 11 misto 2 radku
LCD.write((uint8_t)1); // zobrazime text pro zobrazeni hodnoty
LCD.setCursor(12, 1);
LCD.print("OK");
LCD.setCursor (15, 1); // nastavime pozici kurzoru na 16 misto 2 radku
LCD.write((uint8_t)0);
}
else if (mode == 3 && displayUpdate == true) // zobrazeni pro ulozeni tovatniho nastaveni
{
displayUpdate = false;
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("****HTPi v2****");
LCD.setCursor(0, 1);
LCD.print("stiknuto SW");
}
// ** PRACUJEME S TLACITKEM VPRAVO **
if (!digitalRead(VPRAVO)) // kdyz je stisknuto tlacitko vpravo
{
if ((unsigned long)(millis() - readingTime) >= timeoutButton) // kdyz uplynula doba blokovani tlacitka
{
VPRAVO = 0;
readingTime = millis(); // nastavime novy cas pro povoleni dalsiho cteni
readingUpdate = millis(); // nastav novou prodlevu pro kontrolu necinnosti
displayUpdate = true; // povol aktualizaci displeje
if (mode == 0) mode = 1;
else if (mode == 1) mode = 2;
else if (mode == 2) mode = 0;
else if (mode == 11) mode = 12;
else if (mode == 12) mode = 13;
else if (mode == 13) mode = 14;
}
}
// ** PRACUJEME S TLACITKEM VLEVO **
if (!digitalRead(VLEVO)) // kdyz je stisknuto tlacitko vlevo
{
if ((unsigned long)(millis() - readingTime) >= timeoutButton) // kdyz uplynula doba blokovani tlacitka
{
VLEVO = 0;
readingTime = millis(); // nastavime novy cas pro povoleni dalsiho cteni
readingUpdate = millis(); // nastav novou prodlevu pro kontrolu necinnosti
displayUpdate = true; // povol aktualizaci displeje
if (mode == 0) mode = 2;
else if (mode == 2) mode = 1;
else if (mode == 1) mode = 0;
else if (mode == 11) mode = 1;
else if (mode == 12) mode = 11;
else if (mode == 13) mode = 12;
else if (mode == 14) mode = 13;
else if (mode == 111) mode = 11;
else if (mode == 121) mode = 12;
else if (mode == 131) mode = 13;
else if (mode == 141) mode = 14;
}
}
// ** PRACUJEME S TLACITKEM NAHORU **
if (mode != 0) // kdyz neni mod 0 kontroluj tlacitko nahoru a cas nastaveni
{
if (!digitalRead(NAHORU)) // kdyz je stisknuto tlacitko nahoru
{
if ((unsigned long)(millis() - readingTime) >= timeoutButton) // kdyz uplynula doba blokovani tlacitka
{
NAHORU = 0;
readingTime = millis(); // nastavime novy cas pro povoleni dalsiho cteni
readingUpdate = millis(); // nastav novou prodlevu pro kontrolu necinnosti
displayUpdate = true; // povol aktualizaci displeje
if (mode == 111 && jasMin < 255) jasMin++;
else if (mode == 121 && jasMax < 238) jasMax++;
else if (mode == 131 && interval < 200) interval = interval + 10;
else if (mode == 141) TextToEEPROM(50,10,barva);
}
}
}
// ** PRACUJEME S TLACITKEM DOLU **
if (mode != 0) // kdyz neni mod 0 kontroluj tlacitko dolu a cas nastaveni
{
if (!digitalRead(DOLU)) // kdyz je stisknuto tlacitko dolu
{
if ((unsigned long)(millis() - readingTime) >= timeoutButton) // kdyz uplynula doba blokovani tlacitka
{
DOLU = 0;
readingTime = millis(); // nastavime novy cas pro povoleni dalsiho cteni
readingUpdate = millis(); // nastav novou prodlevu pro kontrolu necinnosti
displayUpdate = true; // povol aktualizaci displeje
if (mode == 111 && jasMin > 242) jasMin--;
else if (mode == 121 && jasMax > 0) jasMax--;
else if (mode == 131 && interval > 0) interval = interval - 10;
}
}
}
// ** PRACUJEME S TLACITKEM SW **
if (!digitalRead(SW) && udalost == 1) // kdyz je stisknuto tlacitko SW
{
displayUpdate = true;
mode = 3;
}
// ** PRACUJEME S VYPNUTIM **
if (!digitalRead(SW) && udalost == 1) // kdyz je pozadavek na vypnuti
{
displayUpdate = true;
mode = 3;
}
if (udalost == 0)
{
if ((unsigned long)(millis() - mimoradnaUdalost) >= 2000) // kdyz uplynul cas necinnosti vrat se na mode 0
{
mimoradnaUdalost = millis();
displayUpdate = true; // povol aktualizaci displeje
mode = 0;
udalost = 1;
}
}
// ** PRACUJEME S TLACITKEM OK **
if (mode != 0) // kdyz neni mod 0 kontroluj tlacitko enter a cas nastaveni
{
if ((unsigned long)(millis() - readingUpdate) >= timeoutUpdate) // kdyz uplynul cas necinnosti vrat se na mode 0
{
displayUpdate = true; // povol aktualizaci displeje
mode = 0;
}
if (!digitalRead(ENTER)) // kdyz je stisknuto tlacitko vyber
{
if ((unsigned long)(millis() - readingTime) >= timeoutButton) // kdyz uplynula doba blokovani tlacitka
{
ENTER = 0;
readingTime = millis(); // nastavime novy cas pro povoleni dalsiho cteni
readingUpdate = millis(); // nastav novou prodlevu pro kontrolu necinnosti
displayUpdate = true; // povol aktualizaci displeje
if (mode == 1) mode = 11;
else if (mode == 11) mode = 111;
else if (mode == 12) mode = 121;
else if (mode == 13) mode = 131;
else if (mode == 2)
{
// ** PRACUJEME S MODY **
mode = 0;
EEPROM.update(0, 254); // tovarni hodnota rozsahu
EEPROM.update(1, 180); // tovarni hodnota rozsahu
EEPROM.update(2, 80); // tovarni hodnota rozsahu
}
else if (mode == 111)
{
mode = 11;
if (jasMin < 255 && jasMin >= 242 && jasMin != EEPROM.read(0)) EEPROM.update(0, jasMin); // uloz minimalni hodnotu rozsahu
else { // jinak zobraz chybu
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Chyba min."); // zobrazime text pro zobrazeni hodnoty
delay(2000);
}
}
else if (mode == 121)
{
mode = 12;
if (jasMax > 0 && jasMax <= 238 && jasMax != EEPROM.read(1)) EEPROM.update(1, jasMax); // uloz maximalni hodnotu rozsahu
else {
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Chyba max."); // zobrazime text pro zobrazeni hodnoty
delay(2000);
}
}
else if (mode == 131)
{
mode = 13;
if (interval > 0 && interval < 200 && interval != EEPROM.read(2)) EEPROM.update(2, interval); // uloz maximalni hodnotu rozsahu
else {
LCD.clear(); // vycistime displej
LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
LCD.print("Chyba rychlost."); // zobrazime text pro zobrazeni hodnoty
delay(2000);
}
}
else if (mode == 141)
{
mode = 14;
switch(vyberBarvy){
case 0:
barva[10] = barva1;
break;
case 1:
barva[10] = barva2;
break;
case 2:
barva[10] = barva3;
break;
case 3:
barva[10] = barva4;
break;
case 4:
barva[10] = barva5;
break;
case 5:
barva[10] = barva6;
break;
}
}
}
}
if (mode == 3) udalost = 0;
}
// **RIZENI PODSVICENI DISPLAYU**
LightAnalogValue = analogRead(ANALOG_SENSOR_PIN); // cteni voltu z analogoveho vstupu
if(aktualMillis - PosledniCteniA0 > Prodleva_A0)
{
PosledniCteniA0 = aktualMillis; // v tento cas jsem provedl posledni akci
LED_AH = map(LightAnalogValue, 0, 1023.0, 255, 0); // zapis hodnoty podsvitu
LED_A = constrain(255,5, max(5, abs(LED_AH)));
LED_H = LED_A / 2.35;
}
// **ZAPNUTI HTPi POMOCÍ TLACITKA**
if ((digitalRead(SW) == LOW) && (digitalRead(RasPi_PW) == HIGH)) // jeli stisknuto tlacitko a nemam info o sepnute samodrzi HTPi
{
if (MinulyStavZap == 1 && millis() - CasZmenyZap > Prodleva_Zap) // neni-li nastaven priznak tlacitko je stisknuto a uplynul-li vetsi cas od zmeny stavu tlacitka nez je PRODLEVA
{
MinulyStavZap = 0; // nastav priznak tlacitko stisknuto
digitalWrite(HTPi, HIGH);
digitalWrite(LED_grabber, HIGH);
digitalWrite(RasPi_Vyp, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Res, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_NAS, LOW); // dej požadavek na připojení NAS
analogWrite(LED_HTPi, LED_H);
analogWrite(LED_Arduino, LED_A);
}
}
else // neni-li stisknuto tlacitko
{
CasZmenyZap = millis(); // zapamatuj si posledni cas, kdy bylo nestisknuto
MinulyStavZap = 1; // nuluj priznak, tlacitko stisknuto
}
// **TVRDE VYPNUTI HTPi POMOCI TLACITKA (PODRZENI TLACITKA > 5s)**
if (digitalRead(SW) == LOW) // jeli stisknuto tlacitko dele nez 5s
{
if (MinulyStavVyp == 1 && millis() - CasZmenyVyp > Prodleva_Vyp) // neni-li nastaven priznak tlacitko je stisknuto a uplynul-li vetsi cas od zmeny stavu tlacitka nez je PRODLEVA
{
MinulyStavVyp = 0; // nastav priznak tlacitko stisknuto
digitalWrite(HTPi, LOW);
digitalWrite(LED_grabber, LOW);
digitalWrite(RasPi_NAS, HIGH); // dej pozadavek na odpojeni NAS
analogWrite(LED_HTPi, 0);
analogWrite(LED_Arduino, 0);
digitalWrite(RasPi_Vyp, LOW);
}
}
else // neni-li stisknuto tlacitko
{
CasZmenyVyp = millis(); // zapamatuj si posledni cas, kdy bylo nestisknuto
MinulyStavVyp = 1; // nuluj priznak, tlacitko stisknuto
}
// **VYPNUTI HTPi POMOCI TLACITKA**
if ((digitalRead(SW) == LOW) && (digitalRead(RasPi_PW) == LOW)) // jeli stisknuto tlacitko a HTPi ma seplou samodrz
{
digitalWrite(HTPi, LOW); // vypni napajeni HTPi
digitalWrite(LED_grabber, LOW); // vypni napajeni LED diod
digitalWrite(RasPi_NAS, HIGH); // dej pozadavek na odpojeni NAS
analogWrite(LED_HTPi, 0); // vypni dislay HTPi
analogWrite(LED_Arduino, 0); // vypni diplay Arduino
digitalWrite(RasPi_Vyp, LOW); // posli pozadavek na vypnuti HTPi
}
// **BLIKANI LED POKUD JE HTPi V POHOTOVOSTI**
if (digitalRead(RasPi_PW) == HIGH && digitalRead(HTPi) == LOW)
{
if (aktualMillis - predchoziMillis > interval)
{
predchoziMillis = aktualMillis;
// puvodni blikani cervnou led
// if (jasR == 255) jasR = 254;
// else jasR = 255;
// analogWrite(RGB_R, jasR);
analogWrite(RGB_R, jasW);
analogWrite(RGB_G, jasW);
analogWrite(RGB_B, jasW);
jasW = jasW - krok;
if (jasW == jasMax || jasW == jasMin)
{
krok = -krok;
}
}
analogWrite(LED_G, 0);
analogWrite(LED_O, 0);
analogWrite(LED_R, 0);
analogWrite(LED_HTPi, 0); // vypni dislay HTPi
alogWrite(LED_Arduino, 0); // vypni diplay Arduino
digitalWrite(RasPi_NAS, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Vyp, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Res, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Rez, HIGH); // nuluj komunikaci s RasPi
}
// **PREPIS DIOD PRO TEPLOTU DLE PAZADAVKU HTPi**
if (digitalRead(RasPi_G) == LOW) analogWrite(LED_G, 10);
else digitalWrite(LED_G, LOW);
if (digitalRead(RasPi_O) == LOW) analogWrite(LED_O, 10);
else digitalWrite(LED_O, LOW);
if (digitalRead(RasPi_R) == LOW) analogWrite(LED_R, 2);
else digitalWrite(LED_R, LOW);
// **RIZENI DIOD**
if (digitalRead(RasPi_PW) == LOW && digitalRead(HTPi) == HIGH)
{
digitalWrite(RGB_G, HIGH);
analogWrite(RGB_B, jas);
analogWrite(LED_HTPi, LED_H);
analogWrite(LED_Arduino, LED_A);
}
// **RESTART HTPi**
if (digitalRead(RasPi_PW) == HIGH && digitalRead(HTPi) == HIGH) // restart HTPi
{
if (MinulyStavRes == 1 && millis() - CasZmenyRes > Prodleva_Res)
{
MinulyStavRes = 0;
digitalWrite(HTPi, LOW); // vypni napajeni HTPi
digitalWrite(LED_grabber, LOW); // vypni napajeni LED diod
digitalWrite(RasPi_NAS, HIGH); // dej pozadavek na odpojeni NAS
digitalWrite(RasPi_Res, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Vyp, HIGH); // nuluj komunikaci s Raspi
analogWrite(LED_HTPi, 0); // vypni dislay HTPi
analogWrite(LED_Arduino, 0); // vypni diplay Arduino
analogWrite(LED_G, 0);
analogWrite(LED_O, 0);
analogWrite(LED_R, 0);
digitalWrite(RGB_G, HIGH);
digitalWrite(RGB_B, HIGH);
}
analogWrite(RGB_R, 255);
analogWrite(RGB_G, 0);
analogWrite(RGB_B, 255);
analogWrite(LED_HTPi, LED_H);
analogWrite(LED_Arduino, LED_A);
digitalWrite(RasPi_Res, HIGH);
}
else // neni-li stisknuto tlacitko
{
CasZmenyRes = millis(); // zapamatuj si posledni cas, kdy bylo nestisknuto
MinulyStavRes = 1; // nuluj priznak, tlacitko stisknuto
}
// **VYPNITI HTPi**
if (digitalRead(RasPi_PW) == LOW && digitalRead(HTPi) == LOW) analogWrite(RGB_R, 0), analogWrite(RGB_B, 255); // vypnuti HTPi
// **ODCHYT TLACITKA Z DALKOVEHO OVLADACE**
if (irrecv.decode(&results)) {
int DO = results.value;
if (DO == 13033) // pokud je stisknuto zelene tlacitko na TV a zatim neprobehla akce spusteni RasPi
{
digitalWrite(HTPi, HIGH); // sepni napajeni pro RasPi
digitalWrite(LED_grabber, HIGH);
digitalWrite(RasPi_NAS, LOW); // dej požadavek na připojení NAS
digitalWrite(RasPi_Vyp, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Res, HIGH); // nuluj komunikaci s RasPi
analogWrite(LED_HTPi, LED_H);
analogWrite(LED_Arduino, LED_A);
}
if (DO == 21225) // pokud je stisknuto cervene tlacitko na TV a zatim neprobehla akce spusteni RasPi
{
digitalWrite(HTPi, HIGH); // sepni napajeni pro RasPi
digitalWrite(RasPi_NAS, HIGH); // dej požadavek na odpojeni NAS
digitalWrite(RasPi_Vyp, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Res, HIGH); // nuluj komunikaci s RasPi
analogWrite(LED_HTPi, LED_H);
analogWrite(LED_Arduino, LED_A);
}
if (DO == 29417) // pokud je stisknuto zlute tlacitko na TV vypni RasPi
{
digitalWrite(HTPi, LOW); // vypni napajeni HTPi
digitalWrite(LED_grabber, LOW); // vypni napajeni LED diod
digitalWrite(RasPi_NAS, HIGH); // dej pozadavek na odpojeni NAS
analogWrite(LED_HTPi, 0); // vypni dislay HTPi
analogWrite(LED_Arduino, 0); // vypni diplay Arduino
digitalWrite(RasPi_Vyp, LOW); // posli pozadavek na vypnuti HTPi
digitalWrite(RasPi_NAS, HIGH); // nuluj komunikaci s RasPi
digitalWrite(RasPi_Res, HIGH); // nuluj komunikaci s RasPi
}
if (DO == 4841) // pokud je stisknuto modre tlacitko na TV restartuj RasPi
{
digitalWrite(RasPi_Res, LOW); // posli pozadavek na restart HTPi
digitalWrite(RasPi_Vyp, HIGH); // nuluj komunikaci s RasPi
}
if (DO == 765)
{
ENTER = 1; // stisknuto tlacitko OK
}
if (DO == -15811)
{
VPRAVO = 1; // stisknuto tlacitko vpravo
}
if (DO == 8925)
{
VLEVO = 1; // stisknuto tlacitko vlevo
}
if (DO == 25245)
{
NAHORU = 1; // stisknuto tlacitko nahoru
}
if (DO == -22441)
{
DOLU = 1; // stisknuto tlacitko dolu
}
Serial.println(DO, DEC); // prepis HEX na seriovy monitor
irrecv.resume(); // Cti dalsi hodnotu
}
}
void TextToEEPROM(int adresa, int maxVelikost, String text)
{
for (int i = 0;i < text.length();i++)
{
EEPROM.write(adresa + i, (byte)text[i]);
}
for (int i = text.length();i < maxVelikost;i++)
{
EEPROM.write(adresa + i, ' ');
}
}
String TextFromEEPROM(int adresa, int maxVelikost)
{
String TextFromEEPROM = "";
for (int i = 0;i < maxVelikost;i++)
{
char znak = (char)EEPROM.read(adresa + i);
TextFromEEPROM = TextFromEEPROM + znak;
}
while (TextFromEEPROM[TextFromEEPROM.length() - 1] == ' ')
{
TextFromEEPROM = TextFromEEPROM.substring(0,TextFromEEPROM.length() - 1);
}
return TextFromEEPROM;
}