Sari la conținut
ELFORUM - Forumul electronistilor

Comandă lumini exterioare casă cu Arduino


mihaicozac

Postări Recomandate

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);          }

Posted Image

 

 

 

 

Posted Image

 

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 de mihaicozac
Link spre comentariu
  • Răspunsuri 0
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Zile populare

Top autori în acest subiect

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