praegune kellaaeg 29.03.2024 16:00:54
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
Terror
HV veteran
liitunud: 08.11.2001
|
09.03.2018 15:01:53
Aidake leida loogikaviga Arduino koodis |
|
|
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 |
|
|
sukelduja
HV Guru
liitunud: 14.06.2007
|
09.03.2018 16:10:55
Re: Aidake leida loogikaviga Arduino koodis |
|
|
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 |
|
|
Terror
HV veteran
liitunud: 08.11.2001
|
09.03.2018 19:37:53
|
|
|
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 |
|
|
Ohohh
Kreisi kasutaja
liitunud: 13.09.2003
|
10.03.2018 09:14:01
|
|
|
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 |
|
|
Terror
HV veteran
liitunud: 08.11.2001
|
10.03.2018 13:06:07
|
|
|
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
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 |
|
|
Ohohh
Kreisi kasutaja
liitunud: 13.09.2003
|
10.03.2018 23:43:49
|
|
|
Jah, nüüd võiks toimida.
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
|
|
lisa lemmikuks |
|
|
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.
|