Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Arduino koodijupp - keskkütte automaatika märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 12.12.2014 23:37:32 Arduino koodijupp - keskkütte automaatika vasta tsitaadiga

Tahaks kesküttepumpa juhtida vastavalt toa temperatuurile.

Ühte osa koodist ei saa tööle nagu tahaks:

  if(toaC < 20 && radikaC > 35){
     digitalWrite(relayRadiator, HIGH);
     do{
       delay(250);
       double toaC = (analogRead(toatemp) * 3.3) / 4095*100;
       double radikaC = (analogRead(radikatemp) * 3.3) / 4095*100;
     }while(toaC > 22);
      digitalWrite(relayRadiator, LOW);

   }


Tahaks et see töötaks nii: Kui toa temp on alla 20C ning vesi paagis on üle 35c siis lülitub pump sisse. Ning töötab niikaua kui toa temp on üle 22c (et vältida relee klõpsimist 20c piirimail). Hetkel hakkab miskipärast relee sisse välja plõksima kui temp alla 20c läheb.
Progemises olen suht võhik muidu ning vbl "do while" ei sobi?


viimati muutis Terror 30.01.2015 19:35:57, muudetud 2 korda
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
karu
HV kasutaja

liitunud: 08.08.2002




sõnum 13.12.2014 01:11:05 vasta tsitaadiga

tsitaat:

while(toaC > 22);

while(toaC < 22);
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
LKits
HV Guru
LKits

liitunud: 06.09.2007




sõnum 13.12.2014 11:02:42 vasta tsitaadiga

Väga huvitavalt lahendatud kood... Ei saa muidugi aru, miks pumba sisselülitamise tingimust ainult ühe korra kontrollitakse, aga no võib-olla on see tõesti vajalik.

Mina lahendaksin selle olukorra robustselt, arusaadavalt.
PS: Kuna pole Arduinoga tuttav, siis võib esineda pisikesi syntaxi vigu. Eeldan, et suudad need ise lahendada icon_smile.gif

double toaC = 0.0; //defineeritakse muutujad
double radikaC = 0.0;
int c = 0; //kontrollmuutuja, et relee ei hakkaks pidevalt sisse/välja lülituma

digitalWrite(relayRadiator, LOW); //enne lõpmatut kordust lülitatakse relee "LOW" asendisse

while(true) {

    toaC = (analogRead(toatemp) * 3.3) / 4095*100; //arvutatakse temperatuurid
    radikaC = (analogRead(radikatemp) * 3.3) / 4095*100;

    if(toaC < 20 && radikaC > 35 && c == 0) {
        c = 1;
        digitalWrite(relayRadiator, HIGH); //paneb relee "HIGH" asendisse
    }

    if(toaC > 22 && c == 1) {
        c = 0;
        digitalWrite(relayRadiator, LOW); //paneb relee "LOW" asendisse
    }

    delay(250);
}

_________________
itLahendused - Arvutite remont ja hooldus, veebilehtede loomine, soodne veebimajutus. Võta ühendust! Tel: +372 555 268 97 ja e-post info@itlahendused.ee
Kommentaarid: 13 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 13
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
matukaz
HV kasutaja
matukaz

liitunud: 24.05.2006



Autoriseeritud ID-kaardiga

sõnum 13.12.2014 13:32:20 vasta tsitaadiga

Arduino main funktsioon käivitub iga tsükli tagant uuesti nii, et pumba sisselülitamise if lauset kontrollitaksegi koguaeg.

Ühesõnaga main funktsioon on igaveses loopis.
Kommentaarid: 28 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
LKits
HV Guru
LKits

liitunud: 06.09.2007




sõnum 13.12.2014 14:28:45 vasta tsitaadiga

Ahnii - siis seda "while(true)" polegi ümber vaja icon_smile.gif

EDIT: Oot, oot, aga mis juhtub, kui "relayRadiator" on juba näiteks "LOW" peale pandud ja kood tolle uuesti "LOW" peale paneb?
Kui uuesti "loop"-i läheb, kas muutujad jäävad mällu või kustuvad kõik ära?

_________________
itLahendused - Arvutite remont ja hooldus, veebilehtede loomine, soodne veebimajutus. Võta ühendust! Tel: +372 555 268 97 ja e-post info@itlahendused.ee
Kommentaarid: 13 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 13
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
RassK
HV Guru
RassK

liitunud: 17.01.2007



Autoriseeritud ID-kaardiga

sõnum 13.12.2014 15:05:42 vasta tsitaadiga

LKits, main on täpselt sama hea kui while(true)... seega toimib täiesti.
Kommentaarid: 116 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 101
tagasi üles
vaata kasutaja infot saada privaatsõnum
LKits
HV Guru
LKits

liitunud: 06.09.2007




sõnum 13.12.2014 15:07:48 vasta tsitaadiga

Kui "main" kordusega kaovad ära muutujad, siis ei ole kohe üldse sama hea icon_wink.gif
while(true)-ga jäävad alles kõik muutujad icon_smile.gif

_________________
itLahendused - Arvutite remont ja hooldus, veebilehtede loomine, soodne veebimajutus. Võta ühendust! Tel: +372 555 268 97 ja e-post info@itlahendused.ee
Kommentaarid: 13 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 13
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
bladerunner
HV Guru

liitunud: 17.01.2002



Autoriseeritud ID-kaardiga

sõnum 13.12.2014 16:26:54 vasta tsitaadiga

Globaalmuutujad säilitavad kõik kenasti oma väärtusi ju?

Üldjuhul peaks Arduino kood selline ju välja nägema:

double toaC = 0.0;
double radikaC = 0.0;

void setup () {
}

void loop () {
}

Ja loop() kutsutakse automaagiliselt pidevalt välja.

_________________
Experience is what you get when you don't get what you want.
Kommentaarid: 168 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 157
tagasi üles
vaata kasutaja infot saada privaatsõnum
matukaz
HV kasutaja
matukaz

liitunud: 24.05.2006



Autoriseeritud ID-kaardiga

sõnum 13.12.2014 19:28:36 vasta tsitaadiga

Muutujad jäävad ikka mällu edasi samal kujul icon_smile.gif, hea oleks ainult ära märkida, mis on esialgsete muutujate väärtused ja see ka kõik see ikka selleks juhuks kui arduinol kaob elekter korraks ära, muud ei midagi.


Tundub et teema on end ammendanud esialgu.
Kommentaarid: 28 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 13.12.2014 20:24:28 vasta tsitaadiga

Hetke kood siis selline, Saadab andmed ka kord minutis netti https://thingspeak.com/channels/20611
Keegi kes asja jagab võiks pilgu peale visata võimalusel, et ega ma mõne hea tava vastu hullult eksinud pole.
Spoiler Spoiler Spoiler
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
bladerunner
HV Guru

liitunud: 17.01.2002



Autoriseeritud ID-kaardiga

sõnum 13.12.2014 20:38:53 vasta tsitaadiga

Analoogseadmest lugedes soovitaks nt 5x näitu võtta 0.1s vahega ja sealt kõige suurema ja kõige väiksema kõrvale jätta ning ülejäänutest keskmise arvutada. Sel viisil saad võimalikest näidu lugemise anomaaliatest lahti.
_________________
Experience is what you get when you don't get what you want.
Kommentaarid: 168 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 157
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 14.12.2014 13:00:54 vasta tsitaadiga

Olen mõelnud, kuid hetkel pole see prioriteet kuna näit ei kõigu üle 0,2c.
Avastasin aga koodist ühe kala. Nimelt:
  if(toaC < 20 && radikaC > 35){
     digitalWrite(relayRadiator, HIGH);
     do{
       delay(250);
       double toaC = (analogRead(toatemp) * 3.3) / 4095*100;
       double radikaC = (analogRead(radikatemp) * 3.3) / 4095*100;
     }while(toaC < 22 || radikaC > 30 );
      digitalWrite(relayRadiator, LOW);
        lcd->setCursor(11,3);
        lcd->print("xxx");
   }

See on loop() sees ning kui temp langeb alla 20c läheb asi do tsüklisse ning ei tule sealt enne välja kui radikate vesi jahtunud või toa temp kõrgem kui 21. Probleem on aga selles ,et siis ei upi ta andmeid netti ning ei uuenda kellaaega lcd'l.
Ma saan aru, et ma peaks tegema sellele eelnevalt võetud koodijupile eraldi funktsiooni mille kutsun main loopis välja, või midagi sinnakanti? Point oleks see ,et ta ei tohiks main loopi kinni tõmmata nagu ta seda praegu teeb.


viimati muutis Terror 14.12.2014 15:03:56, muudetud 2 korda
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
19Mart94
HV kasutaja

liitunud: 22.06.2010



Autoriseeritud ID-kaardiga

sõnum 14.12.2014 14:03:03 vasta tsitaadiga

Terror kirjutas:
Olen mõelnud, kuid hetkel pole see prioriteet kuna näit ei kõigu üle 0,2c.
Avastasin aga koodist ühe kala. Nimelt:
  if(toaC < 20 && radikaC > 35){
     digitalWrite(relayRadiator, HIGH);
     do{
       delay(250);
       double toaC = (analogRead(toatemp) * 3.3) / 4095*100;
       double radikaC = (analogRead(radikatemp) * 3.3) / 4095*100;
     }while(toaC < 22 || radikaC > 30 );
      digitalWrite(relayRadiator, LOW);
        lcd->setCursor(11,3);
        lcd->print("xxx");
   }

See on loop() sees ning kui temp langeb alla 20c läheb asi do tsüklisse ning ei tule sealt enne välja kui radikate vesi jahtunud või toa temp kõrgem kui 21. Probleem on aga selles ,et siis ei upi ta andmeid netti ning ei uuenda kellaaega lcd'l.
Ma saan aru, et ma peaks tegema sellele eelnevalt võetud koodijupile eraldi funktsiooni mille kutsun main loopis välja, või midagi sinnakanti? Point oleks see ,et ta ei tohiks main loopi kinni tõmmata nagu ta seda praegu teeb.

Kuna kogu kood kordab ennast nagunii iga ~1100ms järelt, siis miks mitte teha nii (HIGH/LOW võib vahetuses olla; mõtle koodi loogika kenasti läbi, see on lihtsalt idee):

if(toaC < 20 && radikaC > 35){
   digitalWrite(relayRadiator, HIGH);
} else if(toaC < 22 || radikaC > 30) {
   digitalWrite(relayRadiator, LOW);
}

lcd->setCursor(11,3);
lcd->print("xxx");
Kommentaarid: 33 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 31
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 14.12.2014 15:12:51 vasta tsitaadiga

Ühest eelnevast näitest inspireerituna sain vist tehtud:

Loopis:
c = tempkontroll(radikaC, toaC, c);

+


int tempkontroll(double radikaC, double toaC, int c)
    {   
            lcd->setCursor(1,3);
             lcd->print("tempk");
             lcd->setCursor(11,3);
             lcd->print(c);
        if(toaC < 21 && radikaC > 35 && c == 0) {
        c = 1;
        digitalWrite(relayRadiator, HIGH); //paneb relee "HIGH" asendisse
        }

        else if(toaC > 22 && c == 1) {
        c = 0;
        digitalWrite(relayRadiator, LOW); //paneb relee "LOW" asendisse
        }
        return c;
    }
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 15.12.2014 23:45:55 vasta tsitaadiga

Kas temperatuuri kontrollerit mitte PID algoritmiga ei oleks mõistlikum ehitada ?
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 16.12.2014 09:06:26 vasta tsitaadiga

kpihus kirjutas:
Kas temperatuuri kontrollerit mitte PID algoritmiga ei oleks mõistlikum ehitada ?

Tulevikus võib mõelda keerulisemate algoritmide peale, hetkel plaanis lihtne ning töötav kood koos toimmiva riistvaraga valmis teha ning siis ajapikku võib asja täiustada.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
Miraakel
HV vaatleja
Miraakel

liitunud: 07.10.2009




sõnum 30.01.2015 16:59:04 vasta tsitaadiga

Päris põnev projekt. Missugust Arduinot kasutad? Kas wifi teel juhitav (on/off) voolupistiku ehitamine oleks alustuseks liiga ambitsioonikas ettevõtmine?
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 30.01.2015 19:35:05 vasta tsitaadiga

Spark Core kasutan. https://www.spark.io/
Wifi on integreeritud sellel. Igatepidi super asi kui välja arvata see, et kontrolleri enda firmware on kohati bugine, kuid eks seda ajapikku ehk fixitakse.


Keskütte automaatika koosneb siis Spark Core mikrokontrollerist, 2 releest 3 analoogtemp andurist ning ühest "thermocouple" andurist mis mõõdab korstna tempi.
Automaatika lülitab automaatsele sisse välja kesküttepliidi ning radika pumpa. Vajadusel saab ka manuaalselt ON reziimi panna. (punane tuli lülitil tähistab seda, et antud pump parasjagu töötab. Hetkel asi ca kuu aega viperusteta tööd teinud.
Kõik temperatuurid ning pumba ON/OFF tsüklid uploaditakse ka thinspeak lehele kus saab tagantjärele graafikuid vaadata.

Spoiler Spoiler Spoiler
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Arduino koodijupp - keskkütte automaatika
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.