Nočna lučka iz stare žarnice, ki temelji na Arduinu in WS2812. Naloge za samostojno reševanje

Verjetno so vsi imeli sanje v otroštvu (in več kot eno). Lahko se celo poskusite spomniti občutka, ki napolni otrokovo dušo, ko se mu uresničijo sanje, ali tiste oddaljene, znane iskrice v njegovih očeh ... Kot otrok sem sanjal, da bi imel svojo nočno lučko.

Zdaj sem študent 4. letnika na BSUIR in ko so nam povedali, da se tečajna naloga iz načrtovanja vezij ne da narediti na papirju, ampak na kosu strojne opreme, se mi je posvetilo: nočna lučka, ki sem si jo tako želel otroka lahko naredim sam. Poleg tega ne naredite le predmeta, ki bo osvetljeval sobo v temi, ampak napravo, ki jo je mogoče enostavno upravljati, da ustreza vsakemu razpoloženju. Zakaj ne? Odločil sem se dodati možnost spreminjanja barv z rokami: bližje kot je moja roka nočni lučki, svetlejša je ena od barv (RGB). Z daljinskim upravljalnikom bi rad upravljal tudi nočno lučko.

Takoj priznam, da sem idejo zasledil na spletni strani cxem.net. Na kratko, v tem primeru je bila uporabljena matrika RGB, ki je bila krmiljena s pomočjo premičnih registrov in ultrazvočnih senzorjev razdalje. Sem pa mislil, da matrica sveti samo v eno smer, pa sem hotel, da nočna lučka sveti ob straneh.

Utemeljitev elementov vezja


Osredotočil sem se na mikrokontrolerje Arduino. UNO je za mojo idejo kar primerna opcija, prvič zato, ker je najbolj priljubljena platforma in število pinov ni preveliko, za razliko od Mega, in drugič, nanj lahko priključite zunanji vir napajanja, v mojem primeru je to 12V , za razliko od Nano , tretjič ... no, mislim, da se lahko ustavimo pri teh dveh točkah. Platforma je izjemno priljubljena po vsem svetu zaradi priročnosti in enostavnosti programskega jezika ter odprte arhitekture in programske kode.

več podrobne informacije Informacije o tej plošči lahko preprosto najdete na internetu, zato članka ne bom preobremenil.

Torej, osnovne zahteve za sistem. Zahtevano:
– senzorji, ki bodo spremljali razdaljo do ovire za nadzor sistema;
– senzor za branje signalov z daljinskega upravljalnika daljinec;
– LED diode, ki bodo zagotavljale potrebno funkcionalnost osvetlitve;
– krmilno enoto, ki bo krmilila celoten sistem.

Projekt zahteva merilnike razdalje kot senzorje razdalje, od katerih bo vsak ustrezal določeni barvi: rdeči, zeleni, modri. Senzorji razdalje bodo spremljali razdaljo roke do nočne lučke in bližje kot je roka približana določenemu senzorju, močneje bo zasvetila barva, ki ustreza temu merilniku razdalje. Nasprotno, bolj ko je roka oddaljena, manj napetosti je uporabljene za barvo, ki ustreza senzorju.

Najbolj priljubljeni daljinomeri na ta trenutek to sta Sharp GP2Y0A21YK in HC-SR04. Sharp GP2Y0A21YK je infrardeči daljinomer. Opremljen je z IR oddajnikom in IR sprejemnikom: prvi služi kot vir žarka, katerega odboj ujame drugi. Hkrati so IR žarki senzorja človeškemu očesu nevidni in pri taki jakosti neškodljivi.

V primerjavi z ultrazvočnim senzorjem HC-SR04 ima ta senzor tako prednosti kot slabosti. Prednosti vključujejo nevtralnost in neškodljivost. Slabosti so manjši doseg in odvisnost od zunanjih motenj, vključno z nekaterimi vrstami osvetlitve.

Uporabljeni kot senzorji razdalje za projekt: ultrazvočni daljinomeri HC-SR04.
Načelo delovanja HC-SR04 temelji na dobro znanem pojavu eholokacije. Pri uporabi oddajnik ustvari zvočni signal, ki se, ko se odbije od ovire, vrne v senzor in ga zazna sprejemnik. Ob poznavanju hitrosti širjenja ultrazvoka v zraku (približno 340 m/s) in časa zakasnitve med oddanim in sprejetim signalom je enostavno izračunati razdaljo do akustične pregrade.

Vhod TRIG se poveže s katerimkoli zatičem mikrokontrolerja. Na ta zatič je treba uporabiti impulz. digitalni signal trajanje 10 μs. Senzor na podlagi signala na vhodu TRIG pošlje paket ultrazvočnih impulzov. Po prejemu odbitega signala senzor ustvari pulzni signal na zatiču ECHO, katerega trajanje je sorazmerno z razdaljo do ovire.

IR senzor. Seveda bo signal, potreben za daljinsko upravljanje, prebran in dekodiran s tega senzorja. TSOP18 se med seboj razlikujejo le po frekvenci. Za projekt je bil izbran senzor VS1838B TSOP1838.

Projekt je temeljil na ideji osvetlitve prostora v kateri koli barvi, kar pomeni, da boste potrebovali 3 osnovne barve, iz katerih bo pridobljena osvetlitev: rdeča, zelena, modra. Zato je bil izbran model SMD 5050RGB LED, ki se bo odlično spopadel z nalogo.

Odvisno od količine napetosti, dobavljene vsaki LED, bodo spremenili intenzivnost te osvetlitve. LED mora biti priključena prek upora, sicer tvegamo, da uničimo ne samo to, ampak tudi Arduino. Upor je potreben za omejitev toka na LED na sprejemljivo vrednost. Dejstvo je, da je notranji upor LED zelo nizek in če ne uporabljate upora, bo skozi LED prešel tak tok, da bo preprosto izgorel tako LED kot krmilnik.

LED trakovi, uporabljeni v projektu, se napajajo z 12 V.

Ker je napetost na LED v izklopljenem stanju 6V in je treba regulirati napajanje, ki presega 5V, je potrebno v preklopnem načinu v vezje dodati tranzistorje. Moja izbira je padla na model BC547c.

Na kratko razmislimo, za tiste, ki so pozabili, načelo delovanja tranzistor npn. Če napetosti sploh ne uporabite, ampak preprosto kratko sklenete sponke baze in oddajnika, tudi če ne v kratkem stiku, ampak skozi upor več ohmov, se izkaže, da je napetost baza-emiter enaka nič. Posledično ni baznega toka. Tranzistor je zaprt, kolektorski tok je zanemarljivo majhen, enak začetni tok. V tem primeru naj bi bil tranzistor v izključenem stanju. Nasprotno stanje imenujemo nasičenost: ko je tranzistor popolnoma odprt, tako da se ni več kam odpreti. S to stopnjo odpiranja je upor odseka kolektor-emiter tako nizek, da je preprosto nemogoče vklopiti tranzistor brez obremenitve v kolektorskem vezju; takoj bo izgorel. V tem primeru je lahko preostala napetost na kolektorju le 0,3 ... 0,5 V.

Ti dve stanji, nasičenost in izklop, se uporabljata, ko tranzistor deluje v preklopnem načinu, kot običajni relejni kontakt. Glavni pomen tega načina je, da majhen bazni tok krmili velik kolektorski tok, ki je nekaj desetkrat večji od baznega toka. Velik kolektorski tok dobimo zaradi zunanji vir energije, a vseeno je trenutni dobiček, kot pravijo, očiten. V našem primeru mikrovezje, katerega delovna napetost je 5 V, vključuje 3 trakove z LED, ki delujejo od 12 V.

Izračunajmo način delovanja kaskade ključev. Potrebno je izračunati vrednost upora v osnovnem vezju, tako da LED diode gorijo s polno močjo. Nujen pogoj pri izračunu je, da je tokovni dobiček večji ali enak količniku deljenja največjega možnega kolektorskega toka z najmanjšim možnim osnovnim tokom:

Zato imajo lahko trakovi delovno napetost 220 V, osnovno vezje pa je mogoče krmiliti iz mikrovezja z napetostjo 5 V. Če je tranzistor zasnovan za delovanje s takšno napetostjo na kolektorju, bodo LED diode svetile brez težav.
Padec napetosti na spoju baza-emiter je 0,77 V, pod pogojem, da je osnovni tok 5 mA in kolektorski tok 0,1 A.
Napetost na osnovnem uporu bo:

Po Ohmovem zakonu:

Iz standardnega obsega uporov izberemo upor 8,2 kOhm. S tem je izračun zaključen.

Rad bi vas opozoril na eno težavo, na katero sem naletel. Pri uporabi knjižnice IRremote je Arduino zmrznil pri prilagajanju modre barve. Po dolgem in temeljitem iskanju po internetu se je izkazalo, da ta knjižnica za ta model Arduino privzeto uporablja Timer 2. Časovniki se uporabljajo za krmiljenje izhodov PWM.

Časovnik 0 (sistemski čas, PWM 5 in 6);
Časovnik 1 (PWM 9 in 10);
Časovnik 2 (PWM 3 in 11).

Sprva sem za regulacijo modre barve uporabljal PWM 11. Zato bodite previdni pri delu s PWM, časovniki in knjižnicami tretjih oseb, ki jih morda uporabljajo. Čudno je to domača stran O tej niansi na Githubu ni bilo nič povedano. Če želite, lahko odkomentirate vrstico s časovnikom 1 in komentirate 2.

Povezovanje elementov na mizi izgleda takole:

Po testiranju na testni plošči sta se začeli fazi "Postavljanje elementov na ploščo" in "Delo s spajkalnikom". Po prvem testiranju končane plošče se mi v glavo prikrade misel: nekaj je šlo narobe. In tukaj se začne faza, ki je znana mnogim, "mukotrpno delo s testerjem." Težave (več sosednjih kontaktov je bilo pomotoma spajkanih) so bile hitro odpravljene in tukaj je dolgo pričakovana nagajiva lučka LED.

Potem je šlo le še za telo. Iz tega razloga smo izrezali vezan les z luknjami za naše senzorje. Zadnja platnica Narejena je bila posebej odstranljiva, da lahko uživate v pogledu od znotraj in po želji kaj dokončate ali predelate. Ima tudi 2 luknji za reprogramiranje plošče in napajalnika.

Karoserija je bila lepljena z dvokomponentnim epoksi lepilom. Treba je omeniti posebnost tega lepila za tiste, ki se z njim še niso srečali. Ta izdelek je na voljo v dveh ločenih posodah in ko se vsebina zmeša, pride do takojšnje kemične reakcije. Po mešanju morate ukrepati hitro, v 3-4 minutah. Za nadaljnjo uporabo morate zmešati novo porcijo. Torej, če poskušate to ponoviti, vam svetujem, da mešate v majhnih porcijah in ukrepate zelo hitro, ne bo veliko časa za razmišljanje. Zato je vredno vnaprej razmišljati o tem, kako in kje prilepiti telo. Poleg tega tega ni mogoče storiti v eni seji.

Za montažo trakov z LED diodami zgornji pokrov vstavljena je bila cev, skozi katero so odlično šle vse žice.

Ko je nastal problem s senčnikom, sem se spomnil, kako sem kot otrok izdeloval obrt iz preprostih niti, lepila in balona, ​​ki je služil kot osnova. Načelo za senčnik je enako, vendar se je izkazalo, da je ovijanje poliedra težje kot krogla. Zaradi pritiska niti na konstrukcijo se je ta začela ožiti navzgor in nitke so začele odpadati. Nujno, z rokami, prekritimi z lepilom, je bilo odločeno, da okrepim strukturo od zgoraj. In takrat je na pomoč priskočil CD. Končni rezultat je ta nočna lučka:

Kaj bi povedali za konec?

Kaj naj spremenim v projektu? Za dobavo signala TRIG senzorjem razdalje bi lahko uporabili en izhod Arduino namesto treh. Predvidel bi tudi luknjo za IR senzor (na katerega sem pozabil), ki pa je, žal, še vedno skrit v ohišju, iz katerega seveda ne more brati signalov z daljinca. Vendar, kdo je rekel, da ne morete ničesar spajkati ali vrtati?

Rad bi omenil, da je bil to zanimiv semester in odlična priložnost, da poskusim narediti nekaj, kar ni na papirju, zaradi česar lahko postavim še eno kljukico poleg postavke "otroške sanje". In če mislite, da je poskusiti nekaj novega težko in ne veste, kaj storiti najprej, ne skrbite. Marsikomu se v glavi roji misel: kje začeti in kako to sploh narediti? V življenju je veliko nalog, od katerih se lahko zmedeš, a ko enkrat poskusiš, boš opazil, da lahko z iskrico v očeh premikaš gore, četudi se moraš za to malo potruditi.

Za dodatno nalogo

    še 1 LED

    Še 1 upor z nazivno vrednostjo 220 Ohmov

    še 2 žici

Shematski diagram

Shema na mizi

Opomba

    V tem poskusu namestimo fotoupor med napajalnik in analogni vhod, tj. na položaj R1 v tokokrogu delilnika napetosti. To potrebujemo, da ko se osvetlitev zmanjša, prejmemo manj napetosti na analognem vhodu.

    Poskusite postaviti komponente tako, da LED ne osvetli fotoupora.

Skica

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // preberite raven svetlobe. Mimogrede, naznani // lahko ji dodelite spremenljivko in vrednost hkrati int lahkotnost = analogRead(LDR_PIN) ; // odčitamo vrednost s potenciometra s katerim reguliramo // vrednost praga med pogojno temo in svetlobo int prag = analogRead(POT_PIN) ; // deklariramo logično spremenljivko in ji dodelimo vrednost // "Ali je zdaj temno." Logične spremenljivke, v nasprotju z // cela števila, lahko vsebujejo samo eno od dveh vrednosti: // pravilno ali napačno. Takšne vrednote // imenovano tudi logično. boolean tooDark = (svetlost< threshold) ; // uporaba razvejanja programa: procesor bo izvedel enega od // dva bloka kode, odvisno od izvedbe pogoja. // Če (angleško “if”) je pretemno ...če (tooDark) ( // ...prižgi razsvetljavo digitalWrite(LED_PIN, VISOKO) ; ) drugače ( // ...sicer lučka ni potrebna - ugasni jo digitalWrite(LED_PIN, LOW) ; ) )

Pojasnila kode

    Uporabljamo novo vrsto spremenljivke - boolean, ki shranjuje samo vrednosti true (true, 1) ali false (false, 0). Te vrednosti so rezultat vrednotenja logičnih izrazov. V tem primeru je logični izraz lahkotnost< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Ta logični izraz smo dali v oklepaje samo zaradi jasnosti. Vedno je bolje napisati berljivo kodo. V drugih primerih lahko oklepaji vplivajo na vrstni red operacij, kot pri običajni aritmetiki.

    V našem poskusu bo logični izraz resničen, ko bo vrednost svetlosti manjša od vrednosti praga, ker smo uporabili operator< . Мы можем использовать операторы > , <= , >= , == , != , ki pomenijo »večje od«, »manjše od ali enako«, »večje od ali enako«, »enako«, »ni enako« oz.

    Bodite še posebej previdni pri logičnem operatorju == in ga ne zamenjujte z operatorjem dodelitve =. V prvem primeru primerjamo vrednosti izrazov in dobimo logično vrednost (true ali false), v drugem primeru pa levemu operandu priredimo vrednost desnega operanda. Prevajalnik ne pozna naših namenov in ne bo izdal napake, lahko pa pomotoma spremenimo vrednost kakšne spremenljivke in nato dolgo časa iščemo napako.

    Pogojni stavek if je eden ključnih v večini programskih jezikov. Z njegovo pomočjo lahko izvajamo ne le strogo določeno zaporedje dejanj, ampak tudi sprejemamo odločitve o tem, kateri veji algoritma bomo sledili, odvisno od določenih pogojev.

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

    Z enakim uspehom bi lahko rekli, "če je osvetlitev manjša od mejne vrednosti, potem vklopite LED", tj. posreduje celoten logični izraz če:

če (lahkost< threshold) { // ... }

    zadaj pogojni operaterče nujno sledi bloku kode, ki se izvede, če je logični izraz resničen. Ne pozabite na oba zavita oklepaja ()!

    Če, če je izraz resničen, moramo samo izvršiti eno navodilo, lahko piše takoj za če (...) brez zavit oklepaj:

če (lahkost< threshold) digitalWrite(LED_PIN, HIGH) ;

    Stavek if je mogoče razširiti s konstrukcijo else. Blok kode ali posamezen stavek, ki mu sledi, se bo izvedel samo, če je logični izraz v if ovrednoten kot false. Pravila glede zavitih oklepajev so enaka. V našem poskusu smo zapisali "če je pretemno, prižgi LED, drugače pa ugasni LED."

Svetlobni senzorji (osvetlitev), zgrajeni na osnovi fotorezistorjev, se pogosto uporabljajo v resničnih projektih Arduino. So razmeroma enostavni, niso dragi in jih je enostavno najti in kupiti v kateri koli spletni trgovini. Fotorezistor Arduino vam omogoča nadzor nivoja svetlobe in odziv na njene spremembe. V tem članku bomo pogledali, kaj je fotorezistor, kako deluje svetlobni senzor, ki temelji na njem, in kako senzor pravilno priključiti na plošče Arduino.

Fotorezistor, kot že ime pove, je neposredno povezan z upori, ki jih pogosto najdemo v skoraj vseh elektronskih vezjih. Glavna značilnost običajnega upora je vrednost njegovega upora. Od tega sta odvisna napetost in tok, z uporom nastavimo potrebne načine delovanja drugih komponent. Praviloma se vrednost upora upora praktično ne spremeni v enakih pogojih delovanja.

Za razliko od običajnega upora, fotoupor lahko spremeni svoj upor glede na stopnjo svetlobe okolice. To pomeni, da v elektronsko vezje Parametri se bodo nenehno spreminjali, najprej nas zanima padec napetosti na fotouporu. Z beleženjem teh sprememb napetosti na analognih zatičih Arduina lahko spremenimo logiko vezja in s tem ustvarimo naprave, ki se prilagajajo zunanjim pogojem.

Fotorezistorji se precej aktivno uporabljajo v najrazličnejših sistemih. Najpogostejša uporaba je ulična razsvetljava. Če se v mestu znoči ali postane oblačno, se luči samodejno prižgejo. Iz fotorezistorja lahko naredite varčno žarnico za dom, ki se ne vklopi po urniku, ampak glede na osvetlitev. Izdelate lahko celo varnostni sistem na osnovi svetlobnega senzorja, ki se sproži takoj, ko se zaprta omara ali sef odpre in osvetli. Kot vedno je obseg uporabe katerega koli senzorja Arduino omejen le z našo domišljijo.

Katere fotorezistorje lahko kupite v spletnih trgovinah

Najbolj priljubljena in cenovno ugodna možnost senzorji na trgu so modeli množične proizvodnje kitajskih podjetij, kloni izdelkov proizvajalca VT. Ni vedno mogoče ugotoviti, kdo in kaj točno proizvaja ta ali oni dobavitelj, a za začetek s fotorezistorji je najpreprostejša možnost povsem primerna.

Začetnemu uporabniku Arduino lahko svetujemo, da kupi že pripravljen foto modul, ki izgleda takole:


Ta modul že vsebuje vse potrebne elemente za enostavna povezava fotoupor na ploščo Arduino. Nekateri moduli izvajajo primerjalno vezje in zagotavljajo digitalni izhod in trim upor za krmiljenje.

Ruskemu radioamaterju lahko svetujemo, naj se obrne na ruski PA senzor. V prodaji so na voljo FR1-3, FR1-4 itd. - so bili proizvedeni v času Sovjetske zveze. Toda kljub temu je FR1-3 natančnejša podrobnost. Iz tega sledi razlika v ceni.Za FR ne zahtevajo več kot 400 rubljev. FR1-3 bo stal več kot tisoč rubljev na kos.

Označevanje fotoupora

Sodobno označevanje modelov, proizvedenih v Rusiji, je precej preprosto. Prvi dve črki sta PhotoResistor, številke za pomišljajem označujejo razvojno številko. FR -765 - fotorezistor, razvoj 765. Običajno označen neposredno na telesu dela

Senzor VT ima območje upora, navedeno v diagramu označevanja. Na primer:

  • VT83N1 - 12-100kOhm (12K – osvetljeno, 100K – v temi)
  • VT93N2 - 48-500kOhm (48K - osvetljeno, 100K - v temi).

Včasih za razjasnitev informacij o modelih prodajalec zagotovi poseben dokument proizvajalca. Poleg delovnih parametrov je tam navedena tudi natančnost dela. Vsi modeli imajo območje občutljivosti v vidnem delu spektra. Zbiranje svetlobni senzor Razumeti morate, da je natančnost delovanja relativen pojem. Tudi pri modelih istega proizvajalca, iste serije ali istega nakupa se lahko razlikuje za 50 % ali več.

V tovarni so deli nastavljeni na valovne dolžine od rdeče do zelene svetlobe. Večina ljudi "vidi" tudi infrardeče sevanje. Posebej natančni deli lahko zaznajo celo ultravijolično svetlobo.

Prednosti in slabosti senzorja

Glavna pomanjkljivost fotouporov je spektralna občutljivost. Odvisno od vrste vpadne svetlobe se lahko odpornost razlikuje za več velikosti. Slabosti vključujejo tudi nizka hitrost reakcije na spremembe v osvetlitvi. Če lučka utripa, senzor nima časa za odziv. Če je frekvenca spremembe precej visoka, bo upor na splošno prenehal "videti", da se osvetlitev spreminja.

Prednosti vključujejo preprostost in dostopnost. Neposredno spreminjanje upora glede na svetlobo, ki pada nanj, vam omogoča poenostavitev električni diagram povezave. Sam fotoupor je zelo poceni, vključen je v številne komplete in konstruktorje Arduino, zato je na voljo skoraj vsakemu izdelovalcu Arduino začetniku.

Priključitev fotoupora na Arduino

V projektih arduino Fotorezistor se uporablja kot svetlobni senzor. S prejemanjem informacij lahko plošča vklopi ali izklopi releje, zažene motorje in pošlje sporočila. Seveda moramo senzor pravilno priključiti.

Diagram povezave svetlobnega senzorja z Arduino je precej preprost. Če uporabljamo fotoupor, potem je senzor v vezalni shemi izveden kot delilnik napetosti. Ena roka se spreminja glede na stopnjo osvetlitve, druga pa napaja analogni vhod z napetostjo. V krmilnem čipu se ta napetost pretvori v digitalne podatke prek ADC. Ker Ko se odpornost senzorja zmanjša, ko vanj zadene svetloba, se zmanjša tudi vrednost napetosti, ki pada čez senzor.

Odvisno od tega, v kateri krak delilnika smo postavili fotoupor, se bo na analogni vhod dovajala povečana ali zmanjšana napetost. Če je ena noga fotoupora povezana z maso, bo največja vrednost napetosti ustrezala temi (upornost fotoupora je največja, skoraj vsa napetost pade nanj), najmanjša vrednost pa bo ustrezala dobri osvetlitvi (upornost je blizu ničle, napetost je minimalna). Če na napajalnik priključimo krak fotoupora, bo vedenje ravno obratno.

Sama namestitev plošče ne bi smela povzročati težav. Ker fotoupor nima polarnosti, ga lahko priklopimo z obeh strani, prispajkamo ga na ploščo, povežemo z žicami s pomočjo vezja ali uporabimo za priklop navadne sponke (krokodilčke). Vir energije v vezju je sam Arduino. Fotorezistor ena noga je povezana z maso, druga je povezana z ADC ploščo (v našem primeru - AO). Na isto nogo priključimo upor 10 kOhm. Seveda lahko fotorezistor priključite ne samo na analogni pin A0, ampak tudi na kateri koli drug.

Nekaj ​​besed o dodatnem uporu 10 K. V našem vezju ima dve funkciji: omejevanje toka v vezju in oblikovanje zahtevana napetost v vezju z delilnikom. Omejitev toka je potrebna v primeru, ko popolnoma osvetljen fotoupor močno zmanjša svojo odpornost. Generiranje napetosti je za predvidljive vrednosti na analognih vratih. Pravzaprav za normalno delovanje Pri naših fotouporih zadostuje upor 1K.

S spreminjanjem vrednosti upora lahko "premaknemo" stopnjo občutljivosti na "temno" in "svetlo" stran. Torej, 10 K bo dal hitro preklapljanje pojav svetlobe. V primeru 1K bo svetlobni senzor natančneje zaznal visoke ravni svetlobe.

Če uporabljate pripravljen modul svetlobni senzor, potem bo povezava še enostavnejša. Izhod modula VCC priključimo na 5V konektor na plošči, GND na maso. Preostale pine priključimo na konektorje Arduino.

Če ima plošča digitalni izhod, ga pošljemo na digitalne zatiče. Če je analogno, pojdite na analogno. V prvem primeru bomo prejeli sprožilni signal - raven osvetlitve je bila presežena (prag sprožitve je mogoče nastaviti z nastavitvenim uporom). Iz analognih pinov bomo lahko pridobili vrednost napetosti, ki je sorazmerna dejanski ravni osvetlitve.

Primer skice svetlobnega senzorja na fotouporu

Vezje s fotorezistorjem smo povezali z Arduinom in se prepričali, da je vse narejeno pravilno. Zdaj ostane le še programiranje krmilnika.

Pisanje skice za svetlobni senzor je povsem preprosto. Odstraniti moramo le trenutno vrednost napetosti z analognega pina, na katerega je priključen senzor. To se naredi s funkcijo analogRead(), ki jo vsi poznamo. Nato lahko izvedemo nekaj dejanj, odvisno od stopnje svetlobe.

Napišimo skico za svetlobni senzor, ki vklopi ali izklopi LED, povezano v skladu z naslednjim vezjem.

Algoritem delovanja je naslednji:

  • Določite nivo signala iz analognega zatiča.
  • Raven primerjamo z mejno vrednostjo. Največja vrednost bo ustrezala temi, najmanjša vrednost bo ustrezala največji osvetljenosti. Izberimo vrednost praga, ki je enaka 300.
  • Če je nivo nižji od praga, je temno, morate vklopiti LED.
  • V nasprotnem primeru izklopite LED.
#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); if ( val< 300) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } }

Če pokrijemo fotoupor (z rokami ali predmetom, ki ne prepušča svetlobe), lahko opazujemo prižiganje in ugašanje LED. S spremembo parametra praga v kodi lahko prisilimo, da se žarnica vklopi/izklopi pri različnih stopnjah osvetlitve.

Pri namestitvi poskusite postaviti fotoupor in LED čim dlje drug od drugega, tako da manj svetlobe svetle LED pade na svetlobni senzor.

Svetlobni senzor in gladko spreminjanje svetlosti osvetlitve ozadja

Projekt lahko spremenite tako, da se svetlost LED spreminja glede na stopnjo osvetlitve. V algoritem bomo dodali naslednje spremembe:

  • Svetlost žarnice bomo spremenili preko PWM, s pošiljanjem vrednosti od 0 do 255 na pin z LED z analogWrite().
  • Za pretvorbo digitalne vrednosti nivoja svetlobe iz svetlobnega senzorja (od 0 do 1023) v območje PWM svetlosti LED (od 0 do 255) bomo uporabili funkcijo map().

Primer skice:

#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); // Pretvori dobljeno vrednost v nivo signala PWM. Nižja kot je vrednost osvetlitve, manj energije moramo dovajati LED preko PWM. analogWrite(PIN_LED, ledPower) ; // Spremeni svetlost)

Pri drugem načinu povezave, pri katerem je signal iz analognega priključka sorazmeren s stopnjo osvetlitve, boste morali vrednost dodatno »obrniti« tako, da jo odštejete od največje:

Int val = 1023 – analogRead(PIN_PHOTO_RESISTOR);

Vezje svetlobnega senzorja z uporabo fotoupora in releja

Primeri skic za delo z releji so podani v članku o programiranju relejev v Arduinu. V tem primeru nam ni treba narediti zapletenih gibov: po določitvi "teme" preprosto vklopimo rele in uporabimo ustrezno vrednost na njegovem zatič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); } }

Zaključek

Projekti, ki uporabljajo svetlobni senzor na osnovi fotoupora, so precej preprosti in učinkoviti. Izvedete lahko veliko zanimivih projektov, stroški opreme pa ne bodo visoki. Fotorezistor je povezan z napetostnim delilnikom z dodatnim uporom. Senzor je povezan z analognim priključkom za merjenje različnih ravni svetlobe ali z digitalnim, če nas zanima samo tema. Na skici preprosto preberemo podatke iz analognega (ali digitalnega) priključka in se odločimo, kako se bomo odzvali na spremembe. Upajmo, da se bodo zdaj v vaših projektih pojavile tako preproste "oči".

V tem poskusu se mora LED dioda vklopiti, ko raven svetlobe pade pod prag, ki ga nastavi potenciometer.

SEZNAM DELOV ZA POSKUS

- 1 plošča Arduino Uno;

- 1 plošča brez spajkanja;

- 1 LED;

- 1 fotoupor;

- 1 upor z nazivno vrednostjo 220 Ohmov, 1 upor z nazivno vrednostjo 10 kOhmov;

- 1 spremenljivi upor (potenciometer);

- 10 moški-moški žic.

PODROBNOSTI ZA DODATNO NALOGO

še 1 LED;

Še en upor z nazivno vrednostjo 220 ohmov;

še 2 žici.

SHEMA VEZJA

DIAGRAM NA MEZNICI

SKICA

prenesite skico za Arduino IDE
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // preberite raven svetlobe. Mimogrede, // lahko deklarirate spremenljivko in jo dodelite vrednost naenkrat int lightness = analogRead(LDR_PIN); // preberemo vrednost s potenciometra, ki ga uporabljamo za prilagoditev // vrednosti praga med pogojno temo in svetlobo int threshold = analogRead(POT_PIN); // deklariramo logično spremenljivko in ji dodelite vrednost // "ali je zdaj temno". Logične spremenljivke, za razliko od // celih spremenljivk, lahko vsebujejo samo eno od dveh vrednosti: // resnično ali napačno. Take vrednosti // se imenujejo tudi logične. boolean tooDark = (svetlost< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

POJASNILA ZA KODO

  • Uporabljamo novo vrsto spremenljivk − logično, ki shranjujejo samo vrednosti prav (res, 1) oz lažno (napačno, 0). Te vrednosti so rezultat vrednotenja logičnih izrazov. V tem primeru je logični izraz lahkotnost< threshold . V človeškem jeziku to zveni kot: "osvetljenost pod pragom." Takšna izjava bo resnična, ko bo osvetlitev pod pragom. Mikrokrmilnik lahko primerja vrednosti spremenljivk lahkotnost in prag, ki so rezultati meritev, in izračunajo resničnost logičnega izraza.
  • Ta logični izraz smo dali v oklepaje samo zaradi jasnosti. Vedno je bolje napisati berljivo kodo. V drugih primerih lahko oklepaji vplivajo na vrstni red operacij, kot pri običajni aritmetiki.
  • V našem poskusu bo logični izraz resničen, ko bo vrednost lahkotnost manj kot vrednost prag ker smo uporabili operaterja < . Uporabimo lahko operaterje > , <= , >= , = = , != , ki pomenijo »več kot«, »manj kot ali enako«, »večje kot ali enako«, »enako«, »ni enako« oz.
  • Bodite še posebej previdni pri logičnem operatorju = = in ne zamenjujte ga z operatorjem dodelitve = . V prvem primeru primerjamo vrednosti izrazov in dobimo logično vrednost (true ali false), v drugem primeru pa levemu operandu priredimo vrednost desnega operanda. Prevajalnik ne pozna naših namenov in ne bo izdal napake, lahko pa pomotoma spremenimo vrednost kakšne spremenljivke in nato dolgo časa iščemo napako.
  • Pogojni operator čeče") je eden ključnih v večini programskih jezikov. Z njegovo pomočjo lahko izvajamo ne le strogo določeno zaporedje dejanj, ampak tudi sprejemamo odločitve o tem, kateri veji algoritma bomo sledili, odvisno od določenih pogojev.
  • Za logično izražanje lahkotnost< threshold obstaja pomen: prav oz lažno. Izračunali smo ga in dali v logično spremenljivko pretemno("pretemno") Tako se zdi, da pravimo "če je pretemno, potem prižgi LED"
  • Z enakim uspehom bi lahko rekli, "če je osvetlitev manjša od mejne vrednosti, potem vklopite LED", tj. prenos na če vsi logični izrazi:
če (lahkost< threshold) { // ... }
  • Za pogojnim stavkom če Obstajati mora blok kode, ki se izvede, če je logični izraz resničen. Ne pozabite na oba zavita oklepaja {} !
  • Če, če je izraz resničen, moramo samo izvršiti eno navodila, se lahko piše takoj po če (…) brez zavitih oklepajev:
če (lahkost< threshold) digitalWrite(LED_PIN, HIGH);
  • Operater če se lahko načrtno razširi drugače(»sicer«). Blok kode ali posamezen stavek, ki mu sledi, bo izveden le, če je logični izraz v če ima pomen lažno , « laž" Pravila glede zavitih oklepajev so enaka. V našem poskusu smo zapisali "če je pretemno, prižgi LED, drugače pa ugasni LED."

VPRAŠANJA ZA PREIZKUS

  1. Če med analogni vhod in maso vgradimo fotoupor, bo naša naprava delovala obratno: LED se bo vklopila, ko se bo količina svetlobe povečala. Zakaj?
  2. Kakšen rezultat delovanja naprave bomo dobili, če bo svetloba LED diode padla na fotoupor?
  3. Če namestimo fotoupor, kot je navedeno v prejšnjem vprašanju, kako naj spremenimo program, da bo naprava delovala pravilno?
  4. Recimo, da imamo kodo če (pogoj) (dejanje;). V katerih primerih bo to storjeno? ukrepanje ?
  5. Pri kakšnih vrednostih l izražanje x + y > 0 bo res, če x > 0 ?
  6. Ali je treba navesti, katera navodila naj se izvršijo, če je pogoj v stavku če lažno?
  7. Kakšna je razlika med operaterjem = = od operaterja = ?
  8. Če uporabimo konstrukcijo če (pogoj) dejanje1; sicer dejanje2;, ali lahko pride do situacije, ko se nobeno dejanje ne izvede? Zakaj?

NALOGE ZA SAMOSTOJNO REŠEVANJE

  1. Prepišite program brez uporabe spremenljivke pretemno ob ohranjanju funkcionalnosti naprave.
  2. V vezje dodajte še eno LED. Dokončajte program tako, da ko osvetlitev pade pod mejno vrednost, se prižge ena LED, ko pade osvetlitev pod polovico mejne vrednosti, pa se prižgeta obe LED.
  3. Spremenite vezje in programirajte tako, da se svetleče diode svetijo po istem principu, vendar svetijo tem močneje, čim manj svetlobe pade na fotoupor.




Vrh