Luce notturna ricavata da una vecchia lampadina, basata su Arduino e WS2812. Compiti per una soluzione indipendente

Probabilmente tutti hanno fatto un sogno durante l'infanzia (e più di uno). Puoi anche provare a ricordare la sensazione che riempie l'animo di un bambino quando il suo sogno diventa realtà, o quello scintillio lontano e familiare nei suoi occhi... Da bambino sognavo di avere la mia luce notturna.

Ora sono uno studente del 4° anno alla BSUIR, e quando ci è stato detto che un progetto del corso di progettazione di circuiti può essere realizzato non su carta, ma su un pezzo di hardware, mi è venuto in mente: la luce notturna che tanto desideravo come un bambino può essere fatto da solo. Inoltre, crea non solo un oggetto che illuminerà la stanza al buio, ma un dispositivo che può essere facilmente controllato per adattarsi a qualsiasi stato d'animo. Perché no? Ho deciso di aggiungere la possibilità di cambiare i colori usando le mani: più la mia mano è vicina alla luce notturna, più si illumina il colore più luminoso (RGB). Vorrei anche controllare la luce notturna tramite il telecomando.

Ammetto subito che ho notato l'idea sul sito cxem.net. In breve, questo esempio utilizzava una matrice RGB, controllata mediante registri a scorrimento e sensori di distanza a ultrasuoni. Ma pensavo che la matrice brillasse solo in una direzione, ma volevo che la luce notturna brillasse sui lati.

Giustificazione degli elementi del circuito


Ho rivolto la mia attenzione ai microcontrollori Arduino. UNO è un'opzione abbastanza adatta alla mia idea, in primo luogo perché è la piattaforma più popolare e il numero di pin non è troppo grande, a differenza di Mega, e in secondo luogo perché ad essa è possibile collegare una fonte di alimentazione esterna, nel mio caso è 12V , a differenza di Nano , in terzo luogo... beh, penso che possiamo fermarci a questi due punti. La piattaforma è estremamente popolare in tutto il mondo grazie alla comodità e alla semplicità del linguaggio di programmazione, nonché alla sua architettura aperta e al codice del programma.

Di più informazioni dettagliate Puoi facilmente trovare informazioni su questa bacheca su Internet, quindi non sovraccaricarò l'articolo.

Quindi, i requisiti di base per il sistema. Necessario:
– sensori che seguiranno la distanza da un ostacolo per controllare il sistema;
– sensore per la lettura dei segnali provenienti dal telecomando telecomando;
– LED, che forniranno la funzionalità di illuminazione necessaria;
– una centralina che controllerà l’intero sistema.

Il progetto richiede telemetri come sensori di distanza, ciascuno dei quali corrisponderà a un colore specifico: rosso, verde, blu. I sensori di distanza monitoreranno la distanza della mano dalla luce notturna e quanto più la mano si avvicina a un determinato sensore, tanto più forte si illuminerà il colore corrispondente a questo telemetro. Al contrario, più la mano è lontana, minore è la tensione applicata al colore corrispondente al sensore.

I telemetri più popolari su questo momento questi sono Sharp GP2Y0A21YK e HC-SR04. Sharp GP2Y0A21YK è un telemetro a infrarossi. È dotato di un emettitore IR e di un ricevitore IR: il primo funge da sorgente del fascio, la cui riflessione viene captata dal secondo. Allo stesso tempo, i raggi IR del sensore sono invisibili all'occhio umano e con tale intensità sono innocui.

Rispetto al sensore a ultrasuoni HC-SR04, questo sensore presenta sia vantaggi che svantaggi. I vantaggi includono neutralità e innocuità. Gli svantaggi sono una portata più breve e la dipendenza dalle interferenze esterne, inclusi alcuni tipi di illuminazione.

Utilizzati come sensori di distanza per il progetto: telemetri ad ultrasuoni HC-SR04.
Il principio di funzionamento dell'HC-SR04 si basa sul noto fenomeno dell'ecolocalizzazione. Durante l'utilizzo l'emettitore genera un segnale acustico che, riflesso dall'ostacolo, ritorna al sensore e viene registrato dal ricevitore. Conoscendo la velocità di propagazione degli ultrasuoni nell'aria (circa 340 m/s) e il tempo di ritardo tra il segnale emesso e quello ricevuto, è facile calcolare la distanza dalla barriera acustica.

L'ingresso TRIG si collega a qualsiasi pin del microcontrollore. È necessario applicare un impulso a questo pin. segnale digitale durata 10μs. Sulla base del segnale all'ingresso TRIG, il sensore invia un pacchetto di impulsi ultrasonici. Dopo aver ricevuto il segnale riflesso, il sensore genera un segnale a impulsi sul pin ECHO, la cui durata è proporzionale alla distanza dall'ostacolo.

Sensore IR. Naturalmente, il segnale richiesto per il controllo remoto verrà letto e decodificato da questo sensore. TSOP18 differiscono l'uno dall'altro solo per la frequenza. Per il progetto è stato selezionato il sensore VS1838B TSOP1838.

Il progetto si basava sull'idea di illuminare la stanza con qualsiasi colore, il che significa che saranno necessari 3 colori primari da cui si otterrà l'illuminazione: rosso, verde, blu. Pertanto è stato scelto il modello LED SMD 5050RGB, che farà fronte perfettamente al compito.

A seconda della quantità di tensione fornita a ciascun LED, cambierà l'intensità di questa illuminazione. Il LED deve essere collegato tramite una resistenza, altrimenti rischiamo di rovinare non solo esso, ma anche Arduino. Il resistore è necessario per limitare la corrente sul LED a un valore accettabile. Il fatto è che la resistenza interna del LED è molto bassa e, se non si utilizza un resistore, attraverso il LED passerà una corrente tale da bruciare semplicemente sia il LED che il controller.

Le strisce LED utilizzate nel progetto sono alimentate a 12V.

A causa del fatto che la tensione sui LED nello stato "spento" è di 6 V ed è necessario regolare l'alimentazione, che supera i 5 V, è necessario aggiungere transistor al circuito in modalità di commutazione. La mia scelta è caduta sul modello BC547c.

Consideriamo brevemente, per chi l'avesse dimenticato, il principio di funzionamento transistor npn. Se non si applica alcuna tensione, ma si cortocircuitano semplicemente i terminali della base e dell'emettitore, anche se non in cortocircuito, ma attraverso un resistore di diversi ohm, si scopre che la tensione dell'emettitore base è zero. Di conseguenza, non esiste corrente di base. Il transistor è chiuso, la corrente del collettore è trascurabilmente piccola, proprio la stessa corrente iniziale. In questo caso si dice che il transistor è nello stato di interruzione. Lo stato opposto si chiama saturazione: quando il transistor è completamente aperto, quindi non c'è nessun posto dove aprirsi ulteriormente. Con questo grado di apertura, la resistenza della sezione collettore-emettitore è così bassa che è semplicemente impossibile accendere il transistor senza carico nel circuito del collettore; si brucerà all'istante. In questo caso la tensione residua sul collettore può essere solo 0,3...0,5V.

Questi due stati, saturazione e interruzione, vengono utilizzati quando il transistor funziona in modalità di commutazione, come un normale contatto di relè. Il significato principale di questa modalità è che una piccola corrente di base controlla una grande corrente di collettore, che è diverse decine di volte maggiore della corrente di base. Si ottiene una grande corrente di collettore a causa di fonte esterna energia, ma il guadagno attuale, come si suol dire, è ovvio. Nel nostro caso il microcircuito, la cui tensione di funzionamento è di 5 V, comprende 3 strisce con LED funzionanti a 12 V.

Calcoliamo la modalità operativa della cascata di chiavi. È necessario calcolare il valore del resistore nel circuito di base in modo che i LED brucino a piena potenza. Una condizione necessaria per il calcolo è che il guadagno di corrente sia maggiore o uguale al quoziente di divisione della corrente di collettore massima possibile per la corrente di base minima possibile:

Pertanto, le strisce possono avere una tensione operativa di 220 V e il circuito di base può essere controllato da un microcircuito con una tensione di 5 V. Se il transistor è progettato per funzionare con una tale tensione sul collettore, i LED si accenderanno senza problemi.
La caduta di tensione attraverso la giunzione base-emettitore è 0,77 V, a condizione che la corrente di base sia 5 mA e la corrente di collettore sia 0,1 A.
La tensione ai capi del resistore di base sarà:

Secondo la legge di Ohm:

Dalla gamma standard di resistenze selezioniamo una resistenza da 8,2 kOhm. Questo completa il calcolo.

Vorrei attirare la vostra attenzione su un problema che ho riscontrato. Quando si utilizzava la libreria IRremote, Arduino si bloccava durante la regolazione del colore blu. Dopo una lunga e approfondita ricerca su Internet, si è scoperto che questa libreria utilizza di default il timer 2 per questo modello di Arduino. I timer vengono utilizzati per controllare le uscite PWM.

Timer 0 (ora di sistema, PWM 5 e 6);
Temporizzatore 1 (PWM 9 e 10);
Temporizzatore 2 (PWM 3 e 11).

Inizialmente utilizzavo il PWM 11 per regolare il colore blu. Pertanto, fai attenzione quando lavori con PWM, timer e librerie di terze parti che potrebbero utilizzarli. E' strano pagina iniziale Non è stato detto nulla su questa sfumatura su Github. Se lo desideri, puoi rimuovere il commento dalla riga con il timer 1 e commentare 2.

Il collegamento degli elementi sulla breadboard avviene in questo modo:

Dopo il test sulla breadboard sono iniziate le fasi “Posizionamento degli elementi sulla scheda” e “Lavoro con il saldatore”. Dopo il primo test della tavola finita, un pensiero si insinua nella mia testa: qualcosa è andato storto. E qui inizia la fase, familiare a molti, “Lavoro minuzioso con il tester”. Tuttavia, i problemi (diversi contatti adiacenti sono stati saldati accidentalmente insieme) sono stati rapidamente risolti ed ecco la tanto attesa luce maliziosa dei LED.

Allora era solo una questione di corpo. Per questo motivo è stato tagliato del compensato con fori per i nostri sensori. Copertina posterioreè stato realizzato appositamente rimovibile in modo da poter godere della vista dall'interno e, se lo si desidera, rifinire o rifare qualcosa. Dispone inoltre di 2 fori per la riprogrammazione della scheda e dell'alimentatore.

La carrozzeria è stata incollata con colla epossidica bicomponente. Vale la pena notare la particolarità di questa colla per coloro che non l'hanno mai incontrata prima. Questo prodotto viene fornito in due contenitori separati e quando i contenuti vengono miscelati si verifica una reazione chimica istantanea. Dopo la miscelazione bisogna agire velocemente, entro 3-4 minuti. Per un ulteriore utilizzo, è necessario mescolare una nuova porzione. Quindi, se stai cercando di ripetere l'operazione, il mio consiglio è di mescolare in piccole porzioni e agire molto rapidamente, non ci sarà molto tempo per pensare. Pertanto, vale la pena pensare in anticipo a come e dove incollare il corpo. Inoltre, questo non può essere fatto in una sola seduta.

Per il montaggio di strisce con LED integrati coperchio superioreè stato inserito un tubo attraverso il quale passavano perfettamente tutti i fili.

Quando è sorto il problema con il paralume, mi sono ricordato di come da bambino realizzavo lavori artigianali con semplice filo, colla e un palloncino, che fungeva da base. Il principio del paralume è lo stesso, ma avvolgere un poliedro si è rivelato più difficile di una palla. A causa della pressione esercitata dai fili sulla struttura, questa ha cominciato a restringersi verso l'alto e i fili hanno cominciato a cadere. D'urgenza, con le mani ricoperte di colla, si è deciso di rinforzare la struttura dall'alto. E poi il CD è venuto in soccorso. Il risultato finale è questa luce notturna:

Cosa vorresti dire alla fine?

Cosa dovrei cambiare nel progetto? Per fornire il segnale TRIG ai sensori di distanza, si potrebbe utilizzare un'uscita Arduino invece di tre. Prevederei anche un foro per il sensore IR (di cui mi ero dimenticato), che, ahimè, è ancora nascosto nel caso in cui, naturalmente, non possa leggere i segnali del telecomando. Ma chi ha detto che non si può saldare o forare nulla?

Ci tengo a sottolineare che questo è stato un semestre interessante, e una grande opportunità per provare a fare qualcosa che non sia sulla carta, grazie alla quale posso mettere un'altra spunta accanto alla voce “sogno d'infanzia”. E se pensi che provare qualcosa di nuovo sia difficile e non sai cosa fare prima, non preoccuparti. Molte persone hanno un pensiero che attraversa la testa: da dove cominciare e come è possibile farlo? Ci sono molti compiti nella vita dai quali puoi confonderti, ma una volta che ci provi, noterai che con un luccichio negli occhi puoi spostare le montagne, anche se devi provarci un po' per questo.

Per un compito aggiuntivo

    1 LED in più

    1 ulteriore resistenza con un valore nominale di 220 Ohm

    Altri 2 fili

Diagramma schematico

Schema sulla breadboard

Nota

    In questo esperimento installiamo una fotoresistenza tra l'alimentatore e l'ingresso analogico, ovvero per posizionare R1 nel circuito divisore di tensione. Ne abbiamo bisogno affinché quando l'illuminazione diminuisce, riceviamo meno tensione sull'ingresso analogico.

    Prova a posizionare i componenti in modo che il LED non illumini la fotoresistenza.

Schizzo

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // legge il livello di luce. A proposito, annuncia // puoi assegnargli una variabile e un valore contemporaneamente int leggerezza = analogRead(LDR_PIN) ; // legge il valore dal potenziometro con cui regoliamo // valore di soglia tra l'oscurità condizionale e la luce soglia int = analogRead(POT_PIN) ; // dichiara una variabile booleana e le assegna un valore // "È buio adesso." Variabili booleane, al contrario di // numeri interi, possono contenere solo uno dei due valori: // vero o falso. Tali valori // chiamato anche booleano. booleano tooDark = (leggerezza< threshold) ; // usa la ramificazione del programma: il processore ne eseguirà uno // due blocchi di codice a seconda dell'esecuzione della condizione. // Se (inglese “if”) è troppo scuro... if (troppo scuro) ( // ...accendi l'illuminazione digitalWrite(PIN_LED, ALTO) ; ) altro ( // ...altrimenti la luce non è necessaria: spegnila digitalWrite(PIN_LED, BASSO) ; ) )

Spiegazioni per il codice

    Usiamo un nuovo tipo di variabile: booleana, che memorizza solo i valori vero (vero, 1) o falso (falso, 0). Questi valori sono il risultato della valutazione delle espressioni booleane. In questo esempio, l'espressione booleana è leggerezza< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Mettiamo questa espressione logica tra parentesi solo per chiarezza. È sempre meglio scrivere codice leggibile. In altri casi, le parentesi possono influenzare l'ordine delle operazioni, come nell'aritmetica ordinaria.

    Nel nostro esperimento, l'espressione booleana sarà vera quando il valore di luminosità è inferiore al valore di soglia perché abbiamo utilizzato l'operatore< . Мы можем использовать операторы > , <= , >= , == , != , che significano rispettivamente “maggiore di”, “minore o uguale a”, “maggiore o uguale a”, “uguale a”, “non uguale a”.

    Prestare particolare attenzione all'operatore logico == e non confonderlo con l'operatore di assegnazione = . Nel primo caso confrontiamo i valori delle espressioni e otteniamo un valore logico (vero o falso) e nel secondo caso assegniamo il valore dell'operando destro all'operando sinistro. Il compilatore non conosce le nostre intenzioni e non genererà un errore, ma possiamo modificare accidentalmente il valore di qualche variabile e quindi dedicare molto tempo alla ricerca di un errore.

    L'istruzione condizionale if è una delle più importanti nella maggior parte dei linguaggi di programmazione. Con il suo aiuto, possiamo eseguire non solo una sequenza di azioni rigorosamente definita, ma anche prendere decisioni su quale ramo dell'algoritmo seguire, a seconda di determinate condizioni.

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

    Con lo stesso successo potremmo dire “se l’illuminazione è inferiore al livello di soglia, allora accendi il LED”, cioè passa l'intera espressione logica a if:

se (leggerezza< threshold) { // ... }

    Dietro operatore condizionale if segue necessariamente un blocco di codice che viene eseguito se l'espressione logica è vera. Non dimenticare entrambe le parentesi graffe ()!

    Se, se l'espressione è vera, dobbiamo solo eseguirla uno istruzione, può essere scritta subito dopo if (...) senza parentesi graffe:

se (leggerezza< threshold) digitalWrite(LED_PIN, HIGH) ;

    L'istruzione if può essere estesa con un costrutto else. Il blocco di codice, o la singola istruzione che lo segue, verrà eseguito solo se l'espressione booleana in if restituisce false. Le regole relative alle parentesi graffe sono le stesse. Nel nostro esperimento abbiamo scritto "se è troppo buio, accendi il LED, altrimenti spegni il LED".

I sensori di luce (illuminazione), costruiti sulla base di fotoresistori, vengono spesso utilizzati nei progetti Arduino reali. Sono relativamente semplici, non costosi e facili da trovare e acquistare in qualsiasi negozio online. La fotoresistenza Arduino consente di controllare il livello di luce e rispondere ai suoi cambiamenti. In questo articolo vedremo cos'è una fotoresistenza, come funziona un sensore di luce basato su di essa e come collegare correttamente il sensore alle schede Arduino.

Una fotoresistenza, come suggerisce il nome, è direttamente correlata ai resistori, che spesso si trovano in quasi tutti i circuiti elettronici. La caratteristica principale di un resistore convenzionale è il valore della sua resistenza. La tensione e la corrente dipendono da questo; utilizzando un resistore impostiamo le modalità operative richieste di altri componenti. Di norma, il valore di resistenza di un resistore praticamente non cambia nelle stesse condizioni operative.

A differenza di un resistore convenzionale, fotoresistenza può cambiare la sua resistenza a seconda del livello di luce ambientale. Ciò significa che dentro circuito elettronico I parametri cambieranno costantemente; prima di tutto, siamo interessati alla caduta di tensione attraverso la fotoresistenza. Registrando queste variazioni di tensione sui pin analogici di Arduino, possiamo cambiare la logica del circuito, creando così dispositivi che si adattano alle condizioni esterne.

I fotoresistori sono utilizzati abbastanza attivamente in un'ampia varietà di sistemi. L'applicazione più comune è l'illuminazione stradale. Se sulla città scende la notte o diventa nuvoloso, le luci si accendono automaticamente. Puoi realizzare una lampadina economica per la casa da una fotoresistenza che si accende non secondo un programma, ma in base all'illuminazione. Puoi anche realizzare un sistema di sicurezza basato su un sensore di luce, che verrà attivato immediatamente dopo l'apertura e l'illuminazione di un armadio chiuso o di una cassaforte. Come sempre, il campo di applicazione dei sensori Arduino è limitato solo dalla nostra immaginazione.

Quali fotoresistenze possono essere acquistate nei negozi online

Il più popolare e opzione conveniente i sensori sul mercato sono modelli di produzione di massa di aziende cinesi, cloni di prodotti del produttore VT. Non è sempre possibile capire chi e cosa produce esattamente questo o quel fornitore, ma per iniziare con le fotoresistenze, l'opzione più semplice è abbastanza adatta.

A un utente Arduino alle prime armi può essere consigliato di acquistare un modulo fotografico già pronto simile a questo:


Questo modulo contiene già tutti gli elementi necessari per connessione facile fotoresistenza alla scheda Arduino. Alcuni moduli implementano un circuito comparatore e forniscono un'uscita digitale e un resistore di regolazione per il controllo.

Si può consigliare a un radioamatore russo di rivolgersi al sensore PA russo. Disponibili in vendita sono FR1-3, FR1-4, ecc. - sono stati prodotti in epoca sovietica. Ma nonostante ciò, FR1-3 è un dettaglio più accurato. Da ciò deriva la differenza di prezzo: per FR chiedono non più di 400 rubli. FR1-3 costerà più di mille rubli ciascuno.

Marcatura della fotoresistenza

L'etichettatura moderna dei modelli prodotti in Russia è abbastanza semplice. Le prime due lettere sono PhotoResistor, i numeri dopo il trattino indicano il numero di sviluppo. FR -765 - fotoresistenza, sviluppo 765. Solitamente contrassegnato direttamente sul corpo della parte

Il sensore TV ha un range di resistenza indicato nello schema di marcatura. Per esempio:

  • VT83N1 - 12-100kOhm (12K – illuminato, 100K – al buio)
  • VT93N2 - 48-500kOhm (48K – illuminato, 100K – al buio).

A volte, per chiarire le informazioni sui modelli, il venditore fornisce un documento speciale del produttore. Oltre ai parametri operativi, lì viene indicata anche la precisione della parte. Tutti i modelli hanno un range di sensibilità nella parte visibile dello spettro. Collezionare sensore di luceÈ necessario comprendere che l'accuratezza dell'operazione è un concetto relativo. Anche per i modelli dello stesso produttore, dello stesso lotto o dello stesso acquisto, la differenza può essere del 50% o più.

In fabbrica, le parti sono sintonizzate su lunghezze d'onda che vanno dalla luce rossa a quella verde. La maggior parte delle persone “vede” anche la radiazione infrarossa. Parti particolarmente precise possono rilevare anche la luce ultravioletta.

Vantaggi e svantaggi del sensore

Lo svantaggio principale dei fotoresistori è la sensibilità dello spettro. A seconda del tipo di luce incidente, la resistenza può variare di diversi ordini di grandezza. Gli svantaggi includono anche bassa velocità Reazioni ai cambiamenti di illuminazione. Se la luce lampeggia, il sensore non ha il tempo di reagire. Se la frequenza di variazione è piuttosto elevata, il resistore generalmente smetterà di "vedere" che l'illuminazione sta cambiando.

I vantaggi includono semplicità e accessibilità. Modificare direttamente la resistenza a seconda della luce che cade su di essa consente di semplificare schema elettrico connessioni. La fotoresistenza in sé è molto economica, è inclusa in numerosi kit e produttori di Arduino e quindi è disponibile per quasi tutti i produttori di Arduino alle prime armi.

Collegare una fotoresistenza ad Arduino

Nei progetti arduino La fotoresistenza viene utilizzata come sensore di luce. Ricevendo informazioni da esso, la scheda può accendere o spegnere i relè, avviare i motori e inviare messaggi. Naturalmente dobbiamo collegare correttamente il sensore.

Lo schema di collegamento del sensore di luce ad Arduino è abbastanza semplice. Se utilizziamo una fotoresistenza, nello schema di collegamento il sensore è implementato come partitore di tensione. Un braccio cambia a seconda del livello di illuminazione, il secondo fornisce tensione all'ingresso analogico. Nel chip del controller, questa tensione viene convertita in dati digitali tramite un ADC. Perché Quando la resistenza del sensore diminuisce quando la luce lo colpisce, diminuirà anche il valore della tensione che lo attraversa.

A seconda del braccio del divisore in cui abbiamo posizionato la fotoresistenza, all'ingresso analogico verrà fornita una tensione aumentata o diminuita. Se un ramo della fotoresistenza è collegato a terra, il valore di tensione massimo corrisponderà all'oscurità (la resistenza della fotoresistenza è massima, quasi tutta la tensione cade ai suoi capi) e il valore minimo corrisponderà a una buona illuminazione (la resistenza è vicino allo zero, la tensione è minima). Se colleghiamo il braccio della fotoresistenza all'alimentazione, il comportamento sarà opposto.

L'installazione della scheda stessa non dovrebbe causare alcuna difficoltà. Poiché la fotoresistenza non ha polarità, può essere collegata da entrambi i lati; può essere saldata alla scheda, collegata con fili utilizzando un circuito stampato o utilizzata con normali clip (pinze a coccodrillo) per il collegamento. La fonte di alimentazione nel circuito è l'Arduino stesso. Fotoresistore una gamba è collegata a terra, l'altra è collegata alla scheda ADC (nel nostro esempio - AO). Colleghiamo una resistenza da 10 kOhm alla stessa gamba. Naturalmente, puoi collegare una fotoresistenza non solo al pin analogico A0, ma anche a qualsiasi altro.

Qualche parola sulla resistenza aggiuntiva da 10 K. Nel nostro circuito ha due funzioni: limitare la corrente nel circuito e formare tensione richiesta in un circuito con un divisore. La limitazione di corrente è necessaria in una situazione in cui una fotoresistenza completamente illuminata riduce drasticamente la sua resistenza. E la generazione di tensione avviene per valori prevedibili sulla porta analogica. In realtà per operazione normale Con le nostre fotoresistenze è sufficiente una resistenza di 1K.

Modificando il valore del resistore possiamo "spostare" il livello di sensibilità sui lati "scuro" e "chiaro". Quindi, 10 K daranno commutazione rapida l'inizio della luce. Nel caso di 1K, il sensore di luce rileverà con maggiore precisione livelli di luce elevati.

Se stai usando modulo pronto sensore di luce, il collegamento risulterà ancora più semplice. Colleghiamo l'uscita del modulo VCC al connettore 5V sulla scheda, GND a terra. Colleghiamo i pin rimanenti ai connettori Arduino.

Se la scheda ha un'uscita digitale, la inviamo ai pin digitali. Se è analogico, vai all’analogico. Nel primo caso riceveremo un segnale di trigger: il livello di illuminazione è stato superato (la soglia di trigger può essere regolata utilizzando un resistore di regolazione). Dai pin analogici potremo ottenere un valore di tensione proporzionale al livello di illuminazione reale.

Uno schizzo di esempio di un sensore di luce su una fotoresistenza

Abbiamo collegato il circuito con la fotoresistenza ad Arduino e ci siamo assicurati che tutto fosse fatto correttamente. Ora non resta che programmare il controller.

Scrivere uno schizzo per un sensore di luce è abbastanza semplice. Dobbiamo solo rimuovere il valore della tensione attuale dal pin analogico a cui è collegato il sensore. Questo viene fatto utilizzando la funzione analogRead() che tutti conosciamo. Possiamo quindi eseguire alcune azioni a seconda del livello di luce.

Scriviamo uno schizzo per un sensore di luce che accende o spegne un LED collegato secondo il seguente circuito.

L'algoritmo di funzionamento è il seguente:

  • Determinare il livello del segnale dal pin analogico.
  • Confrontiamo il livello con il valore di soglia. Il valore massimo corrisponderà all'oscurità, il valore minimo corrisponderà alla massima illuminazione. Scegliamo un valore di soglia pari a 300.
  • Se il livello è inferiore alla soglia, è buio, è necessario accendere il LED.
  • Altrimenti spegni il 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); } }

Coprendo la fotoresistenza (con le mani o con un oggetto a prova di luce), possiamo osservare l'accensione e lo spegnimento del LED. Modificando il parametro della soglia nel codice, possiamo forzare l'accensione/spegnimento della lampadina a diversi livelli di illuminazione.

Durante l'installazione, provare a posizionare la fotoresistenza e il LED il più distanti possibile l'uno dall'altro in modo che meno luce proveniente dal LED luminoso cada sul sensore di luce.

Sensore di luce e variazione graduale della luminosità della retroilluminazione

È possibile modificare il progetto in modo che la luminosità del LED cambi a seconda del livello di illuminazione. Aggiungeremo le seguenti modifiche all'algoritmo:

  • Cambieremo la luminosità della lampadina tramite PWM, inviando valori da 0 a 255 al pin con il LED utilizzando analogWrite().
  • Per convertire il valore digitale del livello di luce dal sensore di luce (da 0 a 1023) nell'intervallo PWM della luminosità del LED (da 0 a 255), utilizzeremo la funzione map().

Esempio di schizzo:

#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); // Converte il valore risultante nel livello del segnale PWM. Più basso è il valore di illuminazione, minore è la potenza che dobbiamo fornire al LED tramite PWM. analogWrite(PIN_LED, ledPower) ; // Cambia luminosità)

Nel caso di un altro metodo di connessione, in cui il segnale proveniente dalla porta analogica è proporzionale al grado di illuminazione, sarà necessario inoltre “invertire” il valore sottraendolo dal massimo:

Int val = 1023 – analogRead(PIN_PHOTO_RESISTOR);

Circuito del sensore di luce che utilizza una fotoresistenza e un relè

Esempi di schizzi per lavorare con i relè sono forniti nell'articolo sulla programmazione dei relè in Arduino. In questo caso non abbiamo bisogno di fare movimenti complessi: dopo aver determinato l'“oscurità”, accendiamo semplicemente il relè e applichiamo il valore corrispondente al suo pin.

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

Conclusione

I progetti che utilizzano un sensore di luce basato su una fotoresistenza sono abbastanza semplici ed efficaci. Puoi implementare molti progetti interessanti e il costo delle attrezzature non sarà elevato. La fotoresistenza è collegata utilizzando un circuito divisore di tensione con resistenza aggiuntiva. Il sensore si collega ad una porta analogica per misurare vari livelli di luce o ad una digitale se l'unica cosa che ci interessa è il fatto dell'oscurità. Nello schizzo leggiamo semplicemente i dati da una porta analogica (o digitale) e decidiamo come reagire ai cambiamenti. Speriamo che ora nei tuoi progetti appaiano "occhi" così semplici.

In questo esperimento, il LED dovrebbe accendersi quando il livello di luce scende al di sotto di una soglia impostata da un potenziometro.

ELENCO DELLE PARTI PER L'ESPERIMENTO

- 1 scheda ArduinoUno;

- 1 breadboard senza saldature;

- 1 LED;

- 1 fotoresistenza;

- 1 resistenza da valore nominale di 220 Ohm, 1 resistenza da valore nominale di 10 kOhm;

- 1 resistore variabile (potenziometro);

- 10 fili maschio-maschio.

DETTAGLI PER COMPITI AGGIUNTIVI

1 LED in più;

Altro 1 resistore con un valore nominale di 220 Ohm;

Altri 2 fili.

SCHEMA ELETTRICO

SCHEMA SUL BREADBOARD

SCHIZZO

scarica lo schizzo per l'IDE Arduino
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // legge il livello di luce. A proposito, // puoi dichiarare una variabile e assegnarla assegnargli subito un valore int lightness = analogRead(LDR_PIN); // legge il valore dal potenziometro, che usiamo per regolare // il valore di soglia tra oscurità condizionale e luce int Threshold = analogRead(POT_PIN); // dichiara un variabile logica e assegnarle il valore // "è buio adesso". Le variabili booleane, a differenza // delle variabili intere, possono contenere solo uno dei due valori: // vero o falso. Tali valori // sono anche chiamati booleani. booleano tooDark = (leggerezza< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

SPIEGAZIONI PER IL CODICE

  • Stiamo utilizzando un nuovo tipo di variabili − booleano, che memorizzano solo valori VERO (vero, 1) O falso (falso, 0). Questi valori sono il risultato della valutazione delle espressioni booleane. In questo esempio, l'espressione booleana è leggerezza< threshold . Nel linguaggio umano questo suona come: “illuminamento al di sotto del livello di soglia”. Tale affermazione sarà vera quando l'illuminazione è al di sotto del livello di soglia. Il microcontrollore può confrontare i valori delle variabili leggerezza E soglia, che a loro volta sono i risultati della misurazione e calcolano la verità dell'espressione logica.
  • Mettiamo questa espressione logica tra parentesi solo per chiarezza. È sempre meglio scrivere codice leggibile. In altri casi, le parentesi possono influenzare l'ordine delle operazioni, come nell'aritmetica ordinaria.
  • Nel nostro esperimento, un'espressione booleana sarà vera quando value leggerezza meno del valore soglia perché abbiamo utilizzato l'operatore < . Possiamo usare gli operatori > , <= , >= , = = , != , che significano rispettivamente “maggiore di”, “minore o uguale a”, “maggiore o uguale a”, “uguale a”, “diverso da”.
  • Prestare particolare attenzione all'operatore logico = = e non confonderlo con l'operatore di assegnazione = . Nel primo caso confrontiamo i valori delle espressioni e otteniamo un valore logico (vero o falso) e nel secondo caso assegniamo il valore dell'operando destro all'operando sinistro. Il compilatore non conosce le nostre intenzioni e non genererà un errore, ma possiamo modificare accidentalmente il valore di qualche variabile e quindi dedicare molto tempo alla ricerca di un errore.
  • Operatore condizionale SeSe") è uno dei principali nella maggior parte dei linguaggi di programmazione. Con il suo aiuto, possiamo eseguire non solo una sequenza di azioni rigorosamente definita, ma anche prendere decisioni su quale ramo dell'algoritmo seguire, a seconda di determinate condizioni.
  • Per un'espressione logica leggerezza< threshold c'è un significato: VERO O falso. Lo abbiamo calcolato e inserito in una variabile booleana troppo scuro("troppo scuro") Quindi, sembra che stiamo dicendo “se è troppo buio, accendi il LED”
  • Con lo stesso successo potremmo dire “se l’illuminazione è inferiore al livello di soglia, allora accendi il LED”, cioè trasferire a Se tutta l'espressione logica:
se (leggerezza< threshold) { // ... }
  • Dietro la frase condizionale Se Deve essere presente un blocco di codice che viene eseguito se l'espressione logica è vera. Non dimenticare entrambe le parentesi graffe {} !
  • Se, se l'espressione è vera, dobbiamo solo eseguirla uno istruzioni, può essere scritto subito dopo Se (…) senza parentesi graffe:
se (leggerezza< threshold) digitalWrite(LED_PIN, HIGH);
  • Operatore Se può essere esteso in base alla progettazione altro("Altrimenti"). Un blocco di codice o una singola istruzione successiva verranno eseguiti solo se l'espressione logica in Se ha il significato falso , « menzogna" Le regole relative alle parentesi graffe sono le stesse. Nel nostro esperimento abbiamo scritto "se è troppo buio, accendi il LED, altrimenti spegni il LED".

DOMANDE PER PROVARE SE STESSI

  1. Se installiamo una fotoresistenza tra l'ingresso analogico e la terra, il nostro dispositivo funzionerà al contrario: il LED si accenderà quando la quantità di luce aumenta. Perché?
  2. Quale risultato otterremo dal funzionamento del dispositivo se la luce del LED cade sulla fotoresistenza?
  3. Se installiamo la fotoresistenza come indicato nella domanda precedente, come dobbiamo modificare il programma affinché il dispositivo funzioni correttamente?
  4. Diciamo che abbiamo il codice if (condizione) (azione;). In quali casi verrà effettuato? azione ?
  5. A quali valori espressione x + y > 0 sarà vero se x > 0 ?
  6. È necessario indicare quali istruzioni eseguire se la condizione è presente nell'istruzione Se falso?
  7. Qual è la differenza tra l'operatore = = dall'operatore = ?
  8. Se usiamo la costruzione if (condizione) azione1; altrimenti azione2;, potrebbe verificarsi una situazione in cui nessuna delle azioni viene eseguita? Perché?

COMPITI PER UNA SOLUZIONE INDIPENDENTE

  1. Riscrivere il programma senza utilizzare la variabile troppo scuro pur mantenendo la funzionalità del dispositivo.
  2. Aggiungi un altro LED al circuito. Completare il programma in modo che quando l'illuminazione scende al di sotto del valore di soglia, si accenda un LED e quando l'illuminazione scende al di sotto della metà del valore di soglia, si accendano entrambi i LED.
  3. Modificare il circuito e programmare in modo che i LED si accendano secondo lo stesso principio, ma si accendano tanto più intensamente quanto meno luce cade sulla fotoresistenza.




Superiore