Nattlys fra en gammel lyspære, basert på Arduino og WS2812. Oppgaver for selvstendig løsning

Sannsynligvis hadde alle en drøm i barndommen (og mer enn én). Du kan til og med prøve å huske følelsen som fyller et barns sjel når drømmen går i oppfyllelse, eller den fjerne, kjente gnisten i øynene hans... Som barn drømte jeg om å ha mitt eget nattlys.

Nå er jeg 4. års student ved BSUIR, og da vi ble fortalt at et kursprosjekt i kretsdesign ikke kan gjøres på papir, men på et stykke maskinvare, gikk det opp for meg: nattlyset som jeg ønsket som et barn kan lages av meg selv. Lag dessuten ikke bare et objekt som vil lyse opp rommet i mørket, men en enhet som enkelt kan kontrolleres for å passe til enhver stemning. Hvorfor ikke? Jeg bestemte meg for å legge til muligheten til å endre farger ved hjelp av hendene mine: jo nærmere hånden min er nattlyset, jo lysere lyser en av fargene (RGB). Jeg vil også gjerne styre nattlyset med fjernkontrollen.

Jeg innrømmer med en gang at jeg så ideen på nettstedet cxem.net. Kort fortalt brukte dette eksemplet en RGB-matrise, som ble kontrollert ved hjelp av skiftregistre og ultralydavstandssensorer. Men jeg trodde at matrisen bare skinner i én retning, men jeg ville at nattlyset skulle skinne på sidene.

Begrunnelse av kretselementene


Jeg vendte oppmerksomheten mot Arduino-mikrokontrollere. UNO er ​​et ganske passende alternativ for ideen min, for det første fordi det er den mest populære plattformen og antallet pinner ikke er for stort, i motsetning til Mega, og for det andre kan du koble en ekstern strømkilde til den, i mitt tilfelle er det 12V , i motsetning til Nano , for det tredje... vel, jeg tror vi kan stoppe ved disse to punktene. Plattformen er ekstremt populær over hele verden på grunn av bekvemmeligheten og enkelheten til programmeringsspråket, samt dens åpne arkitektur og programkode.

Mer detaljert informasjon Du kan enkelt finne informasjon om dette brettet på Internett, så jeg vil ikke overbelaste artikkelen.

Så, de grunnleggende kravene til systemet. Påkrevd:
– sensorer som vil spore avstanden til en hindring for å kontrollere systemet;
– sensor for å lese signaler fra fjernkontrollen fjernkontroll;
– LED, som vil gi den nødvendige belysningsfunksjonaliteten;
– en kontrollenhet som skal styre hele systemet.

Prosjektet krever avstandsmålere som avstandssensorer, som hver vil tilsvare en bestemt farge: rød, grønn, blå. Avstandssensorer vil overvåke håndens avstand til nattlyset og jo nærmere hånden bringes til en bestemt sensor, desto sterkere vil fargen som tilsvarer denne avstandsmåleren lyse. Omvendt, jo lenger unna hånden er, jo mindre spenning påføres fargen som tilsvarer sensoren.

De mest populære avstandsmålerne på dette øyeblikket disse er Sharp GP2Y0A21YK og HC-SR04. Sharp GP2Y0A21YK er en infrarød avstandsmåler. Den er utstyrt med en IR-sender og en IR-mottaker: den første fungerer som kilden til strålen, hvis refleksjon fanges opp av den andre. Samtidig er IR-strålene til sensoren usynlige for det menneskelige øyet og ved en slik intensitet er de ufarlige.

Sammenlignet med HC-SR04 ultralydsensor har denne sensoren både fordeler og ulemper. Fordelene inkluderer nøytralitet og harmløshet. Ulempene er kortere rekkevidde og avhengighet av ytre forstyrrelser, inkludert enkelte typer belysning.

Brukes som avstandssensorer for prosjektet: ultralyd avstandsmålere HC-SR04.
Driftsprinsippet til HC-SR04 er basert på det velkjente fenomenet ekkolokalisering. Ved bruk genererer senderen et akustisk signal som, etter å ha blitt reflektert fra hindringen, går tilbake til sensoren og registreres av mottakeren. Når du kjenner forplantningshastigheten til ultralyd i luft (ca. 340 m/s) og forsinkelsestiden mellom det utsendte og mottatte signalet, er det enkelt å beregne avstanden til den akustiske barrieren.

TRIG-inngangen kobles til en hvilken som helst pinne på mikrokontrolleren. En puls må påføres denne pinnen. digitalt signal varighet 10 μs. Basert på signalet ved TRIG-inngangen sender sensoren en pakke med ultralydpulser. Etter å ha mottatt det reflekterte signalet, genererer sensoren et pulssignal ved ECHO-pinnen, hvis varighet er proporsjonal med avstanden til hindringen.

IR sensor. Selvfølgelig vil signalet som kreves for fjernkontroll bli lest og dekodet fra denne sensoren. TSOP18 skiller seg bare fra hverandre i frekvens. VS1838B TSOP1838-sensoren ble valgt for prosjektet.

Prosjektet var basert på ideen om å belyse rommet i hvilken som helst farge, noe som betyr at du trenger 3 primærfarger som belysningen vil bli oppnådd fra: rød, grønn, blå. Derfor ble SMD 5050RGB LED-modellen valgt, som vil takle oppgaven perfekt.

Avhengig av mengden spenning som leveres til hver LED, vil de endre intensiteten til denne belysningen. LED-en må kobles til gjennom en motstand, ellers risikerer vi å ødelegge ikke bare den, men også Arduinoen. Motstanden er nødvendig for å begrense strømmen på LED-en til en akseptabel verdi. Faktum er at den interne motstanden til LED-en er veldig lav, og hvis du ikke bruker en motstand, vil en slik strøm passere gjennom LED-en at den ganske enkelt vil brenne ut både LED-en og kontrolleren.

LED-stripene som brukes i prosjektet er drevet av 12V.

På grunn av det faktum at spenningen på LED-ene i "av"-tilstand er 6V og det er nødvendig å regulere strømforsyningen, som overstiger 5V, er det nødvendig å legge til transistorer til kretsen i byttemodus. Mitt valg falt på BC547c-modellen.

La oss kort vurdere, for de som har glemt, operasjonsprinsippet npn transistor. Hvis du ikke legger på spenning i det hele tatt, men bare kortslutter base- og emitterterminalene, selv om det ikke kortslutter, men gjennom en motstand på flere ohm, viser det seg at base-emitterspenningen er null. Følgelig er det ingen grunnstrøm. Transistoren er lukket, kollektorstrømmen er ubetydelig liten, bare den samme startstrømmen. I dette tilfellet sies transistoren å være i cutoff-tilstand. Den motsatte tilstanden kalles metning: når transistoren er helt åpen, slik at det ikke er noe sted å åpne videre. Med denne åpningsgraden er motstanden til kollektor-emitter-seksjonen så lav at det rett og slett er umulig å slå på transistoren uten en belastning i kollektorkretsen; den vil brenne ut umiddelbart. I dette tilfellet kan restspenningen på kollektoren bare være 0,3...0,5V.

Disse to tilstandene, metning og cutoff, brukes når transistoren fungerer i en svitsjemodus, som en vanlig relékontakt. Hovedbetydningen av denne modusen er at en liten grunnstrøm styrer en stor kollektorstrøm, som er flere titalls ganger større enn grunnstrømmen. En stor kollektorstrøm oppnås pga ekstern kilde energi, men fortsatt er den nåværende gevinsten, som de sier, åpenbar. I vårt tilfelle inkluderer mikrokretsen, hvis driftsspenning er 5V, 3 striper med lysdioder som opererer fra 12V.

La oss beregne driftsmodusen til nøkkelkaskaden. Det er nødvendig å beregne verdien av motstanden i basiskretsen slik at lysdiodene brenner med full effekt. En nødvendig betingelse ved beregning er at strømforsterkningen er større enn eller lik kvotienten for å dele maksimal mulig kollektorstrøm med minimum mulig basisstrøm:

Derfor kan stripene ha en driftsspenning på 220V, og basiskretsen kan styres fra en mikrokrets med en spenning på 5V. Hvis transistoren er designet for å fungere med en slik spenning ved kollektoren, vil LED-ene lyse uten problemer.
Spenningsfallet over base-emitter-overgangen er 0,77V, forutsatt at basisstrømmen er 5mA og kollektorstrømmen er 0,1A.
Spenningen over basismotstanden vil være:

I følge Ohms lov:

Fra standardområdet av motstander velger vi en 8,2 kOhm motstand. Dette fullfører beregningen.

Jeg vil gjerne gjøre deg oppmerksom på ett problem som jeg har møtt. Når du bruker IRremote-biblioteket, frøs Arduino når du justerer den blå fargen. Etter et langt og grundig søk på Internett, viste det seg at dette biblioteket bruker Timer 2 som standard for denne Arduino-modellen. Tidtakere brukes til å kontrollere PWM-utganger.

Timer 0 (Systemtid, PWM 5 og 6);
Timer 1 (PWM 9 og 10);
Timer 2 (PWM 3 og 11).

Til å begynne med brukte jeg PWM 11 for å regulere blåfargen. Vær derfor forsiktig når du arbeider med PWM, tidtakere og tredjepartsbiblioteker som kan bruke dem. Det er rart det hjemmeside Det ble ikke sagt noe om denne nyansen på Github. Hvis du ønsker, kan du avkommentere linjen med timer 1 og kommentere ut 2.

Å koble til elementene på brødbrettet ser slik ut:

Etter testing på brødplaten startet fasene "Plassere elementer på brettet" og "Arbeid med loddebolt". Etter den første testingen av det ferdige brettet kommer en tanke snikende inn i hodet mitt: noe gikk galt. Og her begynner fasen, kjent for mange, "Møysommelig arbeid med testeren." Imidlertid ble problemene (flere tilstøtende kontakter ble ved et uhell loddet sammen) raskt eliminert, og her er det etterlengtede rampete lyset til LED-ene.

Da var det bare et spørsmål om kroppen. Av denne grunn ble kryssfiner med hull for våre sensorer kuttet. Bakre omslag den ble laget spesielt avtagbar slik at du kunne nyte utsikten fra innsiden og om ønskelig fullføre eller gjøre om noe. Den har også 2 hull for omprogrammering av brettet og strømforsyning.

Karosseriet ble limt med to-komponent epoksylim. Det er verdt å merke seg særegenheten til dette limet for de som ikke har møtt det før. Dette produktet kommer i to separate beholdere, og når innholdet blandes, oppstår en umiddelbar kjemisk reaksjon. Etter blanding må du handle raskt, innen 3-4 minutter. For videre bruk må du blande en ny porsjon. Så hvis du prøver å gjenta dette, er mitt råd til deg å blande i små porsjoner og handle veldig raskt, det blir ikke mye tid til å tenke. Derfor er det verdt å tenke på forhånd om hvordan og hvor du skal lime kroppen. Dessuten kan dette ikke gjøres på én gang.

For montering av strips med LED inn toppdekselet det ble satt inn et rør som alle ledningene gikk perfekt gjennom.

Da problemet med lampeskjermen dukket opp, husket jeg hvordan jeg som barn laget håndverk av enkel tråd, lim og en ballong, som fungerte som basen. Prinsippet for lampeskjermen er det samme, men å pakke inn et polyeder viste seg å være vanskeligere enn en ball. På grunn av trykket som ble utøvd av gjengene på strukturen, begynte den å smalne oppover og gjengene begynte å falle av. Med hendene dekket av lim ble det raskt besluttet å styrke strukturen ovenfra. Og så kom CD-en til unnsetning. Sluttresultatet er denne nattlampen:

Hva vil du si til slutt?

Hva bør jeg endre i prosjektet? For å levere TRIG-signalet til avstandssensorene kan man bruke én Arduino-utgang i stedet for tre. Jeg ville også sørget for et hull for IR-sensoren (som jeg glemte), som dessverre fortsatt er skjult i etuiet som den naturligvis ikke kan lese signaler fra fjernkontrollen fra. Men hvem sa at du ikke kan lodde eller bore noe?

Jeg vil merke meg at dette var et interessant semester, og en flott mulighet til å prøve å gjøre noe som ikke er på papiret, takket være at jeg kan sette en ny hake ved siden av elementet "barndomsdrøm". Og hvis du tror det er vanskelig å prøve noe nytt, og du ikke vet hva du skal gjøre først, ikke bekymre deg. Mange har en tanke som går gjennom hodet: hvor skal man begynne og hvordan kan dette i det hele tatt gjøres? Det er mange oppgaver i livet du kan bli forvirret av, men når du først prøver, vil du merke at du med et glimt i øynene kan flytte fjell, selv om du må prøve litt for dette.

For en tilleggsoppgave

    1 LED til

    1 motstand til med en nominell verdi på 220 Ohm

    2 ledninger til

Skjematisk diagram

Opplegg på brødbrettet

Merk

    I dette eksperimentet installerer vi en fotomotstand mellom strømforsyningen og den analoge inngangen, dvs. til posisjon R1 i spenningsdelerkretsen. Vi trenger dette slik at når belysningen avtar, får vi mindre spenning på den analoge inngangen.

    Prøv å plassere komponentene slik at lysdioden ikke lyser opp fotomotstanden.

Skisse

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // les lysnivået. Forresten, kunngjør // du kan tilordne en variabel og en verdi til den samtidig int lightness = analogRead(LDR_PIN) ; // les verdien fra potensiometeret som vi regulerer med // terskelverdi mellom betinget mørke og lys int threshold = analogRead(POT_PIN) ; // erklære en boolsk variabel og tilordne en verdi til den // "Er det mørkt nå." Boolske variabler, i motsetning til // heltall, kan bare inneholde én av to verdier: // sant eller usant. Slike verdier // også kalt boolesk. boolsk forMørk = (lyshet< threshold) ; // bruk programgrening: prosessoren vil kjøre en av // to blokker med kode avhengig av utførelsen av betingelsen. // Hvis (engelsk "if") er for mørkt... hvis (for mørkt) ( // ...slå på lyset digitalWrite(LED_PIN, HIGH); ) annet ( // ...ellers trengs ikke lyset - slå det av digitalWrite(LED_PIN, LOW) ; ) )

Forklaringer til koden

    Vi bruker en ny type variabel - boolsk, som bare lagrer verdiene sann (true, 1) eller usant (false, 0). Disse verdiene er resultatet av evaluering av boolske uttrykk. I dette eksemplet er det boolske uttrykket letthet< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Vi setter dette logiske uttrykket i parentes kun for klarhetens skyld. Det er alltid bedre å skrive lesbar kode. I andre tilfeller kan parenteser påvirke rekkefølgen av operasjoner, som i vanlig aritmetikk.

    I vårt eksperiment vil det boolske uttrykket være sant når lyshetsverdien er mindre enn terskelverdien fordi vi brukte operatoren< . Мы можем использовать операторы > , <= , >= , == , != , som betyr henholdsvis «større enn», «mindre enn eller lik», «større enn eller lik», «lik», «ikke lik».

    Vær spesielt forsiktig med den logiske operatoren == og ikke forveksle den med tilordningsoperatoren = . I det første tilfellet sammenligner vi verdiene til uttrykk og får en logisk verdi (sant eller usant), og i det andre tilfellet tildeler vi verdien av høyre operande til venstre operande. Kompilatoren kjenner ikke intensjonene våre og vil ikke gi en feil, men vi kan ved et uhell endre verdien på en variabel og deretter bruke lang tid på å lete etter en feil.

    Den betingede if-setningen er en av de viktigste i de fleste programmeringsspråk. Med dens hjelp kan vi utføre ikke bare en strengt definert sekvens av handlinger, men også ta beslutninger om hvilken gren av algoritmen som skal følges, avhengig av visse forhold.

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

    Med samme suksess kunne vi si "hvis belysningen er mindre enn terskelnivået, så slå på LED", dvs. send hele det logiske uttrykket til hvis:

hvis (letthet< threshold) { // ... }

    Bak betinget operatør if følger nødvendigvis en kodeblokk som utføres hvis det logiske uttrykket er sant. Ikke glem begge krøllete seler ()!

    Hvis, hvis uttrykket er sant, trenger vi bare å utføre en instruksjon, kan den skrives umiddelbart etter hvis (...) uten krøllete regulering:

hvis (letthet< threshold) digitalWrite(LED_PIN, HIGH) ;

    If-setningen kan utvides med en annen konstruksjon. Kodeblokken, eller enkeltsetningen etter den, vil bare bli utført hvis det boolske uttrykket i if evalueres til usant. Reglene for krøllete seler er de samme. I vårt eksperiment skrev vi "hvis det er for mørkt, slå på lysdioden, ellers slå av lysdioden."

Lyssensorer (belysning), bygget på basis av fotomotstander, brukes ganske ofte i ekte Arduino-prosjekter. De er relativt enkle, ikke dyre og enkle å finne og kjøpe i hvilken som helst nettbutikk. Arduino-fotomotstanden lar deg kontrollere lysnivået og reagere på endringene. I denne artikkelen skal vi se på hva en fotomotstand er, hvordan en lyssensor basert på den fungerer, og hvordan du kobler sensoren riktig til Arduino-kort.

En fotomotstand, som navnet antyder, er direkte relatert til motstander, som ofte finnes i nesten alle elektroniske kretser. Hovedkarakteristikken til en konvensjonell motstand er verdien av motstanden. Spenning og strøm avhenger av det; ved hjelp av en motstand setter vi de nødvendige driftsmodusene til andre komponenter. Som regel endres motstandsverdien til en motstand praktisk talt ikke under de samme driftsforholdene.

I motsetning til en konvensjonell motstand, fotomotstand kan endre motstanden avhengig av nivået av omgivelseslys. Dette betyr at i elektronisk krets Parametrene vil stadig endre seg; først og fremst er vi interessert i at spenningen faller over fotomotstanden. Ved å registrere disse spenningsendringene på de analoge pinnene til Arduino, kan vi endre logikken til kretsen, og dermed skape enheter som tilpasser seg ytre forhold.

Fotomotstander brukes ganske aktivt i en rekke systemer. Det vanligste programmet er gatebelysning. Hvis natten faller på byen eller det blir overskyet, tennes lysene automatisk. Du kan lage en økonomisk lyspære for hjemmet fra en fotomotstand som slår seg på ikke i henhold til en tidsplan, men avhengig av belysningen. Du kan til og med lage et sikkerhetssystem basert på en lyssensor, som utløses umiddelbart etter at et lukket skap eller safe er åpnet og opplyst. Som alltid er omfanget av bruken av Arduino-sensorer bare begrenset av fantasien vår.

Hvilke fotomotstander kan kjøpes i nettbutikker

Den mest populære og rimelig alternativ sensorer på markedet er modeller av masseproduksjon fra kinesiske selskaper, kloner av produkter fra produsenten VT. Det er ikke alltid mulig å finne ut hvem og hva denne eller den leverandøren produserer, men for å komme i gang med fotomotstander er det enkleste alternativet ganske passende.

En nybegynner Arduino-bruker kan rådes til å kjøpe en ferdig fotomodul som ser slik ut:


Denne modulen inneholder allerede alle nødvendige elementer for enkel tilkobling fotomotstand til Arduino-kortet. Noen moduler implementerer en komparatorkrets og gir en digital utgang og en trimmotstand for kontroll.

En russisk radioamatør kan rådes til å henvende seg til den russiske PA-sensoren. Tilgjengelig på salg er FR1-3, FR1-4, etc. - ble produsert tilbake i sovjettiden. Men til tross for dette er FR1-3 en mer nøyaktig detalj. Av dette følger forskjellen i pris For FR ber de om ikke mer enn 400 rubler. FR1-3 vil koste mer enn tusen rubler stykket.

Fotoresistormerking

Moderne merking av modeller produsert i Russland er ganske enkel. De to første bokstavene er PhotoResistor, tallene etter bindestreken indikerer fremkallingsnummeret. FR -765 - fotomotstand, fremkalling 765. Vanligvis merket direkte på delens kropp

VT-sensoren har et motstandsområde som er angitt i merkediagrammet. For eksempel:

  • VT83N1 - 12-100kOhm (12K – opplyst, 100K – i mørket)
  • VT93N2 - 48-500kOhm (48K – opplyst, 100K – i mørket).

Noen ganger, for å avklare informasjon om modeller, gir selgeren et spesielt dokument fra produsenten. I tillegg til driftsparametrene er nøyaktigheten til delen også angitt der. Alle modellene har et følsomhetsområde i den synlige delen av spekteret. Samler lyssensor Du må forstå at nøyaktigheten av operasjonen er et relativt konsept. Selv for modeller fra samme produsent, samme batch eller samme kjøp, kan det avvike med 50 % eller mer.

På fabrikken er delene innstilt til bølgelengder som spenner fra rødt til grønt lys. De fleste "ser" også infrarød stråling. Spesielt presise deler kan til og med oppdage ultrafiolett lys.

Fordeler og ulemper med sensoren

Den største ulempen med fotomotstander er spektrumfølsomhet. Avhengig av typen innfallende lys kan motstanden variere med flere størrelsesordener. Ulempene inkluderer også lav hastighet reaksjoner på endringer i belysning. Hvis lyset blinker, rekker ikke sensoren å reagere. Hvis endringsfrekvensen er ganske høy, vil motstanden generelt slutte å "se" at belysningen endrer seg.

Fordelene inkluderer enkelhet og tilgjengelighet. Direkte endring av motstanden avhengig av lyset som faller på den, lar deg forenkle elektrisk diagram forbindelser. Selve fotomotstanden er veldig billig, den er inkludert i en rekke Arduino-sett og konstruktører, og er derfor tilgjengelig for nesten enhver nybegynner Arduino-produsent.

Koble en fotomotstand til Arduino

I prosjekter arduino Fotomotstanden brukes som lyssensor. Ved å motta informasjon fra den, kan styret slå reléer på eller av, starte motorer og sende meldinger. Naturligvis må vi koble sensoren riktig.

Tilkoblingsskjemaet for lyssensoren til Arduino er ganske enkelt. Hvis vi bruker en fotomotstand, er sensoren i koblingsskjemaet implementert som en spenningsdeler. En arm endres avhengig av belysningsnivået, den andre gir spenning til den analoge inngangen. I kontrollerbrikken konverteres denne spenningen til digitale data gjennom en ADC. Fordi Når motstanden til sensoren avtar når lys treffer den, vil verdien av spenningen som faller over den også avta.

Avhengig av hvilken arm på deleren vi plasserte fotomotstanden i, vil enten økt eller redusert spenning tilføres den analoge inngangen. Hvis ett ben på fotomotstanden er koblet til jord, vil den maksimale spenningsverdien tilsvare mørket (motstanden til fotomotstanden er maksimal, nesten all spenningen faller over den), og minimumsverdien vil tilsvare god belysning (motstanden er nær null, spenningen er minimal). Hvis vi kobler fotomotstandsarmen til strømforsyningen, vil oppførselen være motsatt.

Installasjon av selve brettet bør ikke forårsake noen vanskeligheter. Siden fotomotstanden ikke har noen polaritet, kan den kobles fra begge sider; den kan loddes til kortet, kobles til ledninger ved hjelp av et kretskort, eller brukes med vanlige klips (krokodilleklemmer) for tilkobling. Strømkilden i kretsen er selve Arduinoen. Fotomotstand ett ben er koblet til bakken, det andre er koblet til ADC-kortet (i vårt eksempel - AO). Vi kobler en 10 kOhm motstand til samme ben. Naturligvis kan du koble en fotomotstand ikke bare til analog pinne A0, men også til en hvilken som helst annen.

Noen få ord om den ekstra 10 K motstanden. Den har to funksjoner i vår krets: begrense strømmen i kretsen og danne nødvendig spenning i en krets med en deler. Strømbegrensning er nødvendig i en situasjon der en fullt opplyst fotoresistor reduserer motstanden kraftig. Og spenningsgenerering er for forutsigbare verdier på den analoge porten. Egentlig for normal operasjon Med våre fotomotstander er en motstand på 1K nok.

Ved å endre motstandsverdien kan vi "skifte" følsomhetsnivået til de "mørke" og "lyse" sidene. Så, 10 K vil gi raskt bytte begynnelsen av lys. Ved 1K vil lyssensoren mer nøyaktig oppdage høye lysnivåer.

Hvis du bruker klar modul lyssensor, så blir tilkoblingen enda enklere. Vi kobler utgangen til VCC-modulen til 5V-kontakten på brettet, GND til jord. Vi kobler de resterende pinnene til Arduino-kontaktene.

Hvis brettet har en digital utgang, sender vi den til digitale pinner. Hvis det er analogt, så gå til analogt. I det første tilfellet vil vi motta et triggersignal - belysningsnivået er overskredet (triggerterskelen kan justeres ved hjelp av en justeringsmotstand). Fra de analoge pinnene vil vi kunne få en spenningsverdi proporsjonal med det faktiske belysningsnivået.

En eksempelskisse av en lyssensor på en fotomotstand

Vi koblet kretsen med fotomotstanden til Arduinoen og sørget for at alt ble gjort riktig. Nå gjenstår det bare å programmere kontrolleren.

Å skrive en skisse for en lyssensor er ganske enkelt. Vi trenger bare å fjerne gjeldende spenningsverdi fra den analoge pinnen som sensoren er koblet til. Dette gjøres ved å bruke analogRead()-funksjonen vi alle kjenner. Vi kan da utføre noen handlinger avhengig av lysnivået.

La oss skrive en skisse for en lyssensor som slår på eller av en LED koblet i henhold til følgende krets.

Driftsalgoritmen er som følger:

  • Bestem signalnivået fra den analoge pinnen.
  • Vi sammenligner nivået med terskelverdien. Maksimumsverdien vil tilsvare mørket, minimumsverdien vil tilsvare maksimal belysning. La oss velge en terskelverdi lik 300.
  • Hvis nivået er mindre enn terskelen, er det mørkt, du må slå på LED-en.
  • Ellers slår du av LED-en.
#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); } }

Ved å dekke til fotomotstanden (med hendene eller en lystett gjenstand), kan vi se at LED-en slås av og på. Ved å endre terskelparameteren i koden kan vi tvinge lyspæren til å slå seg på/av ved forskjellige lysnivåer.

Når du installerer, prøv å plassere fotomotstanden og LED så langt fra hverandre som mulig, slik at mindre lys fra den skarpe LED-en faller på lyssensoren.

Lyssensor og jevn endring i bakgrunnsbelysningens lysstyrke

Du kan endre prosjektet slik at lysstyrken til LED-en endres avhengig av belysningsnivået. Vi vil legge til følgende endringer i algoritmen:

  • Vi vil endre lysstyrken til lyspæren via PWM, og sende verdier fra 0 til 255 til pinnen med LED ved hjelp av analogWrite().
  • For å konvertere den digitale verdien av lysnivået fra lyssensoren (fra 0 til 1023) til PWM-området for LED-lysstyrke (fra 0 til 255), bruker vi map()-funksjonen.

Skisse eksempel:

#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); // Konverter den resulterende verdien til PWM-signalnivået. Jo lavere belysningsverdien er, desto mindre strøm må vi levere til LED-en via PWM. analogWrite(PIN_LED, ledPower) ; // Endre lysstyrke)

I tilfelle av en annen tilkoblingsmetode, der signalet fra den analoge porten er proporsjonalt med graden av belysning, må du i tillegg "reversere" verdien ved å trekke den fra maksimum:

Int val = 1023 – analogRead(PIN_PHOTO_RESISTOR);

Lyssensorkrets ved hjelp av fotomotstand og relé

Eksempler på skisser for arbeid med releer er gitt i artikkelen om programmering av reléer i Arduino. I dette tilfellet trenger vi ikke å gjøre komplekse bevegelser: etter å ha bestemt "mørket", slår vi ganske enkelt på reléet og bruker den tilsvarende verdien på pinnen.

#define PIN_RELAY 10 #define PIN_PHOTO_SENSOR A0 void oppsett() ( 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); } }

Konklusjon

Prosjekter som bruker en lyssensor basert på en fotoresistor er ganske enkle og effektive. Du kan implementere mange interessante prosjekter, og kostnadene for utstyr vil ikke være høye. Fotomotstanden kobles til ved hjelp av en spenningsdelerkrets med ekstra motstand. Sensoren er koblet til en analog port for å måle ulike lysnivåer eller til en digital hvis alt vi bryr oss om er mørket. I skissen leser vi ganske enkelt data fra en analog (eller digital) port og bestemmer hvordan vi skal reagere på endringene. La oss håpe at nå vil slike enkle "øyne" dukke opp i prosjektene dine.

I dette eksperimentet skal LED-en slå seg på når lysnivået faller under en terskel satt av et potensiometer.

LISTE OVER DELER FOR EKSPERIMENTET

- 1 Arduino Uno-brett;

- 1 loddefritt brødbrett;

- 1 LED;

- 1 fotomotstand;

- 1 motstand med en nominell verdi på 220 Ohm, 1 motstand med en nominell verdi på 10 kOhms;

- 1 variabel motstand (potensiometer);

- 10 hann-hann-ledninger.

DETALJER FOR TILLEGGSOPPGAVE

1 LED til;

En annen 1 motstand med en nominell verdi på 220 Ohm;

2 ledninger til.

KRETSDIAGRAM

DIAGRAM PÅ BRØDBAVTE

SKISSE

Last ned skisse for Arduino IDE
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // les lysnivået. Forresten, // kan du deklarere en variabel og tilordne en verdi til den på en gang int lightness = analogRead(LDR_PIN); // les verdien fra potensiometeret, som vi bruker til å justere // terskelverdien mellom betinget mørke og lys int terskel = analogRead(POT_PIN); // erklærer en logisk variabel og tilordne den verdien // "er det mørkt nå". Boolske variabler, i motsetning til // heltallsvariabler, kan bare inneholde én av to verdier: // sann eller usann. Slike verdier // kalles også boolske. boolsk forMørk = (lyshet< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

FORKLARINGER TIL KODEN

  • Vi bruker en ny type variabler − boolsk, som kun lagrer verdier ekte (sant, 1) eller falsk (usant, 0). Disse verdiene er resultatet av evaluering av boolske uttrykk. I dette eksemplet er det boolske uttrykket letthet< threshold . På menneskelig språk høres dette ut som: "lysstyrke under terskelnivået." Et slikt utsagn vil være sant når belysningen er under terskelnivået. Mikrokontrolleren kan sammenligne verdiene til variabler letthet Og terskel, som igjen er måleresultatene, og beregner sannheten til det logiske uttrykket.
  • Vi setter dette logiske uttrykket i parentes kun for klarhetens skyld. Det er alltid bedre å skrive lesbar kode. I andre tilfeller kan parenteser påvirke rekkefølgen av operasjoner, som i vanlig aritmetikk.
  • I vårt eksperiment vil et boolsk uttrykk være sant når verdien letthet mindre enn verdi terskel fordi vi brukte operatøren < . Vi kan bruke operatører > , <= , >= , = = , != , som betyr henholdsvis "større enn", "mindre enn eller lik", "større enn eller lik", "lik med", "ikke lik".
  • Vær spesielt forsiktig med den logiske operatoren = = og ikke forveksle det med oppdragsoperatøren = . I det første tilfellet sammenligner vi verdiene til uttrykk og får en logisk verdi (sant eller usant), og i det andre tilfellet tildeler vi verdien av høyre operande til venstre operande. Kompilatoren kjenner ikke intensjonene våre og vil ikke gi en feil, men vi kan ved et uhell endre verdien på en variabel og deretter bruke lang tid på å lete etter en feil.
  • Betinget operatør hvisHvis") er en av de viktigste i de fleste programmeringsspråk. Med dens hjelp kan vi utføre ikke bare en strengt definert sekvens av handlinger, men også ta beslutninger om hvilken gren av algoritmen som skal følges, avhengig av visse forhold.
  • For et logisk uttrykk letthet< threshold det er en mening: ekte eller falsk. Vi beregnet den og satte den inn i en boolsk variabel for mørkt("for mørkt") Dermed ser vi ut til å si "hvis det er for mørkt, så slå på LED"
  • Med samme suksess kunne vi si "hvis belysningen er mindre enn terskelnivået, så slå på LED", dvs. Overfør til hvis alle logiske uttrykk:
hvis (letthet< threshold) { // ... }
  • Bak den betingede uttalelsen hvis Det må være en kodeblokk som kjøres hvis det logiske uttrykket er sant. Ikke glem begge krøllete seler {} !
  • Hvis, hvis uttrykket er sant, trenger vi bare å utføre en instruksjoner, kan den skrives umiddelbart etter hvis (...) uten krøllete seler:
hvis (letthet< threshold) digitalWrite(LED_PIN, HIGH);
  • Operatør hvis kan utvides med design ellers("ellers"). En kodeblokk eller en enkelt setning etter den vil bare bli utført hvis det logiske uttrykket er i hvis har betydningen falsk , « å ligge" Reglene for krøllete seler er de samme. I vårt eksperiment skrev vi "hvis det er for mørkt, slå på lysdioden, ellers slå av lysdioden."

SPØRSMÅL Å TESTE DEG SELV

  1. Hvis vi installerer en fotomotstand mellom den analoge inngangen og jord, vil enheten vår fungere i revers: LED-en vil slå seg på når lysmengden øker. Hvorfor?
  2. Hvilket resultat av enhetens drift vil vi få hvis lyset fra LED-en faller på fotomotstanden?
  3. Hvis vi installerer fotomotstanden som angitt i forrige spørsmål, hvordan må vi endre programmet slik at enheten fungerer som den skal?
  4. La oss si at vi har koden if (tilstand) (handling;). I hvilke tilfeller vil det bli gjort? handling ?
  5. Til hvilke verdier y uttrykk x + y > 0 vil være sant hvis x > 0 ?
  6. Er det nødvendig å angi hvilke instruksjoner som skal utføres hvis betingelsen er i setningen hvis falsk?
  7. Hva er forskjellen mellom operatøren = = fra operatøren = ?
  8. Hvis vi bruker konstruksjonen hvis (tilstand) handling1; annen handling2;, kan det være en situasjon der ingen av handlingene blir utført? Hvorfor?

OPPGAVER FOR UAVHENGIG LØSNING

  1. Omskriv programmet uten å bruke variabelen for mørkt samtidig som enhetens funksjonalitet opprettholdes.
  2. Legg til en annen LED til kretsen. Fullfør programmet slik at når belysningen faller under terskelverdien, tennes én LED, og ​​når belysningen faller under halve terskelverdien, tennes begge LED-ene.
  3. Endre krets og program slik at lysdiodene tennes etter samme prinsipp, men lyser jo mer intenst jo mindre lys faller på fotomotstanden.




Topp