|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Peter123 Član
Pridružen-a: Tor 13 Jan 2009 15:34 Prispevkov: 1366 Aktiv.: 7.34 Kraj: Lj.
|
Objavljeno: Pet Avg 29, 2014 11:41 am Naslov sporočila: Dnevna ura v navezi z zunanjim RTC |
|
|
Torej iščem kako realizirati dnevno (24H) uro, ki ne bo imela hibe tegale stavka:
Koda: |
if(alarmSetting == 1 && alarmSecond == now.second() && alarmMinute == now.minute() && alarmHour == now.hour() ) |
Hiba tega stavka je da preklopi samo v določenem trenutku, ko so pogoji izpolnjeni. Jaz bi pa rad redno preverjal v kakšnem stanju mora biti izhod glede na uro. Zgornji stavek se izvrši 1x dnevno, če na primer MCU izgubi napajanje in ga priklopiš po nastavljeni uri, potem moraš čakati 24H (v najslabšem primeru).
Razmišljal sem v smeri odštevanje trenutne ure od nastavljene ampak je situacija malo bolj komplicirana ...
Tale problem je sigurno že kdo reševal, ima kdo kak link kjer bi tole videl že rešeno?
Ura bo 1x na dan vklopila pin in 1x na dan izklopila
Uporabljam sicer okolje Arduino in zunanji DS1307. Je pa zadeva enaka v Cju? |
|
Nazaj na vrh |
|
|
miharix Član
Pridružen-a: Tor 18 Dec 2012 9:59 Prispevkov: 403 Aktiv.: 2.92 Kraj: LJ
|
Objavljeno: Pet Avg 29, 2014 12:10 pm Naslov sporočila: |
|
|
Namesto en if preoblikuj v več ugnezdenih if stavkov.
Njihovo zaporedje/vgnezditev uredi glede na preostalo kodo. |
|
Nazaj na vrh |
|
|
vpeter Član
Pridružen-a: Pon 11 Jun 2012 16:05 Prispevkov: 337 Aktiv.: 2.33 Kraj: Maribor okolica
|
Objavljeno: Pet Avg 29, 2014 12:58 pm Naslov sporočila: |
|
|
Uorabi eno spremenljivko,v katero shraniš stanje alarma. Pri preverjanju vklopa in izklopa alarma ne primerjaj samo trenutnega časa ampak interval (ali je trenuten čas znotraj časa za alarm). Če alarm še ni postavljen ga postaviš. Če je že postavljen potem ne narediš nič. V primeru reseta sistema ta spremenljivka stanja alarma ni postavljena, čas je večji kot je zahtevan za alarm in vklopiš alarm ter postaviš spremenljivko. Enako velja za izklop.
Tako nekako. Sem danes malce zmeden... |
|
Nazaj na vrh |
|
|
Peter123 Član
Pridružen-a: Tor 13 Jan 2009 15:34 Prispevkov: 1366 Aktiv.: 7.34 Kraj: Lj.
|
Objavljeno: Pet Avg 29, 2014 1:06 pm Naslov sporočila: |
|
|
Zelo dobrodošli bi bili kaki linki do razlage/primerov. |
|
Nazaj na vrh |
|
|
miharix Član
Pridružen-a: Tor 18 Dec 2012 9:59 Prispevkov: 403 Aktiv.: 2.92 Kraj: LJ
|
Objavljeno: Pet Avg 29, 2014 3:18 pm Naslov sporočila: |
|
|
Tvojo eno vrstico kode lahko razbiješ v več if stavkov:
npr:
Koda: |
if(alarmSetting == 1){
if (alarmSecond == now.second()){
if(alarmMinute == now.minute()){
if (alarmHour == now.hour()){
}
}
}
|
Ne vem kaj ti pomeni spremenljivka alarmSetting če to pomeni v kolikor je alarm vklopljen nato bi razporedil tako:
Koda: |
if(alarmMinute == now.minute()){
if(alarmSetting == 1){
if (alarmHour == now.hour()){
if (alarmSecond == now.second()){
vklopi_pin1()
}
}
}
|
Če prav predvidevam kako kodo imaš bi pol to moglo preverjat če je alarm vklopljen vsakih 60min. |
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.04
|
Objavljeno: Pet Avg 29, 2014 5:44 pm Naslov sporočila: |
|
|
Če ne boš za več kot 2 uri zamudil predvidenega trenutka vklopa, se bo izhod še vklopil.
Če boš ujel pravo uro, a zamudil pravo minuto, se bo izhod vklopil.
Če boš ujel pravo uro in prave minute, a zamudil pravo sekundo, se bo izhod vklopil.
Če ne boš ničesar zamudil, ampak bo MCU sam v miru prilezel do točno nastavljenega trenutka, se bo izhod vklopil do sekunde natančno ob predvidenem trenutku.
Enako kolobocijo lahko narediš še za izklop, samo pazi, da se ne bodo intervali ur prekrivali.
Koda: |
void vklopiIzhodA()
{
if(izhod==1)
{
goto vklopiIzhodAv; // VEN!!! Sploh treba naprej preverjati, saj je izhod že vklopljen
}
if(alarmSetting == 1) // Če je alarm nastavljen ...
{
// trenutna ura je večja od ure za vklop izhoda // ampak ne preveč večja
if ((now.hour() > alarmHour) && (now.hour() < (alarmHour+3)))
{
digitalWrite(izhod, HIGH); // Vseeno vklopimo izhod, čeprav smo točno uro že zamudili, a še nismo prepozni
goto vklopiIzhodAv; // VEN!!! Sploh treba naprej preverjati, saj je izhod že vklopljen
}
// trenutna ura je prava, preverimo še minute, ali bomo prepozno vklopili
if(now.hour() == alarmHour)
{
if(now.minute() > alarmMinute)
{
digitalWrite(izhod, HIGH); // Vseeno vklopimo izhod, čeprav smo točne minute že zamudili, a še nismo prepozni
goto vklopiIzhodAv; // VEN!!! Sploh treba naprej preverjati, saj je izhod že vklopljen
}
// trenutne minute so prave, morda ujamemo prave sekunde
if(alarmMinute == now.minute())
{
if( now.second() > alarmSecond)
{
digitalWrite(izhod, HIGH); // Vseeno vklopimo izhod, čeprav smo točne sekunde že zamudili
goto vklopiIzhodAv; // VEN!!! Sploh treba naprej preverjati, saj je izhod že vklopljen
}
if(now.second() == alarmSecond)
{
digitalWrite(izhod, HIGH); // Ob točni uri in točnih minutah smo ujeli še točne sekunde, zato lahko končno v miru vklopimo izhod
}
}
}
}
vklopiIzhodAv: // VEN !!!
now.hour(); // nekaj mora biti tukaj, da lahko postavimo oznako vklopiIzhodAv:
}
|
Če bo celotno dogajanje po 22h uri zvečer, boš moral malo prilagoditi pogoje okrog
(now.hour() < (alarmHour+3)), da ne bo ura že 0:-- ali 1:-- .
Dodano:
Koda: |
if (((now.hour() > alarmHour) && (now.hour() < (alarmHour+3))) || ((now.hour()+24 < alarmHour+3))) |
S temle preslikaš trenutno uro za 24ur naprej. Če je zdajUra+24 še vedno manjša od alarmUre+3, bo vklopilo izhod.
Primer: alarmUra=23 in zdajUra=1 (=25), zato vklopi izhod.
Dodano2:
narediš funkcijo
Koda: |
void vrniSekunde (long int a, long int b, long int c)
{
a= a * 3600; // ure * 3600
b= b * 60; // minute * 60
c= c + b; // dodam sekunde od minut
c= c + a; // nato še sekunde od ur
return c;
}
nato jo kličeš s parametri
zdaj = vrniSekunde(now.hour(), now.minute(), nov.second());
alarm = vrniSekunde(alarmHour, alarmMinute, alarmSecond);
if ((zdaj > alarm) && (zdaj < (alarm + 10800)) || ((zdaj + 81000) < (alarm + 10800)))
{
digitalWrite(izhod, HIGH);
}
else
{
digitalWrite(izhod, LOW);
}
zdaj in alarm morata iti do 165000, torej več kot 16 bitov nepredznačen int. Izhod bo aktiven največ 3 ure od nastavljenega alarma. Če boš vklopil 2h55 kasneje, boš ujel le še 5 minut.
Lahko pa ga v tem obdobju samo vklopiš in ga potem z drugim števcem držiš aktivnega 3 ure.
|
Dodano3:
Če ne rabiš do sekunde točno, narediš funkcijo vrniMinute. Takrat zadostujejo 16 bitne spremenljivke a, b, zdaj ter alarm. In malo bolj poredkoma lahko vse skupaj preverjaš.
Malo sem se potrudil, ker moram ravno naslednji teden (ko dobim 1307) narediti natanko enako funkcijo. Ob nastavljenem alarmu se mora vklopiti izhod za eno uro in pol. Če v tem času ne dobi potrditve (vhod iz stikala), izklopi izhod, sicer ga ohrani. Zadostuje pa minutna točnost. V tipe spremenljivk se pa še nisem zakopal, ker trenutno še shajam z boolean, char, byte, včasih pa dam kar int. Ja, vem, no, ... Doslej je šlo. _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
|
Peter123 Član
Pridružen-a: Tor 13 Jan 2009 15:34 Prispevkov: 1366 Aktiv.: 7.34 Kraj: Lj.
|
Objavljeno: Ned Avg 31, 2014 11:39 am Naslov sporočila: |
|
|
@igo
Tvoj predlog o seštevanju ur in minut se mi zdi še najbolj enostaven.
S tem načinom imaš delo samo z primerjanjem 2 številk.
Preklop se vrši glede na to koliko pogosto kličeš funkcijo. |
|
Nazaj na vrh |
|
|
Peter123 Član
Pridružen-a: Tor 13 Jan 2009 15:34 Prispevkov: 1366 Aktiv.: 7.34 Kraj: Lj.
|
Objavljeno: Pon Sep 01, 2014 8:30 am Naslov sporočila: |
|
|
Tole sem spisal in preizkusil - deluje:
Koda: |
byte setura;
byte setmin;
byte seturaoff;
byte setminoff;
int sestevekcas = 0;
int sestevekseton = 0;
int sesteveksetoff =0;
sestevekcas = (tm.Hour * 8) + tm.Minute; // Seštejem minute z minutami od ur.
sestevekseton = (setura * 8) + setmin;
sesteveksetoff = (seturaoff * 8) + setminoff;
if (sestevekcas >= sestevekseton && sestevekcas < sesteveksetoff )
{
digitalWrite(Izhod1, HIGH);
}
if (sestevekcas >= sesteveksetoff)
{
digitalWrite(Izhod1, LOW);
}
|
Zadevo bi se vsekakor dalo še optimirat. Ideja pa deluje.
Pomislek: rešitev predvideva vklop pred izklopom v istih 24h! Vklop mora biti pred izklopom (časovno). |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 76 dni
Powered by phpBB © 2001, 2005 phpBB Group
|