Arduino Mood Lamp con Telecomando ad infrarossi

Da raspibo.
Jump to navigation Jump to search


IRRec4MoodLamp 002.jpg

Premessa (cancellabile)

L'idea e` nata per caso, la necessita` era di verificare la possibilita` di "backuppare" un telecomando ormai in via di rottura. Da qui, la decisione di approfondire il funzionamento della libreria ad infrarossi scoperta con una ricerca online.
Prova questo, prova quello, trova questo, trova quello, mi sono capitati per le mani alcuni telecomandi, ho dissaldato un ricevitore infrarosso da una vecchia televisione analogica, ho trovato una vecchia lampada che sembrava adatta a funzione diffusore ... ed e` nata questa "cosa".

Rilevazione codici telecomando infrarosso

Installata la libreria IRremote, fatti i collegamenti ad Arduino di un ricevitore infrarosso, col programma demo a corredo "IRrecvDemo.ino", mi sono fatto una tabella con i codici per ogni tasto del telecomando.

Tasto Codice
TV
ALL OFF 12DF0FBE
DVD
VCR
CBL
ASAT
DSAT
AUX 1
CD
AMP
AUX 2
EPG
S
Freccia su ^ 4B8A3EC9
Freccia sinistra < E54E1696
OK 57D22308
Freccia destra > 7DBAE47F
Freccia giu` v F8148CAA
MENU 57D22308
EXIT "
CH+ 608ED007
CH- 7A654176
MUTE B875BD6D
MACRO
VOL+ FB6A2FB3
VOL- 3E2C2832
Schermo 'tratteggi interi' 57D22308
Schermo 'rettangolo dentro' "
Schermo '+' E64E182B
Schermo 'tratteggi progressivi' 57D22308
Schermo 'vuoto' "
1 E1BDC992
2 D23DF6A9
3 8B61AD4
4 6D195655
5 CC7D0190
6 C19E983F
7 86656608
8 EF6A0B21
9 F16C568A
AV 56D22177
0 AC577D79
-/-- 30BFBBB5
REW (Rosso) 6514EB3A
PLAY (Giallo) 1EFD4FB2
F.F. (Blu) 4732DD25
RECORD (Nero) 53511D19
STOP (Verde) 24A17BC1
PAUSE (Rosso) 2E9C9404

Materiali

Per la realizzazione di questa "Mood Lamp", ho utilizzato:

  • Arduino Uno
  • Telecomando Welltech 40085/HTFB85, programmabile e programmato su codice SONY (0027), forse i piu` semplici
  • Un ricevitore infrarossi "dissaldato", quindi sconosciuto, quando ha cominciato a scottare ho capito che avevo collegato male qualcosa e allora ho riprovato finche` non ha funzionato ;)
  • Un LED RGB (tre colori)
  • Una vecchia lampada "da profumo" ritrovata per caso
  • 3 resistenze da 470 ohm (potevo anche metterle piu` piccole, ma non mi interessava una grossa luminosita`)

Circuito/Schema elettrico

Questo lo schema elettrico dei collegamenti: Scarica il PDF

Programma

Questo il programma arduino usato, credo si spieghi da solo, nel senso che mi sembra d'averlo commentato a sufficienza:

// Includo la libreria infrarossi
#include <IRremote.h>

int RECV_PIN = 4;      // Pin del Ricevitore infrarosso

/*
Non riesco ad usare il pin 11
Forse la libreria IR usa/riserva il pin 11 per qualcosa ?
*/
int greenLEDPin = 9;    // LED connected to digital pin 9
int redLEDPin = 10;     // LED connected to digital pin 10
int blueLEDPin = 6;    // LED connected to digital pin 6

// Valori di default/luminosita` all'accensione, giusto per vedere che e` acceso ;)
int GreenMemo = 100;
int RedMemo = 100;
int BlueMemo = 100;

/*
Queste le ho copiate, probabilmente si tratta di:
Inizializzazione del pin ricevitore
Inizializzazione della variabile che contiene il codice ricevuto/risultato
*/
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {

//  Serial.begin(9600);  // Inizializzo la porta seriale
  irrecv.enableIRIn(); // Start the receiver

  // set the digital pins as outputs
  pinMode(greenLEDPin,OUTPUT);
  pinMode(redLEDPin,OUTPUT);
  pinMode(blueLEDPin,OUTPUT);
}

void loop() {

  if (irrecv.decode(&results)) {
    //Serial.println(results.value, HEX);  // Stampo a video il codice letto/ricevuto

    // Se questo valore e` PLAY/Giallo, entro nella funzione automatica
    if ( results.value == 0x1EFD4FB2 ) {
      // Finche` non premo STOP/Verde
      while ( results.value != 0x24A17BC1 ) {
        /* Creo dei valori random con passi di 5 per l'intensita` luminosa
        Il valore max e` 255, usando passi di 5, 255/5=51,
        52 sara` il mio range, che effettivo e` 0..51
        */
        RedMemo = random(52)*5;
        GreenMemo = random(52)*5;
        BlueMemo = random(52)*5;
        analogWrite(redLEDPin, RedMemo);
        analogWrite(greenLEDPin, GreenMemo);
        analogWrite(blueLEDPin, BlueMemo);
        delay(3000);
        /*
        Sembra che siano necessarie le temporizzazioni inserite
        forse esagerate, per poter leggere/ricevere il codice,
        che altrimenti "sfugge"
        */
        irrecv.resume(); // Receive the next value
        //Serial.println(results.value, HEX);  // Stampo a video il codice letto/ricevuto
        delay(1000);  // Temporizzazione inserita
        irrecv.decode(&results);
        //Serial.println(results.value, HEX);  // Stampo a video il codice letto/ricevuto
        delay(1000);  // Temporizzazione inserita
      }
    }


    // Se premo il tasto REW Rosso, spengo tutto
    if ( results.value == 0x6514EB3A ) {
      GreenMemo = 0;
      RedMemo = 0;
      BlueMemo = 0;
    }
    
    // Se premo il tasto FWD Blue, accendo tutto
    if ( results.value == 0x4732DD25 ) {
      GreenMemo = 255;
      RedMemo = 255;
      BlueMemo = 255;
    }

    // Se e Ogni volta che premo il tasto II Pause Red, uso un valore random
    if ( results.value == 0x2E9C9404 ) {
      // Perche` utilizzando range di 5, 255/5=51
      RedMemo = random(52)*5;
      GreenMemo = random(52)*5;
      BlueMemo = random(52)*5;
    }
    
    /*
    Uso i tasti 1,2,3,4,5,6, per aumentare/diminuire l'intensita` dei 3 colori
    1+, 2- Verde
    3+, 4- Rosso
    5+, 6- Blu
    */
    if ( results.value == 0xE1BDC992 ) {
      if (GreenMemo < 255) {
        GreenMemo=GreenMemo+5;
      }
    }
    if ( results.value == 0x6D195655 ) {
      if (GreenMemo > 0) {
        GreenMemo=GreenMemo-5;
      }
    }
    if ( results.value == 0xD23DF6A9 ) {
      if (RedMemo < 255) {
        RedMemo=RedMemo+5;
      }
    }
    if ( results.value == 0xCC7D0190 ) {
      if (RedMemo > 0) {
        RedMemo=RedMemo-5;
      }
    }
    if ( results.value == 0x8B61AD4 ) {
      if (BlueMemo < 255) {
        BlueMemo=BlueMemo+5;
      }
    }
    if ( results.value == 0xC19E983F ) {
      if (BlueMemo > 0) {
        BlueMemo=BlueMemo-5;
      }
    }
    irrecv.resume(); // Receive the next value
  }

  analogWrite(redLEDPin, RedMemo);
  analogWrite(greenLEDPin, GreenMemo);
  analogWrite(blueLEDPin, BlueMemo);
  delay(100);

/*
  Serial.println (GreenMemo);
  Serial.println (RedMemo);
  Serial.println (BlueMemo);
*/
  
}

Riferimenti