![En LED -stemningslampe på 1 dollar med ATtiny13 og WS2812: 7 trinn En LED -stemningslampe på 1 dollar med ATtiny13 og WS2812: 7 trinn](https://i.howwhatproduce.com/images/001/image-1815-j.webp)
Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-23 15:02
![En LED -stemningslampe på $ 1 med ATtiny13 og WS2812 En LED -stemningslampe på $ 1 med ATtiny13 og WS2812](https://i.howwhatproduce.com/images/001/image-1815-1-j.webp)
Av arduinocelentano Følg mer av forfatteren:
![Personlig CalDAV-server på en enkeltbordsmaskin Personlig CalDAV-server på en enkeltbordsmaskin](https://i.howwhatproduce.com/images/001/image-1815-2-j.webp)
![Personlig CalDAV-server på en enkeltbordsmaskin Personlig CalDAV-server på en enkeltbordsmaskin](https://i.howwhatproduce.com/images/001/image-1815-3-j.webp)
![LCD Invaders: a Space Invaders Like Game på 16x2 LCD -tegnvisning LCD Invaders: a Space Invaders Like Game på 16x2 LCD -tegnvisning](https://i.howwhatproduce.com/images/001/image-1815-4-j.webp)
![LCD Invaders: a Space Invaders Like Game på 16x2 LCD -tegnvisning LCD Invaders: a Space Invaders Like Game på 16x2 LCD -tegnvisning](https://i.howwhatproduce.com/images/001/image-1815-5-j.webp)
![Octarine: et fargematchende spill med WS2812 RGB -lysdioder Octarine: et fargematchende spill med WS2812 RGB -lysdioder](https://i.howwhatproduce.com/images/001/image-1815-6-j.webp)
![Octarine: et fargematchende spill med WS2812 RGB -lysdioder Octarine: et fargematchende spill med WS2812 RGB -lysdioder](https://i.howwhatproduce.com/images/001/image-1815-7-j.webp)
Dette er en rimelig stemningslampe med fire moduser.
1. Rainbow gnist. En lysgnist beveger seg oppover gang på gang og endrer gradvis fargen.
2. Rainbow glød. En stabil glød som gradvis endrer fargen.
3. Simulering av stearinlys.
4. Av.
Du kan bytte modus ved å trykke på en berøringsknapp øverst. Den nåværende modusen lagres i EEPROM -minnet etter at den er slått av.
Hvor liten er ATtiny13?
Tanken var å få maksimale funksjoner fra minimum maskinvare, noe mer komplekst enn automatisert bryter eller termometer, et prosjekt nær kanten av denne lille mikrokontrolleren. Tross alt får begrensninger deg til å tenke kreativ, ikke sant? Vel, det så slik ut i begynnelsen.
Det mest utfordrende i dette prosjektet var å skyve all koden inn i ATtiny13. Mikrokontrolleren har 1K byte flash og bare 64 byte RAM. Ja, når jeg sier “byte”, mener jeg de som består av åtte bits. 64 byte for alle dine lokale variabler og anropsstabel. For å gjøre det klart, tenk på at vi må kontrollere 8 RGB -lysdioder. Hver av dem er definert av 3 byte (en for henholdsvis rød, grønn og blå kanal). Så bare for å lagre tilstanden til 8 lysdioder, må vi implementere en rekke med 8 strukturer 3 byte hver, og en peker til begynnelsen av denne matrisen vil ta en byte til. Dermed er 25 av 64 byte ute. Vi har nettopp brukt 39% av RAM og har egentlig ikke startet ennå. I tillegg trenger du 7 × 3 = 21 byte for å lagre syv grunnleggende regnbuefarger, så 72% av RAM er ute. Vel, når det gjelder grunnleggende farger, overdriver jeg: vi trenger ikke dem alle samtidig i RAM, og de endres aldri, så de kan implementeres som en konstant matrise som skal lagres i flash i stedet for RAM. Uansett, det gir et helhetsinntrykk om brukt maskinvare.
Da jeg husket Knuths uttalelse om for tidlig optimalisering, begynte jeg med å prototype tre lampemoduser hver for seg for å se hva som skjer. Jeg har testet dem separat for å sikre at de fungerer som de skal og at hver av dem passer til min mikrokontroller. Det tok et par kvelder å oppnå det, og alt gikk bra … til jeg prøvde å sette dem sammen i en switch -erklæring. avr-size verktøy rapporterte en 1,5 Kb tekstdelingsstørrelse (med -s flagg av avr-gcc). I det øyeblikket var min opprinnelige intensjon å ta litt ATtiny25 med 2Kb blits, og det kunne ha vært den lykkelige slutten på denne historien.
Men på en eller annen måte følte jeg at etter betydelig optimalisering kunne jeg klare å krympe den skitne koden til 1Kb. Imidlertid tok det en uke til å innse at det er umulig og en uke til å oppnå det uansett. Jeg måtte kutte en regnbue til fem grunnfarger (uten vesentlig visuell forskjell). Jeg kvittet meg med saksuttalelser og brukte en kjede med if-then-if for å redusere binær kodestørrelse. Brannanimasjon trenger en pseudoslått tallgenerator som er ganske stor, så jeg implementerte en forenklet versjon av LFSR med konstant startverdi. Jeg bryr meg ikke om PRNG full sykluslengde og bare på jakt etter en nedstigningsbalanse mellom kodestørrelse og "realistisk brannanimasjon". Jeg implementerte også mange mindre optimaliseringer jeg ikke husker akkurat nå, og klarte til og med å blinke alle modusene bortsett fra brann inn i brikken. Da jeg gikk tom for ideer, var min totale kode omtrent 1200 byte.
Jeg tok timeout og hadde lest mye om optimalisering av AVR -kode. Jeg var nær ved å gi opp og skrive om alt på samlingsspråk, men ga det den siste sjansen. Under det siste optimaliseringsrushetet har jeg kuttet en regnbue til tre grunnfarger og fått andre til å bli beregnet i farten, jeg inspiserte alt og fulgte AVR -optimaliseringsanbefalinger og til slutt …
avrdude: skriveblits (1004 byte):
Skriving | #################################################### | 100% 0,90s
Det er ikke nødvendig å si at jeg brukte nesten all RAM og bare en byte EEPROM for å lagre gjeldende modus. Jeg antyder ikke at dette er en ideell og ultimate implementering. Det fungerer bare og passer til mikrokontrolleren. Jeg er sikker på at du kan gjøre det bedre. Jeg er virkelig. Jeg vil bare dele moroa med å løse et tilsynelatende upraktisk problem du anser som nesten umulig i begynnelsen. "Derfor betyr hacking å utforske grensene for hva som er mulig …" -Richard Stallman.
Rekvisita:
1x ATtiny13 MCU ($ 0,28 = $ 0,24 for MCU i SOP-8-pakken og $ 0,04 for DIP8-adapter)
8x WS2812 RGB -lysdioder (jeg anbefaler et brett eller et stykke LED -stripe) ($ 0,42)
1x TTP223 berøringsknapp ($ 0,10)
1x Micro USB til DIP -adapter ($ 0,14)
1x 10kΩ motstand (<$ 0,01)
1x 100nF keramisk kondensator (<$ 0,01)
1x 10–47µF elektrolytisk kondensator (<$ 0,01)
Totalt <$ 0,97
Trinn 1: Programvareoppsett
![Programvareoppsett Programvareoppsett](https://i.howwhatproduce.com/images/001/image-1815-8-j.webp)
Du trenger avr-gcc verktøykjede for å kompilere kildekoden og avrdude-verktøyet for å laste opp mikrokontrollerens ROM. Installasjonsprosessen er ganske enkelt og grei, men det avhenger av operativsystemet. Hvis du bruker en slags GNU/Linux, har du sannsynligvis allerede riktige pakker i lagertreet. Kildekoden til dette prosjektet kan lastes ned her:
github.com/arduinocelentano/t13_ws2812_lamp
Du trenger også et light_ws2812 bibliotek:
github.com/cpldcpu/light_ws2812
Når du har avr-gcc verktøykjede og prosjektkilder, kjører du terminalen og skriver inn følgende kode:
cd -bane/til/prosjekt
gjøre
Trinn 2: Programmering av mikrokontrolleren
![Programmering av mikrokontrolleren Programmering av mikrokontrolleren](https://i.howwhatproduce.com/images/001/image-1815-9-j.webp)
![Programmering av mikrokontrolleren Programmering av mikrokontrolleren](https://i.howwhatproduce.com/images/001/image-1815-10-j.webp)
![Programmering av mikrokontrolleren Programmering av mikrokontrolleren](https://i.howwhatproduce.com/images/001/image-1815-11-j.webp)
Hvis du har en slags USBASP -programmerer, bare koble den til Attiny i henhold til pinout. Vanligvis vil det se slik ut, men jeg anbefaler på det sterkeste å sjekke ut din faktiske pinout!
Alternativt kan du bruke et Arduino -kort som programmerer. Åpne Arduino IDE og finn Arduino ISP -eksemplet i "Fil → Eksempler" -menyen. Etter at du har lastet opp skissen, fungerer Arduino -brettet som en programmerer. Kommentarene i skissekoden vil gi deg en anelse om pinout.
Nå løp
lage blits
for å blinke MCU og
lage sikring
for å sette sikringsbiter.
Anbefalt:
Hvordan bruke Neopixel Ws2812 LED eller LED STRIP eller Led Ring med Arduino: 4 trinn
![Hvordan bruke Neopixel Ws2812 LED eller LED STRIP eller Led Ring med Arduino: 4 trinn Hvordan bruke Neopixel Ws2812 LED eller LED STRIP eller Led Ring med Arduino: 4 trinn](https://i.howwhatproduce.com/images/001/image-401-30-j.webp)
Hvordan bruke Neopixel Ws2812 LED eller LED STRIP eller Led Ring With Arduino: Hei folkens siden Neopixel led Strip er veldig populær, og den kalles også som ws2812 led strip. De er veldig populære fordi vi i denne LED -stripen kan adressere hver LED hver for seg, noe som betyr at hvis du vil at få lysdioder skal lyse i en farge
Neopixel Ws2812 Rainbow LED-glød med M5stick-C - Kjører Rainbow på Neopixel Ws2812 Bruke M5stack M5stick C Bruke Arduino IDE: 5 trinn
![Neopixel Ws2812 Rainbow LED-glød med M5stick-C - Kjører Rainbow på Neopixel Ws2812 Bruke M5stack M5stick C Bruke Arduino IDE: 5 trinn Neopixel Ws2812 Rainbow LED-glød med M5stick-C - Kjører Rainbow på Neopixel Ws2812 Bruke M5stack M5stick C Bruke Arduino IDE: 5 trinn](https://i.howwhatproduce.com/images/001/image-2825-28-j.webp)
Neopixel Ws2812 Rainbow LED-glød med M5stick-C | Running Rainbow på Neopixel Ws2812 Bruke M5stack M5stick C Bruke Arduino IDE: Hei folkens i denne instruksen, vi lærer hvordan du bruker neopixel ws2812 LED eller led strip eller led matrise eller led ring med m5stack m5stick-C utviklingstavle med Arduino IDE, og vi skal lage et regnbuemønster med den
Komme i gang med NeoPixel / WS2812 RGB LED: 8 trinn (med bilder)
![Komme i gang med NeoPixel / WS2812 RGB LED: 8 trinn (med bilder) Komme i gang med NeoPixel / WS2812 RGB LED: 8 trinn (med bilder)](https://i.howwhatproduce.com/images/002/image-3576-24-j.webp)
Komme i gang med NeoPixel / WS2812 RGB LED: [Spill av video] I denne instruksen vil vi utforske den adresserbare RGB LED (WS2812) eller populært kjent som Adafruit NeoPixel. NeoPixel er en familie av ringer, strimler, brett og amp; pinner av pulserende, fargerike miniatyr -lysdioder. Disse er kjedelige
Høyspennings alternerende okklusjons treningsbriller [ATtiny13]: 5 trinn (med bilder)
![Høyspennings alternerende okklusjons treningsbriller [ATtiny13]: 5 trinn (med bilder) Høyspennings alternerende okklusjons treningsbriller [ATtiny13]: 5 trinn (med bilder)](https://i.howwhatproduce.com/images/002/image-4760-57-j.webp)
Høyspennings alternerende okklusjons treningsbriller [ATtiny13]: I min første instruks har jeg beskrevet hvordan jeg bygger en enhet som burde være ganske nyttig for noen som ønsker å behandle amblyopi (lat øye). Designet var veldig forenklet og hadde noen ulemper (det krevde bruk av to batterier og væske
Liquid Crystal Glasses for Amblyopia (Alternative Occlusion Training Glasses) [ATtiny13]: 10 trinn (med bilder)
![Liquid Crystal Glasses for Amblyopia (Alternative Occlusion Training Glasses) [ATtiny13]: 10 trinn (med bilder) Liquid Crystal Glasses for Amblyopia (Alternative Occlusion Training Glasses) [ATtiny13]: 10 trinn (med bilder)](https://i.howwhatproduce.com/images/002/image-4775-39-j.webp)
Liquid Crystal Glasses for Amblyopia (Alternating Occlusion Training Glasses) [ATtiny13]: Amblyopia (lat øye), en synsforstyrrelse som påvirker omtrent 3% av befolkningen, vanligvis behandlet med enkle øyeoppslag eller atropindråper. Dessverre tilstopper disse behandlingsmetodene et sterkere øye i lange, uavbrutte perioder, nei