Arduino termostat a vlhkomer so senzorom DHT22

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

mumlo
Okoloidúci
Okoloidúci
Príspevky: 3
Dátum registrácie: 11 Okt 2010, 00:00
Bydlisko: Malá Čalomija
Vek: 35

Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa mumlo » 12 Aug 2015, 22:43

Zdravím Vás
V programovaní som začiatočník. Naprogramoval som si tento termostat. Program aj zapojenie funguje problém mi ale robí naprogramovať to tak aby som vedel pridávať a uberať stupne po desatinách. Zatiaľ to mám naprogramované tak že pridávam a uberám iba celé stupne. Bol by som rád ak by mi vedel niekto pomôcť.

Tu je kód:

Kód: Vybrať všetko

#include <DHT.h>
#include <EEPROM.h>        
#include <LiquidCrystal.h> 
#define DHTPin A0
#define DHTTYPE DHT22

DHT dht(DHTPin,DHTTYPE);

LiquidCrystal lcd(5,4,3,2,1,0); 
int Rele = 8;     
int TlacPlus = 6;     
int TlacMinus = 7;     
float settemp;
void setup()
{
  pinMode(Rele,OUTPUT); //nastavenie pinu ako výstup
  pinMode(TlacPlus,INPUT_PULLUP);  //nastavenie pinu ako vstup
  pinMode(TlacMinus,INPUT_PULLUP);  //nastavenie pinu ako vstup
  lcd.begin(16,2);
  dht.begin();      
  EEPROM.read(1);
}
void loop()
{
  float vlhkost = dht.readHumidity();
  float teplota = dht.readTemperature();
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("T:");        // T - Teplota
  lcd.print(teplota);     //vypíš hodnotu zo senzora
  lcd.print((char)223);   //znak stupeň Celsius
  lcd.print("C");    
  lcd.print("H:");        // H - vlhkosť
  lcd.print(vlhkost);     //vypíš hodnotu zo senzora
  lcd.print("%");
  settemp = EEPROM.read(1);  //načítaj nastavenú teplotu z EEPROM pamäte
  
  if (digitalRead(TlacPlus)==LOW)  //ak je tlačidlo stlačené
  {
    settemp++;      //pridaj stupne
  }
  else
  {
  }

  if (digitalRead(TlacMinus)==LOW)    //ak je tlačidlo stlačené
  {
    (settemp--);      //uber stupne
  }
  else
  {
  }
  lcd.setCursor(0,1);
  lcd.print("I: ");       // I - Ideálna teplota 
  lcd.print(settemp);     //vypíš nastavenú teplotu
  lcd.print((char)223);   //znak stupeň Celsius
  lcd.print("C");    
  EEPROM.write(1,settemp);  //ulož nastavenú teplotu do pamäte
  delay(100);
  
  if (teplota<settemp) //ak je teplota menšia ako ideálna (nastavená) teplota
  {
    digitalWrite(Rele,HIGH); //zopni Relé
  }
  else              //inak
  {
    digitalWrite(Rele,LOW); //rozopni Relé
  }
}
Prílohy
Tu je zapojenie:
Tu je zapojenie:
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa peterple » 12 Aug 2015, 23:04

tak ako to máš tak

Kód: Vybrať všetko

settemp+=0.1
settemp-=0.1
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
lh
Pokročilý člen
Pokročilý člen
Príspevky: 715
Dátum registrácie: 23 Mar 2013, 14:02
Bydlisko: z južnej strany Poľany
Vek: 45

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa lh » 12 Aug 2015, 23:29

Ak budeš mať tak presne nastavenú teplotu, odporúčal by som Ti dorobiť hysterézu, aby Ti to relé stále necvakalo.
0

mumlo
Okoloidúci
Okoloidúci
Príspevky: 3
Dátum registrácie: 11 Okt 2010, 00:00
Bydlisko: Malá Čalomija
Vek: 35

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa mumlo » 28 Aug 2015, 20:25

peterple napísal:tak ako to máš tak

Kód: Vybrať všetko

settemp+=0.1
settemp-=0.1
Toto som už skúšal a takto mi to nefunguje. Keď to spravím takto a stlačím tlačidlo Pridať teplotu tak mi to pridá 0.1 stupňa ale hneď ako pustím tlačidlo tak mi to skočí naspäť na pôvodnú teplotu, takže mi nepridá nič. A keď stlačím tlačidlo Ubrať teplotu tak mi to uberie normálne celé číslo a nie jednu desatinu.

-- 28 Aug 2015, 20:26 --
lh napísal:Ak budeš mať tak presne nastavenú teplotu, odporúčal by som Ti dorobiť hysterézu, aby Ti to relé stále necvakalo.
Ako by si spravil tú hysteréziu?
0

Používateľov profilový obrázok
lh
Pokročilý člen
Pokročilý člen
Príspevky: 715
Dátum registrácie: 23 Mar 2013, 14:02
Bydlisko: z južnej strany Poľany
Vek: 45

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa lh » 28 Aug 2015, 20:34

No problém je asi v tom, ako nastavenú teplotu zapisuješ a čítaš z EEPROM. Nepoznám síce detaily makra EEPROM.write / read v arduino, ale predpokladám, že do EEPROM zapisuje a danú adresu celočíselnú 8bit hodnotu, tj. 0 - 255. Takže ak chceš ukladať desatinné miesta, tak to rieš buď zápisom/čítaním z dvoch adries, v tom prípade ti zostane zachovaný rozsah nastavenia od 0 do 255.255°C, alebo ukladaj na jednu adresu násobok nastavenej hodnoty. To si ale zmenšíš rozsah nastavenia na 0 - 25.5°C.

K tej hysteréze:
Najjednoduchšie je nastaviť konštantnú hysterézu. Tzn., že keď zapínaš napr. pri 5.1°C tak podľa toho, či zapínaš ventilátor, alebo ohrev, mal by si vypínať pri 5.1°C± napr. 1°C. Keď chladíš tak -x°C ak zohrievaš tak +x°C

Takže sa vyhneš takémuto scenáru: (príklad so zapínaním chladenia)
teplota stúpne na 5.2°C
zapínaš chladenie
chladenie zníži telplotu na 5.1°C za 1s
vypínaš chladenie..... a tak dookola...

Rozdiel teplôt treba zvoliť s ohľadom na rýchlosť zmeny teploty po zapnutí chladenia.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa peterple » 28 Aug 2015, 20:53

Z tej tvojej prvej otázky to tak vyzeralo že nevieš pripočíťať odpočíťať inak než pomocou ++/--. To že si také skúšal si nenapísal. lh ti to vysvetlil kde je pes zakopaný. Ja som ten kód ani neštudoval. Napríklad aj detekcia tlačítok je napísaná úplne nedostatočne. Ďalšia tragédia je to ukladanie do EEPROM každú 0,1 sekundu. To vieš že životnosť EEPROM je výrobcom garantovaná na 100tisíc zápisov? Pri tovej frekvencii zápisov to máš za 3 hodiny. Ona tá EEPROM neodíde samozrejme okamžite po tom limite ale už si nebude pamätať tak dlho ako je garantované v DS.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
lh
Pokročilý člen
Pokročilý člen
Príspevky: 715
Dátum registrácie: 23 Mar 2013, 14:02
Bydlisko: z južnej strany Poľany
Vek: 45

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa lh » 28 Aug 2015, 22:13

peterple napísal:Ďalšia tragédia je to ukladanie do EEPROM každú 0,1 sekundu.
Vidíš, a to som si vôbec neuvedomil... asi preto, že to je taká vec, že som nepredpokladal, že to niekto takto použije 8O

Ak má tlačítka ošetrené hardwarovm, tak mu to môže fungovať v poriadku. Aj keď v schéme nič nemá, možno sa mu to do simulácie nechcelo dokresľovať.

pre mumlo:
Možno by bolo dobre, keby si trochu viac popísal, kde a akým spôsobom chceš teplotu udržiavať, a či Ťa nejaký dôvod viedol k tým častým zápisom a čítaniam, alebo je to len nedomyslené. Predpokladám že PC ani skleník to nebude, keď požaduješ nastavenie na 0.1°C

edit:
ešte k DHT22 a presnosti... mám jeden DHT22 doma, a presnosť merania vlhkosti je katastrofa, a s teplotou je to síce lepšie, ale nie som si istý, že má zmysel regulovať na 0.1°C na základe údajov z tohto senzora. Takisto perióda merania 0.1s je zbytočne krátka. Ber to len ako podnet na zamyslenie.

Model DHT22
Operating range humidity 0-100%RH; temperature -40~80Celsius
Accuracy humidity +-2%RH(Max +-5%RH); - toto sa mi nepodarilo nikdy... ale je pravda, že ten môj senzor je z Ebay
Accuracy temperature <+-0.5Celsius
Resolution or sensitivity humidity 0.1%RH;
Resolution or sensitivity temperature 0.1Celsius
Repeatability humidity +-1%RH;
Repeatability temperature +-0.2Celsius
Humidity hysteresis +-0.3%RH
Long-term Stability +-0.5%RH/year
Sensing period Average: 2s
Interchangeability fully interchangeable
Dimensions small size 14*18*5.5mm; big size 22*28*5mm
0

mumlo
Okoloidúci
Okoloidúci
Príspevky: 3
Dátum registrácie: 11 Okt 2010, 00:00
Bydlisko: Malá Čalomija
Vek: 35

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa mumlo » 29 Aug 2015, 14:14

Týmto termostatom by som chcel ovládať liaheň na kuriatka. S tou EEPROM som to určite úplne nedomyslel. Mne by stačilo tú teplotu uložiť raz za deň.
Malo by to fungovať nasledovne:

Relé mi bude spínať žiarovky. Tie žiarovky mi vlastne majú ohrievať vzduch v liahni. V liahni potrebujem nasledovné teploty:

● Prvých 8 dní nastaviť výstupnú teplotu v liahni na 39 °C a vlhkosť na 66 %.

● Od 9. do 11. dňa výstupnú teplotu liahne udržiavať na 39,3 % a vlhkosť na 70 %.

● 12. a 13. výstupná teplota v liahni 39,5 °C a vlhkosť 70 %.

● 14. a 15. deň výstupná teplota stále 39,5 °C, vlhkosť zvýšiť na 75 %.

● 16. až 18. deň výstupná teplota 39,8 °C, vlhkosť 75 %.

● 19. deň výstupná teplota 39,8 °C a vlhkosť 80 %.

● 20. a 21. deň (kuriatka sa na 20. deň už kľujú a na 21. deň liahnu) výstupná teplota 40 °C, vlhkosť 80 %.

Kvôli tomuto potrebujem nastavovať stupne v desatinách. Samozrejme datasheet DHT-čka mám preštudovaný a viem že presnosť má iba 0,5°C. Stačilo by mi to keby sa mi to dalo regulovať aj po pol stupňoch. Starý termostat nebol vôbec takýto presný takže keby sa mi to dalo takto spraviť tak by to bolo super. Zapisovať tie stupne do EEPROM pamäte by mi stačilo raz za deň a to kvôli tomu, že v poslednom čase u nás dosť často vypadáva elektrina a keď sa to vypne a znovu zapne tak sa to vynuluje. Po vynulovaní sa automaticky nastaví teplota na 255°C. To by potom tie žiarovky svietili stále a vajcia by sa mi v liahni uvarili. Preto potrebujem aby mi aj po takomto výpadku elektriny termostat reguloval teplotu.
0

Používateľov profilový obrázok
lh
Pokročilý člen
Pokročilý člen
Príspevky: 715
Dátum registrácie: 23 Mar 2013, 14:02
Bydlisko: z južnej strany Poľany
Vek: 45

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa lh » 29 Aug 2015, 16:47

Asi by som pouvažoval nad RTC modulom so zálohovou batériou. Napr. takýto A požadované časy a teploty uložil do EEPROM a potom už len čítať a spínať. A kurence budeš chodiť len kontrolovať, nemusíš nič nastavovať.

Rád by som vedel, aký vplyv na psychický vývoj kureniec majú blikajúce žiarovky :biggrin:
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa peterple » 30 Aug 2015, 14:04

mumlo napísal:S tou EEPROM som to určite úplne nedomyslel. Mne by stačilo tú teplotu uložiť raz za deň.
Zapisovať tie stupne do EEPROM pamäte by mi stačilo raz za deň a to kvôli tomu, že v poslednom čase u nás dosť často vypadáva elektrina a keď sa to vypne a znovu zapne tak sa to vynuluje. Po vynulovaní sa automaticky nastaví teplota na 255°C. To by potom tie žiarovky svietili stále a vajcia by sa mi v liahni uvarili. Preto potrebujem aby mi aj po takomto výpadku elektriny termostat reguloval teplotu.
Zapisovať do EEPROM treba vtedy keď sa tá nastavená hodnota zmenila a nie každých 100ms. Tiež nerozumiem prečo by sa mala teplota po resete nastaviť na 255. Ved si ju nastavím ako chcem. Napr na 39 stupňov a je.

V podstate ti stačí naozaj jediný byte v EEPROM. To je rozsah od 0 do 255. Ber to ako že je to 10 násobok. Teda máš rozsah od 0 do 25.5
No a ešte pripočítaš 20 a máš rozsah od 20 do 45.5. Potom už len tabuľka takýchto čísel po jednotlivých dňoch a máš to.

Keď máš výpadky napätia daj to na baterky a skús taktovať interným 128kHz oscilátorom. Alebo zálohuj pomocou 1F kondenzátorom, možno to výpadky vykryje. RTC je tiež riešenie.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
spin90
Ultimate člen
Ultimate člen
Príspevky: 4642
Dátum registrácie: 12 Jan 2008, 00:00
Bydlisko: Kosice
Vek: 33

Re: Arduino termostat a vlhkomer so senzorom DHT22

Príspevok od používateľa spin90 » 16 Júl 2016, 16:21

Neviem ci to je este aktualne, ale tu hystereziu ste ako nastavili v programe ? Neviem na to prist ako to robit, Diedka mi blika pri prechode zo stavov . Ako sa to robi aby mi to neblblo? Chcem hystereziu naprklad 0,5 stc. Su tam 3 rezimy /cez PWM). Nejaky napad? neviem si uz rady.

Teraz mam nieco take:

if(teplota1<=nastavtep11){
analogWrite(mosfet1,10);
};
if(teplota1>nastavtep11 && teplota1<nastavtep12){
analogWrite(mosfet1,100);
};
if(teplota1>=nastavtep12){
analogWrite(mosfet1,255);
};
Ale samozrejme je to spatne.
0
"Je to smutná epocha, keď je ľahšie rozbiť atóm ako predsudky."
A. Einstein

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok