//https://create.arduino.cc/projecthub/electropeak/using-1602-lcd-keypad-shield-w-arduino-w-examples-e02d95
#include <LiquidCrystal.h>
#include <string.h>
//#include <TimerOne.h>"
const uint8_t PARAM_SZAM =15; // paraméterek száma
const uint8_t TERMOSZT =A4; // láb a termosztáthoz
const uint32_t SOHA =0UL-1; // végtelen idő. Ha egy időpont nem érdekes, ezt kapja,
#define VENTI_KESES 400 // Ne csigával egyszerre induljon
#define CSIGABE 1 //A csiga erre indul el [0/1]
#define CSIGAKI !CSIGABE //A CSIGABE ellentettje
#define TERMOSZBE 0 // A termosz fűtést kér
#define TERMOSZKI !TERMOSZBE // Termosz kikapcsolást kér
#define ALLAPOTIR Serial<<" >T(3) : "<<termoszJel<<" CS(7) : " <<digitalRead(CSIGA)<< " VENTI : \n"
uint8_t termoszJel ; //A Termoszláb értéke (0/1);
uint8_t termoszMult =255; //A Termoszláb előző értéke ;
uint32_t ventiGyorsLesz =0; //be/kikapcsolási időpontok (millis)
uint32_t ventiLassuLesz =SOHA;
uint32_t csigaBeLesz =0; //időpont Millis()
uint32_t csigaKiLesz =0; //Időpont Millis
uint32_t most; //aktuális idő (millis)
volatile uint32_t nyomva =SOHA;
//LCD lábak
const int pin_RS = 8;
const int pin_EN = 9;
const int pin_d4 = 4;
const int pin_d5 = 5;
const int pin_d6 = 6;
const int pin_d7 = 7;
const int pin_BL = 10;
LiquidCrystal lcd( pin_RS, pin_EN, pin_d4, pin_d5, pin_d6, pin_d7);
enum gombok {ENTER,LEFT,DOWN,UP,RIGHT};
enum szint {FOKEP,MENU,ALLITO};
szint menu_Szint=0;
typedef struct {
int16_t x; //Paraméter értéke
uint8_t oszl; //oszlop a főképen
uint8_t sor; //sor a főképen
uint8_t lab; //Mikrokontroller láb száma
int16_t oszto; //kiírás nagyságrendje
uint8_t irhato_e; //fix-vagy írható?
char txt[17]; //megnevezés
char egyseg[4]; //Mértékegység
} param;
// 12334567890123456 KezdőképAlapállapot
//╔════════════════╗ Jelmagyarázat:
//║79°78%12s 45 198║ |előre:79°|ventifűt:78%pwm||adagszünet_Füt:12|adagidő:0,45 mp|Kémény:198°
//║61 35%30 65 125║ |visszaág:61°|VEntitart35%pwm||adagszünet_tart:30 Szivattyú be:65°|Lambda 125 |
//╚════════════════╝
char kepsor[4][17]=
{ " % s \' ",
" ",
"Ld SzivKi ",
" p-re_megy ",
};
// x, érték, oszl, sor, lab,oszto, irhato, txt , egység
param X[PARAM_SZAM]= // 0123456789012345
{ {78, 4, 0, 0, 1, 2, "PWM % futes:" ,"%" },//PWM% Fűtéskor
{35, 4, 1, 0, 1, 2, "PWM % Tuz.tart:","%" },//PWM% Tűztartáskor
{11000, 7, 0, 0, 1000, 2, "Cs.szunet fut:" ,"ms"},//msec csigaszünet Fűtéskor
{30000, 7, 1, 0, 1000, 2, "Cs.szunet tart:","ms"},//msec csigaszünet tűztartáskor
{450, 11, 0, 0, 10, 3, "Csigamenetido:" ,"ms"},//msec Csiga menetidő
{65, 11, 1, 0, 1, 2, "Sziv bekapcs :" ,"C" },//C° Szivattyú bekapcsolási hőm.
{55, 12, 2, 0, 1, 2, "Sziv kikapcs :" ,"C" },//C° Sziv kikapcsolási hőm.
{65, 2, 3, 0, 1, 2, "Tisztitaskoz" ,"min"},//prc Időköz nagyadag tisztításkor
{65, 15, 3, 0, 1, 2, "Tisztitas ido" ,"sec"},//ms Menetidő nagyadag tisztításkor
{90, 0, 0, 0, 1, 2, "Vesz homers." ,"C" },//C° Túlmelegedési küszöb
{76, 1, 0, 0, 1, 0, "" ,"C" },//c° Előremenő víz hőm.
{53, 1, 1, 0, 1, 0, "" ,"C" },//C° Viszzajövő hőm.
{198, 15, 0, 0, 1, 0, "" ,"C" },//C° Kémény hőm.
{125, 15, 1, 0, 1, 0, "Lambda" ,"Lam"},// Lambda érték
{ 2, 15, 2, 0, 1, 0, "" ,"C" },//C° Külső hőmérséklet
};
enum param_t {venti_Fut, venti_Tart, csigaSz_Fut, csigaSz_Tart, csiga_Megy, t_SzivBe, \
t_SzivKi, tiszt_Koz, tiszt_Tartam, t_Vesz, t_Elore , t_Vissza, t_Kemeny, Lambda, t_Kinti };
/*void xprintx(char* cel, const int32_t valtozo, uint8_t m )
{ uint8_t x=0;
if ( valtozo < 0) x++;
if (abs(valtozo)<10) ;
else (abs(valtozo)<100) ? x++ : x +=2;
memccopy(&cel,&puff,x);
lcd.setCursor(oszl,sor);
lcd.print(valtozo);
}
void printx(int16_t valtozo, uint8_t oszl, uint8_t sor )
{ if (valtozo<0) oszl--;
if (abs(valtozo)<10) ;
else (abs(valtozo)<100) ? oszl-- : oszl -=2;
lcd.setCursor(oszl,sor);
lcd.print(valtozo);
}
*/
void beilleszt(param *adat)
{ char tar[]=" ";
itoa(adat->x/adat->oszto, tar, DEC);
uint8_t hossz=strlen(tar);
memcpy(&kepsor[adat->sor][adat->oszl-hossz+1], tar, hossz);
}
void fkep()
{ for( uint8_t i=0 ; i<t_Kinti ; ( i== t_SzivBe) ? i=t_Elore : i++ ) beilleszt(&X[i]);
lcd.setCursor(0, 0); lcd.print(kepsor[0]);
lcd.setCursor(0, 1); lcd.print(kepsor[1]);
}
void nyomas(void)
{ nyomva=millis()+50;
}
void akcio_Menu(gombok gomb)
{ static uint8_t aktiv_Sor;
switch (menu_Szint)
{ case FOKEP: //////////////////// Főkép
aktiv_Sor=0;
if (gomb==ENTER || gomb==RIGHT)
{ menu_Szint=MENU;
lcd.clear();
lcd.noCursor();
lcd.print(X[venti_Fut].txt);
lcd.setCursor(0,1);
lcd.print(X[venti_Fut].x);lcd.print(" ");lcd.print(X[venti_Fut].egyseg);lcd.print(" ");
}
break;
case MENU: ////////////////// Menü
switch (gomb)
{ case RIGHT:
case ENTER:
menu_Szint=ALLITO;
lcd.setCursor(1,1);lcd.cursor(); lcd.blink();
break;
case LEFT:
menu_Szint=FOKEP;
fkep();
break;
case UP:
if (aktiv_Sor>0)
{ aktiv_Sor--;
lcd.clear();
lcd.print(X[aktiv_Sor].txt);
lcd.setCursor(0,1);lcd.noBlink();
lcd.print(X[aktiv_Sor].x);lcd.print(" ");lcd.print(X[aktiv_Sor].egyseg);lcd.print(" ");
}
break;
case DOWN:
if (aktiv_Sor<t_Vesz)
{ aktiv_Sor++;
lcd.clear();
lcd.print(X[aktiv_Sor].txt);
lcd.setCursor(0,1);lcd.noBlink();
lcd.print(X[aktiv_Sor].x);lcd.print(" ");lcd.print(X[aktiv_Sor].egyseg);lcd.print(" ");
}
break;
}
break;
case ALLITO:
int8_t elojel=1;
switch (gomb)
{
case LEFT:
case ENTER:
menu_Szint=MENU;
lcd.noBlink();lcd.noCursor();
break;
case DOWN:
elojel=-1;
case UP:
(aktiv_Sor!=csiga_Megy) ? X[aktiv_Sor].x += X[aktiv_Sor].oszto*elojel : X[aktiv_Sor].x += 25*elojel ;
lcd.setCursor(0,1);
lcd.print(X[aktiv_Sor].x)/X[aktiv_Sor].oszto;lcd.print(" ");lcd.print(X[aktiv_Sor].egyseg);lcd.print(" ");
lcd.setCursor(1,1);
break;
}
break;
}
}
gombok gomb_Olvas()
{ uint16_t x = analogRead (A0);
if (x < 160) return ENTER;
else if (x < 400) return LEFT;
else if (x < 650) return DOWN;
else if (x < 850) return UP;
else if (x < 1024) return RIGHT;
}
void setup()
{ // Timer1.intialize(10,40000); //láb, microsec
pinMode(3, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(3), nyomas, RISING);
lcd.begin(16, 2);
//fokep();
fkep();
Serial.begin(9600);
Serial.println(0ul-1);
}
void loop()
{ int x, k;
delay(500);
//Serial.println(analogRead(A0));
uint8_t bill;
uint16_t X;
if (nyomva < millis())
{ nyomva=SOHA;
gombok nyomott_Gomb=gomb_Olvas();
akcio_Menu(nyomott_Gomb);
if (nyomva < millis())
Serial.println(nyomott_Gomb);
}
}
// 12334567890123456 KezdőképAlapállapot
//╔════════════════╗ Jelmagyarázat:
//║79°45%12s 40 198║ |előre:79°|ventifűt:45%pwm||adagszünet_Füt:30|adagidő:0,4 mp|Kémény:198°
//║61 28%30 65 -10║ |visszaág:61°|VEntitart28%pwm||adagszünet_tart:30 Szivattyú be:65°|Külső:-10° |
//╚════════════════╝
//12334567890123456 Motor
//------------------
//V 45% 300
//| 25%
//------------------