Nattljus från en gammal glödlampa, baserad på Arduino och WS2812. Uppgifter för självständig lösning

Förmodligen hade alla en dröm i barndomen (och mer än en). Du kan till och med försöka komma ihåg känslan som fyller ett barns själ när hans dröm går i uppfyllelse, eller det där avlägsna, välbekanta gnistan i hans ögon... Som barn drömde jag om att ha en egen nattlampa.

Nu går jag fjärde året på BSUIR och när vi fick höra att ett kursprojekt i kretsdesign inte kan göras på papper, utan på en hårdvara, gick det upp för mig: nattlampan som jag så önskade som ett barn kan göras av mig själv. Gör dessutom inte bara ett föremål som lyser upp rummet i mörkret, utan en enhet som enkelt kan styras för att passa alla humör. Varför inte? Jag bestämde mig för att lägga till möjligheten att ändra färger med mina händer: ju närmare min hand är nattljuset, desto starkare lyser en av färgerna (RGB). Jag skulle också vilja styra nattljuset med fjärrkontrollen.

Jag ska genast erkänna att jag upptäckte idén på webbplatsen cxem.net. Kortfattat använde detta exempel en RGB-matris, som styrdes med hjälp av skiftregister och ultraljudsavståndssensorer. Men jag trodde att matrisen bara lyser åt ett håll, men jag ville att nattljuset skulle lysa på sidorna.

Motivering av kretselementen


Jag riktade min uppmärksamhet mot Arduino-mikrokontroller. UNO är ett ganska lämpligt alternativ för min idé, för det första eftersom det är den mest populära plattformen och antalet stift inte är för stort, till skillnad från Mega, och för det andra kan du ansluta en extern strömkälla till den, i mitt fall är det 12V , till skillnad från Nano , för det tredje... ja, jag tror att vi kan stanna vid dessa två punkter. Plattformen är extremt populär över hela världen tack vare programmeringsspråkets bekvämlighet och enkelhet, samt dess öppna arkitektur och programkod.

Mer detaljerad information Du kan enkelt hitta information om detta forum på Internet, så jag kommer inte att överbelasta artikeln.

Så, de grundläggande kraven för systemet. Nödvändig:
– sensorer som spårar avståndet till ett hinder för att styra systemet;
– sensor för avläsning av signaler från fjärrkontrollen fjärrkontroll;
– Lysdioder, som ger den nödvändiga belysningsfunktionaliteten;
– en styrenhet som ska styra hela systemet.

Projektet kräver avståndsmätare som avståndssensorer, som var och en kommer att motsvara en specifik färg: röd, grön, blå. Avståndssensorer kommer att övervaka handens avstånd till nattljuset och ju närmare handen förs till en viss sensor, desto starkare kommer färgen som motsvarar denna avståndsmätare att lysa. Omvänt, ju längre bort handen är, desto mindre spänning appliceras på färgen som motsvarar sensorn.

De mest populära avståndsmätarna på det här ögonblicket dessa är Sharp GP2Y0A21YK och HC-SR04. Sharp GP2Y0A21YK är en infraröd avståndsmätare. Den är utrustad med en IR-sändare och en IR-mottagare: den första fungerar som strålkällan, vars reflektion fångas upp av den andra. Samtidigt är sensorns IR-strålar osynliga för det mänskliga ögat och vid sådan intensitet är de ofarliga.

Jämfört med ultraljudssensorn HC-SR04 har denna sensor både fördelar och nackdelar. Fördelarna inkluderar neutralitet och ofarlighet. Nackdelarna är kortare räckvidd och beroende av yttre störningar, inklusive vissa typer av belysning.

Används som avståndssensorer för projektet: ultraljudsavståndsmätare HC-SR04.
Funktionsprincipen för HC-SR04 är baserad på det välkända fenomenet ekolokalisering. När den används genererar sändaren en akustisk signal som, efter att ha reflekterats från hindret, återgår till sensorn och registreras av mottagaren. Genom att känna till utbredningshastigheten för ultraljud i luft (cirka 340 m/s) och fördröjningstiden mellan den utsända och mottagna signalen är det lätt att beräkna avståndet till den akustiska barriären.

TRIG-ingången ansluts till valfritt stift på mikrokontrollern. En puls måste appliceras på denna stift. digital signal varaktighet 10 μs. Baserat på signalen vid TRIG-ingången skickar sensorn ett paket med ultraljudspulser. Efter att ha mottagit den reflekterade signalen genererar sensorn en pulssignal vid ECHO-stiftet, vars varaktighet är proportionell mot avståndet till hindret.

IR-sensor. Givetvis kommer signalen som krävs för fjärrkontroll att läsas och avkodas från denna sensor. TSOP18 skiljer sig endast från varandra i frekvens. VS1838B TSOP1838-sensorn valdes för projektet.

Projektet baserades på idén att belysa rummet i vilken färg som helst, vilket innebär att du kommer att behöva 3 primära färger från vilka belysningen kommer att erhållas: röd, grön, blå. Därför valdes SMD 5050RGB LED-modellen, som kommer att klara uppgiften perfekt.

Beroende på mängden spänning som tillförs varje lysdiod, kommer de att ändra intensiteten på denna belysning. Lysdioden måste anslutas via ett motstånd, annars riskerar vi att förstöra inte bara den, utan även Arduino. Motståndet behövs för att begränsa strömmen på lysdioden till ett acceptabelt värde. Faktum är att det interna motståndet hos lysdioden är mycket lågt och om du inte använder ett motstånd, kommer en sådan ström att passera genom lysdioden att den helt enkelt kommer att bränna ut både lysdioden och styrenheten.

LED-remsorna som används i projektet drivs av 12V.

På grund av det faktum att spänningen på lysdioderna i "av" tillstånd är 6V och det är nödvändigt att reglera strömförsörjningen, som överstiger 5V, är det nödvändigt att lägga till transistorer till kretsen i omkopplingsläget. Mitt val föll på modellen BC547c.

Låt oss kort överväga funktionsprincipen för dem som har glömt npn transistor. Om du inte lägger på spänning alls utan helt enkelt kortsluter bas- och emitterterminalerna, även om de inte kortsluter, utan genom ett motstånd på flera ohm, visar det sig att bas-emitterspänningen är noll. Följaktligen finns det ingen basström. Transistorn är stängd, kollektorströmmen är försumbart liten, precis samma initialström. I detta fall sägs transistorn vara i cutoff-tillståndet. Det motsatta tillståndet kallas mättnad: när transistorn är helt öppen, så att det inte finns någonstans att öppna ytterligare. Med denna öppningsgrad är resistansen i kollektor-emittersektionen så låg att det helt enkelt är omöjligt att slå på transistorn utan en belastning i kollektorkretsen; den brinner ut omedelbart. I detta fall kan restspänningen på kollektorn endast vara 0,3...0,5V.

Dessa två tillstånd, mättnad och avstängning, används när transistorn arbetar i ett växlingsläge, som en vanlig reläkontakt. Den huvudsakliga innebörden av detta läge är att en liten basström styr en stor kollektorström, som är flera tiotals gånger större än basströmmen. En stor kollektorström erhålls pga extern källa energi, men ändå är den nuvarande vinsten, som de säger, uppenbar. I vårt fall innehåller mikrokretsen, vars driftsspänning är 5V, 3 remsor med lysdioder som fungerar från 12V.

Låt oss beräkna funktionsläget för nyckelkaskaden. Det är nödvändigt att beräkna värdet på motståndet i baskretsen så att lysdioderna brinner med full effekt. Ett nödvändigt villkor vid beräkning är att strömförstärkningen är större än eller lika med kvoten för att dividera den maximalt möjliga kollektorströmmen med den minsta möjliga basströmmen:

Därför kan remsorna ha en driftspänning på 220V, och baskretsen kan styras från en mikrokrets med en spänning på 5V. Om transistorn är konstruerad för att fungera med en sådan spänning vid kollektorn, kommer lysdioderna att lysa utan problem.
Spänningsfallet över bas-emitterövergången är 0,77V, förutsatt att basströmmen är 5mA och kollektorströmmen är 0,1A.
Spänningen över basmotståndet kommer att vara:

Enligt Ohms lag:

Från standardområdet för motstånd väljer vi ett 8,2 kOhm motstånd. Detta avslutar beräkningen.

Jag skulle vilja uppmärksamma er på ett problem som jag stötte på. När du använder IRremote-biblioteket frös Arduino när den blå färgen justerades. Efter en lång och grundlig sökning på Internet visade det sig att detta bibliotek använder Timer 2 som standard för denna Arduino-modell. Timers används för att styra PWM-utgångar.

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

Till en början använde jag PWM 11 för att reglera den blå färgen. Var därför försiktig när du arbetar med PWM, timers och tredjepartsbibliotek som kan använda dem. Det är konstigt det startsida Det sades ingenting om denna nyans på Github. Om du vill kan du avkommentera raden med timer 1 och kommentera ut 2.

Att ansluta elementen på brödbrädan ser ut så här:

Efter testning på brödbrädan började faserna "Placera element på brädan" och "Arbeta med lödkolv". Efter den första testningen av den färdiga brädan kryper en tanke in i mitt huvud: något gick fel. Och här börjar fasen, som är bekant för många, "Morsamt arbete med testaren." Problemen (flera intilliggande kontakter löddes av misstag samman) eliminerades dock snabbt och här är det efterlängtade busiga ljuset från lysdioderna.

Då var det bara en fråga om kroppen. Av denna anledning skars plywood med hål för våra sensorer. Bakstycket den gjordes speciellt avtagbar så att man kunde njuta av utsikten från insidan och, om så önskas, avsluta eller göra om något. Den har även 2 hål för omprogrammering av kortet och strömförsörjningen.

Kroppen limmades med tvåkomponents epoxilim. Det är värt att notera det speciella med detta lim för dem som inte har stött på det tidigare. Denna produkt kommer i två separata behållare, och när innehållet blandas uppstår en omedelbar kemisk reaktion. Efter blandning måste du agera snabbt, inom 3-4 minuter. För vidare användning måste du blanda en ny portion. Så om du försöker upprepa detta är mitt råd till dig att blanda i små portioner och agera väldigt snabbt, det blir inte mycket tid att tänka. Därför är det värt att tänka i förväg om hur och var man limmar kroppen. Dessutom kan detta inte göras i ett sammanträde.

För montering av lister med lysdioder i topplock ett rör sattes in genom vilket alla ledningar passerade perfekt.

När problemet med lampskärmen uppstod kom jag ihåg hur jag som barn gjorde hantverk av enkel tråd, lim och en ballong, som fungerade som bas. Principen för lampskärmen är densamma, men att linda en polyeder visade sig vara svårare än en boll. På grund av trycket som utövades av gängorna på strukturen började den smalna av uppåt och gängorna började falla av. Brådskande, med mina händer täckta av lim, beslutades det att stärka strukturen ovanifrån. Och så kom CD:n till undsättning. Slutresultatet är denna nattlampa:

Vad skulle du vilja säga till slut?

Vad ska jag ändra i projektet? För att leverera TRIG-signalen till avståndssensorerna kan man använda en Arduino-utgång istället för tre. Jag skulle också ge ett hål för IR-sensorn (som jag glömde bort), som tyvärr fortfarande är gömd i fodralet som den naturligtvis inte kan läsa signaler från fjärrkontrollen från. Men vem sa att du inte kan löda eller borra någonting?

Jag skulle vilja notera att detta var en intressant termin och ett utmärkt tillfälle att försöka göra något som inte är på papper, tack vare vilket jag kan sätta en bock till bredvid "barndomsdrömmen". Och om du tycker att det är svårt att prova något nytt och du inte vet vad du ska göra först, oroa dig inte. Många människor har en tanke i huvudet: var ska man börja och hur kan detta ens göras? Det finns många uppgifter i livet som du kan bli förvirrad av, men när du väl försöker kommer du att märka att du med glimten i ögonen kan flytta berg, även om du måste försöka lite för detta.

För ytterligare en uppgift

    1 LED till

    Ytterligare 1 motstånd med ett nominellt värde på 220 Ohm

    2 kablar till

Schematiskt diagram

Schema på brödbrädan

notera

    I detta experiment installerar vi ett fotomotstånd mellan strömförsörjningen och den analoga ingången, d.v.s. till position R1 i spänningsdelarkretsen. Vi behöver detta så att när belysningen minskar får vi mindre spänning på den analoga ingången.

    Försök att placera komponenterna så att lysdioden inte lyser upp fotomotståndet.

Skiss

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // läs av ljusnivån. Förresten, meddela // du kan tilldela en variabel och ett värde till den på en gång int lightness = analogRead(LDR_PIN) ; // läs av värdet från potentiometern som vi reglerar med // tröskelvärde mellan villkorligt mörker och ljus int threshold = analogRead(POT_PIN) ; // deklarera en boolesk variabel och tilldela den ett värde // "Är det mörkt nu." Booleska variabler, i motsats till // heltal, kan bara innehålla ett av två värden: // sant eller falskt. Sådana värden // kallas även boolesk. Boolean tooDark = (ljushet< threshold) ; // använd programgrening: processorn kommer att köra en av // två block med kod beroende på villkorets exekvering. // Om (engelska "if") är för mörkt... om (för mörkt) ( // ...tänd belysningen digitalWrite(LED_PIN, HIGH) ; ) annat ( // ...annars behövs inte ljuset - släck det digitalWrite(LED_PIN, LOW) ; ))

Förklaringar till koden

    Vi använder en ny typ av variabel - boolean, som endast lagrar värdena true (true, 1) eller false (false, 0). Dessa värden är resultatet av att utvärdera booleska uttryck. I det här exemplet är det booleska uttrycket lätthet< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Vi sätter detta logiska uttryck inom parentes endast för tydlighetens skull. Det är alltid bättre att skriva läsbar kod. I andra fall kan parenteser påverka operationsordningen, som i vanlig aritmetik.

    I vårt experiment kommer det booleska uttrycket att vara sant när ljushetsvärdet är mindre än tröskelvärdet eftersom vi använde operatorn< . Мы можем использовать операторы > , <= , >= , == , != , som betyder "större än", "mindre än eller lika med", "större än eller lika med", "lika med", "inte lika med", respektive.

    Var särskilt försiktig med den logiska operatorn == och blanda inte ihop den med tilldelningsoperatorn = . I det första fallet jämför vi uttryckens värden och får ett logiskt värde (sant eller falskt), och i det andra fallet tilldelar vi värdet på den högra operanden till den vänstra operanden. Kompilatorn känner inte till våra avsikter och kommer inte att ge ett fel, men vi kan av misstag ändra värdet på någon variabel och sedan spendera lång tid på att leta efter ett fel.

    Den villkorliga if-satsen är en av de viktigaste i de flesta programmeringsspråk. Med dess hjälp kan vi utföra inte bara en strikt definierad sekvens av åtgärder, utan också fatta beslut om vilken gren av algoritmen som ska följas, beroende på vissa förutsättningar.

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

    Med samma framgång skulle vi kunna säga "om belysningen är lägre än tröskelnivån, slå sedan på lysdioden", dvs. skicka hela det logiska uttrycket till om:

om (lätthet< threshold) { // ... }

    Bakom villkorlig operatör if följer nödvändigtvis ett kodblock som exekveras om det logiska uttrycket är sant. Glöm inte båda lockiga hängslen ()!

    Om, om uttrycket är sant, behöver vi bara exekvera ett instruktion kan den skrivas omedelbart efter om (...) utan lockiga hängslen:

om (lätthet< threshold) digitalWrite(LED_PIN, HIGH) ;

    If-satsen kan utökas med en annan konstruktion. Kodblocket, eller den enstaka satsen som följer efter den, kommer bara att exekveras om det booleska uttrycket in if utvärderas till falskt. Reglerna för lockiga hängslen är desamma. I vårt experiment skrev vi "om det är för mörkt, slå på lysdioden, annars stäng av lysdioden."

Ljussensorer (belysning), byggda på basis av fotoresistorer, används ganska ofta i riktiga Arduino-projekt. De är relativt enkla, inte dyra och lätta att hitta och köpa i vilken nätbutik som helst. Arduino-fotoresistorn låter dig kontrollera ljusnivån och svara på dess förändringar. I den här artikeln kommer vi att titta på vad en fotoresistor är, hur en ljussensor baserad på den fungerar och hur man korrekt ansluter sensorn till Arduino-kort.

En fotoresistor, som namnet antyder, är direkt relaterad till motstånd, som ofta finns i nästan alla elektroniska kretsar. Det huvudsakliga kännetecknet för ett konventionellt motstånd är värdet på dess motstånd. Spänning och ström beror på det; med hjälp av ett motstånd ställer vi in ​​de nödvändiga driftslägena för andra komponenter. Som regel förändras resistansvärdet för ett motstånd praktiskt taget inte under samma driftsförhållanden.

Till skillnad från ett konventionellt motstånd, fotoresistor kan ändra sitt motstånd beroende på nivån av omgivande ljus. Det betyder att i elektrisk krets Parametrarna kommer ständigt att förändras; först och främst är vi intresserade av att spänningen faller över fotomotståndet. Genom att registrera dessa spänningsförändringar på de analoga stiften på Arduino kan vi ändra kretsens logik och därigenom skapa enheter som anpassar sig till yttre förhållanden.

Fotoresistorer används ganska aktivt i en mängd olika system. Den vanligaste applikationen är gatubelysning. Om natten faller på staden eller det blir molnigt tänds lamporna automatiskt. Du kan göra en ekonomisk glödlampa för hemmet från en fotoresistor som tänds inte enligt ett schema, utan beroende på belysningen. Du kan till och med göra ett säkerhetssystem baserat på en ljussensor, som utlöses direkt efter att ett stängt skåp eller kassaskåp har öppnats och belysts. Som alltid begränsas tillämpningsområdet för alla Arduino-sensorer endast av vår fantasi.

Vilka fotoresistorer kan köpas i onlinebutiker

De mest populära och prisvärt alternativ sensorer på marknaden är modeller av massproduktion från kinesiska företag, kloner av produkter från tillverkaren VT. Det är inte alltid möjligt att ta reda på vem och vad exakt den eller den leverantören producerar, men för att komma igång med fotoresistorer är det enklaste alternativet ganska lämpligt.

En nybörjare av Arduino kan rekommenderas att köpa en färdig fotomodul som ser ut så här:


Denna modul innehåller redan alla nödvändiga element för enkel anslutning fotoresistor till Arduino-kortet. Vissa moduler implementerar en komparatorkrets och tillhandahåller en digital utgång och ett trimmotstånd för styrning.

En rysk radioamatör kan rekommenderas att vända sig till den ryska PA-sensorn. Tillgängliga på rea är FR1-3, FR1-4, etc. - producerades redan i sovjettiden. Men trots detta är FR1-3 en mer exakt detalj. Av detta följer skillnaden i pris. För FR begär de inte mer än 400 rubel. FR1-3 kommer att kosta mer än tusen rubel per styck.

Fotoresistormärkning

Modern märkning av modeller producerade i Ryssland är ganska enkel. De två första bokstäverna är PhotoResistor, siffrorna efter bindestrecket anger framkallningsnumret. FR -765 - fotoresistor, framkallning 765. Vanligtvis märkt direkt på delens kropp

VT-sensorn har ett motståndsområde som anges i märkningsdiagrammet. Till exempel:

  • VT83N1 - 12-100kOhm (12K – upplyst, 100K – i mörker)
  • VT93N2 - 48-500kOhm (48K – upplyst, 100K – i mörker).

Ibland, för att förtydliga information om modeller, tillhandahåller säljaren ett speciellt dokument från tillverkaren. Förutom driftsparametrarna indikeras även delens noggrannhet där. Alla modeller har ett känslighetsområde i den synliga delen av spektrumet. Samlar ljussensor Du måste förstå att driftens noggrannhet är ett relativt begrepp. Även för modeller från samma tillverkare, samma parti eller samma köp kan det skilja sig med 50 % eller mer.

På fabriken är delarna avstämda till våglängder som sträcker sig från rött till grönt ljus. De flesta människor "ser" också infraröd strålning. Särskilt exakta delar kan till och med upptäcka ultraviolett ljus.

Fördelar och nackdelar med sensorn

Den största nackdelen med fotoresistorer är spektrumkänslighet. Beroende på typen av infallande ljus kan motståndet variera med flera storleksordningar. Till nackdelarna hör också låg hastighet reaktioner på förändringar i belysningen. Om lampan blinkar hinner inte sensorn reagera. Om ändringsfrekvensen är ganska hög kommer motståndet i allmänhet att sluta "se" att belysningen förändras.

Fördelarna är enkelhet och tillgänglighet. Genom att direkt ändra motståndet beroende på ljuset som faller på det kan du förenkla elschema anslutningar. Själva fotomotståndet är väldigt billigt, det ingår i många Arduino-kit och konstruktörer och är därför tillgängligt för nästan alla nybörjare Arduino-tillverkare.

Ansluter ett fotomotstånd till Arduino

I projekt arduino Fotoresistorn används som ljussensor. Genom att ta emot information från den kan kortet slå på eller av reläer, starta motorer och skicka meddelanden. Naturligtvis måste vi ansluta sensorn korrekt.

Anslutningsschemat för ljussensorn till Arduino är ganska enkelt. Om vi ​​använder en fotoresistor, är sensorn i anslutningsdiagrammet implementerad som en spänningsdelare. En arm ändras beroende på belysningsnivån, den andra ger spänning till den analoga ingången. I styrchippet omvandlas denna spänning till digital data via en ADC. Därför att När sensorns motstånd minskar när ljus träffar den, kommer även värdet på spänningen som faller över den att minska.

Beroende på vilken arm av delaren vi placerade fotomotståndet i, kommer antingen ökad eller minskad spänning att matas till den analoga ingången. Om ett ben på fotomotståndet är anslutet till jord, kommer det maximala spänningsvärdet att motsvara mörker (motståndets resistans är maximal, nästan all spänning faller över den), och minimivärdet kommer att motsvara bra belysning (motståndet är nära noll, spänningen är minimal). Om vi ​​kopplar fotomotståndsarmen till strömförsörjningen blir beteendet det motsatta.

Att installera själva brädan bör inte orsaka några svårigheter. Eftersom fotoresistorn inte har någon polaritet kan den anslutas från båda sidor, den kan lödas till kortet, kopplas ihop med ledningar med hjälp av ett kretskort eller användas med vanliga clips (krokodilklämmor) för anslutning. Strömkällan i kretsen är Arduino själv. Fotomotstånd ett ben är anslutet till marken, det andra är anslutet till ADC-kortet (i vårt exempel - AO). Vi ansluter ett 10 kOhm motstånd till samma ben. Naturligtvis kan du ansluta en fotoresistor inte bara till det analoga stiftet A0, utan också till vilket annat.

Några ord om det extra 10 K-motståndet. Det har två funktioner i vår krets: begränsa strömmen i kretsen och bilda erforderlig spänning i en krets med en delare. Strömbegränsning är nödvändig i en situation där en fullt upplyst fotoresistor kraftigt minskar dess motstånd. Och spänningsgenerering är för förutsägbara värden på den analoga porten. Egentligen för normal drift Med våra fotoresistorer räcker det med ett motstånd på 1K.

Genom att ändra resistorvärdet kan vi "skifta" känslighetsnivån till de "mörka" och "ljusa" sidorna. Så, 10 K kommer att ge snabbt byte ljusets uppkomst. I fallet med 1K kommer ljussensorn mer exakt att upptäcka höga ljusnivåer.

Om du använder färdig modul ljussensor, då blir anslutningen ännu enklare. Vi ansluter VCC-modulens utgång till 5V-kontakten på kortet, GND till jord. Vi ansluter de återstående stiften till Arduino-kontakterna.

Om kortet har en digital utgång skickar vi den till digitala stift. Om det är analogt, gå till analogt. I det första fallet kommer vi att få en triggersignal - belysningsnivån har överskridits (triggertröskeln kan justeras med hjälp av ett justeringsmotstånd). Från de analoga stiften kommer vi att kunna erhålla ett spänningsvärde som är proportionellt mot den faktiska belysningsnivån.

En exempelskiss av en ljussensor på en fotoresistor

Vi kopplade kretsen med fotoresistorn till Arduino och såg till att allt gjordes korrekt. Nu återstår bara att programmera regulatorn.

Att skriva en skiss för en ljussensor är ganska enkelt. Vi behöver bara ta bort det aktuella spänningsvärdet från det analoga stiftet som sensorn är ansluten till. Detta görs med funktionen analogRead() som vi alla känner till. Vi kan sedan utföra några åtgärder beroende på ljusnivån.

Låt oss skriva en skiss för en ljussensor som slår på eller av en lysdiod ansluten enligt följande krets.

Driftsalgoritmen är som följer:

  • Bestäm signalnivån från det analoga stiftet.
  • Vi jämför nivån med tröskelvärdet. Det maximala värdet kommer att motsvara mörker, det lägsta värdet kommer att motsvara maximal belysning. Låt oss välja ett tröskelvärde lika med 300.
  • Om nivån är lägre än tröskeln är det mörkt, du måste slå på lysdioden.
  • Annars, stäng av lysdioden.
#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); } }

Genom att täcka över fotomotståndet (med händerna eller ett ljussäkert föremål) kan vi se att lysdioden tänds och släcks. Genom att ändra tröskelparametern i koden kan vi tvinga glödlampan att tändas/släckas vid olika ljusnivåer.

När du installerar, försök att placera fotomotståndet och lysdioden så långt ifrån varandra som möjligt så att mindre ljus från den ljusa lysdioden faller på ljussensorn.

Ljussensor och mjuk förändring av bakgrundsbelysningens ljusstyrka

Du kan modifiera projektet så att ljusstyrkan på lysdioden ändras beroende på belysningsnivån. Vi kommer att lägga till följande ändringar i algoritmen:

  • Vi kommer att ändra ljusstyrkan på glödlampan via PWM och skicka värden från 0 till 255 till stiftet med lysdioden med analogWrite().
  • För att konvertera det digitala värdet för ljusnivån från ljussensorn (från 0 till 1023) till PWM-området för LED-ljusstyrka (från 0 till 255), kommer vi att använda map()-funktionen.

Skissexempel:

#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); // Konvertera det resulterande värdet till PWM-signalnivån. Ju lägre belysningsvärde, desto mindre ström måste vi leverera till lysdioden via PWM. analogWrite(PIN_LED, ledPower) ; // Ändra ljusstyrka)

I fallet med en annan anslutningsmetod, där signalen från den analoga porten är proportionell mot graden av belysning, måste du dessutom "vända" värdet genom att subtrahera det från maximum:

Int val = 1023 – analogRead(PIN_PHOTO_RESISTOR);

Ljussensorkrets med fotoresistor och relä

Exempel på skisser för att arbeta med reläer ges i artikeln om programmering av reläer i Arduino. I det här fallet behöver vi inte göra komplexa rörelser: efter att ha bestämt "mörkret" slår vi helt enkelt på reläet och applicerar motsvarande värde på dess stift.

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

Slutsats

Projekt som använder en ljussensor baserad på en fotoresistor är ganska enkla och effektiva. Du kan genomföra många intressanta projekt, och kostnaden för utrustning kommer inte att vara hög. Fotoresistorn är ansluten med hjälp av en spänningsdelarkrets med extra resistans. Sensorn är ansluten till en analog port för att mäta olika ljusnivåer eller till en digital om allt vi bryr oss om är mörkret. I skissen läser vi helt enkelt data från en analog (eller digital) port och bestämmer hur vi ska reagera på ändringarna. Låt oss hoppas att nu kommer sådana enkla "ögon" att dyka upp i dina projekt.

I det här experimentet ska lysdioden tändas när ljusnivån sjunker under en tröskel som ställs in av en potentiometer.

LISTA ÖVER DELAR FÖR EXPERIMENTET

- 1 Arduino Uno-bräda;

- 1 lödbräda;

- 1 lysdiod;

- 1 fotoresistor;

- 1 motstånd med ett nominellt värde på 220 ohm, 1 motstånd med ett nominellt värde på 10 kOhm;

- 1 variabelt motstånd (potentiometer);

- 10 hane-hane trådar.

DETALJER FÖR YTTERLIGARE UPPGIFT

1 LED till;

Ytterligare 1 motstånd med ett nominellt värde på 220 Ohm;

2 kablar till.

KRETSDIAGRAM

DIAGRAM PÅ BRYDTAVLA

SKISS

Ladda ner skiss för Arduino IDE
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // läs ljusnivån. Förresten, // kan du deklarera en variabel och tilldela ett värde på det på en gång int ljushet = analogRead(LDR_PIN); // läs värdet från potentiometern, som vi använder för att justera // tröskelvärdet mellan villkorligt mörker och ljus int tröskel = analogRead(POT_PIN); // deklarera en logisk variabel och tilldela den värdet // "är det mörkt nu". Booleska variabler, till skillnad från // heltalsvariabler, kan bara innehålla ett av två värden: // true eller false. Sådana värden // kallas också booleska. Boolean tooDark = (ljushet< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

FÖRKLARINGAR TILL KODEN

  • Vi använder en ny typ av variabler − booleskt, som endast lagrar värden Sann (sant, 1) eller falsk (falskt, 0). Dessa värden är resultatet av att utvärdera booleska uttryck. I det här exemplet är det booleska uttrycket lätthet< threshold . På mänskligt språk låter detta som: "belysningsstyrka under tröskelnivån." Ett sådant påstående kommer att vara sant när belysningen är under tröskelnivån. Mikrokontrollern kan jämföra värdena på variabler lätthet Och tröskel, som i sin tur är mätresultaten, och beräkna sanningen i det logiska uttrycket.
  • Vi sätter detta logiska uttryck inom parentes endast för tydlighetens skull. Det är alltid bättre att skriva läsbar kod. I andra fall kan parenteser påverka operationsordningen, som i vanlig aritmetik.
  • I vårt experiment kommer ett booleskt uttryck att vara sant när värdet lätthet mindre än värdet tröskel eftersom vi använde operatören < . Vi kan använda operatörer > , <= , >= , = = , != , som betyder "större än", "mindre än eller lika med", "större än eller lika med", "lika med", "inte lika med", respektive.
  • Var särskilt försiktig med den logiska operatorn = = och blanda inte ihop det med uppdragsoperatören = . I det första fallet jämför vi uttryckens värden och får ett logiskt värde (sant eller falskt), och i det andra fallet tilldelar vi värdet på den högra operanden till den vänstra operanden. Kompilatorn känner inte till våra avsikter och kommer inte att ge ett fel, men vi kan av misstag ändra värdet på någon variabel och sedan spendera lång tid på att leta efter ett fel.
  • Villkorlig operatör omOm") är en av de viktigaste i de flesta programmeringsspråk. Med dess hjälp kan vi utföra inte bara en strikt definierad sekvens av åtgärder, utan också fatta beslut om vilken gren av algoritmen som ska följas, beroende på vissa förutsättningar.
  • För ett logiskt uttryck lätthet< threshold det finns en mening: Sann eller falsk. Vi beräknade det och lade det i en boolesk variabel för mörkt("för mörkt") Därför verkar vi säga "om det är för mörkt, slå på lysdioden"
  • Med samma framgång skulle vi kunna säga "om belysningen är lägre än tröskelnivån, slå sedan på lysdioden", dvs. överföra till om alla logiska uttryck:
om (lätthet< threshold) { // ... }
  • Bakom det villkorliga uttalandet om Det måste finnas ett kodblock som exekveras om det logiska uttrycket är sant. Glöm inte båda lockiga hängslen {} !
  • Om, om uttrycket är sant, behöver vi bara exekvera ett instruktioner kan den skrivas direkt efter om (…) utan lockiga hängslen:
om (lätthet< threshold) digitalWrite(LED_PIN, HIGH);
  • Operatör om kan utökas genom design annan("annat"). Ett kodblock eller en enstaka sats som följer efter det kommer bara att exekveras om det logiska uttrycket in om har betydelsen falsk , « lögn" Reglerna för lockiga hängslen är desamma. I vårt experiment skrev vi "om det är för mörkt, slå på lysdioden, annars stäng av lysdioden."

FRÅGOR ATT TESTA DIG SJÄLV

  1. Om vi ​​installerar ett fotomotstånd mellan den analoga ingången och jord, kommer vår enhet att fungera omvänt: LED-lampan tänds när ljusmängden ökar. Varför?
  2. Vilket resultat av enhetens funktion kommer vi att få om ljuset från lysdioden faller på fotoresistorn?
  3. Om vi ​​installerar fotomotståndet enligt föregående fråga, hur behöver vi ändra programmet så att enheten fungerar korrekt?
  4. Låt oss säga att vi har koden if (villkor) (åtgärd;). I vilka fall kommer det att göras? handling ?
  5. Till vilka värden y uttryck x + y > 0 kommer att vara sant om x > 0 ?
  6. Är det nödvändigt att ange vilka instruktioner som ska utföras om villkoret finns i uttalandet om falsk?
  7. Vad är skillnaden mellan operatören = = från operatören = ?
  8. Om vi ​​använder konstruktionen if (villkor) action1; annat åtgärd2;, kan det finnas en situation där ingen av åtgärderna utförs? Varför?

UPPGIFTER FÖR OBEROENDE LÖSNING

  1. Skriv om programmet utan att använda variabeln för mörkt samtidigt som enhetens funktionalitet bibehålls.
  2. Lägg till ytterligare en lysdiod till kretsen. Slutför programmet så att när belysningen faller under tröskelvärdet tänds en lysdiod, och när belysningen faller under halva tröskelvärdet tänds båda lysdioderna.
  3. Byt krets och program så att lysdioderna tänds enligt samma princip, men lyser ju mer intensivt desto mindre ljus faller på fotoresistorn.




Topp