Avancerad LED styrning

Ibland vill man styra ett antal lysdioder (LED) i ett visst schema, det går snabbt att göra det med hjälp utav C/C++ om det är få lysdioder, men vill man styra flera helt oberoende av varandra i ett schema/mönster och ha en enkla inställningsmöjligheter, då kommer detta program till användning, det finns så mycket annat än Lysdioder som kan styras på samma sätt helt oberoende av varandra såsom servon och maskiner (PLC).

Detta program kom till i samband med att vi ville styra/simulera lampor i hus som finns på modelljärnvägar. Till varje hus kan sätta upp 10 helt oberoende lysdioder som följer ett mönster där man kan programmera dem vad de skall göra (simulera vanlig av/på, dimmer, TV flimmer eller lysrör). Varje rum i huset avskiljs och har en egen lysdiod (TV har en RGB lysdiod), sedan sätter man upp ett schema på hur varje lysdiod skall fungera.

På utvecklingskort med ATMega328P finns det 6st PWM utgångar som kör på 490Hz (via det inbyggda libbet i utvecklingsmiljön), vi har tagit vara på alla dem samt lagt till ytterligare 4 vanliga digitala utgångar som kan göra allt utom dimmer funktion och dessa får man anpassa resistorn för att de skall lysa så skarpt man vill att de skall göra. Med dem med PWM utgångar har vi möjligheten att programmera max belysning (0-255) och tiden för att rampa upp till max belysning i tiondels sekunder samt även tiden för att rampa ner dem. Detta för att simulera att någon tänder i ett rum med dimmerfunktion eller om man tar 3st PWM utgångar med korta tider kan man simulera att en TV är påslagen (TV funktionen är inte helt optimal, utan kommer att förbättras senare). Alla utgångar kan även ställas så att de kan simulera att det är lysrör, perfekt för t.ex. fabriker, badrum eller kök. Lysrörsfunktionen kan även simulera svetsljus i en verkstad, dock inte helt optimalt, så det kommer att göras en funktion för detta med inom kort.

Så, till varje lysdiod kan man ställa in:
* Om lysdioden skall funka som en vanlig lampa (0) eller lysrör (1)
* Maxstyrka (0-255), gäller endast de första 6PWM utgångarna
* Tiden i 1/10s som lysdioden skall vara släckt
* Tiden i 1/10s som den skall rampa upp (0=Tänd direkt) eller antal blink vid lysrör
* Tiden i 1/10s som lysdioden skall vara tänd
* Tiden i 1/10s som den skall rampa ner (0=Släck direkt)

Varje lysdiod sköter sedan sitt eget schema i en loop utan att störa de andra lysdioderna, detta tack vare att vi inte använder någon tidsfördröjning som “hänger” programmet, utan kollar av tiden och kommer ihåg var vi var (alla lysdioder har en egen timer) och det hela finns i en så kallad “state machine” och en loop där vi snurrar igenom alla 10 lysdioder.

Detta projekt är ett exempel och vi kan inte ge support på det.

Här finns koden till programmet. Vi har valt att använda vår egen produkt Brage till detta projekt, men koden funkar på alla kort med en ATMega328P. Det är fritt fram att använda och ändra koden till eget behov utan att fråga oss, dock skall info finnas i koden vart originalprogrammet kommer ifrån.