Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Aidake leida loogikaviga Arduino koodis 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
otsing:  
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 09.03.2018 15:01:53 Aidake leida loogikaviga Arduino koodis vasta tsitaadiga

On üks vana valvekeskus mida ei saa seadistada ning seetõttu aretasin sinna kunagi Arduino taha mis annaks valvekeskusele õhtul käskluse valvesse minna.
Süsteem peaks töötama nii, et 22.20 läheb maja automaatselt valvesse, kui keegi pole juba enne ise pannud.
Kui nüüd peaks olema soov enne hommikut valvest maha võtta, siis valvestab Arduino uuesti automaatselt 30 min möödudes.
Bug on selles, et kohati peale 22.20 üritades valvet maha võtta ei aktiveeru 30min countdown uuesti vavestuseks vaid arduino valvestab koheselt uuesti (st ei saagi enne hommikut valvet maha võtta).

Countdown osa koodist:

void Countdown(){
 

    if (Tarm<0 && digitalRead(sensePin) == 0){
        wait =1; //kui automaatse valvestuse countdown on alla nulli ja valve on sisse lülitatud...
        } 
    if(Tarm>0 && digitalRead(sensePin) == 1){ //kui automaatse valvestuse countdown ei ole veel nulli jõudnud ning valve ei ole sees...
 
        wait=0;
        long hours=0;
        long mins=0;
        long secs=0;
        secs = Tarm; //convect milliseconds to seconds
        mins=secs/60; //convert seconds to minutes
        hours=mins/60; //convert minutes to hours
   
        secs=secs-(mins*60); //subtract the coverted seconds to minutes in order to display 59 secs max
        mins=mins-(hours*60); //subtract the coverted minutes to hours in order to display 59 minutes max
   
        lcd->setCursor(5,2);
        lcd->print("Arming in: ");
        lcd->setCursor(6,3);
        if(hours<10) lcd->print('0');
        lcd->print(hours);
        lcd->print(":");
        if(mins<10) lcd->print('0');
        lcd->print(mins);
        lcd->print(":");
        if(secs<10) lcd->print('0');
        lcd->print(secs);
    }
 
    if ((digitalRead(sensePin == 1) && Tarm < 0 && wait !=1) || (digitalRead(sensePin == 1) && Tcurr<19500 && wait !=1)){ //kui valve on maas ja taimer on alla nulli ja WAIT on 0. VÕI. sama +tänase päeva sek väiksem kui 19500 (5:25AM). ->valvestab koheselt. 

        lcd->clear();
        lcd->setCursor(7,2);
        lcd->print("Arming");
        digitalWrite(armPin, HIGH);
        delay(1000);
        digitalWrite(armPin, LOW);
        delay(5000);
    }
 
   if ((digitalRead(sensePin) && Tarm < 0 && wait ==1) || (digitalRead(sensePin) && Tcurr<19500 && wait ==1)){ //sama mis eelmine, kuid kui WAIT on 1, siis valvestab 30min pärast.
 
    int armTimer =29;
    while (armTimer > 1) {
        for (int i=armTimer; i > -1; i--){
            armTimer = i;
            lcd->clear();
            lcd->setCursor(4,2);
            lcd->print("Rearming in: ");
            lcd->setCursor(7,3);
            if(armTimer<10) lcd->print('0');
            lcd->print(armTimer);
            lcd->print(":");
     
            for (int j=59; j > -1; j--){
                digitalClockDisplay();
                lcd->setCursor(10,3);
                if(j<10) lcd->print('0');
                lcd->print(j);
                if (!digitalRead(sensePin)) {return;}
                delay(1000);
                }
            }
        }
    lcd->clear();
    lcd->setCursor(7,2);
    lcd->print("Arming");
    digitalWrite(armPin, HIGH);
    delay(1000);
    digitalWrite(armPin, LOW);
    delay(5000);
    }
}

_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
sukelduja
HV Guru
sukelduja

liitunud: 14.06.2007




sõnum 09.03.2018 16:10:55 Re: Aidake leida loogikaviga Arduino koodis vasta tsitaadiga

Terror kirjutas:
On üks vana valvekeskus mida ei saa seadistada ning seetõttu aretasin sinna kunagi Arduino taha mis annaks valvekeskusele õhtul käskluse valvesse minna.
Süsteem peaks töötama nii, et 22.20 läheb maja automaatselt valvesse, kui keegi pole juba enne ise pannud.
Kui nüüd peaks olema soov enne hommikut valvest maha võtta, siis valvestab Arduino uuesti automaatselt 30 min möödudes.
Bug on selles, et kohati peale 22.20 üritades valvet maha võtta ei aktiveeru 30min countdown uuesti vavestuseks vaid arduino valvestab koheselt uuesti (st ei saagi enne hommikut valvet maha võtta).

Countdown osa koodist:

void Countdown(){
 

    if (Tarm<0 && digitalRead(sensePin) == 0){
        wait =1; //kui automaatse valvestuse countdown on alla nulli ja valve on sisse lülitatud...
        } 
    if(Tarm>0 && digitalRead(sensePin) == 1){ //kui automaatse valvestuse countdown ei ole veel nulli jõudnud ning valve ei ole sees...
 
        wait=0;
        long hours=0;
        long mins=0;
        long secs=0;
        secs = Tarm; //convect milliseconds to seconds
        mins=secs/60; //convert seconds to minutes
        hours=mins/60; //convert minutes to hours
   
        secs=secs-(mins*60); //subtract the coverted seconds to minutes in order to display 59 secs max
        mins=mins-(hours*60); //subtract the coverted minutes to hours in order to display 59 minutes max
   
        lcd->setCursor(5,2);
        lcd->print("Arming in: ");
        lcd->setCursor(6,3);
        if(hours<10) lcd->print('0');
        lcd->print(hours);
        lcd->print(":");
        if(mins<10) lcd->print('0');
        lcd->print(mins);
        lcd->print(":");
        if(secs<10) lcd->print('0');
        lcd->print(secs);
    }
 
    if ((digitalRead(sensePin == 1) && Tarm < 0 && wait !=1) || (digitalRead(sensePin == 1) && Tcurr<19500 && wait !=1)){ //kui valve on maas ja taimer on alla nulli ja WAIT on 0. VÕI. sama +tänase päeva sek väiksem kui 19500 (5:25AM). ->valvestab koheselt. 

        lcd->clear();
        lcd->setCursor(7,2);
        lcd->print("Arming");
        digitalWrite(armPin, HIGH);
        delay(1000);
        digitalWrite(armPin, LOW);
        delay(5000);
    }
 
   if ((digitalRead(sensePin) && Tarm < 0 && wait ==1) || (digitalRead(sensePin) && Tcurr<19500 && wait ==1)){ //sama mis eelmine, kuid kui WAIT on 1, siis valvestab 30min pärast.
 
    int armTimer =29;
    while (armTimer > 1) {
        for (int i=armTimer; i > -1; i--){
            armTimer = i;
            lcd->clear();
            lcd->setCursor(4,2);
            lcd->print("Rearming in: ");
            lcd->setCursor(7,3);
            if(armTimer<10) lcd->print('0');
            lcd->print(armTimer);
            lcd->print(":");
     
            for (int j=59; j > -1; j--){
                digitalClockDisplay();
                lcd->setCursor(10,3);
                if(j<10) lcd->print('0');
                lcd->print(j);
                if (!digitalRead(sensePin)) {return;}
                delay(1000);
                }
            }
        }
    lcd->clear();
    lcd->setCursor(7,2);
    lcd->print("Arming");
    digitalWrite(armPin, HIGH);
    delay(1000);
    digitalWrite(armPin, LOW);
    delay(5000);
    }
}

Kuidas sa muutujatele Tarm ja Tcurr väärtuse annad?
Kommentaarid: 22 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 22
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 09.03.2018 19:37:53 vasta tsitaadiga

int H = 22; //tunnid, automaatse valvestuse aeg
int M = 20; //minutid
int S = 00; //sekundid

Tarm = ((((H - Time.hour()))*3600L)+(((M - Time.minute()))*60L)+((S - Time.second())));
Tcurr = ((Time.hour()*3600L)+(Time.minute()*60L)+(Time.second()));'

Link koodile: https://go.particle.io/shared_apps/5aa00c973354f097a5001535

_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 10.03.2018 09:14:01 vasta tsitaadiga

Esmasel vaatlusel tundub probleem olevat selles, et "Tarm" on negatiivne ainult ajavahemikus 22:20 kuni 00:00.
Ehk siis "wait=1" juhtub ainult juhul, kui deaktiveerid alarmi enne südaööd.


if (Tarm<0 && digitalRead(sensePin) == 0){
    wait =1; //kui automaatse valvestuse countdown on alla nulli ja valve on sisse lülitatud...
}



Täpsustus:
Kui sa oled korra võtnud valve maha peale südaööd, siis "wait=0" ja enam ei rakendu tingimus "(Tarm<0 && digitalRead(sensePin) == 0)", mis paneks tagasi "wait=1"

if(Tarm>0 && digitalRead(sensePin) == 1){ //kui automaatse valvestuse countdown ei ole veel nulli jõudnud ning valve ei ole sees...
 
  wait=0;
  ...
}
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 10.03.2018 13:06:07 vasta tsitaadiga

Ohohh kirjutas:
Esmasel vaatlusel tundub probleem olevat selles, et "Tarm" on negatiivne ainult ajavahemikus 22:20 kuni 00:00.
Ehk siis "wait=1" juhtub ainult juhul, kui deaktiveerid alarmi enne südaööd.


if (Tarm<0 && digitalRead(sensePin) == 0){
    wait =1; //kui automaatse valvestuse countdown on alla nulli ja valve on sisse lülitatud...
}



Täpsustus:
Kui sa oled korra võtnud valve maha peale südaööd, siis "wait=0" ja enam ei rakendu tingimus "(Tarm<0 && digitalRead(sensePin) == 0)", mis paneks tagasi "wait=1"

if(Tarm>0 && digitalRead(sensePin) == 1){ //kui automaatse valvestuse countdown ei ole veel nulli jõudnud ning valve ei ole sees...
 
  wait=0;
  ...
}

Tänud thumbs_up.gif

Ning probleemi peaks lahendama?:

    if ((Tarm<0 || Tcurr<19500) && digitalRead(sensePin) == 0){ //kui automaatse valvestuse countdown on alla nulli või käeoleva päeva aeg on vähem, kui 5.30AM ja valve on sisse lülitatud...
        wait =1; //aktiveerib allpool 30min countdown tsükli automaatseks taasvalvestuseks
        } 
    if(Tarm>0 && Tcurr>19500 && digitalRead(sensePin) == 1){ //kui automaatse valvestuse countdown ei ole veel nulli jõudnud ning kui käesoleva päeva aeg on üle 5.30AM ning valve ei ole sees...
 
        wait=0;
.....

https://go.particle.io/shared_apps/5aa3bbcaa7f86a2280000d46

_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 10.03.2018 23:43:49 vasta tsitaadiga

Jah, nüüd võiks toimida.
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Aidake leida loogikaviga Arduino koodis
[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.