Teploty s DS18B20
Príspevok: 1
• Stránka 1 z 1
Teploty s DS18B20
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.
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
}
Príspevok: 1
• Stránka 1 z 1