godFather89 Postat Martie 25, 2013 Partajează Postat Martie 25, 2013 Mi se pare destul de urat codul. Deci... tu vrei sa faci un ceas in care sa poti pune alarma pentru vacanta\lucru, timpul saptamanii\weekend? Vrei sa poti pune alarma doar pentru o singura zi sau ceva de genul? De ce vrei sa ai si moment de timp pentru incheierea alarmei? Daca vrei sa tii cont de ziua saptamanii, ora si minut, atunci eu as face ceva in felul urmator: timp_actual = minut + ora * 60 + zi * 1440; (unde minut = 0..59, ora = 0..23, zi = 0..6)timp_start = minut_alarma + ora_alarma * 60 + zi_alarma * 1440;timp_sfarsit = minut_alarma_sfarsit + ora_alarma_sfarsit * 60 + zi_alarma_sfarsit * 1440;while (timp_start < timp_sfarsit ? timp_actual >= timp_start && timp_actual < timp_sfarsit : timp_actual >= timp_start || timp_actual < timp_sfarsit){....} Evident, se poate face o functie pentru convertirea timpului (din zi/ora/min in nr de minute dintr-o saptamana). Presupun ca ai o lista de alarme... Daca da, poti sa le enumeri si verifici intr-o bucla repetitiva. Cum iti dai seama daca e vacanta sau nu? Alarmele cum le introduci in ceas? Link spre comentariu
suirammarius Postat Martie 25, 2013 Autor Partajează Postat Martie 25, 2013 Am un meniu de unde se alege daca e orar de vacanta sau orar normal. In orar normal tre' sa functioneze in 3 intervale orare zilnice de luni pana vineri (cele 3 intervale se repeta zilnic de luni pana vineri) si in alte 3 intervale zilnice in timpul sfarsitului de saptamana.Este vorba despre automatizarea unei instalatii ce printre altele contine si o incalzire prin podea; cum incalzirea prin podea are inertie foarte mare, e ineficient sa fie controlata prin intermediul temperaturii asa ca se folosesc intervale orare (introduse din meniu de utilizator).Dupa ce am vazut solutia ta, e adevarat ca si mie mi se pare chiar urat codul meu (cam scolaresc ). Dar, in afara de "uratenie" ti se pare ceva gresit?L.E.Folosind forma prezentata de tine mai sus de a memora alarmele nu mai are nevoie sa compare timp_start cu timp_stop pt ca timp_start nu o sa fie niciodata mai mare decat timp_stop deoarece ai luat in considerare ziua saptamanii. Dar, eu am sa folosesc fara a lua in considerare ziua saptamanii, in schimb am sa le compar. :)PS: DS1307 are ziua saptamanii 1-7, nu 0-6 Link spre comentariu
suirammarius Postat Martie 25, 2013 Autor Partajează Postat Martie 25, 2013 De solutia asta ce parere aveti? if (weekDay <= 5) { timp_actual = minute + hour*60; if(timp_start1 < timp_stop1) //////////////////// alarma 1 { if((timp_actual >= timp_start1) && (timp_actual < timp_stop1)) h=1; } else { if((timp_actual >= timp_start1) || (timp_actual < timp_stop1)) h=1; } if(timp_start2 < timp_stop2) /////////////////// alarma 2 { if((timp_actual >= timp_start2) && (timp_actual < timp_stop2)) h=1; } else { if ((timp_actual >= timp_start2) || (timp_actual < timp_stop2)) h=1; } if(timp_start3 < timp_stop3) ////////////////// alarma 3 { if((timp_actual >= timp_start3) && (timp_actual < timp_stop3)) h=1; } else { if ((timp_actual >= timp_start3) || (timp_actual < timp_stop3)) h=1; } } else { if(timp_start1_w < timp_stop1_w) //////////////////// alarma 1 weekend { if((timp_actual >= timp_start1_w) && (timp_actual < timp_stop1_w)) h=1; } else { if ((timp_actual >= timp_start1_w) || (timp_actual < timp_stop1_w)) h=1; } if(timp_start2_w < timp_stop2_w) /////////////////// alarma 2 weekend { if((timp_actual >= timp_start2_w) && (timp_actual < timp_stop2_w)) h=1; } else { if ((timp_actual >= timp_start2_w) || (timp_actual < timp_stop2_w)) h=1; } if(timp_start3_w < timp_stop3_w) ////////////////// alarma 3 weekend { if((timp_actual >= timp_start3_w) && (timp_actual < timp_stop3_w)) h=1; } else { if ((timp_actual >= timp_start3_w) || (timp_actual < timp_stop3_w)) h=1; } } Link spre comentariu
godFather89 Postat Martie 26, 2013 Partajează Postat Martie 26, 2013 Folosind forma prezentata de tine mai sus de a memora alarmele nu mai are nevoie sa compare timp_start cu timp_stop pt ca timp_start nu o sa fie niciodata mai mare decat timp_stop deoarece ai luat in considerare ziua saptamanii. Dar, eu am sa folosesc fara a lua in considerare ziua saptamanii, in schimb am sa le compar. Poate vrei sa pui o alarma sa inceapa duminica seara si sa se opreasca luni dimineata. Tot timpul se poate.PS: DS1307 are ziua saptamanii 1-7, nu 0-6Atunci mai scazi unu si e acelasi lucru.Vad ca ai trei alarme. Eu as folosi un tip de date structurat in care sa tin minte data/ora de start/stop la fiecare si le-as trece printr-o bucla repetitiva.Ceva de genul:typedef struct { uint16_t timp_start, timp_stop; bool pentruVara;} tAlarma;#define COUNT 3tAlarma alarme[COUNT];//initializezi alarmele (din eeprom sau de unde vrei)uin16_t timp_actual = ...;uint8_t h = 0;for (uint8_t i = 0; i< COUNT && !h; i++){ if (alarme[i].pentruVara && !esteVara()) continue; if (alarme[i].timp_start < alarme[i].timp_stop) etc.}In felul acesta poti sa adaugi si sa scoti alarme fara sa modifici codul in mod semnificativ. Link spre comentariu
suirammarius Postat Martie 26, 2013 Autor Partajează Postat Martie 26, 2013 Numarul de alarme nu se schimba niciodata iar de luni pana vineri se repeta cele 3 intervale; in week-end se repeta alte 3 intervale. Nu am nevoie sa bag data si-n plus tre' sa stai o gramada sa setezi aparatu' daca tre' sa bagi data pt fiecare alarma.Deocamdata il las asa si am sa-l supun la niste teste. :)MULTUMESC MULT pentru ajutor! Link spre comentariu
suirammarius Postat Martie 28, 2013 Autor Partajează Postat Martie 28, 2013 Dupa 2 zile de teste... merge perfect!!! Link spre comentariu
emilemir Postat Aprilie 16, 2013 Partajează Postat Aprilie 16, 2013 Buna, e posibil sa postezi codul daca merge si la arduino? Am un arduino mega si as vrea sa realizez un ceas cu alarma programabila pe care sa il folosesc la udat florile din ghivece . Multumesc anticipat Link spre comentariu
suirammarius Postat Aprilie 16, 2013 Autor Partajează Postat Aprilie 16, 2013 Salut!Adica... sa postez functia care citeste ceasu' si cea cu intervalele orare, nu tot codul, nu? (tot codul nu ar avea nicio legatura cu ceea ce vrei tu sa faci)Sau vrei sa il adaptez eu la ceea ce vrei tu sa faci?Explica un pic si te ajut cu mare placere!Presupun ca nu vei folosi un arduino mega doar pt asta, nu? Adica asta o poti face si cu un atmega 328 (fara placa arduino, doar programat in Arduino)! Link spre comentariu
emilemir Postat Aprilie 16, 2013 Partajează Postat Aprilie 16, 2013 ceasul as reusi sa il fac sa fie afisat pe un LCD dar sa pun si o alarma programabila in program nu stiu cum. arduino mega o sa il folosesc doar pentru udat florile deocamdata. M-ar ajuta foarte mult si functia care citeste ora si intervalele orare. Practic ce mi-am proiectat eu in materia cenusie ar fi un ceas cu alarma in care sa am posibilitatea sa setez o alarma sau 2 intr-o zi si sa pot si stabili durata alarmei ca sa pot regla debitul de apa necesar plantei, dupa care in viitor sa mai adaug si un senzor de umiditatemultumesc mult !! Link spre comentariu
suirammarius Postat Aprilie 16, 2013 Autor Partajează Postat Aprilie 16, 2013 Ok!Maine seara o sa iti postez tot ce ai nevoie si bine comentat. Link spre comentariu
suirammarius Postat Aprilie 20, 2013 Autor Partajează Postat Aprilie 20, 2013 Buuun... scuze de intarzaiere! Prima oara implementam 2 functii care ne ajuta sa comunicam cu ceasu' (din zecimal in BDC si cealalta din BDC in zecimal): byte decToBcd(byte val){ return ( (val/10*16) + (val%10) );} si byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) );} Apoi citim ceau': void readDate(){ Wire.beginTransmission(0x68); Wire.write(0x00); Wire.endTransmission(); Wire.requestFrom(0x68, 7); second = bcdToDec(Wire.read()); minute = bcdToDec(Wire.read()); hour = bcdToDec(Wire.read() & 0b111111); weekDay = bcdToDec(Wire.read()); monthDay = bcdToDec(Wire.read()); month = bcdToDec(Wire.read()); year = bcdToDec(Wire.read());} Apoi folosim o functie ce "semnalizeaza" atunci cand suntem in intervalul orar prestabilit: byte orar() { byte h; readDate(); h=0; timp_actual = minute + hour*60; if(timp_start < timp_stop) //////////////////// alarma { if((timp_actual >= timp_start) && (timp_actual < timp_stop)) h=1; } else { if((timp_actual >= timp_start) || (timp_actual < timp_stop)) h=1; } return h; } Functia asta iti returneaza 1 cand esti in intervalul prestabilit. Tu trebuie sa stabilesti doar "timp_start = minut_start + 60*ora_start" si "timp_stop = minut_stop + 60*ora_stop" (intr-o functie separata de preferat). Apoi poti folosi asa: if (orar()) digitalWrite (pin_pompa, HIGH); Daca ai un cactus si o planata tropicala (ce trebuie udata mai des) poti sa pui o electrovalva de 2 cai si implementazi 2 functii de tip byte orar() (de ex. byte orar1()) si pui o conditia ca daca orar1() e adevarat sa iti activeze si pinul de la valva, altfel sa fie 0. Arunca un ochi pe cod si daca mai ai intrebari cu mare placere te voi ajuta. Sa-ti creasca plantele! Link spre comentariu
emilemir Postat Aprilie 20, 2013 Partajează Postat Aprilie 20, 2013 multumesc foarte mult, raman dator. Ce imi trebuie mie e sa ud cateva petunii si muscate curgatoare care cam sufereau ca nu sunt tot timpul acasa sa le ud. O sa iau fiecare linie de cod sa o invat ce face si pe viitor cand imi soseste si senzorul de umiditate si placa ethernet o sa ma straduiesc sa il dezvolt'Multumesc inca o data pentru timpul acordat! Link spre comentariu
suirammarius Postat Aprilie 20, 2013 Autor Partajează Postat Aprilie 20, 2013 (...) O sa iau fiecare linie de cod sa o invat ce face (...)Daca ai vreo nelamurire, intreaba!Cum o sa faci circuitu' hidraulic? Cu pompa si depozit sau cu electrovalva?Treaba cu senzoru' de umiditate... ce vrei sa faci cu el? Sa masori umiditatea din camera? Sau pt ce vrei sa il folosesti? Link spre comentariu
emilemir Postat Aprilie 21, 2013 Partajează Postat Aprilie 21, 2013 partea de alimentare cu apa o sa o fac fie cu un bidon de apa suspendat pe tersasa si sa deschid circuitul cu oajutorul unei electrovalve de 24 volti luata de la un aparat de cafea sau cu ajutorul unui robinet normal de plastic (luat de la irigatii prin picurare) pe care il actionez cu un servo de 8,5 kg/cm. Cu senzorul masor umiditatea din sol iar daca umiditatea e in parametrii normali programul sa faca un salt peste partea de alarma. (florile sunt asezate in jardiniere pe margine iar cand ploua si bate vantul ploaia mai ajuta ea la udat Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum