Ritkán működő gépek monitorozása V2.0

Nemrégiben vásároltam egy 16×1 LCD kijelzőt. Kiderült, hogy nem működik a háttér világítása. Kis méregetés után kiderült, hogy a kijelzőbe beépített led tropa. Kapargattam egy kicsit az üveglap élét, és kiderült, hogy a kijelző javítható, csak be kell építeni egy új ledet. A javítás abból állt, hogy a kijelző üveglapjának pereméről lekapartam a feséket, és oda ragasztottam egy ledet, Ha ez világit, egész jól látható a kijelzett szöveg. Nem tökéletes, de használható. Így néz ki a preparált LCD:

Sajnos beépítés előtt elfelejtettem lefotózni a kijelző oldalt, így a led a képen nem látszik, de talán el lehet képzelni mi történt!

Mivel ezen a kijelzőn nem lehetett szoftveres úton ki/be kapcsolni a háttér világítást, keresni kezdtem valamilyen értelmes felhasználást. Pont előtte néhány nappal szükségem volt a szivattyú monitorozó áramkörbe épített áram érzékelő feszültség adatára, de sehogyan sem tudtam elérni, hogy a szivattyú működjön és közben mérjem az érzékelő feszültség kimenetét. Ahhoz, hogy járjon a szivattyú a vízszint érzékelőjét meg kell „emelni”, de eközben nem állhatok mérőműszerrel 5 méterrel távolabb. Ez a bosszantó probléma, ráébresztett arra, hogy a szivattyú monitorozó áramkörömben milyen jól felhasználhatnám a félig roncs LCD-t!

Minden maradt ugyanaz, csak kivezettem az ATmega328 lábairól az I2C buszt a kijelzőhöz, és átalakítottam a programot. Ime néhány kép az új kütyüről:

Ezen a kapcsoló dobozon számunkra a 7 szegmenses kijelző, a két nyomógomb és a legalsó sötét csík, az LCD kijelző a lényeg. Van még néhány világítós kapcsoló, azok itt most nem érdekesek.
A vezérlő elektronika egy kicsit átalakult, mert kapott egy külön kapcsoló üzemű tápegység modult a régebbi konnektorba dugható telefontöltő helyett. Hely problémákkal küszködtem, ezért döntöttem a nagyon drága 300Ft-os táp beépítése mellett:

Az áramérzékelő elhelyezése maradt olyan mint volt, de az áramérzékelő alaposabb megismerése alapján kétszer vezettem át a 230V-os vezetéket, így kétszer akkor feszültséget kaptam az egyenirányító kimentén:

Az áram érzékelőnek van egy alap kimenő feszültsége akkor is, amikor a szivattyú nem működik. Bekapcsoláskor ezt megmérem, és tárolom. Ezzel a mért értékkel a későbbiekben korrigálni fogom a mért adatokat. Ez egyben azt is jelenti, hogy az elektronikát akkor szabad bekapcsolni, amikor a szivattyú éppen nem működik. Ez egy áramszünetet követően nem biztos, hogy így is lesz.

Ennek az offset feszültségnek az oka az, hogy a D1 és D2 egyenirányító és a szinteltoló dióda feszültsége nem teljesen azonos. Az áramérzékelő kapcsolása emlékeztetőül:

Hőmérséklet változással a két dióda feszültsége egyre inkább eltér egymástól, ezért ez az offszet még változik is, de ez engem nem nagyon érdekel, nincs szükségem ilyen pontosságra. Tekintve, hogy immár le is tudok olvasni konkrét feszültség értéket, és tudom, hogy ez arányos a szivattyú áramfelvételével, van értelme valahogyan konvertálni a mért adatot. Ehhez feleségem villanyvasalóját használtam. Teljesítmény 1200W, tehát 1200W/230V=5,2A áramot vesz fel. A szivattyú helyett a vasalót kötöttem be, és a mutatott feszültséget feljegyeztem. Ezt követően már volt egy váltószámom, amivel a mért feszültségből közvetlenül áramfelvételt írhatok ki a kijelzőre. Tudom, hogy nem egy pontos megoldás, de nekem ennyi épp elegendő.

 A program jelentősen leegyszerűsödött kivettem belőle a tárolt adatokat „levillogtató” egy karakteres megjelenítő megoldást, hiszen már van LCD kijelző, nem kell a 7 szegmenses kijelzővel hülyéskedni. Az egyik nyomógomb direktben tápot ad egy soros ellenálláson keresztül a kijelző utólag beszerelt led háttér világításának, tehát a gombot nyomni kell folyamatosan, ha látni akarom az adatokat.
A másik nyomógomb váltogatja a regisztrált értékeket, és leolvasgathatom ami érdekel. A következő kijelzések közül lehet válogatni:

A a következőket lehet leolvasni:

  • Ossz.muk.ido: a szivattyú összes működési ideje. Ezt másodperc alapon mérem. Nem ez határozza meg az élettartamot, csak kíváncsi voltam rá!
  • Ossz.mot.indit: A szivattyú beindításának darabszáma a készülék üzembehelyzése óta. Epromban tárolt adat, nem törlődik áramszünetkor.
  • Arammero offset: Bekapcsoláskor a zárójelben látható adatot olvastam ki a konverterből. EZ a tapsztalati konverziós szám meghatározása után (villanyvasalós mérés) a kijelzett áramerősséget jelenti. Ez fals áramerősség, a motor 0A áramot vesz fel, tehát ezzel korrigálni kell a tényleges mért értéket.
  • Mot.erz.kuszob: Előre programban beállított adat, ennél nagyobb áram értéknél tekinti úgy a program, hogy működik a motor.
  • Tularam kuszob: A potenciométerrel beállítható áram érték, ami felett túláram riasztást ad a kijelző tizedes pontja. A túláram valamilyen komolyabb problémára is utalhat a szivattyúval, pl. beleakadt egy kő a darálóba stb.
  • Tularamok szama: Hány túláram jelzés volt a működési időben.
  • Uts.max.mot.aram: Ezért az adatért csináltam az egészet. Látható, hogy a szvattyú 3,72 A áramot vesz fel (legalább is utoljára ennyit), így teljesítménye 850W. És ez igaz, az adatlapja szerint 800W-os. Nem is tévedtem olyan nagyot a villanyvasalóval!
  • Motoraram: Az éppen aktuális motoráram. Most épp nem megy a szivattyú. Az a 0,02A abból fakad, hogy az offszet feszültség korrigálása nem teljesen pontos, az offszet kicsit mindig változik.
  • 24H inditasszam: Ezt az adatot jelzi ki a 7 szegmens kijelző is. Nálunk ez reggel általában 3 szokott lenni, mert az esti zuhanyzással elég sok vizet fogyasztunk. Délután ez az érték már csak 2.

És ha valakit érdekel, itt a forráskód is:

#include <EEPROM.h>
#include <Wire.h>    //I2C library 
#include <LiquidCrystal_I2C.h>  //I2C LCD kezelő könyvtár
//LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  //LCD paraméterek megadása, a 4 soros LCD-m címe 3F
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  //LCD paraméterek megadása 2x16 LCD

#define tombmeret 10		//mekkora legyen a ramban tárolt adaok mennyisége
#define eepromkimeles 0   //ha értéke egy, akkor csak minde 5. indítás után tárolunk az eepromban, ha 0 akkor minden indításkor
#define felejtes_ido 86100  //ennyi idon belüli szivattyú indítások számát jelezzük ki. 86100sec=24 óra
byte hossz=0;
long kijelzo_frissites=millis();
long lcd_vilagitas=millis();
char szamjegy_db[]={'0','0','0','0'};
byte szamjegy_db_num[]={0,0,0,0};
char szamjegy_ido[]={'0','0','0','0'};
byte l=0;
byte motor_on=0;
byte motor_on_state=0;
byte szintjelzes=0;
long s1=0;					//eeprom-ból kiolvasottértékek átmeneti tárolása
long s2=0;					//eeprom-ból kiolvasottértékek átmeneti tárolása
long s3=0;					//eeprom-ból kiolvasottértékek átmeneti tárolása
byte k=0;
int inditas_db=0;
int korrekcio=0;
long ido_tmp=millis();	//a másodpercenkénti figyeléshez
long ido_tmp2=millis();	//a 100msec-es figyeléshez
long ido_tmp3=millis();	//a 100msec-es figyeléshez
//long ido_tmp4=millis();	//a 100msec-es figyeléshez
long bekapcs_ido=0;		//az aktuális szivattyú működés időtartama
long ido[tombmeret]; 			//ebben mérjük a bekapcsolások között eltelt időt
long bekapcsolva[tombmeret];		//az egyes bekapcsolások ideje (szivattyú működési idő
byte tarolasjelzes[tombmeret]; //a tartalmában levo 1-es hatasara taroljuk az adatokat az epromban
byte sw_elozo_allapot=LOW;	//szivattyú működés előző ciklusban érzékelt állapota
long o_ido=0;				//tömb elemek összeadásakor használt változó
int tombindex=0;
byte villogas=0;
byte veszjelzesmemo=0;
long veszjelz_ido=millis();
byte veszjelz_tmp=0;
byte motor_megy=LOW; //szivattyú működéseklor HIGH, ha nem működik, akkor LOW
int aram_kuszob=0;  //szivattyú áramküszöb értéke, mely felett működőnek tekintjük (áramváltó alap feszültsége+3+alapfesz/5)
byte motor_tularam=LOW; //szivattyú tuláram esetén HIGH, alatta LOW, Bármilyen lekérdezés LOW-ba billenti
byte szintjelzo_alapertek=0;  //ha nincs vészjelzés, akkor LOW vagy HIGH értéket vesz fel.
byte szintjelzo_on=0;
int aram_offset=0;
int motoraram=0;
int aramlimit=0;
int uts_max_motoraram=0;
//prellmentesítés segédváltozói
 byte in_prev_state=0;     //bemenet előző állapota segéd változó
 byte in_prell_tmp=0;      //bemenet prell figyeléshez segéd változó
 long in_prell_time=0;     //bemenet prellmentesítéshez eltelt idő az első kontaktus óta, segéd változó
 long out_setup_time_tmp=0;//kimenet kikapcsolási időhöz segéd változó
 byte in_state=0;          //nyomógomb nyomvatartás alatt értéke 1
byte adat_valaszto=0; //az LCD kijelzett értéket határozza meg
bool k_frissit=LOW;


//szivattyú működésérzékelő bemenet
//hétszegmenses kijlző kimenetek
//   -       A       Szegmensek: 1   -  B,C
//  | |   F     B                2   -  A,B,G,E,D 
//   -       G                   3   -  1,3,4,6,7
//  | |   E     C                4   -  F,B,G,C
//   -       D                   5   -  A,F,G,C,D
//                               6   -  A,F,G,E,C,D
//                               7   -  A,B,C
//                               8   -  A,F,B,G,E,C,D
//                               9   -  A,F,B,G,C,D
//                               0   -  A,F,B,E,C,D
//                               forgas1   -  G
//                               forgas2   -  C
//                               forgas3   -  D
//                               forgas4   -  E
//                               telijelzés1   -  D
//                               telijelzés2   -  G
//                               telijelzés3   -  A
//                A F B G E C D 
byte szegmens[]= {0,0,0,1,0,0,0,   //0, 0
                  1,1,0,1,1,0,1,    //1, 7
                  0,1,0,0,0,1,0,    //2, 14
                  0,1,0,0,1,0,0,    //3, 21
                  1,0,0,0,1,0,1,    //4, 28
                  0,0,1,0,1,0,0 ,    //5, 35
                  0,0,1,0,0,0,0,    //6, 42
                  0,1,0,1,1,0,1,    //7, 49
                  0,0,0,0,0,0,0,    //8, 56
                  0,0,0,0,1,0,0,    //9, 63
                  1,1,1,0,1,1,1,    //f1, 70
                  1,1,1,1,1,0,1,    //f2, 77
                  1,1,1,1,1,1,0,    //f3, 84
                  1,1,1,1,0,1,1,    //f3, 91
                  1,1,1,1,1,1,0,    //s1, 98
                  1,1,1,0,1,1,1,    //s2, 105
                  0,1,1,1,1,1,1,    //s3, 112
                  1,1,1,1,1,1,1};   //ures, 119

byte pin_szegmens[] = {7,  8,  9, 10, 11, 12, 13};
// szegmens betüjele:  A,  F,  B,  G,  E,  C , D
//chip kivezetés:     13, 14, 15, 16, 17, 18, 19 


void setup()
{
  Serial.begin(9600);
  analogReference(DEFAULT);  //A tápfeszt veszi referenciának (5V)
  Wire.begin();  // I2C busz használat indítása
  lcd.begin(20,4  ); //LCD inicializálása
//  lcd.noBacklight();      //háttérvilágítás bekapcsolása
  lcd.backlight();      //háttérvilágítás bekapcsolása

  //tömbök indulú értékének feltöltése
  for (byte i=0;i<5;i++) {	ido[i]=0;bekapcsolva[i]=0;tarolasjelzes[i]=0;}
  tarolasjelzes[0]=1;
  pinMode(2,INPUT); //motor működés érzékelő bemenet //4. chip kivezetés
  digitalWrite(2,HIGH);
  pinMode(3,INPUT); //"teli" szintjelző érzékelő bemenet //5. chip kivezetés
  digitalWrite(3,HIGH);
  pinMode(4,INPUT); //Kijelző világítás bekapcsoló gomb. 60 másodpercig világít, 
                    //jelenlegi hardverben nincs funkciója, mert a világítást egy külön nyomógomb direktben kapcsolja a kijelzőn
  digitalWrite(4,HIGH);
  pinMode(5,INPUT); //Kijelzett érték váltása az LCD kijelzőn és gyári alapbeállítás, ha nyomva van bekapcsoláskor
  digitalWrite(5,HIGH);
  
  // led kijelző szegmenseinek vezérlő kimeneteinek beállítása
  // Arduino láb:        7, 8, 9,10,11,12,13
  // szegmens betüjele:  A, F, B, G, E, C, D
  for (byte i=6;i<14;i++) {pinMode(i,OUTPUT);digitalWrite(i,HIGH);} //led kijelző szegmenseinek vezérlő kimenetei
  if (digitalRead(5)==LOW) //gyári alapbeállítás
  {
    lcd.setCursor(0,0);lcd.print("Alapertek beall.");
    lcd.setCursor(0,1);lcd.print("                ");
    //eeprom törlés, gyári alapbeállítás
    for (byte i=0;i<20;i++) {EEPROM.write(i,0);}
    EEPROM.write(9,digitalRead(3));       //szintjelző alapállapotának lekérdezése
    //tizedespont villogtatás, ami a gyári alapbeállítást jelzi
    for (byte i=1;i<5;i++) {digitalWrite(6,LOW);delay(200);digitalWrite(6,HIGH);delay(200);}
  }
  lcd.clear();lcd.setCursor(0,0);lcd.print("Offset meres!   ");
  //10x mérünk és átlagoljuk, így megkapjuk a nyugalmi feszültségét az áramváltó egyenirányítójának
  //fontos, hogy bekapcsoláskor ne működjön a szvattyú
  for (byte i=0;i<10;i++) {aram_offset=aram_offset+analogRead(A2);delay(60);}
  aram_offset=aram_offset/10;  //egyenirányitó átlagos nyugalmi offszet átlagos feszültségének számítása
  aram_kuszob=aram_offset*10;   //nyugalmi offszetnél harmoszorosa a működő motor érzékelésének áramküszöbe
  lcd.setCursor(0,1);lcd.print("Offset:");
  lcd.setCursor(0,1);lcd.print((float) aram_offset*0.017);lcd.print("A (");lcd.print(aram_offset);lcd.print(")");
  delay(2000);
  szintjelzo_alapertek=EEPROM.read(9);  //tárolt szintjelző alapállapot kiolvasása
  uts_max_motoraram=EEPROMReadlong(15);
  lcd.setCursor(0,1);lcd.print("Uts.max.mot.aram");
  lcd.setCursor(0,1);lcd.print("torlesehez nyomd");
  delay(2000);
  lcd.setCursor(0,1);lcd.print("a nyomógombot!  ");
  lcd.setCursor(0,1);lcd.print("Hatravan:       ");
  for (byte i=5;i>0;i--) 
  {
    lcd.setCursor(9,1);lcd.print(i);
    if (digitalRead(5)==LOW)
    {
      for (byte j=15;j<20;j++) {EEPROM.write(j,0);}
      lcd.setCursor(0,0);lcd.print("Max aram torolve");
      lcd.setCursor(0,1);lcd.print("================");
      delay(2000); 
      break;
    }
    delay(1000);
  }
}

void loop()
{
  //4-es bemenetre kötött gombnyomásra bekapcsoljuk az lcd háttérvilágítását, és egy perc mulva kapcsoljuk ki
  if (digitalRead(4)==LOW) {lcd.backlight();lcd_vilagitas=millis();}
  //if (lcd_vilagitas+60000<millis()) {lcd.noBacklight();}

  //egy másodpercenként ellenőrizzuk, hogy megy e a motor és adminisztrálunk
  if (millis()>ido_tmp+1000) {inditas_szamlalo();ido_tmp=millis();}

  //1,2 másodpercre beállítjuk a vizszint vészjelzést ha bekapcsolt a vész vizszintjelző
  if (millis()>ido_tmp3+1200) {if (motor_on!=1) {szintjelzes=1;}}
  if (millis()>ido_tmp3+2400) {	ido_tmp3=millis();szintjelzes=0;k=0;}

  //Szintjelző tárolt alapértéke alapján a vészjelzés detektálása szintjelzo_on=HIGH jelzi a magas folyadékszintet 
  szintjelzo_on=LOW;
  if (szintjelzo_alapertek==LOW) {if (digitalRead(3)==HIGH) {szintjelzo_on=HIGH;}} 
  else {if (digitalRead(3)==LOW) {szintjelzo_on=HIGH;}}

  //*******************szintjelző riasztás megjelenítése led kijelzőn***********************************
  //bekapcsolt a vész szintjelző kapcsoló, sorban villogtatjuk a függőleges pálcikákat 3 másodpercenként
  if (szintjelzes==1 && szintjelzo_on==HIGH)  
  {
    if (millis()>ido_tmp2+200) 
    {
      for (byte i=0;i<7;i++) {digitalWrite(pin_szegmens[i],szegmens[98+(k*7)+i]);}
      k++;if(k==3) {k=0;}
      ido_tmp2=millis();
    }
  }

  //******************motor működés kelzése a led kijelzőn*******************************************
  //éppen működik a motor, sorban körbe villogtajuk az alsó 4 szegmenst
  if (motor_on==1 && szintjelzes==0) 
  {
    if (millis()>ido_tmp2+200) 
    {
      //motor működik	
      for (byte i=0;i<7;i++) {digitalWrite(pin_szegmens[i],szegmens[70+(motor_on_state*7)+i]);}
      motor_on_state++;if (motor_on_state==4) {	motor_on_state=0;}
      ido_tmp2=millis();
    }			
  }
  
  //********************indításszám kijelzése a led kijelzőn****************************************
  //sem a motor nem működik, sem vész vizszint kijelzés nincs
  //kijelezzük az utolsó 24 óra indításainak számát, villogtatjuk ha több mint 8
  if (motor_on==0 && szintjelzes==0) 
  {
    if (millis()>ido_tmp2+200) 
    {
      if (inditas_db==8) {villogas++;} else {villogas=1;}
      if (villogas==2) {for (byte i=0;i<7;i++) {digitalWrite(pin_szegmens[i],szegmens[119+i]);}}
      if (villogas==1) {for (byte i=0;i<7;i++) {digitalWrite(pin_szegmens[i],szegmens[inditas_db*7+i]);}}
      if (villogas==2){villogas=0;}
      ido_tmp2=millis();
    }
  }

  // **************prellmentesítés a nyomógombon, és kijelzett érték paraméterének változtatása*****************
  //első lenyomás érzékelése
  if (in_state==0 and digitalRead(5)==LOW and in_prell_tmp==0)
    {in_prell_tmp=1;in_prell_time=millis();} 
  // már 50msecv óta nyomva van, most már biztos, hogy lenyomták és nem prellezik
  if (in_state==0 and digitalRead(5)==LOW and in_prell_tmp==1 and millis()>in_prell_time+50) 
    {
      in_state=1;in_prell_tmp=0;
      //növeljük a kijelzett érték változóját, ciklikuan 0-ha, elértük a legnagyobb értéket
      adat_valaszto++;if (adat_valaszto==9){adat_valaszto=0;}
      k_frissit=HIGH; //ennek hatására azonnal ki fogja írni a kiválasztott adot (frissíti a kijelzőt)
      digitalWrite(6,HIGH);  //kikapcsoljuk a tizedespontot (túláram jelzés törlése)
    } 
  //első elengedés érzékelése
  if (in_state==1 and digitalRead(5)==HIGH and in_prell_tmp==0)
    {in_prell_tmp=1;in_prell_time=millis();} 
  // már 50msecv óta elengedve, most már biztos, hogy elengedték és nem prellezik
  if (in_state==1 and digitalRead(5)==HIGH and in_prell_tmp==1 and millis()>in_prell_time+50) 
    {in_state=0;in_prell_tmp=0;} 
        
  //***********************************kijelző frissítés******************************************
  //Serial.println(k_frissit);
  if (millis()>kijelzo_frissites+1000 or k_frissit==HIGH)  //egymásodpercenként frissítjük a kijelzésre kerülő értéket
                                                           //vagy ha megnyomta a nyomógombot
  {
    k_frissit=LOW;
    //lcd.setCursor(0,1);lcd.print("                ");
    switch (adat_valaszto)
    {
      case 0:   //24 óra indításszáma
        lcd.setCursor(0,0);lcd.print("24H inditasszam:");
        lcd.setCursor(0,1);lcd.print(inditas_db);lcd.print(" db            ");break;
      case 1:   //Összes motor működési idő
        lcd.setCursor(0,0);lcd.print("Ossz.muk.ido:   ");
        lcd.setCursor(0,1);lcd.print(EEPROMReadlong(0)/60);lcd.print(" perc       ");break;
      case 2:   //Összes motor indításszám
        lcd.setCursor(0,0);lcd.print("Ossz.mot.indit:");
        lcd.setCursor(0,1);lcd.print(EEPROMReadlong(4));lcd.print(" db            ");break;
      case 3:   //árammérő offszet értéke
        lcd.setCursor(0,0);lcd.print("Arammero offset:");
        lcd.setCursor(0,1);lcd.print((float) aram_offset*0.017);lcd.print("A (");lcd.print(aram_offset);lcd.print(") ");break;
      case 4:   //motor működés érzékelési küszöb
        lcd.setCursor(0,0);lcd.print("Mot.erz.kuszob: ");
        lcd.setCursor(0,1);lcd.print((float)aram_kuszob*0.017);lcd.print("A (");lcd.print(aram_kuszob);lcd.print(") ");;break;
      case 5:   //motor túláram risztási küszöb (potméter beállított értéke)
        lcd.setCursor(0,0);lcd.print("Tularam.kuszob: ");
        lcd.setCursor(0,1);lcd.print((float) aramlimit*0.017);lcd.print("A (");lcd.print(aramlimit);lcd.print(") ");break;
      case 6:   //motor túláram risztási küszöb (potméter beállított értéke)
        lcd.setCursor(0,0);lcd.print("Tularamok szama: ");
        lcd.setCursor(0,1);lcd.print(EEPROMReadlong(10));lcd.print(" db            ");break;
      case 7:   //motor áramának értéke (offszet éték kivonásával)
        lcd.setCursor(0,0);lcd.print("Uts.max.mot.aram:");
        lcd.setCursor(0,1);lcd.print((float)uts_max_motoraram*0.017);lcd.print("A (");lcd.print(uts_max_motoraram);lcd.print(") ");break;
      case 8:   //motor áramának értéke (offszet éték kivonásával)
        lcd.setCursor(0,0);lcd.print("Motoraram:      ");
        lcd.setCursor(0,1);lcd.print((float) (motoraram-aram_offset)*0.017);lcd.print("A (");lcd.print(motoraram);lcd.print(") ");break;
    }
    kijelzo_frissites=millis();
  }
}	



void inditas_szamlalo()
{
  //idő számlálók növelése. Másodperc alapon mérünk időt
  bekapcs_ido++;ido_tmp=millis();
  ido[0]=ido[0]+1;
  o_ido=0;
  s3=0;
  // sorban összeadjuk a tömbben tárolt időt, ha elértük a 24 órát (86400 másodperc), akkor megállunk
  //az utolsó 24 óra szivattyú indításainak számára vagyunk kíváncsiak
  while (o_ido<felejtes_ido && s3<tombmeret-1 && ido[s3]!=0)
  {
    o_ido=o_ido+ido[s3];
    s3++;
  }		
  inditas_db=s3-1;
  if (inditas_db==8) {veszjelzesmemo=1;}
  if (tarolasjelzes[tombmeret-1]==1 && eepromkimeles==1) //tarolásjelzés, tehát az utolsó 5 adatot összgezni és tárolni kell
                                                         //de csak akkor, ha az eeprom kimélés be van kapcsolva
  {
    //Összeadjuk a tömbben tárolt bekapcsolási időket, és közben töröljük az összeadottakat
    //a törlés csak a működés nyomnkövethetősége miatt lett beépítve
    o_ido=0;
    for (byte j=0;j<5;j++) {	o_ido=o_ido+bekapcsolva[tombmeret-j-1];bekapcsolva[tombmeret-j-1]=0;}
      //osszes szivattyú működési idő kiolvasása az eeprom-ból és hozzáadjuk az utóbbi tárolt bekapcsolási időket
    s1=EEPROMReadlong(0);
    s1=s1+o_ido;
      //Összes eddigi indításszám kiolvasása eeprom-ból és hozzáadjuk az utóbbi tárolt indítás számot
    s2=EEPROMReadlong(4);
    EEPROMWritelong(0,s1);
    EEPROMWritelong(4,s2+5); //értékek írása az eeprom-ba
    tombindex=0;
    tarolasjelzes[tombmeret-6]=1;
    tarolasjelzes[tombmeret-1]=0;
  } //if vége
  motor_lekerdezes();
  
  //a szivattyú indítás felfutó éle, tároljuk a tömbb 0-as indexén az utolsó indítás óta 
  //eltelt időt és tároljuk ennek változóját, töröljuk a bekapcsolási idő változóját
  if (motor_megy && !sw_elozo_allapot) {  bekapcs_ido=0;motor_on=1;}
  
  //szivattyú kikapcsolása (lefutó él). Minden értéket lejjebb másolunk a tömbben és
  //tároljuk a bekapcsolási idő számlálást
  if (!motor_megy && sw_elozo_allapot) 
  {
    if (motor_tularam==HIGH) 
    {
      //ha a motor áramfelvétele nagyobb volt a működés alatt mint a potival beállított limit, akkor kigyúllad a tizedespont. 
      //Az5-os bemenetre kötött gomb lenyomása kikapcsolja
      digitalWrite(6,LOW);
      motor_tularam=LOW;
      int ta=EEPROMReadlong(10);
      ta++;
      EEPROMWritelong(10,ta);
    }
    EEPROMWritelong(15,uts_max_motoraram);
    bekapcsolva[0]=bekapcs_ido;
    motor_on=0;
    for (byte j=tombmeret-1;j>0;j--)
    {
      bekapcsolva[j]=bekapcsolva[j-1];
      ido[j]=ido[j-1];
      tarolasjelzes[j]=tarolasjelzes[j-1];
    }
    bekapcsolva[0]=0;ido[0]=0;tarolasjelzes[0]=0;
    if (eepromkimeles==0) //eeprom kimélés kikapcsolva, így minden motor működés után beírjuk az adatokat az eeprom-ba
    {
      //Összes eddigi működési idő kiolvasása eeprom-ból és hozzáadjuk a legutóbbi működési időt
      s1=EEPROMReadlong(0);
      s1=s1+bekapcs_ido;
      EEPROMWritelong(0,s1);
      //Összes eddigi indításszám kiolvasása eeprom-ból és hozzáadunk egyet
      s2=EEPROMReadlong(4);
      EEPROMWritelong(4,s2+1); //értékek írása az eeprom-ba
    }
  }
  sw_elozo_allapot=motor_megy; //fel és lefutó él érzékeléséhez
}


//Ez a funkció kiír egy 4 byte (32bit) long változót az eeprom-ba
void EEPROMWritelong(int address, long value)
{
	//szétszedjük byte-okra a long-ot
	byte four = (value & 0xFF);
	byte three = ((value >> 8) & 0xFF);
	byte two = ((value >> 16) & 0xFF);
	byte one = ((value >> 24) & 0xFF);
	//A 4 byte-os adat epromba írása
	EEPROM.write(address, four);
	EEPROM.write(address + 1, three);
	EEPROM.write(address + 2, two);
	EEPROM.write(address + 3, one);
}

//Ez a funkció visszaolvas 4 byte (32bit) long változót az eeprom-ból
long EEPROMReadlong(long address)
{
	//4 bytes olvasása az eeprom-ból.
	long four = EEPROM.read(address);
	long three = EEPROM.read(address + 1);
	long two = EEPROM.read(address + 2);
	long one = EEPROM.read(address + 3);
	//4 byte long változóvá alakítása
	return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}

void char_konv(int szam)
{
	String konv_string=String(szam);
	hossz=konv_string.length();
	for (byte j=0;j<4;j++) {szamjegy_db[j]='0';}
	for (byte i=0;i<hossz;i++) {szamjegy_db[4-hossz+i]=konv_string.charAt(i);}
}

void motor_lekerdezes()
{
motoraram=analogRead(A2);
if (uts_max_motoraram<(motoraram-aram_offset)) {uts_max_motoraram=motoraram-aram_offset;}
aramlimit=analogRead(A1);
if (!digitalRead(2) || (motoraram-aram_offset)>aram_kuszob) {motor_megy=HIGH;}  else {motor_megy=LOW;}
if ((motoraram-aram_offset)>aramlimit) {motor_tularam=HIGH;}
}

Mennyire volt hasznos amit olvastál?

Kattints egy csillagra az értékeléshez!

Sajnálom, hogy amit olvastál nem volt hasznos számodra!

Szeretném ha elégedett lennél!

Írd le kérlek, hogy mi nem tetszett!?