Introduction: Mushroom Fairytale Lights

Welkom bij mijn ARDUINO project voor ITTT; If This, Then That.

Wat wij gaan maken hier is een magisch, speciaal nachtlampje. Hij bespaart niet alleen energie doordat het op licht werkt, en dus uit gaat in de ochtend, maar ook vermaakt het lichtje je met leuke lichtshows die afspelen met alleen maar een simpele druk op de knop!

Is het niet licht genoeg? Geen zorgen, ook zullen wij hier een dimlicht op maken die als backlight dient. Door de POTmeter in een dimmer te veranderen kan je naast de rustgevende gloei van de paddenstoelen ook van een zachte blauwe gloed genieten die je zelf kan beïnvloeden.
We bevestigen natuurlijk ook een schakelaar zodat je met de hand het lampje zelf ook uit kan zetten.

Al om al gaat jou sprookjes licht de volgende dingen kunnen:

  • Gloeien op normaal programma
  • Uit gaan als het licht is
  • Een POTmeter die de backlight kan dimmen
  • Twee knoppen ( of meer! ) die elk een eigen lichtshow geven
  • Een normale schakelaar om het lampje aan en uit te zetten

Geniet van rustig in slaapvallen in je eigen stuk sprookjes bos nadat je deze simpele stappen volgt!

Step 1: Stap 1: Inspiratie & Materiaal.

Voordat we gaan beginnen aan ons magisch project heb je eerst inspiratie nodig. Voor mijn project wou ik graag iets doen wat ik al jaren wil doen; een magisch paddenstoel lichtje maken.

Deze inspiratie komt vooral uit scenes uit spellen die ik graag speel zoals, voornamelijk, Undertale & Skyrim.
Dit magisch beeld is altijd bij mij gebleven en als je zoals mij ben wil je dit graag ook in je eigen huis halen!

Dus als eerst, zoek je inspiratie, kijk wat je mooi vindt en schets dit uit, experimenteer met kleur en vorm!
Ik koos voor blauw omdat dat voor mij het mooist is! De vorm omdat dit het meest herkenbaar als paddenstoel is!

Nu je een idee heb van wat je neer wil zetten heb je je materiaal nodig:

Voor ARDUINO:

  • Arduino UNO
  • ± 15 LEDs van gewenste kleur
  • Elektrisch draad
  • Licht sensor(s)
  • POT meter
  • Knoppen
  • Knip schakelaar
  • Bread board
  • Soldeer klemmen
  • Weerstandjes voor je LEDs & knoppen & sensor
  • Batterij kabel & batterij voor ARDUINO

TIP: gebruik deze website om de juiste weerstandjes te vinden.

Behuizing & uiterlijk:

  • Stevig maar dun ( rest ) hout
  • Natuur hout/dik stuk schors
  • Clear silicoon
  • Waterverf naar gewenste paddenstoel kleur
  • Soldeertang
  • Plastic weggooi bakje
  • Roer ijzer/tandenstoker
  • Basis gereedschap ( hamer, spijkers, schroevendraaier, etc. )
  • Plastic folie
  • Lijm

Laten we beginnen!

Step 2: Stap 2: Code & Wiring!

Studeer de schematics bij de afbeeldingen, de andere foto laat je zien hoe het er een beetje uit gaat zien als je het met je breadboard in elkaar zet.

Je wilt twee LED groepen gebruiken voor overzicht.

De BACKLIGHT:

Alle LEDjes in deze groep hebben maar 1 ( analog ) pin nodig aangezien ze allemaal hetzelfde moeten gaan doen! Zorg ervoor dat alle LEDjes een weerstandje hebben en lijdt ze dan naar dezelfde ~ pin.

Sluit de POTmeter aan zoals aangegeven in de schematics en je bent voor dit gedeelte klaar.

De GLOWLIGHT:

Elk LEDje hier krijgt zijn eigen pin. Ook hier heb je de analog pins nodig anders kan de pin niet de analog code verwerken! Zorg ervoor dat elk LEDje zijn eigen weerstandje heeft en met een snoer in verbinding staat met zijn eigen pin.

Je wilt de knoppen aansluiten zoals in de schematics staat vergeven, hiervoor kan je elke digital pin ( zonder ~ ) gebruiken.

En nou voor de lichtsensor, verwijd nogmaals naar de schematics. Deze lichtsensor gaat door jou codering effect hebben op beide lichtgroepen en hoort dus nergens bij.

Als je zeker weet dat elke snoer en LED goed voorzien is en op de juiste locatie kan je nu de code hieronder overplaatsen in de ARDUINO codering programma en op je UNO zetten.

Verwijs naar de comments in de code om te zien wat waar voor is, let goed op dat je de juiste knoppen en LEDjes in de juiste pins heb aangesloten:

( vergeet niet te testen nadat je de CODE op je UNO gezet heb voordat je naar de volgende stap gaat )

/* Mijn Project */
/* 
 *  Robin Zuijderduijn
 *  3026060
 *  Game Artist G&I jaar 1
*
*
 * Project naam: Mushroom Fairy Light
 * Doel: een interactief nachtlampje met verschillende functies voor costumisation!
 * 
 * Het 'nachtlampje' komt met een dimlicht en een lichtshow! Je kan het lampje aan en uit doen, in het geheel
 * of alleen de glowlights. De dimlicht kan uitgezet worden door de draaiknop helemaal om te draaien.
 * Ook zal het project reageren op licht, zodra het licht wordt zal de lampjes uit gaan om energie te besparen terwijl
 * jij nog slaapt!
 * 
 * Een extra functie zijn de knopjes die beide een unieke lichtshow geven op een kort deuntje! 
 * Ideaal voor uwzelf of uw kind.
 *
* variables */
/* voor de formules */
int value, value2, value3 ;
int periode = 6000;
int displace = 500;
long time = 0;
long debounce = 200;
/* knoppen */
int pattern1 = 0;
int pattern2 = 0;
int knop1 = 4;
int knop2 =2;
int draaiKnop = A0;
int lichtSens = A1;
/* ledjes */
/* bl - backlights */
int blLed1 = 9; 
/* gl - glowlights */
int glLed1 = 5;
int glLed2 = 6;
int glLed3 = 3;
/* delay voor patroon 1 */
int patroon1 = 400;
void setup() {
  /* backlight pins */
  pinMode(blLed1, OUTPUT);    /* backlight ledPin */
  pinMode(draaiKnop, INPUT);  /* draai knop pin   */
  pinMode(lichtSens, INPUT);  /* licht sensor pin */
  /* glowlights pins */
  pinMode(glLed3, OUTPUT);    /* mushroom light ledPin  */
  pinMode(knop1, INPUT);      /* knop pin               */
  pinMode(knop2, INPUT);      /* knop pin               */
}
void loop() {
  /* beide licht functies hebben hun eigen loop nodig om 'apart en tegelijk' the functioneren */
    glowlights();
    backlights();
}
  /* backlights eigen loop */
void backlights() {
    /* de value voor MAP aanmaken */
  int value = analogRead(draaiKnop);
  Serial.println(value);
    /* lvi = light value intake */
  int lvi = analogRead(lichtSens);
  Serial.println(lvi);
    /* wanneer het licht is, lampjes uit, wanneer donker lampjes aan */
  if ( lvi > 50 ){
    digitalWrite(blLed1, LOW);
  } else {
    /* lampjes AAN = hier het licht van de draaiknop af laten hangen */
    int brightness = map(value, 0, 1023, 0, 255);
    analogWrite(blLed1, brightness);
  }
}
  /* glowlights eigen loops*/
void glowlights() {
  /* elke knop een unieke patroon aangeven */
  pattern1 = digitalRead(knop1);
  pattern2 = digitalRead(knop2);
    /* pattern 1 */
  if(pattern1 == HIGH){ 
    /* lights off first */
    digitalWrite(glLed3, LOW);
    delay(10);
    digitalWrite(glLed2, LOW);
    digitalWrite(glLed1, LOW);
    /* pattern 1 */
    digitalWrite(glLed3, HIGH);
    delay(patroon1);
    digitalWrite(glLed3, LOW);
    
    digitalWrite(glLed2, HIGH);
    delay(patroon1);
    digitalWrite(glLed2, LOW);
    
    digitalWrite(glLed1, HIGH);
    delay(patroon1);
    digitalWrite(glLed1, LOW);
    digitalWrite(glLed3, HIGH);
    delay(patroon1);
    digitalWrite(glLed3, LOW);
    /* slowed down 1 */
    digitalWrite(glLed2, HIGH);
    delay(550);
    digitalWrite(glLed2, LOW);
    
    digitalWrite(glLed1, HIGH);
    delay(550);
    digitalWrite(glLed1, LOW);
    digitalWrite(glLed3, HIGH);
    delay(650);
    digitalWrite(glLed3, LOW);
    
    digitalWrite(glLed2, HIGH);
    delay(patroon1);
    digitalWrite(glLed2, LOW);
    digitalWrite(glLed3, HIGH);
    delay(patroon1);
    digitalWrite(glLed3, LOW);
    
    digitalWrite(glLed1, HIGH);
    delay(patroon1);
    digitalWrite(glLed1, LOW);
    
    /* slowed down 2 */
    digitalWrite(glLed2, HIGH);
    delay(550);
    digitalWrite(glLed2, LOW);
    
    digitalWrite(glLed1, HIGH);
    delay(550);
    digitalWrite(glLed1, LOW);
    digitalWrite(glLed3, HIGH);
    delay(450);
    digitalWrite(glLed3, LOW);
    digitalWrite(glLed2, HIGH);
    delay(patroon1);
    digitalWrite(glLed2, LOW);
    
    digitalWrite(glLed1, HIGH);
    delay(patroon1);
    digitalWrite(glLed1, LOW);
    digitalWrite(glLed3, HIGH);
    delay(patroon1);
    digitalWrite(glLed3, LOW);
    digitalWrite(glLed2, HIGH);
    delay(patroon1);
    digitalWrite(glLed2, LOW);
    /* slowed down */
    digitalWrite(glLed1, HIGH);
    delay(550);
    digitalWrite(glLed1, LOW);
    
    digitalWrite(glLed2, HIGH);
    delay(550);
    digitalWrite(glLed2, LOW);
    digitalWrite(glLed3, HIGH);
    delay(650);
    digitalWrite(glLed3, LOW);
    
    digitalWrite(glLed1, HIGH);
    delay(patroon1);
    digitalWrite(glLed1, LOW);
    digitalWrite(glLed2, HIGH);
    delay(patroon1);
    digitalWrite(glLed2, LOW);
    digitalWrite(glLed1, HIGH);
    delay(patroon1);
    digitalWrite(glLed1, LOW);
    /* slow down 1 */
    digitalWrite(glLed3, HIGH);
    delay(550);
    digitalWrite(glLed3, LOW);
    digitalWrite(glLed2, HIGH);
    delay(550);
    digitalWrite(glLed2, LOW);
    
    digitalWrite(glLed1, HIGH);
    delay(650);
    digitalWrite(glLed1, LOW);
  }
     /* pattern 2 */
  if(pattern2 == HIGH){ 
    /* lights off first */
    digitalWrite(glLed3, LOW);
    delay(10);
    digitalWrite(glLed2, LOW);
    digitalWrite(glLed1, LOW);
    /* pattern 2 */
   for (int i = 0; i < 255; i++){
    analogWrite(glLed3, i);
    delay(5);
  }
  for (int i = 255; i > 0; i--){
    analogWrite(glLed3, i);
    delay(5);
  }
  for (int i = 0; i < 255; i++){
    analogWrite(glLed2, i);
    delay(5);
  }
  for (int i = 255; i > 0; i--){
    analogWrite(glLed2, i);
    delay(5);
  }
  for (int i = 0; i < 255; i++){
    analogWrite(glLed1, i);
    delay(5);
  }  
  for (int i = 255; i > 0; i--){
    analogWrite(glLed1, i);
    delay(5);
  }
  for (int i = 0; i < 255; i++){
    analogWrite(glLed2, i);
    delay(5);
  }
  for (int i = 255; i > 0; i--){
    analogWrite(glLed2, i);
    delay(5);
  }
  for (int i = 0; i < 255; i++){
    analogWrite(glLed3, i);
    delay(5);
  }
  for (int i = 255; i > 0; i--){
    analogWrite(glLed3, i);
    delay(5);
  }
  for (int i = 0; i < 255; i++){
    analogWrite(glLed1, i);
    delay(5);
  }  
  for (int i = 255; i > 0; i--){
    analogWrite(glLed1, i);
    delay(5);
  }
  for (int i = 0; i < 255; i++){
    analogWrite(glLed3, i);
    delay(5);
  }
  for (int i = 0; i < 255; i++){
    analogWrite(glLed2, i);
    delay(5);
  }
  for (int i = 0; i < 255; i++){
    analogWrite(glLed1, i);
    delay(5);
  }
  for (int i = 255; i > 0; i--){
    analogWrite(glLed1, i);
    delay(5);
  }
  for (int i = 255; i > 0; i--){
    analogWrite(glLed2, i);
    delay(5);
  }
  for (int i = 255; i > 0; i--){
    analogWrite(glLed3, i);
    delay(5);
  }
/* 
 *  Kleine note, ja ik weet dat dit makkelijker kan in functies enzo maar ik heb hier op het moment geen tijd voor. 
 *  mijn pogingen zijn mislukt en het duurt nu zo lang dat ik heb besloten om dit over te slaan om meer tijd over
 *  te hebben voor het afmaken van het project.
 *  Spijt me voor de muur aan ledjes die aan en uit gaan :(
 */
  }
  /* normal glow pattern */
  int lvi = analogRead(lichtSens);
  Serial.println(lvi);
    /* ook hier gaan de lampjes niet aan totdat het donker is */
  if ( lvi > 50 ){
    digitalWrite(glLed3, LOW);
    digitalWrite(glLed2, LOW);
    digitalWrite(glLed1, LOW);
  } else {
    /* nu het donker is gaan de lampjes aan */
   time = millis();
    /* de formules om de lampjes te laten gloeien, 
     *  dit is om delay() te vermijden zodat het dimlicht niet onderbroken wordt. 
     */
   value = 128+127*cos(2*PI/periode*time);
   value2 = 128+127*cos(2*PI/periode*(displace-time));
   value3 = 128+127*cos(2*PI/periode*((displace/2)-time));
   
    /* de ledjes gaan nu gloeien */
   analogWrite(glLed3, value);           
   analogWrite(glLed2, value2);           
   analogWrite(glLed1, value3);
  }
}

Note: ja ik weet dat de licht programma's makkelijker gecodeerd kan worden met functions, dit is alleen boven mijn codering niveau maar als je zelf gevorderd ben moedig ik je aan om de code aan te passen en te verbeteren als je dat wilt!

Step 3: Stap 3: De Behuizing!

Je wilt de doos waar je ARDUINO in bewaart wordt iets kleiner hebben dan je brok hout/schors zodat je de doos makkelijk er achter of onder kan 'verstoppen.'
Verwijs naar de foto's voor mijn gebruikte dimensies!

! Belangrijk !

  • In de bodem van de doos wil je graag openingen zagen waar de snoeren van de LEDjes door heen kunnen.
  • Beide zijkanten moeten van iets dikker hout zodat je openingen kan maken voor de knoppen zonder het out te breken.
  • Als je hout te fragiel is gebruik houtlijm ipv. spijker en hamer, dit voorkomt splijten.
  • Maak de doos pas vast aan elkaar als je zeker weet dat je ARDUINO er in past.

Aan de kant waar de UNO komt wil je graag de batterij hebben samen met de flip schakelaar, je knipt en stript 1 van de kabels van de batterij snoer en soldeert deze aan de flip schakelaar.

Aan de andere zijkant boor je een holte voor de POTmeter en een ruimte waar je de knoppen & lichtsensor kan plaatsen.

Step 4: Stap 4: Solderen & Snoeren!

  • Soldeer de LEDjes vast aan het weerstandje ( aan de positieve kant natuurlijk ) en aan de snoeren, gebruik tape om de blote snoeren te isoleren, zodat ze elkaar niet kunnen aanraken, wikkel dan de draaden om elkaar heen. Doe dit voor alle LEDjes.
  • Boor gaten door je stuk natuur hout/schors waar je paddenstoelen uit wil laten komen.
  • Test of de snoeren er door heen kunnen komen, zo niet, boor de gaten groter.
  • Soldeer de knoppen/sensor/POTmeter vast aan de snoeren en sluit ze aan in de doos zoals je prototype.
  • Testen Testen Testen!

Werkt alles nog steeds? Een goede tip is alle LEDjes meteen te testen nadat ze gesoldeerd zijn. Het kan voorkomen dat weerstandjes of LEDjes beschadigt kunnen worden door de soldeertang!

Test ook meteen je knoppen en sensors, zodat je zeker weet dat alles werkt, voordat je aan het volgende begint.
Dit voorkomt stress als iets niet werkt nadat je alles er meteen in heb gesoldeert.

Is er iets mis gegaan? Wees niet bang, met de soldeertang kan je het soldeer ook meteen weghalen en opnieuw proberen.

Step 5: Stap 5: De Paddenstoelen!

Wat je hier nodig heb:

  • Clear silicoon
  • Plastic folie
  • Plastic bakje
  • Roer ijzer/tandenstokers
  • Verf
  • Lijm

TIP: silicoon droogt over een hele lange tijd dus werk rustig.

De Steel:

Stap 1: neem een stuk plastic folie, leg het plat en ongekreukt voor je uit.
Stap 2: neem het plastic bakje, spuit silicoon in het bakje.
Stap 3: neem de tandenstoker, doop deze in een klein beetje verf, mix het door de silicoon
Stap 4: schraap de silicoon met de tandenstoker uit het bakje, leg het op de plastic folie
Stap 5: leg 1 van de ledjes in de silicoon, zorg ervoor dat het lampje zelf niet in de silicoon terecht komt
Stap 6: vouw de folie dubbel, zorg ervoor dat het LEDje met silicoon aan de dichte zijkant zit
Stap 7: masseer zachjes de silicoon gelijk over de snoeren in een steel-vorm
Stap 8: laat dit drogen over de span van 3-6 uur, hangt af van hoeveel je gebruikt heb
Stap 9: herhaal dit voor alle paddenstoel lichtjes

De Kap:

Stap 1: neem een stuk plastic folie, leg het plat en ongekreukt voor je uit.
Stap 2: neem het plastic bakje, spuit silicoon in het bakje.
Stap 3: neem de tandenstoker, doop deze in een klein beetje verf, mix het door de silicoon.
Stap 4: schraap de silicoon met de tandenstoker uit het bakje, leg het op de plastic folie.
Stap 5: vouw de folie zo dicht dat de silicoon in het midden is.
Stap 6: masseer de silicoon zacht en voorzichtig in een cirkel vorm
Stap 7: trak zachtjes de cirkel silicoon strak over de bolle kant van een schroevendraaier OF druk met je vingers een holle vorm in de silicoon
Stap 8: laat dit drogen over de span van 3-6 uur, hangt af van hoeveel je gebruikt heb
Stap 9: herhaal dit voor alle paddenstoel kapjes

Nadat alles goed stevig gedroogd is kan je met een lik silicoon de kapjes op de LEDjes 'plakken'. Laat dit dik een uur drogen. ( De tijd is korter omdat je veel minder gebruikt ).

Rijg nu de paddenstoelen door het hout heen en lijm de snoeren vast zodat je paddenstoelen goed blijven zitten.

Door het silicoon kan je makkelijk de snoeren buigen zonder weerstand! Zo kan je elke paddenstoel buigen in unieke en verschillende richtingen.

Step 6: Laatste Stap: Aansluiten & Af!

  • Rijg de snoeren van de LEDjes door de openingen onder in de doos, knip, strip en sluit de snoeren aan zoals je ze in je prototype had aangesloten.
  • Gebruik de soldeerklemmen om bijv alle negatieve kabels naar 1 dezelfde GND toe te verbinden, of sluit alle kabels op bread board aan op de - baan.

Test alle lampjes voordat je de doos met houtlijm aan je stuk natuur hout/schors bevestigd!

  • Lijm de doos nu aan je stuk hout, laat dit over genoeg tijd drogen zodat niks uit elkaar kan vallen.
  • Je bent nu klaar!

Extra's

  • Gebruik nep mos voor decoratie
  • Gebruik boetseer klei om 'elven bankjes' of andere soorten extra paddenstoelen te maken
  • Lijm stenen vast aan de doos voor balans als je lampje niet op zichzelf blijft staan

Dankje voor de aandacht voor mijn project, ik ben erg blij met mijn nieuwe interactieve nachtlampje en ik hoop dat jij dat ook bent!

Happy building!