Arduino schéma - arduino.sk

Teploty s DS18B20

Vaše nápady a pomoc s Vašimi projektami
Príspevky: 33
Registrovaný: Pia 26. Jún 2015 21:17:41

Teploty s DS18B20

Poslaťod barado » Pia 11. Dec 2015 22:58:12

Trosku je to tu mrtve. Tak prispejem svojim malinkym projektikom, ktory som slubil bratovi do kotolne.
Kotolna je "mimo" rodinneho domu a riadenie kurenia kotlom na tuhe palivo do akumulacnej nadrze je urobene na mieru riadiacou jednotkou, ktorej povod nepoznam. Ale rad by som poznal. Tato jednotka zobrazuje teploty priamo v kotolni a tak ak brat chce vidiet stav kotolne musi vyjst z domu von do kotolne.
Rozhodol som sa mu preto umiestnit 20x4 riadkovy LCD display priamo do domu a na meranie teplot pouzit OneWire cidla DALLAS DS18B20.
Zobrazovat sa zatial bude 10 teplot 4xakumulacka, 2xkotol (primar), 2xvykurovaci okruh(sekundar), vonkajsia a vnutorna teplota.
Adresy cidiel su ulozene v EEPROM a v pripade vadneho cidla bude mozne v specialne na to urcenej zdierke zistit adresu cidla a tuto adresu potom zadat na prislusnu poziciu. Tato nova adresa sa zobrazi na LCD automaticky, ak sa ju podari precitat.
Asi som to mohol urobit aj trochu prehladnejsie, no dlho som bojoval s displayom, ktory nemal rozmiestnene piny podla mnou pouzitej kniznice a dlho som na to nemohol prist preco mi display nefunguje. Az po dlhej dobe ked uz som chcel ten LCD rozbit som sa pozrel do manualu a piny v kniznici upravil.

Kód: Vybrať všetko
/* include libs */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>


#define BACKLIGHT_PIN     3
#define POL POSITIVE


LiquidCrystal_I2C lcd(0x27, BACKLIGHT_PIN, POL);

unsigned long startTimeDallas=0;                   //zaciatok nacitavania, kontroluje sa s millis
unsigned int  intervalDallas=5000;                 //posli poziadavku na nacitanie teploty kazdych xx sekund
unsigned long startTimeDallasWait=0;               //zaciatok konverzie teploty v senzoroch
unsigned int  intervalDallasWait=800;              //citaj teplotu z cidiel az po uplynuti 400ms
unsigned long startTimeLCD=0;                      //zaciatok nacitavania, kontroluje sa s millis
unsigned long intervalTimeLCD=1000;                //zaciatok nacitavania, kontroluje sa s millis
unsigned long startTimeLCDBackLightON=0;       //zaciatok nacitavania, kontroluje sa s millis
unsigned long intervalTimeLCDBackLightON=60000;    //cas podsvietenia

boolean textTempPrinted=false;                    //text pre teploty uz zobrazeny
boolean tlacidloPlus=false;
boolean tlacidloEnter=false;
boolean LCDshowTemperatures = false;                  //zobrazuj teploty
boolean LCDshowAdressSettings = false;                //zobrazuj nastavovanie adries teplot
boolean LCDsetAdressNumberIndex = false;              //nastavuj pole adresy

boolean tlacidloPlusState;             // the current reading from the input pin
boolean lastTlacidloPlusState = false;   // the previous reading from the input pin
boolean tlacidloEnterState;             // the current reading from the input pin
boolean lastTlacidloEnterState = false;   // the previous reading from the input pin

byte setSensorNumber=0;                    //cislo nastavovaneho senzora 0-9
byte setSensorNumberIndex=255;              //nastavovane pole adresy
boolean tlacidloEnterStateTRUE=false;               //reakcia iba na true ENTER
boolean tlacidloPlusStateTRUE=false;                //reakcia iba na true PLUS

long lastDebounceTimePlus = 0;   // the last time the output pin was toggled
long lastDebounceTimeEnter = 0;   // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers

#define ONE_WIRE_BUS 2                    //pin pre teploty DS18B20
#define TEMPERATURE_PRECISION 11

#define ONE_WIRE_BUS_NEW 3                //pin pre zistenie adresy pri vymene cidla

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
OneWire oneWireNew(ONE_WIRE_BUS_NEW);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
DallasTemperature sensorsNew(&oneWireNew);

// polia pre ulozenie adries
// je mozne pouzit decimalnu hodnotu adresy namiesto HEX

//adresy pre kontroler
uint8_t ak1[] = { 0x29, 0xE3, 0x1E, 0xDE, 0x06, 0x00, 0x00, 0x75 };
//uint8_t ak1[] = { 40, 227, 30, 222, 6, 0, 0, 117 };
uint8_t ak2[] = { 0x28, 0xD6, 0xDE, 0xDC, 0x00, 0x0, 0x0, 0x87 };
uint8_t ak3[] = { 0x28, 0x3E, 0x83, 0xDD, 0x00, 0x0, 0x0, 0xF9 };
uint8_t ak4[] = { 0x28, 0xE3, 0x1E, 0xDE, 0x00, 0x0, 0x0, 0xA4 };
uint8_t ko1[] = { 0x28, 0x00, 0x00, 0x01, 0x00, 0x0, 0x0, 0xA7 };
uint8_t ko2[] = { 0x28, 0x00, 0x00, 0x02, 0x06, 0x0, 0x0, 0x76 };
uint8_t po1[] = { 0x28, 0x00, 0x00, 0x03, 0x06, 0x0, 0x0, 0x76 };
uint8_t po2[] = { 0x28, 0x00, 0x00, 0x04, 0x06, 0x0, 0x0, 0x76 };
uint8_t vo1[] = { 0x28, 0xE3, 0x1E, 0xDE, 0x06, 0x00, 0x00, 0x75 };
uint8_t vn1[] = { 0x28, 0xE3, 0x1E, 0xDE, 0x06, 0x00, 0x00, 0x74 };
//uint8_t vn1[] = { 40, 243, 3, 59, 6, 0, 0, 118 };


//adresy pre test
/*
uint8_t ak1[] = { 0x28, 0xD6, 0xDE, 0xDC, 0x00, 0x00, 0x00, 0x87 };
uint8_t ak2[] = { 0x28, 0xE3, 0x1E, 0xDE, 0x00, 0x00, 0x00, 0xA4 };
uint8_t ak3[] = { 0x28, 0x5A, 0xB1, 0x3A, 0x00, 0x00, 0x00, 0x2E };
uint8_t ak4[] = { 0x28, 0x3E, 0x83, 0xDD, 0x00, 0x00, 0x00, 0xF9 };
uint8_t ko1[] = { 0x28, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29 };
uint8_t ko2[] = { 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70 };
uint8_t po1[] = { 0x28, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47 };
uint8_t po2[] = { 0x28, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2 };
uint8_t vo1[] = { 0x28, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5 };
uint8_t vn1[] = { 0x28, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC };
*/

float tAk1, tAk2, tAk3, tAk4, tKo1, tKo2, tPo1, tPo2, tVo1, tVn1;          // premenne pre ulozenie teplot z cidiel

DeviceAddress tempDeviceAddress;                                 // ulozenie novej adresy do temporary premennej

#define outDO_1 6
#define outDO_2 7
#define outDO_3 8
#define outDO_4 9
#define inDI_0_PLUS 10                        //pin tlacidla PLUS
#define inDI_1_ENTER 11                       //pin tlacidla ENTER
#define outDO_7 12
#define outDO_8 13

void eepromReadAdress(void)              //nacitanie adries z eeprom pri starte
{
  static int eepromAdress;
  eepromAdress=0;
  EEPROM.get( eepromAdress, ak1 );
  eepromAdress=8;
  EEPROM.get( eepromAdress, ak2 );
  eepromAdress=16;
  EEPROM.get( eepromAdress, ak3 );
  eepromAdress=24;
  EEPROM.get( eepromAdress, ak4 );
  eepromAdress=32;
  EEPROM.get( eepromAdress, ko1 );
  eepromAdress=40;
  EEPROM.get( eepromAdress, ko2 );
  eepromAdress=48;
  EEPROM.get( eepromAdress, po1 );
  eepromAdress=56;
  EEPROM.get( eepromAdress, po2 );
  eepromAdress=64;
  EEPROM.get( eepromAdress, vo1 );
  eepromAdress=72;
  EEPROM.get( eepromAdress, vn1 );
}

void setSensorsResolution(void)                        //nastavenie rozlisenia cidla
{
  sensors.setResolution(ak1, TEMPERATURE_PRECISION);
  sensors.setResolution(ak2, TEMPERATURE_PRECISION);
  sensors.setResolution(ak3, TEMPERATURE_PRECISION); 
  sensors.setResolution(ak4, TEMPERATURE_PRECISION);
  sensors.setResolution(ko1, TEMPERATURE_PRECISION);
  sensors.setResolution(ko2, TEMPERATURE_PRECISION);
  sensors.setResolution(po1, TEMPERATURE_PRECISION);
  sensors.setResolution(po2, TEMPERATURE_PRECISION);
  sensors.setResolution(vo1, TEMPERATURE_PRECISION);
  sensors.setResolution(vn1, TEMPERATURE_PRECISION);
}



void setup()
{

  pinMode ( inDI_0_PLUS, INPUT );
  pinMode ( inDI_1_ENTER, INPUT );

  lcd.begin(20,4);                                                 // inicializacia LCD
  lcd.setCursor(4,0);
  lcd.print("Brgo Teploty");
  lcd.setCursor(6,2);
  lcd.print("by BaRado");
  lcd.backlight();

//nacitanie adries z EEPROM
  eepromReadAdress();

// Start up the library
  sensors.begin();                                                   //start kniznice cidiel - pracovnych
  sensorsNew.begin();                                                //start kniznice cidiel - citanie adresy noveho cidla
  startTimeDallas = millis() + intervalDallas;                       // ulozenie startovacej pozicie casu + interval
  startTimeLCD = millis() + intervalTimeLCD;                         // ulozenie startovacej pozicie casu + interval
  startTimeLCDBackLightON = millis() + intervalTimeLCDBackLightON;   // ulozenie startovacej pozicie casu + interval

  setSensorsResolution();                                            //spustenie nastavenia rozlisenia cidiel

 
  sensors.setWaitForConversion(false);

  Serial.begin(115200);                                              //start serial

  LCDshowTemperatures=true;                                          //premenna pre zobrazovanie cidiel
 
  delay(3000);                                                       //pockaj chvilku :)
}

void loop()

  if(sensorsNew.getAddress(tempDeviceAddress, 1))                   //ak sa podari precitat adresu noveho cidla
  {
    textTempPrinted=false;                                          //vypis textu pre teploty
    lcd.backlight();                                                //podsvietenie
    startTimeLCDBackLightON = millis() + intervalTimeLCDBackLightON;   //ulozenie startovacej pozicie casu + interval
    novySenzor();                                                   //zobraz novu adresu
  }
  else                                                       
  {
    tlacidla();                                                     //zisti stav tlacidiel
 
  //zobrazujem vychodziu obrazovku 
    if (tlacidloPlusState)                                               //stlaceny PLUS
    {
      lcd.backlight();                                                   //zapni podsvietenie
      startTimeLCDBackLightON = millis() + intervalTimeLCDBackLightON;   //ulozenie startovacej pozicie casu + interval
    }
 
  //toto prebehne iba raz
    if (tlacidloEnterStateTRUE && !LCDshowAdressSettings)         //stlaceny ENTER a som na obrazovke teplot
    {
      LCDshowTemperatures=false;                                  //neukazuj teploty
      LCDshowAdressSettings=true;                                 //povol zobrazovanie adries
      lcd.backlight();                                            //zapni podsvietenie
      showAdress();                                               //zobrazuj adresy teplot
    }
 
  //vypinanie podsvietenia po uplynuti nastaveneho casu
    if( (long)( millis() - startTimeLCDBackLightON ) >= 0 && !LCDshowAdressSettings)
    {
      lcd.noBacklight();                                        //vypnutie podsvietenia
    }
 
  //nacitavanie teplot
    if (LCDshowTemperatures)
    {
      readTemp();                                              //program zobrazovania teplot
    }
 
  //zobrazujem adresy teplot 
    if (LCDshowAdressSettings)
    {
      if (tlacidloPlusStateTRUE)                              //stlacene tlacidlo PLUS
      {
        if (LCDsetAdressNumberIndex)                          //ak nastavujem adresu
        {
          setAdress();                                       //nastavovanie adresy
        }
        else
        {
          setSensorNumber++;                                 //dalsi senzor       
          showAdress();                                      //zobraz adresu senzora
        }
      }
      if (tlacidloEnterStateTRUE)                            //stlacene tlacidlo ENTER
      {
        if (!LCDsetAdressNumberIndex && setSensorNumber!=0)  //vstup do nastavovania jednotlivych poli adresy. Nie ak som v "HELP-e".
        {                                                                           
          LCDsetAdressNumberIndex=true;                         //vstup do nastavovania jednotlivych poli adresy
          setSensorNumberIndex=255;                             //nastavim pole na 255, aby som pripocitanim dostal 0-te pole adresy
          setAdress();
        }
        if (LCDsetAdressNumberIndex)                          //aktivovane nastavovanie jednotlivych poli adresy
        {
          if (setSensorNumberIndex<7 || setSensorNumberIndex==255)  //ak je pole adresy mensie ako 7 alebo sa rovna 255
          {
            setSensorNumberIndex++;                                 //zvysim cislo nastavovaneho pola adresy
            Serial.println(setSensorNumberIndex);     
          }
          else                                                      //ak nie
          {
            LCDsetAdressNumberIndex=false;                          //zrusim nastavovanie jednotlivych poli adresy a tym umoznim presun na dalsiu adresu
            showAdress();                                      //zobraz adresu senzora         
          }
        }
        tlacidloEnterStateTRUE=false;                               //vypinam ENTER
      }   
    } 
 
   //zobrazovanie teplot na LCD raz za intervalTimeLCD
    if( (long)( millis() - startTimeLCD ) >= 0)
    {
      startTimeLCD= millis() + intervalTimeLCD;
      if (LCDshowTemperatures)                                      //zobrazuj na LCD iba ak je to povolene
      {
        showTemperatures();                                         //zobrazovanie teplot na LCD
      }
    }
  }
 

}


void novySenzor(void)
{
//ak som v menu na polozke zistovania novej adresy v pripade potreby nahrady snimaca DS18B20 za novy

    lcd.clear();
    lcd.setCursor(0,0);                                          //nastavenie sa na druhy riadok LCD
    lcd.print(F("Adresa"));                                      //

    lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD
    for(int i=0;i<8; i++)                                      //vypis jednotlivych poli adresy
    {
      lcd.print(tempDeviceAddress[i],HEX);                     //zobrazenie pola adresy v HEX
      lcd.moveCursorRight();                                   //medzera na LCD
      if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti
    }
    delay(100);                                                //davam delay, aby to necitalo prilis rychlo.
}

//zistovanie zmien stavu tlacidiel
void tlacidla(void)
{
  tlacidloPlus=digitalRead(inDI_0_PLUS);                       //citaj stav tlacidla plus
  tlacidloEnter=digitalRead(inDI_1_ENTER);                     //citaj stav tlacidla enter

  // If the switch changed, due to noise or pressing:
  if (tlacidloPlus != lastTlacidloPlusState)
  {
    // reset the debouncing timer
    lastDebounceTimePlus = millis();
  }
  if ((millis() - lastDebounceTimePlus) > debounceDelay)
  {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (tlacidloPlus != tlacidloPlusState)
    {
      tlacidloPlusState = tlacidloPlus;
      if (tlacidloPlusState)
      {
        tlacidloPlusStateTRUE=true;
      }     
    }
  }


  // If the switch changed, due to noise or pressing:
  if (tlacidloEnter != lastTlacidloEnterState)
  {
    // reset the debouncing timer
    lastDebounceTimeEnter = millis();
  }
  if ((millis() - lastDebounceTimeEnter) > debounceDelay)
  {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (tlacidloEnter != tlacidloEnterState)
    {
      tlacidloEnterState = tlacidloEnter;
      if (tlacidloEnterState)
      {
        tlacidloEnterStateTRUE=true;
      }     
    }
  }
  lastTlacidloPlusState = tlacidloPlus;
  lastTlacidloEnterState = tlacidloEnter;
}

//citanie teplot bez delay
void readTemp(void)                                 
{
  if( (long)( millis() - startTimeDallas ) >= 0)
  {
    static float teplota;                                    //definovanie premennej pre docasne ulozenie teploty
    static boolean requested_1;
    if (!requested_1)                                        //ak sa este neziadalo o poskytnutie teplot
    {
      startTimeDallasWait = millis() + intervalDallasWait;

      sensors.requestTemperatures();                         //poziadavka na nacitanie teplot zo senzorov DS18B20
      requested_1=true;                                      //poziadavka uz poslana
     
      Serial.println("Poziadavka poslana"); 
    }
    if( (long)( millis() - startTimeDallasWait ) >= 0)
    {
      teplota=sensors.getTempC(ak1);
      if (teplota!=-127) 
      {
        tAk1=teplota;
      }
      Serial.print("Senzor Ak1 ");
      Serial.println(tAk1,DEC);   

      teplota=sensors.getTempC(ak2);
      if (teplota!=-127)
      {
        tAk2=teplota;
      }
      Serial.print("Senzor Ak2 ");
      Serial.println(tAk2,DEC);
     
      teplota=sensors.getTempC(ak3);
      if (teplota!=-127)
      {
        tAk3=teplota;
      }
      Serial.print("Senzor Ak3 ");         
      Serial.println(tAk3,DEC);

      teplota=sensors.getTempC(ak4);
      if (teplota!=-127)
      {
        tAk4=teplota;
      }
      Serial.print("Senzor Ak4 ");
      Serial.println(tAk4,DEC);         

      teplota=sensors.getTempC(ko1);
      if (teplota!=-127)
      {
        tKo1=teplota;
      }
      Serial.print("Senzor Ko1 ");
      Serial.println(tKo1,DEC);     
 
      teplota=sensors.getTempC(ko2);
      if (teplota!=-127)
      {
        tKo2=teplota;
      }
      Serial.print("Senzor Ko2 ");
      Serial.println(tKo2,DEC);   

      teplota=sensors.getTempC(po1);
      if (teplota!=-127)
      {
        tPo1=teplota;
      }
      Serial.print("Senzor Po1 ");
      Serial.println(tPo1,DEC);     
 
      teplota=sensors.getTempC(po2);
      if (teplota!=-127)
      {
        tPo2=teplota;
      }
      Serial.print("Senzor Po2 ");
      Serial.println(tPo2,DEC);   
     
      teplota=sensors.getTempC(vo1);
      if (teplota!=-127)
      {
        tVo1=teplota;
      }
      Serial.print("Senzor Vo1 ");
      Serial.println(tVo1,DEC);   

      teplota=sensors.getTempC(vn1);
      if (teplota!=-127)
      {
        tVn1=teplota;
      }
      Serial.print("Senzor Vn1 ");
      Serial.println(tVn1,DEC);     
     
      requested_1=false;
      startTimeDallas = millis() + intervalDallas;  // ulozenie startovacej pozicie
    }     
  }
}

//update adries v eeprom
void eepromSaveAdress(void)               
{
  static int eepromAdress;
  eepromAdress=0;                                            //skok na eeprom 0
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,ak1[i]);
    eepromAdress++;
  }
  eepromAdress=8;                                            //skok na eeprom 8
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,ak2[i]);
    eepromAdress++;
  }
  eepromAdress=16;                                            //skok na eeprom 16
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,ak3[i]);
    eepromAdress++;
  }
  eepromAdress=24;                                            //skok na eeprom 24
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,ak4[i]);
    eepromAdress++;
  } 
  eepromAdress=32;                                            //skok na eeprom 32
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,ko1[i]);
    eepromAdress++;
  }
  eepromAdress=40;                                            //skok na eeprom 40
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,ko2[i]);
    eepromAdress++;
  }
  eepromAdress=48;                                            //skok na eeprom 48
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,po1[i]);
    eepromAdress++;
  }
  eepromAdress=56;                                            //skok na eeprom 56
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,po2[i]);
    eepromAdress++;
  }
  eepromAdress=64;                                            //skok na eeprom 64
  for(int i=0;i<8; i++)
  {
    EEPROM.update(eepromAdress,vo1[i]);
    eepromAdress++;
  }
  eepromAdress=72;                                            //skok na eeprom 72
  for(int i=0;i<8; i++)
  {
     EEPROM.update(eepromAdress,vn1[i]);
    eepromAdress++;
  } 
  lcd.setCursor(0,2);
  lcd.print(F("Adresy ulozene"));                             //oznam
  setSensorsResolution();                                     //nastavenie rozlisenia teplotnych cidiel
  delay(2000);                                                //pockaj chvilicku
}


//ukazuj adresy cidiel
void showAdress(void)
{
  textTempPrinted=false;                                      //po ukonceni znovu vypis textu na LCD
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("Nast. adresy "));
  if (setSensorNumber > 10)                                  //test konca prezerania/nastavovania adries
  {
    eepromSaveAdress();                                      //update v eeprom na konci prezerania adries
  }
  switch (setSensorNumber)                                   //vypis na LCD podla prezeraneho teplotneho cidla
  {
    case 0:                                                  //maly HELP, asi to moc nepomoze tak to rozpisem sem
      lcd.print(F("Help"));                                  //posuvam sa PLUS-om, ak sa stlaci ENTER, zmeni sa sposob zobrazovania adresy do dvoch riadkov
      lcd.setCursor(0,1);                                    //a hned mozem menit PLUS-om prve pole adresy v HEX-a kode. Pole ma velkost byte-u
      lcd.print(F("PLUS pohyb v menu a"));                   //PLUS-om prechadzam hodnotu O-FF Hex(0-255 Dec) stale dookola. Ak je hodnota spravne
      lcd.setCursor(0,2);                                    //nastavena stlacam ENTER a nastavujem dalsie pole adresy. Takto nastavim osem poli
      lcd.print(F("zmena adresy.ENTER"));                    //jednej adresy a poslednym ENTER-om sa zmeni sposob zobrazenia adresy do jedneho riadku.
      lcd.setCursor(0,3);                                    //PLUS-om sa posuvam na dalsiu adresu teplotneho cidla.
      lcd.print(F("vstup do zmeny adr."));                   //Na konci vypise oznam o ulozeni adries a LCD sa prepne do zobrazovania teplot.
      break;   
    case 1:
      lcd.print(F("Ak1"));                                   //vypis nazvu cidla
      lcd.setCursor(0,2);                                    //nastavenie dalsieho riadku
      for(int i=0;i<8; i++)                                 
      {
        lcd.print(ak1[i],HEX);                               //vypis jednotlivych casti adresy
      } 
      break;
    case 2:
      lcd.print(F("Ak2"));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(ak2[i],HEX);
      }
      break;
    case 3:
      lcd.print(F("Ak3"));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(ak3[i],HEX);
      }
      break;
    case 4:
      lcd.print(F("Ak4"));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(ak4[i],HEX);
      }
      break;
    case 5:
      lcd.print(F("Ko1"));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(ko1[i],HEX);
      }
      break;
    case 6:
      lcd.print(F("Ko2"));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(ko2[i],HEX);
      }
      break;
    case 7:
      lcd.print(F("Po1"));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(po1[i],HEX);
      }
      break;
    case 8:
      lcd.print(F("Po2"));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(po2[i],HEX);
      }
      break;
    case 9:
      lcd.print(F("Vo "));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(vo1[i],HEX);
      }
      break;
    case 10:
      lcd.print(F("Vn "));
      lcd.setCursor(0,2);
      for(int i=0;i<8; i++)
      {
        lcd.print(vn1[i],HEX);
      }
      break;
  }

  tlacidloEnterStateTRUE=false;                                     //reset hodnoty tlacidla
  tlacidloPlusStateTRUE=false;                                      //reset hodnoty tlacidla

  if (setSensorNumber>10)                                           //ukoncenie nastavovania adries
  {
    setSensorNumber=0;
    LCDshowAdressSettings=false;                                   //nezobrazuj adresy
    LCDshowTemperatures=true;                                      //povol zobrazovanie teplot
  }
}


//nastavovanie jednotlivych poli adresy snimaca
void setAdress(void)           
{
  switch (setSensorNumber)                                         //nastavujem senzor ...
  {
    case 1:
      if (tlacidloPlusStateTRUE) ak1[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(ak1[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD     
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
    case 2:
      if (tlacidloPlusStateTRUE) ak2[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(ak2[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD     
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;   
    case 3:
      if (tlacidloPlusStateTRUE) ak3[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(ak3[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD     
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
    case 4:
      if (tlacidloPlusStateTRUE) ak4[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(ak4[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD     
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
    case 5:
      if (tlacidloPlusStateTRUE) ko1[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(ko1[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD   
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
    case 6:
      if (tlacidloPlusStateTRUE) ko2[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(ko2[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD   
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
    case 7:
      if (tlacidloPlusStateTRUE) po1[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(po1[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD     
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
    case 8:
      if (tlacidloPlusStateTRUE) po2[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(po2[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD 
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
    case 9:
      if (tlacidloPlusStateTRUE) vo1[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(vo1[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD     
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
    case 10:
      if (tlacidloPlusStateTRUE) vn1[setSensorNumberIndex]++;
      lcd.setCursor(0,2);
      lcd.print("                ");                             //zmazanie riadku
      lcd.setCursor(0,2);                                        //nastavenie sa na druhy riadok LCD     
      for(int i=0;i<8; i++)
      {
        lcd.print(vn1[i],HEX);                                   //vypis jednotlivych poli adresy
        lcd.print(" ");                                          //medzera na LCD   
        if (i==3) lcd.setCursor(0,3);                            //ak vypisem 4 polia tak sa posun na dalsi riadok lebo sa to s tymi medzerami nezmesti       
      }     
      break;
  } 
  lcd.print(F("        "));
  tlacidloEnterStateTRUE=false;                                  //reset stavu tlacidla
  tlacidloPlusStateTRUE=false;                                   //reset stavu tlacidla
}


// zobrazovanie teplot na LCD
void showTemperatures(void)
{
  if (!textTempPrinted)                                          //ak som uz raz zobrazil, tak uz neobrazuj
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Ak");
    lcd.setCursor(0,1);
    lcd.print("Ak");
    lcd.setCursor(0,2);
    lcd.print("Ak");
    lcd.setCursor(0,3);
    lcd.print("Ak");
    lcd.setCursor(6,0);
    lcd.print("Ko");
    lcd.setCursor(6,1);
    lcd.print("Ko");
    lcd.setCursor(6,2);
    lcd.print("Po");
    lcd.setCursor(6,3);
    lcd.print("Po");
    lcd.setCursor(12,0);
    lcd.print("Vo");
    lcd.setCursor(12,1);
    lcd.print("Vn"); 
    textTempPrinted=true;
  }
  //vypis teplot na LCD cez funkciu
 
    showParValueFloat(tAk1, 4, 0);
    showParValueFloat(tAk2, 4, 1);   
    showParValueFloat(tAk3, 4, 2);
    showParValueFloat(tAk4, 4, 3);   
    showParValueFloat(tKo1, 10, 0);
    showParValueFloat(tKo2, 10, 1);
    showParValueFloat(tPo1, 10, 2);   
    showParValueFloat(tPo2, 10, 3);     
    showParValueFloat1(tVo1, 18, 0);
    showParValueFloat1(tVn1, 18, 1);
}

//vypis hodnoty na LCD (hodnota, stlpec, riadok)
//zabezpeci zmazanie buniek LCD a zarovnanie podla hodnoty teploty
void showParValueFloat(float Value, int menuCol, int menuRow)
{
  menuCol-=2;                                  //posun o dve bunky dolava
  lcd.setCursor(menuCol,menuRow);              //nastavenie na LCD
  lcd.print("    ");                           //zmazanie buniek
  menuCol+=2;                                  //posun o dve bunky doprava
  if (Value<0)                                 //ak hodnota mensia ako 0
  {
    menuCol--;                                 //posun o jednu bunku dolava
    if (Value<=-10)                            //ak hodnota mensia rovna ak -10
    {
      menuCol--;                               //posun o jednu bunku dolava
    }
    if (Value<=-100)                           //ak hodnota mensia rovna ako -100
    {
      menuCol--;                               //posun o jednu bunku dolava
    }
  }
  if (Value>0)                                 //ak hodnota vacsia ako 0
  {
    if (Value>=10)                             //ak hodnota vacsia rovna ako 10
    {
      menuCol--;                               //posun o jednu bunku dolava
    }
    if (Value>=100)                            //ak hodnota vacsia rovna ako 100
    {
      menuCol--;                               //posun o jednu bunku dolava
    }   
  }
  lcd.setCursor(menuCol,menuRow);              //nastavenie na vysledny stlpec a riadok
  lcd.print(Value,0);                          //vypis hodnoty na LCD bez desatinneho miesta
}


//vypis hodnoty na LCD (hodnota, stlpec, riadok)
//zabezpeci zmazanie buniek LCD a zarovnanie podla hodnoty teploty
void showParValueFloat1(float Value, int menuCol, int menuRow)
{
  menuCol-=4;                                  //posun o dve bunky dolava
  lcd.setCursor(menuCol,menuRow);              //nastavenie na LCD
  lcd.print("    ");                           //zmazanie buniek
  menuCol+=2;                                  //posun o dve bunky doprava
  if (Value<0)                                 //ak hodnota mensia ako 0
  {
    menuCol--;                                 //posun o jednu bunku dolava
    if (Value<=-10)                            //ak hodnota mensia rovna ak -10
    {
      menuCol--;                               //posun o jednu bunku dolava
    }
    if (Value<=-100)                           //ak hodnota mensia rovna ak -100
    {
      menuCol--;                               //posun o jednu bunku dolava
    }
  }
  if (Value>0)                                 //ak hodnota vacsia ako 0
  {
    if (Value>=10)                             //ak hodnota vacsia rovna ako 10
    {
      menuCol--;                               //posun o jednu bunku dolava
    }
    if (Value>=100)                            //ak hodnota vacsia rovna ako 100
    {
      menuCol--;                               //posun o jednu bunku dolava
    }   
  }
  lcd.setCursor(menuCol,menuRow);              //nastavenie na vysledny stlpec a riadok
  lcd.print(Value,1);                          //vypis hodnoty na LCD bez desatinneho miesta
}

Späť na Projekty vo fáze vývoja