Lumină de noapte de la un bec vechi, bazat pe Arduino și WS2812. Sarcini pentru soluție independentă

Probabil că toată lumea a avut un vis în copilărie (și mai mult de unul). Poți chiar să încerci să-ți amintești sentimentul care umple sufletul unui copil atunci când visul lui devine realitate, sau acea strălucire îndepărtată și familiară din ochii lui... În copilărie, visam să am propria mea lumină de noapte.

Acum sunt student în anul 4 la BSUIR, iar când ni s-a spus că un proiect de curs de design de circuite se poate face nu pe hârtie, ci pe o bucată de hardware, mi-a dat seama: veioza pe care mi-o doream atât de mult ca un copil poate fi făcut de mine. Mai mult, faceți nu doar un obiect care să lumineze camera în întuneric, ci și un dispozitiv care poate fi controlat cu ușurință pentru a se potrivi oricărei dispoziții. De ce nu? Am decis să adaug capacitatea de a schimba culorile folosind mâinile mele: cu cât mâna mea este mai aproape de lumina de noapte, cu atât se aprinde una dintre culori (RGB) mai strălucitoare. De asemenea, aș dori să controlez lumina de noapte folosind telecomanda.

Recunosc imediat că am descoperit ideea pe site-ul cxem.net. Pe scurt, acest exemplu a folosit o matrice RGB, care a fost controlată folosind registre de deplasare și senzori ultrasonici de distanță. Dar am crezut că matricea strălucește doar într-o direcție, dar am vrut ca lumina de noapte să strălucească în lateral.

Justificarea elementelor circuitului


Mi-am îndreptat atenția către microcontrolerele Arduino. UNO este o opțiune destul de potrivită pentru ideea mea, în primul rând pentru că este cea mai populară platformă și numărul de pini nu este prea mare, spre deosebire de Mega, iar în al doilea rând, puteți conecta o sursă de alimentare externă la ea, în cazul meu este de 12V , spre deosebire de Nano , în al treilea rând... ei bine, cred că ne putem opri la aceste două puncte. Platforma este extrem de populară în întreaga lume datorită confortului și simplității limbajului de programare, precum și arhitecturii deschise și codului de program.

Mai mult informatii detaliate Puteți găsi cu ușurință informații despre acest panou pe Internet, așa că nu voi supraîncărca articolul.

Deci, cerințele de bază pentru sistem. Necesar:
– senzori care vor urmări distanța până la un obstacol pentru a controla sistemul;
– senzor pentru citirea semnalelor de la telecomandă telecomandă;
– LED-uri, care vor asigura funcționalitatea necesară de iluminare;
– o unitate de control care va controla întregul sistem.

Proiectul necesită telemetru ca senzori de distanță, fiecare dintre ele va corespunde unei anumite culori: roșu, verde, albastru. Senzorii de distanță vor monitoriza distanța mâinii până la lumina de noapte și cu cât mâna este mai aproape de un anumit senzor, cu atât culoarea corespunzătoare acestui telemetru se va aprinde mai puternic. În schimb, cu cât mâna este mai îndepărtată, cu atât se aplică mai puțină tensiune culorii corespunzătoare senzorului.

Cele mai populare telemetru pe acest moment acestea sunt Sharp GP2Y0A21YK și HC-SR04. Sharp GP2Y0A21YK este un telemetru cu infraroșu. Este echipat cu un emițător IR și un receptor IR: primul servește ca sursă a fasciculului, a cărui reflexie este prinsă de al doilea. În același timp, razele IR ale senzorului sunt invizibile pentru ochiul uman și la o asemenea intensitate sunt inofensive.

În comparație cu senzorul cu ultrasunete HC-SR04, acest senzor are atât avantaje, cât și dezavantaje. Avantajele includ neutralitatea și inofensiunea. Dezavantajele sunt o rază mai scurtă și dependența de interferențe externe, inclusiv unele tipuri de iluminare.

Utilizați ca senzori de distanță pentru proiect: telemetru cu ultrasunete HC-SR04.
Principiul de funcționare al HC-SR04 se bazează pe binecunoscutul fenomen de ecolocație. La utilizarea acestuia, emițătorul generează un semnal acustic, care, reflectat de obstacol, revine la senzor și este înregistrat de receptor. Cunoscând viteza de propagare a ultrasunetelor în aer (aproximativ 340 m/s) și timpul de întârziere dintre semnalul emis și recepționat, este ușor de calculat distanța până la bariera acustică.

Intrarea TRIG se conectează la orice pin al microcontrolerului. Acest pin trebuie aplicat un impuls. semnal digital durata 10 μs. Pe baza semnalului de la intrarea TRIG, senzorul trimite un pachet de impulsuri ultrasonice. După primirea semnalului reflectat, senzorul generează un semnal de impuls la pinul ECHO, a cărui durată este proporțională cu distanța până la obstacol.

Senzor IR. Desigur, semnalul necesar telecomenzii va fi citit și decodat de la acest senzor. TSOP18 diferă unul de celălalt doar prin frecvență. Senzorul VS1838B TSOP1838 a fost selectat pentru proiect.

Proiectul s-a bazat pe ideea de a ilumina camera în orice culoare, ceea ce înseamnă că veți avea nevoie de 3 culori primare din care se va obține iluminarea: roșu, verde, albastru. Prin urmare, a fost ales modelul SMD 5050RGB LED, care va face față perfect sarcinii.

În funcție de cantitatea de tensiune furnizată fiecărui LED, acestea vor modifica intensitatea acestei iluminări. LED-ul trebuie conectat printr-un rezistor, altfel riscăm să-l stricăm nu numai, ci și Arduino. Rezistorul este necesar pentru a limita curentul de pe LED la o valoare acceptabilă. Faptul este că rezistența internă a LED-ului este foarte scăzută și, dacă nu utilizați un rezistor, atunci un astfel de curent va trece prin LED, încât pur și simplu va arde atât LED-ul, cât și controlerul.

Benzile LED utilizate în proiect sunt alimentate la 12V.

Datorită faptului că tensiunea pe LED-uri în starea „oprit” este de 6V și este necesară reglarea sursei de alimentare, care depășește 5V, este necesar să adăugați tranzistori la circuit în modul de comutare. Alegerea mea a căzut pe modelul BC547c.

Să luăm în considerare pe scurt, pentru cei care au uitat, principiul de funcționare tranzistor npn. Dacă nu aplicați deloc tensiune, ci pur și simplu scurtcircuitați bornele de bază și emițător, chiar dacă nu scurtcircuitați, ci printr-un rezistor de câțiva ohmi, se dovedește că tensiunea bază-emițător este zero. În consecință, nu există curent de bază. Tranzistorul este închis, curentul colectorului este neglijabil mic, exact același curent inițial. În acest caz, se spune că tranzistorul este în starea de întrerupere. Starea opusă se numește saturație: atunci când tranzistorul este complet deschis, astfel încât nu există unde să se deschidă în continuare. Cu acest grad de deschidere, rezistența secțiunii colector-emițător este atât de scăzută încât este pur și simplu imposibil să porniți tranzistorul fără sarcină în circuitul colectorului; acesta se va arde instantaneu. În acest caz, tensiunea reziduală pe colector poate fi de numai 0,3...0,5V.

Aceste două stări, saturație și întrerupere, sunt utilizate atunci când tranzistorul funcționează într-un mod de comutare, ca un contact de releu obișnuit. Semnificația principală a acestui mod este că un curent de bază mic controlează un curent mare de colector, care este de câteva zeci de ori mai mare decât curentul de bază. Se obţine un curent mare de colector datorită sursă externă energie, dar totuși câștigul actual, după cum se spune, este evident. În cazul nostru, microcircuitul, a cărui tensiune de funcționare este de 5V, include 3 benzi cu LED-uri care funcționează de la 12V.

Să calculăm modul de funcționare al cascadei de taste. Este necesar să se calculeze valoarea rezistenței din circuitul de bază, astfel încât LED-urile să ardă la putere maximă. O condiție necesară la calcul este ca câștigul de curent să fie mai mare sau egal cu câtul de împărțire a curentului maxim posibil de colector la curentul de bază minim posibil:

Prin urmare, benzile pot avea o tensiune de funcționare de 220V, iar circuitul de bază poate fi controlat dintr-un microcircuit cu o tensiune de 5V. Dacă tranzistorul este proiectat să funcționeze cu o astfel de tensiune la colector, atunci LED-urile se vor aprinde fără probleme.
Căderea de tensiune pe joncțiunea bază-emițător este de 0,77 V, cu condiția ca curentul de bază să fie de 5 mA și curentul colectorului să fie de 0,1 A.
Tensiunea pe rezistorul de bază va fi:

Conform legii lui Ohm:

Din gama standard de rezistențe selectăm un rezistor de 8,2 kOhm. Aceasta completează calculul.

Aș dori să vă atrag atenția asupra unei probleme pe care am întâlnit-o. Când utilizați biblioteca IRremote, Arduino a înghețat la ajustarea culorii albastre. După o căutare lungă și amănunțită pe Internet, s-a dovedit că această bibliotecă folosește Timer 2 în mod implicit pentru acest model Arduino. Temporizatoarele sunt folosite pentru a controla ieșirile PWM.

Timer 0 (Ora sistemului, PWM 5 și 6);
Timer 1 (PWM 9 și 10);
Timer 2 (PWM 3 și 11).

Inițial, am folosit PWM 11 pentru a regla culoarea albastră. Prin urmare, aveți grijă când lucrați cu PWM, cronometre și biblioteci terțe care le pot folosi. E ciudat că pagina principala Nu s-a spus nimic despre această nuanță pe Github. Dacă doriți, puteți anula comentariul cu cronometrul 1 și puteți comenta 2.

Conectarea elementelor de pe placa de breadboard arată astfel:

După testarea pe placă, au început fazele „Așezarea elementelor pe placă” și „Lucrarea cu un fier de lipit”. După prima testare a plăcii finite, mi se strecoară în cap un gând: ceva nu a mers prost. Și aici începe faza, cunoscută pentru mulți, „Lucrare minuțioasă cu testerul”. Cu toate acestea, problemele (mai multe contacte adiacente au fost lipite accidental împreună) au fost eliminate rapid și iată lumina rău așteptată a LED-urilor.

Atunci a fost doar o chestiune de corp. Din acest motiv, a fost tăiat placaj cu găuri pentru senzorii noștri. Coperta din spate a fost făcut special detașabil, astfel încât să vă puteți bucura de priveliștea din interior și, dacă doriți, să finalizați sau să refaceți ceva. De asemenea, are 2 orificii pentru reprogramarea placii si alimentare.

Corpul a fost lipit cu lipici epoxidic bicomponent. Merită remarcat particularitatea acestui adeziv pentru cei care nu l-au mai întâlnit înainte. Acest produs vine în două recipiente separate, iar atunci când conținutul este amestecat, are loc o reacție chimică instantanee. Dupa amestecare, trebuie sa actionezi rapid, in 3-4 minute. Pentru utilizare ulterioară, trebuie să amestecați o nouă porție. Așa că dacă încerci să repeți acest lucru, sfatul meu pentru tine este să amesteci în porții mici și să acționezi foarte repede, nu va fi mult timp să te gândești. Prin urmare, merită să vă gândiți în avans cum și unde să lipiți corpul. În plus, acest lucru nu se poate face într-o singură ședință.

Pentru montarea benzilor cu LED-uri în interior coperta s-a introdus un tub prin care treceau perfect toate firele.

Când a apărut problema cu abajurul, mi-am amintit cum în copilărie făceam meșteșuguri din fir simplu, lipici și un balon, care servea drept bază. Principiul pentru abajur este același, dar împachetarea unui poliedru s-a dovedit a fi mai dificilă decât o minge. Din cauza presiunii exercitate de fire asupra structurii, aceasta a început să se îngusteze în sus, iar firele au început să cadă. Urgent, cu mâinile acoperite cu lipici, s-a decis să întăresc structura de sus. Și apoi CD-ul a venit în ajutor. Rezultatul final este această lumină de noapte:

Ce ai vrea sa spui pana la urma?

Ce ar trebui să schimb în proiect? Pentru a furniza semnalul TRIG senzorilor de distanță, se poate folosi o ieșire Arduino în loc de trei. Aș asigura și un orificiu pentru senzorul IR (de care am uitat), care, din păcate, este încă ascuns în cazul în care, desigur, nu poate citi semnale de la telecomandă. Totuși, cine a spus că nu poți lipi sau găuri nimic?

Aș dori să remarc că acesta a fost un semestru interesant și o oportunitate grozavă de a încerca să fac ceva care nu este pe hârtie, datorită căruia pot pune o altă bifă lângă elementul „visul copilăriei”. Și dacă crezi că este dificil să încerci ceva nou și nu știi ce să faci mai întâi, nu-ți face griji. Mulți oameni le trece prin cap un gând: de unde să înceapă și cum se poate face acest lucru? Sunt multe sarcini în viață din care te poți încurca, dar odată ce vei încerca, vei observa că cu o sclipire în ochi poți muta munții, chiar dacă trebuie să încerci puțin pentru asta.

Pentru o sarcină suplimentară

    Încă 1 LED

    Încă 1 rezistor cu o valoare nominală de 220 Ohmi

    inca 2 fire

Diagramă schematică

Schema pe placa

Notă

    În acest experiment instalăm un fotorezistor între sursa de alimentare și intrarea analogică, adică. la poziţia R1 în circuitul divizor de tensiune. Avem nevoie de acest lucru pentru ca atunci când iluminarea scade, să primim mai puțină tensiune la intrarea analogică.

    Încercați să plasați componentele astfel încât LED-ul să nu lumineze fotorezistorul.

Schiță

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // citiți nivelul de lumină. Apropo, anunță // îi puteți atribui o variabilă și o valoare deodată int lightness = analogRead(LDR_PIN) ; // citim valoarea din potențiometrul cu care reglam // valoare de prag între întuneric și lumină condiționată int prag = analogRead(POT_PIN) ; // declarăm o variabilă booleană și îi atribuim o valoare // „Este întuneric acum?” Variabile booleene, spre deosebire de // numere întregi, pot conține doar una dintre cele două valori: // adevărat sau fals. Asemenea valori // numit și boolean. boolean tooDark = (luminozitate< threshold) ; // folosiți ramificarea programului: procesorul va executa unul dintre // două blocuri de cod în funcție de execuția condiției. // Dacă (în engleză „dacă”) este prea întunecat... dacă (prea întunecat) ( // ...aprinde lumina digitalWrite(LED_PIN, HIGH) ; ) altfel ( // ...altfel nu este nevoie de lumina - stinge-o digitalWrite(LED_PIN, LOW) ; ) )

Explicații pentru cod

    Folosim un nou tip de variabilă - boolean, care stochează numai valorile adevărate (adevărat, 1) sau false (fals, 0). Aceste valori sunt rezultatul evaluării expresiilor booleene. În acest exemplu, expresia booleană este ușurință< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Am pus această expresie logică între paranteze doar pentru claritate. Este întotdeauna mai bine să scrieți cod care poate fi citit. În alte cazuri, parantezele pot afecta ordinea operațiilor, ca în aritmetica obișnuită.

    În experimentul nostru, expresia booleană va fi adevărată atunci când valoarea luminozității este mai mică decât valoarea pragului, deoarece am folosit operatorul< . Мы можем использовать операторы > , <= , >= , == , != , care înseamnă „mai mare decât”, „mai mic sau egal cu”, „mai mare sau egal cu”, „egal cu”, respectiv „nu este egal cu”.

    Fiți deosebit de atenți cu operatorul logic == și nu îl confundați cu operatorul de atribuire = . În primul caz, comparăm valorile expresiilor și obținem o valoare logică (adevărat sau fals), iar în al doilea caz, atribuim valoarea operandului din dreapta operandului din stânga. Compilatorul nu cunoaște intențiile noastre și nu va emite o eroare, dar putem schimba accidental valoarea unei variabile și apoi petrecem mult timp căutând o eroare.

    Instrucțiunea condițională if este una dintre cele cheie în majoritatea limbajelor de programare. Cu ajutorul acestuia, putem efectua nu numai o secvență strict definită de acțiuni, ci și să luăm decizii cu privire la ce ramură a algoritmului să urmăm, în funcție de anumite condiții.

    Expresia logică lejeritate< threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»

    Cu același succes am putea spune „dacă iluminarea este mai mică decât nivelul pragului, atunci porniți LED-ul”, adică. treceți întreaga expresie logică la dacă:

dacă (luminozitate< threshold) { // ... }

    In spate operator condițional dacă urmează neapărat un bloc de cod care este executat dacă expresia logică este adevărată. Nu uitați de ambele bretele ()!

    Dacă, dacă expresia este adevărată, trebuie doar să executăm unu instrucțiune, se poate scrie imediat după dacă (...) fără acolade:

dacă (luminozitate< threshold) digitalWrite(LED_PIN, HIGH) ;

    Declarația if poate fi extinsă cu un construct else. Blocul de cod, sau singura instrucțiune care îl urmează, va fi executată numai dacă expresia booleană în if este evaluată ca false. Regulile referitoare la bretele sunt aceleași. În experimentul nostru, am scris „dacă este prea întuneric, pornește LED-ul, altfel stinge LED-ul”.

Senzorii de lumină (iluminare), construiți pe baza de fotorezistoare, sunt destul de des folosiți în proiectele Arduino reale. Sunt relativ simple, nu sunt scumpe și ușor de găsit și cumpărat în orice magazin online. Fotorezistorul Arduino vă permite să controlați nivelul de lumină și să răspundeți la modificările acesteia. În acest articol ne vom uita la ce este un fotorezistor, cum funcționează un senzor de lumină bazat pe acesta și cum să conectați corect senzorul la plăcile Arduino.

Un fotorezistor, după cum sugerează și numele, este direct legat de rezistențele, care se găsesc adesea în aproape orice circuit electronic. Principala caracteristică a unui rezistor convențional este valoarea rezistenței sale. Tensiunea și curentul depind de el; folosind un rezistor, setăm modurile de funcționare necesare ale altor componente. De regulă, valoarea rezistenței unui rezistor practic nu se modifică în aceleași condiții de funcționare.

Spre deosebire de un rezistor convențional, fotorezistor isi poate modifica rezistenta in functie de nivelul luminii ambientale. Aceasta înseamnă că în circuit electronic Parametrii se vor schimba constant; în primul rând, ne interesează căderea tensiunii pe fotorezistor. Înregistrând aceste modificări de tensiune pe pinii analogici ai Arduino, putem schimba logica circuitului, creând astfel dispozitive care se adaptează la condițiile externe.

Fotorezistoarele sunt folosite destul de activ într-o mare varietate de sisteme. Cea mai comună aplicație este iluminatul stradal. Dacă se lasă noaptea în oraș sau devine înnorat, luminile se aprind automat. Poti realiza un bec economic pentru casa dintr-un fotorezistor care se aprinde nu dupa un program, ci in functie de iluminare. Puteți chiar să realizați un sistem de securitate bazat pe un senzor de lumină, care va fi declanșat imediat după ce un dulap închis sau seif este deschis și iluminat. Ca întotdeauna, domeniul de aplicare al oricărui senzor Arduino este limitat doar de imaginația noastră.

Ce fotorezistoare pot fi cumpărate din magazinele online

Cel mai popular și opțiune accesibilă senzorii de pe piață sunt modele de producție în masă de la companii chineze, clone de produse de la producătorul VT. Nu este întotdeauna posibil să ne dăm seama cine și ce anume produce acest sau acel furnizor, dar pentru a începe cu fotorezistoare, cea mai simplă opțiune este destul de potrivită.

Un utilizator începător Arduino poate fi sfătuit să cumpere un modul foto gata făcut, care arată astfel:


Acest modul conține deja toate elementele necesare pentru conexiune ușoară fotorezistor la placa Arduino. Unele module implementează un circuit comparator și oferă o ieșire digitală și un rezistor de reglare pentru control.

Un radioamator rus poate fi sfătuit să apeleze la senzorul rusesc PA. Disponibil la vânzare sunt FR1-3, FR1-4 etc. - au fost produse pe vremea sovietică. Dar, în ciuda acestui fapt, FR1-3 este un detaliu mai precis. Din aceasta rezultă diferența de preț.Pentru FR ei cer nu mai mult de 400 de ruble. FR1-3 va costa mai mult de o mie de ruble bucata.

Marcaj fotorezistor

Etichetarea modernă a modelelor produse în Rusia este destul de simplă. Primele două litere sunt PhotoResistor, numerele de după liniuță indică numărul de dezvoltare. FR -765 - fotorezistor, dezvoltare 765. De obicei marcat direct pe corpul piesei

Senzorul VT are un domeniu de rezistență indicat în diagrama de marcare. De exemplu:

  • VT83N1 - 12-100kOhm (12K – iluminat, 100K – în întuneric)
  • VT93N2 - 48-500kOhm (48K – iluminat, 100K – în întuneric).

Uneori, pentru a clarifica informațiile despre modele, vânzătorul oferă un document special de la producător. Pe lângă parametrii de funcționare, acolo este indicată și precizia piesei. Toate modelele au o gamă de sensibilitate în partea vizibilă a spectrului. Colectare senzor de lumina Trebuie să înțelegeți că acuratețea operațiunii este un concept relativ. Chiar și pentru modelele de la același producător, același lot sau aceeași achiziție, poate diferi cu 50% sau mai mult.

La fabrică, piesele sunt reglate pe lungimi de undă care variază de la lumină roșie la verde. Majoritatea oamenilor „văd” și radiația infraroșie. Piesele deosebit de precise pot detecta chiar și lumina ultravioletă.

Avantajele și dezavantajele senzorului

Principalul dezavantaj al fotorezistoarelor este sensibilitatea spectrului. În funcție de tipul de lumină incidentă, rezistența poate varia cu mai multe ordine de mărime. Dezavantajele includ și viteza mica reacții la schimbările de iluminare. Dacă lumina clipește, senzorul nu are timp să reacționeze. Dacă frecvența schimbării este destul de mare, rezistorul va înceta în general să „vadă” că iluminarea se schimbă.

Avantajele includ simplitatea și accesibilitatea. Schimbarea directă a rezistenței în funcție de lumina care cade pe ea vă permite să simplificați schema electrica conexiuni. Fotorezistorul în sine este foarte ieftin, este inclus în numeroase kituri și constructori Arduino și, prin urmare, este disponibil pentru aproape orice producător de Arduino începător.

Conectarea unui fotorezistor la Arduino

În proiecte arduino Fotorezistorul este folosit ca senzor de lumină. Primind informații de la acesta, placa poate porni sau opri releele, poate porni motoarele și poate trimite mesaje. Desigur, trebuie să conectăm corect senzorul.

Schema de conectare a senzorului de lumină la Arduino este destul de simplă. Dacă folosim un fotorezistor, atunci în schema de conectare senzorul este implementat ca divizor de tensiune. Un braț se schimbă în funcție de nivelul de iluminare, al doilea furnizează tensiune la intrarea analogică. În cipul controlerului, această tensiune este convertită în date digitale printr-un ADC. Deoarece Când rezistența senzorului scade atunci când lumina îl lovește, valoarea tensiunii care cade peste el va scădea și ea.

În funcție de brațul divizorului în care am plasat fotorezistorul, la intrarea analogică va fi furnizată tensiune crescută sau scăzută. Dacă un picior al fotorezistorului este conectat la masă, atunci valoarea maximă a tensiunii va corespunde întunericului (rezistența fotorezistorului este maximă, aproape toată tensiunea scade pe el), iar valoarea minimă va corespunde unei lumini bune (rezistența este aproape de zero, tensiunea este minimă). Dacă conectăm brațul fotorezistorului la sursa de alimentare, comportamentul va fi invers.

Instalarea plăcii în sine nu ar trebui să provoace dificultăți. Deoarece fotorezistorul nu are polaritate, poate fi conectat din ambele părți; poate fi lipit la placă, conectat cu fire folosind o placă de circuit sau folosit cu cleme obișnuite (cleme crocodil) pentru conectare. Sursa de alimentare din circuit este Arduino însuși. Fotorezistor un picior este conectat la pământ, celălalt este conectat la placa ADC (în exemplul nostru - AO). Conectăm un rezistor de 10 kOhm la același picior. Desigur, puteți conecta un fotorezistor nu numai la pinul analogic A0, ci și la oricare altul.

Câteva cuvinte despre rezistența suplimentară de 10 K. Are două funcții în circuitul nostru: limitarea curentului în circuit și formarea tensiunea necesarăîntr-un circuit cu divizor. Limitarea curentului este necesară într-o situație în care un fotorezistor complet iluminat își reduce drastic rezistența. Și generarea tensiunii este pentru valori previzibile pe portul analogic. De fapt pentru operatie normala Cu fotorezistoarele noastre, o rezistență de 1K este suficientă.

Schimbând valoarea rezistorului, putem „schimba” nivelul de sensibilitate către părțile „întunecate” și „luminoase”. Deci, 10 K vor da comutare rapidă apariția luminii. În cazul 1K, senzorul de lumină va detecta mai precis nivelurile ridicate de lumină.

Dacă utilizați modul gata senzor de lumină, atunci conexiunea va fi și mai simplă. Conectam ieșirea modulului VCC la conectorul de 5V de pe placă, GND la masă. Conectăm pinii rămași la conectorii Arduino.

Dacă placa are o ieșire digitală, atunci o trimitem la pinii digitali. Dacă este analogic, atunci treceți la analogic. În primul caz, vom primi un semnal de declanșare - nivelul de iluminare a fost depășit (pragul de declanșare poate fi ajustat folosind un rezistor de reglare). Din pinii analogici vom putea obține o valoare a tensiunii proporțională cu nivelul real de iluminare.

Un exemplu de schiță a unui senzor de lumină pe un fotorezistor

Am conectat circuitul cu fotorezistorul la Arduino și ne-am asigurat că totul a fost făcut corect. Acum nu mai rămâne decât să programați controlerul.

Scrierea unei schițe pentru un senzor de lumină este destul de simplă. Trebuie doar să eliminăm valoarea tensiunii curente din pinul analogic la care este conectat senzorul. Acest lucru se face folosind funcția analogRead() pe care o știm cu toții. Putem efectua apoi câteva acțiuni în funcție de nivelul de lumină.

Să scriem o schiță pentru un senzor de lumină care pornește sau stinge un LED conectat conform următorului circuit.

Algoritmul de operare este următorul:

  • Determinați nivelul semnalului de la pinul analogic.
  • Comparăm nivelul cu valoarea pragului. Valoarea maximă va corespunde întunericului, valoarea minimă va corespunde iluminării maxime. Să alegem o valoare de prag egală cu 300.
  • Dacă nivelul este mai mic decât pragul, este întuneric, trebuie să porniți LED-ul.
  • În caz contrar, stinge LED-ul.
#define PIN_LED 13 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println(val); dacă ( val< 300) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } }

Acoperind fotorezistorul (cu mâinile tale sau cu un obiect rezistent la lumină), putem observa LED-ul aprinderea și stingerea. Schimbând parametrul de prag din cod, putem forța becul să se aprindă/stinge la diferite niveluri de iluminare.

Când instalați, încercați să plasați fotorezistorul și LED-ul cât mai departe unul de celălalt posibil, astfel încât mai puțină lumină de la LED-ul strălucitor să cadă pe senzorul de lumină.

Senzor de lumină și schimbare lină a luminozității luminii de fundal

Puteți modifica proiectul astfel încât luminozitatea LED-ului să se modifice în funcție de nivelul de iluminare. Vom adăuga următoarele modificări la algoritm:

  • Vom schimba luminozitatea becului prin PWM, trimițând valori de la 0 la 255 la pinul cu LED-ul folosind analogWrite().
  • Pentru a converti valoarea digitală a nivelului de lumină de la senzorul de lumină (de la 0 la 1023) în gama PWM de luminozitate LED (de la 0 la 255), vom folosi funcția map().

Exemplu de schiță:

#define PIN_LED 10 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println(val); int ledPower = map(val, 0, 1023, 0, 255); // Convertiți valoarea rezultată în nivelul semnalului PWM. Cu cât este mai mică valoarea de iluminare, cu atât mai puțină putere trebuie să furnizăm LED-ului prin PWM. analogWrite(PIN_LED, ledPower) ; // Schimbați luminozitatea)

În cazul unei alte metode de conectare, în care semnalul de la portul analogic este proporțional cu gradul de iluminare, va trebui să „inversați” suplimentar valoarea scăzând-o din maxim:

Val int = 1023 – analogRead(PIN_PHOTO_RESISTOR);

Circuitul senzorului de lumină folosind un fotorezistor și un releu

Exemple de schițe pentru lucrul cu relee sunt date în articolul despre programarea releelor ​​în Arduino. În acest caz, nu trebuie să facem mișcări complexe: după ce am determinat „întunericul”, pur și simplu pornim releul și aplicăm valoarea corespunzătoare pinului său.

#define PIN_RELAY 10 #define PIN_PHOTO_SENSOR A0 void setup() ( pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); if (val< 300) { // Светло, выключаем реле digitalWrite(PIN_RELAY, HIGH); } else { // Темновато, включаем лампочку digitalWrite(PIN_RELAY, LOW); } }

Concluzie

Proiectele care folosesc un senzor de lumină bazat pe un fotorezistor sunt destul de simple și eficiente. Puteți implementa multe proiecte interesante, iar costul echipamentului nu va fi mare. Fotorezistorul este conectat folosind un circuit divizor de tensiune cu rezistență suplimentară. Senzorul este conectat la un port analogic pentru a măsura diferite niveluri de lumină sau la unul digital dacă tot ce ne pasă este de faptul întunericului. În schiță, citim pur și simplu datele dintr-un port analog (sau digital) și decidem cum să reacționăm la modificări. Să sperăm că acum astfel de „ochi” simpli vor apărea în proiectele tale.

În acest experiment, LED-ul ar trebui să se aprindă atunci când nivelul de lumină scade sub un prag stabilit de un potențiometru.

LISTA DE PĂRȚI PENTRU EXPERIMENT

- 1 placă Arduino Uno;

- 1 panou fara lipit;

- 1 LED;

- 1 fotorezistor;

- 1 rezistor cu o valoare nominală de 220 Ohmi, 1 rezistor cu o valoare nominală de 10 kOhmi;

- 1 rezistenta variabila (potentiometru);

- 10 fire tată-tată.

DETALII PENTRU SARCINI SUPLIMENTARE

încă 1 LED;

Inca 1 rezistenta cu o valoare nominala de 220 Ohmi;

inca 2 fire.

SCHEMA DE CIRCUIT

DIAGRAMĂ PE PLATĂ

SCHIȚĂ

descărcați schița pentru Arduino IDE
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // citește nivelul de lumină. Apropo, // poți declara o variabilă și aloca o valoare pentru aceasta dintr-o dată int lightness = analogRead(LDR_PIN); // citim valoarea de la potențiometru, pe care o folosim pentru a ajusta // valoarea pragului între întuneric condiționat și lumină int prag = analogRead(POT_PIN); // declarăm un variabilă logică și atribuiți-i valoarea // „este întunecat acum”. Variabilele booleene, spre deosebire de // variabilele întregi, pot conține doar una din două valori: // adevărat sau fals. Astfel de valori // sunt numite și boolean. boolean tooDark = (luminozitate< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

EXPLICAȚII PENTRU COD

  • Folosim un nou tip de variabile − boolean, care stochează numai valori Adevărat (adevărat, 1) sau fals (fals, 0). Aceste valori sunt rezultatul evaluării expresiilor booleene. În acest exemplu, expresia booleană este lejeritate< threshold . În limbajul uman, acest lucru sună ca: „iluminare sub nivelul pragului”. O astfel de afirmație va fi adevărată atunci când iluminarea este sub nivelul pragului. Microcontrolerul poate compara valorile variabilelor lejeritateȘi prag, care la rândul lor sunt rezultatele măsurătorii și calculează adevărul expresiei logice.
  • Am pus această expresie logică între paranteze doar pentru claritate. Este întotdeauna mai bine să scrieți cod care poate fi citit. În alte cazuri, parantezele pot afecta ordinea operațiilor, ca în aritmetica obișnuită.
  • În experimentul nostru, o expresie booleană va fi adevărată atunci când valoarea lejeritate mai putin decat valoarea prag pentru că am folosit operatorul < . Putem folosi operatori > , <= , >= , = = , != , care înseamnă „mai mare decât”, „mai mic sau egal cu”, „mai mare decât sau egal cu”, „egal cu”, respectiv „nu este egal cu”.
  • Fiți deosebit de atenți cu operatorul logic = = și nu îl confundați cu operatorul de atribuire = . În primul caz, comparăm valorile expresiilor și obținem o valoare logică (adevărat sau fals), iar în al doilea caz, atribuim valoarea operandului din dreapta operandului din stânga. Compilatorul nu cunoaște intențiile noastre și nu va emite o eroare, dar putem schimba accidental valoarea unei variabile și apoi petrecem mult timp căutând o eroare.
  • Operator condiționat dacăDacă") este una dintre cele cheie în majoritatea limbajelor de programare. Cu ajutorul acestuia, putem efectua nu numai o secvență strict definită de acțiuni, ci și să luăm decizii cu privire la ce ramură a algoritmului să urmăm, în funcție de anumite condiții.
  • Pentru o expresie logică lejeritate< threshold exista un sens: Adevărat sau fals. Am calculat-o și am pus-o într-o variabilă booleană prea intuneric("prea intuneric") Astfel, se pare că spunem „dacă este prea întuneric, atunci pornește LED-ul”
  • Cu același succes am putea spune „dacă iluminarea este mai mică decât nivelul pragului, atunci porniți LED-ul”, adică. transfer către dacă toate expresiile logice:
dacă (luminozitate< threshold) { // ... }
  • În spatele enunțului condiționat dacă Trebuie să existe un bloc de cod care este executat dacă expresia logică este adevărată. Nu uitați de ambele bretele {} !
  • Dacă, dacă expresia este adevărată, trebuie doar să executăm unu instrucțiuni, poate fi scris imediat după dacă (…) fără bretele:
dacă (luminozitate< threshold) digitalWrite(LED_PIN, HIGH);
  • Operator dacă poate fi extins prin proiectare altfel("in caz contrar"). Un bloc de cod sau o singură instrucțiune care îl urmează va fi executat numai dacă expresia logică este în dacă are sensul fals , « minciună" Regulile referitoare la bretele sunt aceleași. În experimentul nostru, am scris „dacă este prea întuneric, pornește LED-ul, altfel stinge LED-ul”.

ÎNTREBĂRI PENTRU A VA TESTĂ

  1. Dacă instalăm un fotorezistor între intrarea analogică și masă, dispozitivul nostru va funcționa invers: LED-ul se va aprinde când cantitatea de lumină crește. De ce?
  2. Ce rezultat al funcționării dispozitivului vom obține dacă lumina de la LED cade pe fotorezistor?
  3. Dacă instalăm fotorezistorul așa cum sa menționat în întrebarea anterioară, cum trebuie să schimbăm programul, astfel încât dispozitivul să funcționeze corect?
  4. Să presupunem că avem codul dacă (condiție) (acțiune;). In ce cazuri se va face? acțiune ?
  5. La ce valori y expresie x + y > 0 va fi adevărat dacă x > 0 ?
  6. Este necesar să se indice ce instrucțiuni să se execute dacă condiția este în instrucțiune dacă fals?
  7. Care este diferența dintre operator = = de la operator = ?
  8. Dacă folosim construcția dacă (condiție) acțiune1; else action2;, ar putea exista o situație în care niciuna dintre acțiuni să nu fie executată? De ce?

SARCINI PENTRU SOLUȚIE INDEPENDENTĂ

  1. Rescrieți programul fără a utiliza variabila prea intuneric menținând în același timp funcționalitatea dispozitivului.
  2. Adăugați un alt LED la circuit. Finalizați programul astfel încât atunci când iluminarea scade sub valoarea de prag, un LED se aprinde, iar când iluminarea scade sub jumătate din valoarea de prag, ambele LED-uri se aprind.
  3. Schimbați circuitul și programați astfel încât LED-urile să se aprindă după același principiu, dar strălucesc cu cât mai intens cu atât cade mai puțină lumină pe fotorezistor.




Top