Trädkoja våningssäng (5 / 5 steg)
Steg 5: Electonics
Jag kunde inte motstå att lägga lite av tech till sängen, så jag installerade några remsor av RGB ledde och en twinking stjärna fält/glow-worms på undersidan av britsen.
De ledda remsorna var lätt. Jag valde en fast styrenhet på ebay, som visas i bilden, som jag visste att en fjärrkontroll skulle försvinner efter några dagar. Jag lägger en remsa i överslafen och en annan på undersidan för läsning.
Stjärna taket tog lite ansträngning... Jag anpassade här koden (http://playground.arduino.cc/Main/AnalogAndDigital...) för att använda de 6 pwm utgångarna för en arduino mini. Min kod är nedan (gärna låta mig veta om du har några förslag, jag är fortfarande lärande arduino).
Jag la en strömbrytare och en potentiometer att justera LED ljusstyrka i en liten kontroll låda under britsen. Jag trådbundna tillsammans kluster av 6 lysdioder till varje PWM utgången arduino och lagt till en 1 k ohm motstånd till varje ledde till hålla nuvarande down (de inte behöver vara så ljusa) och se till att alla lampor inte skulle överbelasta arduino. Jag gömde det stökigt ledningar av sig ett ark svart polyester längs undersidan av britsen och säkra den på plats med tunna bitar av tall formblåsning. Lysdioder lyser fint igenom tyget, du kan slags se det i bifogade bilder.
#define MAX_FIREFLIES_ON 6
int PotPin = A0; ** analog ansluten till potten int fade = 0;
Ändra dessa värden för att avgöra hur långa LED vistelser utanför och hur länge det stannar ON för analoga eldflugor. Dessa värden är i millisekunder gånger 10 (dvs 27 = 270 millisekunder). #define ANALOG_MIN_OFF 41 #define ANALOG_MAX_OFF 300 #define ANALOG_MIN_ON 50 #define ANALOG_MAX_ON 200
Ändra dessa värden för att avgöra hur långa LED vistelser utanför och hur länge den stannar ON Digital eldflugor. Dessa värden är i millisekunder. #define DIGITAL_MIN_OFF 4410 #define DIGITAL_MAX_OFF 30000 #define DIGITAL_MIN_ON 210 #define DIGITAL_MAX_ON 2100
Antalet nivåer transparensen innan lampan är avstängd med en digital PWM. Bästa för att inte ändra dessa #define DIGITAL_FADE_INTERVAL 20 #define DIGITAL_FADE_WAIT 20
Används för att ange de 4 staterna kan vi vara i. typedef fasttexttypen {FADEUP, ON, FADEDOWN, OFF} FireflyState;
TypeDef struct FireFlyStruct {byte pin; //PWM utgångsstift är 3,5,6,9,10, och 11 FireflyState stat; //used att avgöra vad staten LED är i, bleknande upp/ner eller på/av osignerade långa värde; //used som leds nuvarande värde
Analoga värden int varaktighet; Anger hur länge led kommer att vara på/av
Digitala värden osignerade länge; Används för tidsberäkningar för att se om det är dags att byta stat booleska växla; Används för att växla LED på/off med PWM osignerade långa tona; används för att beräkna hur lång led kommer att vara på/av för PWM under en tona upp/osignerade långa fadeWait; används för att öka den tid det tar för att blekna så räcker det bara lite längre. } Firefly;
UNO R3 - 14 stift int analogPins [] = {3, 5, 6, 9, 10, 11}; int allPins [] = {3, 5, 6, 9, 10, 11};
Firefly fireflies[sizeof(allPins)/sizeof(*allPins)];
För att fastställa om nuvarande PIN-koden är en Analog och en Digital Pin. booleska isAnalog (int pin) {int längd = sizeof(analogPins)/sizeof(*analogPins); för (int jag = 0; jag
I slutet av denna funktion blir alla eldflugor setup //with den information de behöver för att fungera korrekt. Vi vänder också på MAX_FIREFLIES_ON eldflugor att börja oss. void initialize() {för (int jag = 0; jag < (sizeof(fireflies)/sizeof(Firefly)); i ++) {//Why jag med denna pekaren notation av ta adressen till objektet //and då avrefereringen det? Det var att visa någon hur man gör. Om det stör dig, ersätta varje förekomst av "ff ->" med "eldflugor [i]." och //it kommer att köra samma. Firefly * ff = & eldflugor [i]; FF -> pin = allPins [i]; om (jag < MAX_FIREFLIES_ON) ff -> state = ON; annars ff -> state = OFF; FF -> värde = 0;
Analoga värden ff -> längd = 0;
Digitala värden ff -> tid = 0; FF -> Växla = sant; FF -> tona = 0; FF -> fadeWait = 0;
om (jag < MAX_FIREFLIES_ON) {om (isAnalog (ff -> pin) == true) ff -> längd = random (ANALOG_MIN_ON, ANALOG_MAX_ON); annars ff -> värde = millis() + random (DIGITAL_MIN_ON, DIGITAL_MAX_ON);} annat {om (isAnalog (ff -> pin) == true) ff -> längd = random (ANALOG_MIN_OFF, ANALOG_MAX_OFF); annars ff -> värde = ff -> tid + random (DIGITAL_MIN_OFF DIGITAL_MAX_OFF); } } }
Bestäm hur många LED är för närvarande och om det är lika med MAX_FIREFLIES_ON, returnerar sant. booleska isMaxFireflies() {boolean retValue = false; int cnt = 0; för (int jag = 0; jag < (sizeof(fireflies)/sizeof(Firefly)); i ++) {Firefly * ff = & eldflugor [i]; om (ff -> staten! = OFF) cnt ++;} om (cnt > = MAX_FIREFLIES_ON) {retValue = sant;} återvända retValue;}
Används för vår försening av 10ms för analog. osignerade långa analogDelayTime = 0;
/ * ANALOG ELDFLUGOR Obs: (det finns en 10 ms fördröjning på alla analoga eldflugor).
Det finns 4 stater eldflugor kan vara i. PÅ = håller LED på tills räknaren når den tid som angetts för på. OFF = håller LED av tills räknaren når den tid som angetts för på. FADEUP = under loppet av 500ms, ändra lysdioder ljusstyrka om 51 gånger FADEDOWN = under loppet av 500ms, ändra lysdioder ljusstyrka ca 51 gånger
När firefly är färdigt det är FADEUP, avgör det en slumpmässig tid hur länge att hålla lampan på. På samma sätt bestämmer FADEDOWN en slumpmässig tid hur länge att hålla LED av.
Om en LED är redo för (FADEUP) att kontrollera vi om vi har nått MAX_FIREFLIES_ON. Om vi har, sedan vi satte det LED tillbaka till OFF staten och berätta den till vänta igen utan att slå på. * / void analogFireflies() {
Sätta en 10 ms fördröjning på alla analoga saker. om (millis ()-analogDelayTime < 50) återvända; analogDelayTime = millis();
Iterera genom alla analoga eldflugor för (int jag = 0; jag < (sizeof(fireflies)/sizeof(Firefly)); i ++) {Firefly * ff = & eldflugor [i];
om (isAnalog (ff -> pin) == false) fortsätta;
om (ff -> staten == ON) {/ / Pin på analogWrite (ff -> pin, fade);
FF -> värde + = 1; om (ff -> värde == ff -> varaktighet) {ff -> state = FADEDOWN; ff -> värde = fade;}} annars om (ff -> staten == OFF) {/ / Pin av analogWrite (ff -> pin, 0);
FF -> värde + = 1; om (ff -> värde == ff -> varaktighet) {om (isMaxFireflies()) {ff -> värde = 0; ff -> state = OFF; ff -> längd = random (ANALOG_MIN_OFF, ANALOG_MAX_OFF);} annat {ff -> state = FADEUP; ff -> värde = 0;}}} annars om (ff -> staten == FADEUP) {/ / Pin tona upp ff -> värde + = 1, //previously 5 analogWrite (ff -> pin, ff -> värde);
om (ff -> värde == fade) {ff -> värde = 0; ff -> state = ON, ff -> längd = random (ANALOG_MIN_ON, ANALOG_MAX_ON);}} annars om (ff -> staten == FADEDOWN) {/ / Pin tona ner ff -> värde-=1; //previously 5 analogWrite (ff -> pin, ff -> värde);
om (ff -> värde == 0) {ff -> värde = 0; ff -> state = OFF, ff -> längd = random (ANALOG_MIN_OFF, ANALOG_MAX_OFF);}} } }
//----------------------------------------------------------------------------------------------------
void turnLedOn (int pin) {
om (isAnalog(pin) == true) analogWrite (pin, 255); } void turnLedOff (int pin) {
om (isAnalog(pin) == true) analogWrite (pin, 0); }
Itererar igenom alla stiften (digital och analog) och visar dem på (upp till MAX_FIREFLIES_ON). Ger oss en chans att se till att alla lysdioder är ansluten och arbeta innan programmet börjar //and när vi träffar återställa på arduino. void caterpillar() {int allcount = (sizeof(allPins)/sizeof(*allPins));
för (int jag = allcount-1; jag > = 0; i--) {om (jag < allcount-MAX_FIREFLIES_ON) turnLedOff(allPins[MAX_FIREFLIES_ON+i]); turnLedOn(allPins[i]); delay(250);}
för (int jag = MAX_FIREFLIES_ON-1; jag > = 0; i--) {turnLedOff(allPins[i]); delay(250);}}
void setup() {//Set alla digitala stift till utgång pinMode (PotPin, indata); Serial.BEGIN(9600); för (int jag = 0; jag < (sizeof(allPins)/sizeof(*allPins)); i ++) {/ / om (isAnalog(i) == false) / / pinMode (i, matas); / /}
Caterpillar(); Initialize(); }
void loop() {blekna = map(analogRead(PotPin), 0, 1023, 1, 255); / / fade = 255; Serial.println(Fade); analogFireflies(); }