Luce Sole Ikea Animata per Bambini – SunBabyNight

Ebbene si. Avendo dei bambini e la necessità di arredare la loro stanza, pensai, su suggerimento di mia moglie di aggiungere alcuni effetti alle luci della stessa: nacque da subito Luce Sole Ikea Animata per Bambini – SunBabyNight. L’idea nacque acquistando il lampadario Ikea a forma di sole.

Essenzialmente si tratta di due pezzi di plastica sovrapposti ad un porta-lampada a 3 lampade.

Decisi a questo punto di aggiungere degli effetti di luce animati, lasciando le lampade dentro.

Smontai i pezzi di plastica. Avevo una striscia led da 1 metro del tipo 5050 che tagliai in 12 segmenti da 3 led ciascuno.

Fissando questi segmenti intorno al sole riuscii a coprire l’intera circonferenza.

A questo punto realizzai una scheda con a bordo un Arduino Nano v3.0 utilizzando 12 uscite di Arduino per pilotare 12 transistor 2N2222 che a loro volta accendono le strisce led da 3 led l’una. Di seguito una immagine.

Feci in modo che la scheda fosse plug-N-play utilizzando dei connettori. In questo modo, in caso di manutenzione, lo smontaggio del kit è veloce e pratico. I connettori 1, 2 e 3 alimentano tutti i 12 segmenti del sole mentre il primo connettore a sinistra in foto connette tutte le masse dei segmenti ed in fine il connettore a 4 pin di destra fornisce l’alimentazione. Nello stesso c’è la predisposizione per alloggiare un modulo IRDA in modo da poter inviare da remoto dei comandi con un telecomando infrarossi… magari in un prossimo step.

Per aggiungere un effetto scenico più coinvolgente ho fatto in modo che i vari segmenti siano pilotati in PWM in modo da creare effetti di dissolvenza tra le accensioni e gli spegnimenti.

Purtroppo però nativamente Arduino Nano v3.0 non supporta il PWM su tutti i PIN ma solo su alcuni.

Per superare questo limite ho utilizzato una libreria nota come SoftPWM liberamente scaricabile.

Alla fine il risultato è quello che potete vedere in video:

Di seguito vi posto il codice di Arduino utilizzato per lo scopo:

/************************************************************************
  IKEA BABY SUN LIGHT
  Michele Ardito - www.micheleardito.info
  Progetto del 26.01.2016
*************************************************************************/

/************************************************************************
   LIBRERIA SOFTPWM
*************************************************************************/
#include <SoftPWM.h>
uint8_t leds[12] = {3, 6, 5, 4, 11, 8, 9, 7, A3, 12, A2, 10};

/************************************************************************
   Costanti e variabili di tempo 
*************************************************************************/
#define DELAY 120
#define DELAYSHORT 40
#define DELAYSHORTF 150
#define DELAYLONG 850
#define INITIALFADEOUT 100
// per il tipo di ciclo (scelta della animazione)
int ciclo = 0;
// ripetizioni del ciclo
int ripetizioni = 0;
/************************************************************************
   Variabili varie 
*************************************************************************/
int i, j;

/************************************************************************
   SETUP
*************************************************************************/
void setup() {
  // avvia la libreria
  SoftPWMBegin();
  // accende tutti i segmenti al max PWM
  for (int i = 0; i < 12; i++) {
    SoftPWMSet(leds[i], 255);
  }
  // imposta il tempo di fade in a 50ms e fadeout a 400ms per tutti i segmenti
  SoftPWMSetFadeTime(ALL, 100, 400);
  
  // if analog input pin 0 is unconnected, random analog
  // noise will cause the call to randomSeed() to generate
  // different seed numbers each time the sketch runs.
  // randomSeed() will then shuffle the random function.
  randomSeed(analogRead(0));

  // mantiene tutto acceso per 10sec
  delay(10000);
  // fadeout dei segmenti in maniera "pseudocasuale"
  SoftPWMSet(leds[11], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[9], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[4], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[1], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[2], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[8], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[7], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[3], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[0], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[5], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[10], 0);
  delay(INITIALFADEOUT);
  SoftPWMSet(leds[6], 0);
  
  // inizializza per il ciclo di fade out
  j = 11;
}

/************************************************************************
   LOOP
*************************************************************************/
void loop() {
  switch (ciclo) {
    case 0: 
      for (i = 0; i < 12; i++) {
        SoftPWMSet(leds[i], ripetizioni);
        j = i;
        delay(DELAYSHORT);
      }
      ripetizioni+=20;
      if (ripetizioni > 255) { ripetizioni = 0; ciclo = 1; }
      break;
    case 1:
      for (i = 0; i < 12; i++) {
        SoftPWMSet(leds[i], 255);
        SoftPWMSet(leds[j], 0);
        j = i;
        delay(DELAY - ripetizioni * 7);
      }
      ripetizioni++;
      if (ripetizioni > 10) { ripetizioni = 0; ciclo = 2; }
      break;
    case 2:
      for (i = 0; i < 12; i++) {
        SoftPWMSet(leds[i], random(10,255));
        delay(DELAYSHORT);
      }
      delay(DELAYLONG);
      for (i = 0; i < 12; i++) {
        SoftPWMSet(leds[i], 0);
        delay(DELAYSHORT);
      }
      delay(DELAYLONG);
      ripetizioni++;
      if (ripetizioni > 3) { ripetizioni = 0; ciclo = 3; }
      break;
    case 3:
      for (i = 0; i < 6; i++) {
        SoftPWMSet(leds[i], 255);
        SoftPWMSet(leds[i+6], 0);
      }
      delay(DELAYLONG - ripetizioni * 150);
      for (i = 0; i < 6; i++) {
        SoftPWMSet(leds[i], 0);
        SoftPWMSet(leds[i+6], 255);
      }
      delay(DELAYLONG - ripetizioni * 150);
      ripetizioni++;
      if (ripetizioni > 3) { ripetizioni = 0; ciclo = 4; }
      break;
    case 4:
      for (i = 0; i < 12; i++) {
        SoftPWMSet(leds[i], random(10,255));
      }
      delay(DELAYLONG - ripetizioni * 80);
      ripetizioni++;
      if (ripetizioni > 10) { ripetizioni = 0; ciclo = 5; }
      break;
    case 5:
      for (i = 0; i < 12; i++) {
        SoftPWMSet(leds[i], random(10,255));
      }
      delay(DELAYSHORTF);
      ripetizioni++;
      if (ripetizioni > 100) { ripetizioni = 0; ciclo = 0; }
      break;
  }
}