Cuprins:
2025 Autor: John Day | [email protected]. Modificat ultima dată: 2025-01-13 06:58
Pentru acest proiect am dorit ceva care să-mi permită să mă învăț mai multe despre electronică / software, ceva în care încă nu am ajuns. Am decis că o lumină ar fi o platformă bună pentru asta.
Designul cu care am venit a fost pentru un iluminator cu funcții de reglare a culorii și luminozității. Pe produs, temperatura și luminozitatea culorii albe calde până la reci sunt controlate prin „puc”, poziția și orientarea acestuia schimbându-le în mod independent - o interacțiune destul de unică / distractivă.
De asemenea, am ajuns să creez o aplicație (aș putea să mă provoc și eu) pentru a le regla, precum și pentru a adăuga funcționalități suplimentare pentru a controla unele LED-uri RGB și pentru a seta o alarmă de răsărit. Alarma de răsărit crește treptat luminozitatea peste 30 de minute pentru a vă ajuta să vă treziți.
Deoarece acesta este primul meu proiect Arduino / App, presupun că va exista cu siguranță modalități mai bune de a face codul, așa că mergeți ușor pe mine! Se îngrijorează, așa că sunt fericit. Dacă aveți sugestii cu privire la îmbunătățiri etc. ar fi bine să auziți …
Toate fișierele pentru acest proiect (codul inventator arduino / aplicație, grafica aplicației etc.) și aplicația apk. pot fi găsite la acest link.
Am înscris acest lucru la concursurile Raspberry Pi și FULL SPECTRUM LASER, deci dacă credeți că este demn un vot ar fi apreciat masiv !!
De ce ai nevoie….
Elec. Componente:
- Arduino Micro
- 12 senzori de efect Hall Radiometric Linear
- DC Jack
- Alimentare 12V
- 2x LED-uri alb rece de 1W (6000K)
- 2 LED-uri albe calde de 1W (2800K)
- 4x Neopixeli Adafruit RGB
- Sparkfun Picobuck 350mA driver de curent constant
- Modul Bluetooth HC06
- Placă prototip
- Blocuri terminale
- Fire
Materiale:
- Materiale pentru fabricarea matrițelor (carton sau silicon etc.)
- Rășină turnată din poliuretan
- Placaj
Consumabile:
- Solder
- Spray cu vopsea
- Hârtie de șlefuit
- Amestecarea paharelor / agitatorelor
Instrumente:
- Ciocan de lipit
- Pistol de lipit
- Cleste / șurubelnițe / cuțite etc.
- Cutter cu laser
Software:
- Arduino
- MIT App Inventor (gratuit pe web)
- Photoshop sau ceva pentru a crea grafică pentru aplicații
Pasul 1: senzori de efect Hall
Pentru controlul / interacțiunea produsului, am căutat să vin cu ceva puțin diferit, nu doar cu un cadran sau altceva.
După un pic de cercetare a diferitelor tipuri de componente electronice, am găsit senzori cu efect de hală radiometric liniar. Acestea sunt în esență un senzor a cărui ieșire este afectată de câmpurile magnetice. De obicei, ieșirea senzorilor este jumătate din tensiunea de intrare. Cu toate acestea, atunci când un magnet este apropiat de acesta, ieșirea va crește fie la tensiunea de intrare, fie va scădea la 0V (limite de saturație), în funcție de polul nord sau sud al magnetului.
Mi-am dat seama că pot folosi acest lucru pentru a-mi permite să controlez două setări diferite pe un singur senzor de sală - s-a născut ideea „puck”. Un magnet este ascuns în pucul tăiat cu laser și ar controla luminozitatea sau temperatura culorii în funcție de capătul cu care se confruntă senzorii. Merg mai târziu în codul Arduino, dar în esență citesc acești senzori și caut dacă ieșirea a crescut deasupra unui „declanșator ridicat” sau a scăzut sub „declanșatorul scăzut”. Folosesc mai mulți senzori de efect hall pentru a-mi permite să mapez o temperatură specifică a culorii și o valoare a luminozității pe fiecare, care se declanșează pe măsură ce glisați pucul în jurul arcului..
Pasul 2: Hardware electronice
Primul pas al acestui proiect a fost conectarea hardware-ului electronic. Am ales să folosesc un Arduino Micro deoarece are un număr mare de pini de citire analogici - permițându-mi să folosesc mai mulți senzori de efect hall pentru a oferi suficientă rezoluție pentru ajustarea setării. O sursă de alimentare de 12V DC este împărțită între alimentarea driverului Arduino și a LED-ului.
Arcul de control folosește 11 senzori de sală, cu un altul folosit pentru a opri lumina. Acestea au fost conectate în pinii A0-> A5 și 4, 6, 8, 9, 10, 12. Aceștia împărtășesc o șină / pin comună de 5v și de masă.
LED-urile pe care le-am folosit sunt de 1W și necesită un driver de curent constant. Sparkfun PicoBuck a fost utilizat deoarece oferă o constantă de 350mA până la 3 canale de ieșire. Alimentarea de 12V este conectată la știfturile Vin. Driverul are pini de intrare pentru a controla PWM-ul ieșirilor, acestea fiind conectate la pinii 3 și 5 din Arduino.
Modulul bluetooth a fost apoi conectat. Bluetooth Rx-> Arduino Tx, Tx-> Rx și 5v.ground.
LED-urile au fost montate pe o placă separată. Două LED-uri albe reci sunt conectate în serie, la fel și cele calde. Acestea se conectează la ieșirile 1 și 2 ale driverului. LED-urile RGB sunt Neopixeli Adafruit; acestea sunt module cu lanțuri pe care le puteți controla în mod individual culoarea și luminozitatea de la un singur pin Arduino. Acestea se conectează la pinul 11 și pinii de 5V / masă.
Pasul 3: Inventor de aplicații
Pentru a crea aplicația, am folosit MIT App Inventor, este gratuit și ușor de învățat / utilizat. Mai întâi a trebuit să creez ecranele / grafica aplicației - acest lucru se poate face în Photoshop etc. Este mai ușor în App Inventor dacă aveți toate componentele care alcătuiesc ecranele ca imagini / fișiere separate.
App Inventor are două vizualizări, există fila „Designer” pentru elementele vizuale din partea frontală și fila „Blocuri” pentru cod.
Folosind fila „Designer” am construit ecranele aplicației. O problemă pe care am găsit-o este că componenta bluetooth nu funcționează pe mai multe ecrane, așa că, după ecranul „bun venit”, toate celelalte (conexiune, RGB, temperatură de culoare, alarmă) sunt toate create în același ecran - în mod eficient straturi pe care le pornesc / oprit.
Principalele instrumente pe care le-am folosit sunt pentru „aspect / aliniere” și „pânză”. O pânză este o zonă sensibilă la atingere pe care o puteți afișa ca imagine.
Odată ce imaginile sunt configurate, este timpul să treceți la fila „Blocuri” și să scrieți codul. O voi descrie pe scurt, dar este probabil mai ușor dacă importați fișierul meu în App Inventor și vă jucați în jurul vostru …
Aceste prime blocuri sunt pentru ecranele de conectare. Pentru a permite aplicației să încerce să se conecteze automat la modulul Bluetooth Arduinos, creez și setez o variabilă la adresa HC06. Folosesc un cronometru pentru a schimba imaginea de fundal în timp ce se conectează. Dacă conexiunea reușește, atunci se încarcă ecranul temporar al culorii. Dacă bluetooth-ul nu se conectează automat, trebuie să apăsați butonul „Conectare la dispozitiv”. Aceasta va afișa o listă cu toate dispozitivele bluetooth pe care le poate vedea telefonul dvs. Comanda „bluetoothclient1.connect” utilizează adresa dispozitivului pe care o selectați din lista respectivă pentru a vă conecta.
Aceste blocuri controlează ce se întâmplă atunci când atingeți fiecare dintre butoanele meniului - schimbați între RGB, temperatura culorii și alarma. Pe măsură ce sunt atinse, straturile vizuale aplicabile sunt activate și dezactivate. Adică atunci când atingeți butonul de meniu RGB, comută imaginea de fundal a butoanelor pe pictograma întunecată, pornește ecranul RGB și celălalt este dezactivat.
Controlul puterii și luminozității este împărțit între ecranele RGB și temp. Pentru ca Arduino să știe ce LED-uri trebuie să controleze, trebuie să-i spun ce ecran este încărcat. Un șir de text în format (ecran)? este trimis de telefoanele dvs. bluetooth folosind comanda BluetoothClient1. SendText.
Acest bloc trimite șirul (Power)? ori de câte ori este apăsat butonul de alimentare.
Aceste blocuri controlează reglarea temperaturii culorii. Când atingeți pânza, coordonata Y a punctului dvs. de atingere este utilizată pentru a seta variabila „cool”. Valoarea Y este determinată de dimensiunea pixelilor pânzei, deci în cazul meu o valoare cuprinsă între 0 și 450. Folosesc multiplicatorul pentru a-l converti într-o valoare PWM utilizabilă (0-255). Trimit apoi un șir cu acea valoare și un identificator în forma (Tempvalue) ?.
Blocuri similare cu cele de mai sus, dar pentru controlul luminozității. Folosind coordonata X de data aceasta și diferiți multiplicatori pentru a seta variabila „Bright” la o valoare cuprinsă între 10 și 100.
Aceste blocuri sunt pentru controlul RGB. Există o comandă numită „GetPixelColor” care poate fi utilizată pentru a obține o valoare RGB a pixelului pe care îl atinge degetul. Se scoate valoarea cu un extra de 255 la sfârșit dintr-un anumit motiv, așa că fac un pic de muncă pentru a obține valoarea în format (RGBredvalue.greenvalue.bluevalue.)? Din nou, acest lucru este apoi trimis la Arduino, dar cu RGB ca identificator în șir.
Următoarea secțiune a blocurilor este pentru setările de alarmă. Primul bloc controlează ce se întâmplă atunci când atingeți / trageți soarele în sus și în jos. Din nou, comenzile „obțineți curentul X și Y” sunt folosite pentru a obține o valoare pentru locul în care este degetul și pentru a schimba imaginea de fundal în funcție de înălțimea soarelui. Poziția solară conduce, de asemenea, dacă alarma este activată sau dezactivată, aceasta este trimisă prin Bluetooth.
Când atingeți sau terminați de mișcat soarele, acesta afișează selectorul de timp pentru a vă permite să setați o oră de alarmă. Partea principală a acestui bloc următor este utilizarea timpului curent pentru a afla câte milisecunde există până la setarea alarmei. Această valoare este trimisă apoi către Arduino
În pasul următor am prezentat modul în care Arduino citește și folosește șirurile …
Pasul 4: Cod Arduino
Ca și în cazul codului aplicației, voi acoperi acest aspect pe scurt …
Mai întâi îmi setez toate variabilele, atribuind senzorii și LED-urile pinilor corecți. Ieșirea de la senzorii de efect hall va fi citită folosind funcția analogRead, oferind o valoare cuprinsă între 0 și 1023. Așa cum s-a descris anterior, emite jumătate atunci când nu sunt prezenți magneți, deci în jur de 500. Folosesc variabile de declanșare joasă și înaltă pentru a-mi permite să ușor reglați când știe că pucul este peste senzor.
Neopixelii necesită o bibliotecă, astfel încât este definit aici..
Setarea nulă pornește serialele, pentru Micro pinii Rx / Tx (bluetooth) utilizează Serial1.. Pinii sunt apoi setați ca intrări sau ieșiri și LED-urile sunt stinse.
Acum este bucla principală …
Această primă secțiune verifică dacă se primesc date din aplicație. Serial1.available () citește serialul și obține numărul de octeți din șir. Dacă asta e> 0, știu datele primite.
Dacă vă amintiți, toate șirurile pe care le trimit din aplicație se încheie cu un semn de întrebare … adică (Bright100)?
Folosesc funcția.readStringUntil pentru a citi datele seriale până la semnul întrebării (Bright100) și setați variabila BTstring la aceasta. Verific dacă BTstring se termină cu un ')' pentru a mă asigura că sunt primite comenzi complete. Dacă sunt, atunci bucla BluetoothProgram se numește … aceasta este descrisă mai jos..
Următorul bit controlează alarma de răsărit. Practic, dacă alarma este activată și ora este corectă, atunci va începe să se estompeze LED-urile. Datorită faptului că ochiul uman percepe lumina logaritmic, este mai bine să faceți orice fel de LED-uri se estompeze în sus / jos cu o curbă exponențială mai degrabă decât liniară. Prin urmare, o ecuație conduce valorile PWM …
Pentru a evita ca pucul să interfereze cu controlul aplicației, acesta este dezactivat atunci când utilizați aplicația. Pentru a reactiva pucul, trebuie să îl mutați de pe produs timp de 5 secunde. Acest bit de cod verifică mai întâi dacă toți senzorii emit o valoare de stare stabilă (fără magnet) și apoi pornește un cronometru. După 5 secunde, variabila BTinControl este setată înapoi la fals.
Codul pentru puck acum.. Mai întâi trebuie să citiți senzorii.
Dacă lumina este în prezent stinsă, va verifica dacă vreunul dintre senzori se află deasupra sau sub punctele de declanșare, adică pucul a fost plasat pe arc. Dacă este, atunci se vor estompa cu LED-urile albe până la ultima dvs. setare, indiferent unde îl așezați.
Pentru a menține LED-ul setat la ultima dvs. setare în loc să actualizați la valorile asociate cu orice senzori care se declanșează, variabila MovedSinceStandby este setată la false. Următorul fragment de cod verifică practic dacă ați mutat pucul din poziția sa inițială cu o sumă stabilită …
Dacă mutați pucul, „MainProgram” este apelat pentru a actualiza luminozitatea / temperatura culorii. Acest lucru este descris mai jos.
Ultimul bit din această buclă principală verifică dacă pucul a fost plasat înapoi pe docul de așteptare - senzorul 12 citește o valoare deasupra / sub un punct de declanșare. Dacă da, se estompează LED-ul înapoi în jos..
Bucla bluetooth:
După cum s-a descris mai sus când datele sunt primite prin Bluetooth, șirul este citit. Acum trebuie să verificăm ce spune acel șir …
Toate șirurile, în afară de luminozitate, temperatura culorii și RGB, sunt destul de ușor de tratat. Verificați dacă BTstring este egal cu textul trimis din aplicație.
Dacă vă amintiți, ori de câte ori schimbați ecranele din aplicație, va trimite o comandă bluetooth. Aici ne întrebăm pentru asta și setăm unele variabile la adevărat sau fals, astfel încât să știm pe ce ecran vă aflați.
Observați la sfârșitul fiecărei secțiuni am setat variabila BTinControl la adevărat și șterg valoarea BTstring.
Când atingeți butonul de alimentare din aplicație, LED-urile se vor estompa în sus sau în jos. Variabilele setate mai sus pentru ecranul în care vă aflați sunt utilizate pentru a decide dacă LED-urile RGB sau albe vor fi controlate.
Pentru luminozitate, temperatura culorii și RGB, trebuie să citesc șirurile într-un mod ușor diferit. Deoarece partea numerică a șirului se va schimba, mă întreb dacă șirul începe cu unul dintre identificatori, nu șirul complet, deci doar (Bright aici..
Acum trebuie să separ valoarea luminozității reale de șir. Formatul șirului trimis din aplicație este (Brightvalue), așadar știu că valoarea luminozității va fi între „t” și „)”. Poziția „t” va rămâne constantă, va fi întotdeauna al 7-lea caracter din șir. Dar, deoarece valoarea luminozității poate fi între 10 și 100, poziția „)” se va schimba. Folosesc comanda.indexOf pentru a afla unde este ')', ce caracter este și pot folosi apoi comanda.substring pentru a citi șirul dintre cel de-al 7-lea caracter și poziția caracterului ')'. Acest lucru îmi lasă doar valoarea luminozității pe care o pot folosi pentru a regla LED-urile RGB sau albe în funcție de ecran.
Reglarea temperaturii culorii este un proces similar cu cel de mai sus, dar valoarea va fi între „p” și „)” de data aceasta …
Pentru ajustarea RGB avem trei valori de extras din șir, dar este un proces similar din nou. Din aplicație primim șiruri în forma (RGBvalue.value.value)
Deci, știu că valoarea roșie va fi între „B” și primul punct. Valoarea verde este între primul / al doilea punct și valoarea albastră este între al doilea punct și ')'.
Odată ce avem valorile, neopixele sunt setate la noua culoare …
Aici verificăm dacă alarma este activată sau dezactivată. Dacă se schimbă ora alarmei, vom primi un șir cu numărul de milisecunde de acum până la alarmă. Din nou, această valoare este extrasă din șir și pentru a putea verifica dacă este timpul pentru a începe răsăritul soarelui, trebuie să setăm o variabilă la ora curentă (milis).
Comenzi Puck:
Așa cum s-a descris mai înainte, dacă pucul (magnetul) este într-o direcție în sus, acesta va conduce ieșirea senzorului de hol sub declanșatorul inferior și dacă în sens invers deasupra declanșatorului înalt.
Acest lucru permite controlul atât al luminozității, cât și al temperaturii culorii pe același arc..
Valorile senzorilor sunt citite. Dacă oricare dintre ele este mai mică decât valoarea scăzută a declanșatorului, ajustăm temperatura culorii. Există 11 senzori sub zona arcului, care ieșirile vor merge la rândul lor sub punctul de declanșare pe măsură ce pucul se deplasează deasupra lor. Fiecare senzor are o valoare PWM pentru LED-urile reci și calde, începând cu senzorul 1 la 100% cald, 0% rece și funcționând până la 11 la 0% cald, 100% rece.
Controlul luminozității se face în același mod.. verificând dacă ieșirile senzorilor sunt peste declanșatorul mare de această dată și oferind fiecărui senzor o valoare de ponderare a luminozității.
Această ponderare a luminozității este apoi înmulțită cu valoarea temperaturii culorii pentru a da valoarea totală de ieșire. Vă permite să setați orice temperatură de culoare la orice luminozitate …
Pasul 5: Locuințe
- Am început prin a face o matriță din carton pentru partea inferioară a carcasei. Pentru a crea nișele pentru zona de control, am avut o bucată de placaj cu laser tăiat în formă de arc și am folosit o monedă de 5p pentru docul „standby”. Acestea au fost lipite de matrița din carton, acordând atenție pentru a le obține în poziția corectă care să se alinieze cu senzorii de efect de hol.
- Apoi a fost amestecarea rășinii poliuretanice. Lucrurile pe care le folosesc au un raport 1: 1 simplu și se vindecă în aproximativ 20 de minute.. așa că trebuie să lucreze destul de repede!
- Turnarea inițială a fost să umple fundul matriței. După acest set am adăugat un perete interior de carton pentru a-mi permite să turn pereții laterali.
- Pentru a crea secțiunea superioară, în care s-ar așeza LED-urile, am tăiat și am lipit niște tub / pahar de plastic în poziție sub un unghi. Și din nou rășina a fost turnată și lăsată să se întindă.
- Acum carcasa era gata, trebuia să fac niște găuri și să-i dau un nisip bun.
- Grundul a fost aplicat și apoi pulverizat cu stratul final de vopsea.
Pasul 6: Asamblare / Concluzie
- O fantă pentru mufa DC a fost decupată din carcasă. Cricul este apoi lipit.
- Placa LED poate fi apoi înșurubată în secțiunea superioară, cu firele introduse în partea inferioară.
- Sârmele de la LED-uri și mufa DC au fost apoi înșurubate în blocurile de borne corecte.
- Placa principală este apoi înșurubată în carcasă
- O bucată de placaj este apoi înșurubată pentru a acoperi partea inferioară a carcasei.
- Ultimul lucru este să lipiți „pucul” împreună, asigurându-vă că orientați polii magnetului cu capacul corect de „luminozitate” sau „temperatură de culoare”.
Per total, lumina funcționează destul de bine! Există câteva erori în software pentru a le rezolva, iar LED-urile RGB ar putea fi mai luminoase. De asemenea, pot adăuga un senzor de lumină ambientală pentru a schimba automat temperatura culorii, începând cu „răcire” în timpul zilei și schimbând în „caldă” noaptea.
Noroc pentru lectură!