Sari la conținut
ELFORUM - Forumul electronistilor

Programare orara a unei actiuni


suirammarius

Postări Recomandate

Buna seara!Lucrez la un proiect ce printre altele include si oprogramare orara. Folosesc un ceas extern (DS1307).Pana acum, pt a exectuta o anumita actiune intre orele "x" si orele "y", ii dadeam "1" cand ajungea la ora "x" si apoi ii dadeam "0" cand ajungea la ora "y". Functioneaza perfect, dar are un dezavantaj: daca pornesti aparatu' dupa ora de pornire, nu mai porneste pana a doua zi la ora "x". Deci, ar trebui sa folosesc un while("esti in interval") {"executa asta"}. Are cineva vreo idee cum as putea sa fac asta FARA sa folosesc AM/PM ? Ca sa folosesc AM/PM tre' sa schimb o gramada din cod...Multumesc!

Link spre comentariu
  • Răspunsuri 28
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • suirammarius

    16

  • emilemir

    4

  • godFather89

    4

  • Liviu M

    3

:ras: Am facut si eu asa! Maama si ce incantat eram.... Pai daca eu ii dau sa porneasca la ora 22 si sa se opreasca la ora 4, cum crezi ca va reactiona (atat aparatul cat si beneficiarul) ? :sparge:
Link spre comentariu

Foarte scurt... la fiecare ciclu.Momentan nu am cum sa pun programul (nu-l am in calc asta), dar pot explica:if (ora_actuala == ora_start) orar=1;if (ora_actuaa == ora_stop) orar = 0;while (orar){....}Atat, nimic mai mult; in loc de "..." activez niste functii, ceea ce nu cred ca ar fi relevant in solutionarea problemei mele, nu?Treaba e ca in solutia prezentata mai sus daca aparatu' nu e pornit la ora de start, nu mai porneste; sau, daca e oprit un pic in timpul intervalului (orar=1), cand porneste nu mai stie sa faca orar = 1 si asteapta pana a doua zi!

Link spre comentariu

Si solutia e...Adica daca tot ai rezolvat, pune si solutia, asa, preventiv. :da Revenind la ideea mea, normal ca trebuie testata relatia intre prag1 si prag2 si daca 2 e mai mic decat 1 se face testul pe intervale (prag1..23:59 si 0..prag2).

Link spre comentariu

O varianta destul de usor de implementat e sa vezi care interval (start-stop sau stop-start) e neintrerupt si sa testezi daca ora curenta e in el.

if(ora_start < ora_stop)  // interval neintrerupt de timp  = start..stop, cand orar == 1{   if((ora >= ora_start) && (ora < ora_stop))         orar = 1;   else       orar = 0;}else  // interval neintrerupt de timp  = stop..start, cand orar == 0{   if((ora >= ora_stop) && (ora < ora_start))       orar = 0;   else       orar = 1;}

Probabil se mai poate micsora folosind inca o variabila pe post de flag, care sa semnalizeze care-i intervalul contiguu...

 

PS N-am testat codul, dar ar trebui sa mearga.

Link spre comentariu

Asa nu merge; daca vreau sa funtioneze de la 22 la 04....

atunci, is mai multe metode:1: ora_stop o incrementezi cu 24 (la fel si ora_actuala daca e mai mica ca ora_stop).2: cam la fel cum e mesajul de mai sus:
while (ora_start < ora_stop ? ora_actuala >= ora_start && ora_actuala < ora_stop : ora_actuala >= ora_start || ora_actuala < ora_stop){....}
3: normalizezi ora in functie de data (ceva mai complicat dar tine cont si de zi - daca ai nevoie)etc.
Link spre comentariu

O varianta destul de usor de implementat e sa vezi care interval (start-stop sau stop-start) e neintrerupt si sa testezi daca ora curenta e in el. (...)

Am luat exemplul pus de tine si l-am adaptat; eu aveam nevoie si de minute. Uite ce mi-a iesit (inca nu l-am probat):
if (weekDay <= 5)      {        if(hNlv_eeprom_hora_on < hNlv_eeprom_hora_off)  // interval neintrerupt de timp  = start..stop, cand orar == 1        {          if((hour >= hNlv_eeprom_hora_on) && (hour < hNlv_eeprom_hora_off))           {             if ((minute == hNlv_eeprom_min_on) || m==1)             {               h = 1;               m = 1;             }             else              {               h=0;               m=0;             }           }           else if (hour == hNlv_eeprom_hora_off && (minute < hNlv_eeprom_min_off))           h = 1;           else           h=0;                   }        else  // interval neintrerupt de timp  = stop..start, cand orar == 0        {         if((hour > hNlv_eeprom_hora_off) && (ora < hNlv_eeprom_hora_on))         h = 0;         else if (hour == hNlv_eeprom_hora_off && (minute > hNlv_eeprom_min_off))         h=0;         else if (hour == hNlv_eeprom_hora_on && (minute < hNlv_eeprom_min_on))         h=0;         else         h=1;      }    }
Cum vi se pare?Asta ar fi doar orarul de luni pana vineri in perioada normala (nu in vacanta/concediu). Mai am de facut si cel de sambata-duminica si apoi cel de vacanta. As vrea sa folosesc modelul mai sus prezentat si tocmai de aia ceream o parere. :)
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări