mihaicozac Postat Februarie 17, 2017 Partajează Postat Februarie 17, 2017 (editat) Printre alte proiecte, am realizat acest mic circuit care-mi automatizează luminile din jurul casei. Este vorba de ledurile de la numărul de casă şi câteva baghete dispuse deasupra uşii de la intrare şi a uşilor de la garaje. Acţionarea se face la lăsarea întunericului, când în prima fază numărul se aprinde progresiv până la intensitatea maximă iar ledurile de iluminare stau la o intensitate mică. Când unul din senzorii IR detectează o mişcare luminile ajung în cca. 0,5s la maximum, rămân aşa o perioadă de timp după care intensitatea se reduce foarte lent până ajunge la valoarea iniţială. Particularitatea circuitului este că o detecţie IR în timp ce lumina este aprinsă prelungeşte durata în care lumina este la maximum, de asemenea şi dacă ea este în curs de stingere se aprinde imediat la loc. În acest scop am folosit un "contor" care este încărcat la o valoare fixă de fiecare dată când vine un impuls IR. Contorul este apoi decrementat şi când ajunge la zero luminile încep să se stingă. Dacă lumina ambiantă depăşeşte un anumit nivel (reglabil), toate ledurile sunt oprite imediat. Jonglând din valorile variabilelor se pot obţine diferite temporizări şi viteze. Sunt prevăzute mai multe intrări separate IR, dacă senzorii nu suportă legarea paralel, însă dacă nu se folosesc toate se pot şterge din cod sau lega împreună cu una activă, poate cândva va fi nevoie de ele. int counter, lightValue, dawn = 9, pwm = 6, dawnValue, pwmValue, darkness,light;void setup() {counter = 0;dawnValue = 0;pwmValue = 16;analogWrite(6, 0);analogWrite(9, 0); }void loop(){ lightValue = analogRead(A0); darkness = analogRead(A1); if(lightValue < darkness) {light = 1;} else if(lightValue > (darkness + 32)) {light = 0;} if(light) {dawnValue += 1; if(counter > 0) {pwmValue +=16;} else {pwmValue -= 0.5;} pwmValue = constrain(pwmValue, 16, 255); } else {dawnValue = 0; pwmValue = 0; counter = 0;} dawnValue = constrain(dawnValue, 0, 255); if(digitalRead(2) || digitalRead(3) || digitalRead(4) || digitalRead(5)) {counter = 1023;} counter --; if(counter <= 0) {counter = 0;} analogWrite(dawn, dawnValue); analogWrite(pwm, pwmValue); delay(20); } Altă variantă simplificată poate fi folosită de ex. la o scară interioară, aici s-a renunţat la detectarea luminii de zi şi s-a scurtat puţin perioada de maxim şi "coada": int IR2 = 2, IR3 = 3, counter, pwm = 9, pwmValue = 16, IR = 0;void setup() {pinMode(IR2, INPUT);pinMode(IR3, INPUT);counter = 0; }void loop(){ IR = (digitalRead(IR2) || digitalRead(IR3)); if(counter > 0) {pwmValue +=16;} else {pwmValue -= 1;} pwmValue = constrain(pwmValue, 16, 255); if(IR) {counter = 512;} counter --; if(counter <= 0) {counter = 0;} analogWrite(pwm, pwmValue); delay(50); } Editat Februarie 17, 2017 de mihaicozac 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