Son dos projectes diferents, simultanis en el temps en la construcció.
El arbre de nadal.
La joguina de nadal.
S'ha muntat un kit de AZDelivery nomenat DIY LED Arbre de Nadal Kit.

El treball per soldar tots els leds, resistències, condensadors, transistors, etc, es una feinada molt considerable.
Volem dinenyar un dispositiu per una joguina, per exemple un avió o un cotxe, millor un cotxe.
Al apropar-se el nen a la joguina a una distancia establerta, s'activa el dispositiu i al separar-se se desactiva.
Al activar-se ha de fer musica i llums, també en una segona fase, moviment, la hèlice del avió o les rodes del cotxe. Quan el nen es separa de la joguina el dispositiu es des activa.
Placa Arduino Uno.
Sensor de moviment HC-SR04.
Led Martix V1.0
Reproductor, gravador de musica ISD1820, en una segona fase un reproductor de mp3.
Altaveu.
Bateria de 9 V.
IDE de Arduino.
Fet amb la aplicació de circuito.io


/* * PROJECTE BON NADAL * Joguina que al aproparse el nen fa musica i llums. * Si el detector de moviment detecta un objecte entre 0.5 m i 1 metre * sona musica i s'encen la matriu de leds, altrament no fa res. * componets: reproductor_grabador, detector de moviment i matriu de leds */ //// llibreries ///////// #include "LedControl.h" #include "Arduino.h" #include "NewPing.h" #include <SPI.h> //pins del sensor de moviment #define HCSR04_PIN_TRIG 3 #define HCSR04_PIN_ECHO 2 //pin del grabador reproductor de musica #define VOICERECORDER_PIN_SIG 5 //constructor del sensor NewPing hcsr04(HCSR04_PIN_TRIG,HCSR04_PIN_ECHO); //matriu de leds /* *pins *mosiPin 11 lila *clkPin 13 grog *cePin 10 dades blau */ static uint8_t data[4] = {0x0, 0x0, 0x0, 0x0}; // matriu de dades inicialitzat a 0 const int CE = 10; // pin per la funció CE //////////////////// setup ///////////////////////////////// void setup() { pinMode(VOICERECORDER_PIN_SIG, OUTPUT); Serial.begin(9600); pinMode(CE, OUTPUT); SPI.begin(); } ////////////////////// loop ///////////////////////////////// void loop(){ // distancia al objecte en moviment en cm int distancia = hcsr04.ping_cm(); Serial.print("distancia: ");Serial.println(distancia); //si la distancia está en el interval de 0.5 a 1 metres, musica i llum if( distancia>50 && distancia<100 ){ Serial.println("Comença la musica i les llums "); possarMusica(); encentMatriuLeds(); } else{ Serial.println("distancia fora de limits, silenci i foscor "); } delay(3000); } //la matriu de leds ilumina tres cors de mes gran a mes petit i s'apaga al acabar void encentMatriuLeds(){ //primer for es per els tres cors //i el segon per el temps de iluminació de cada cor // el switch, quan i=0, executa corGran(),quan i=1 corMig() i i=2 corPetit() for (int i = 0; i < 3; i++) { for (int m = 100; m > 0; m--) { // make a for loop to let the data displayed on the matrix. switch (i) { case 0: corGran(); break; case 1: corMig(); break; case 2: corPetit(); break; default: break; } } matrixoff(); // s'apaga la maatriu de leds delay(100); // delay 100 ms } } void corGran() { int j; int temps = 2; static uint8_t cor[8] = {0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18}; // you need to calculate which led should be light up by this array, // it defined line by line on your matrix, // for example, // 0x00 means the led of the first line is off, // and the 0x66 means the second line's first led will go off // and the 0xFF means th fourth led will go off // and 0xFF fifth led will go off // and 0x18 eight led will go off. // others will turn on....and so on. for (j = 0; j < 8; j++) { data[0] = ~cor[j]; // color red data[1] = 0xFF; // color green data[2] = 0xFF; // color blue data[3] = 0x01 << j; // display the data on matrix. digitalWrite(CE, LOW); // when CE is low, it begin to receive data. SPI.transfer(data[0]); // transfer data[0] to the matrix(red) SPI.transfer(data[1]); // transfer data[2] to the matrix(green) SPI.transfer(data[2]); // transfer data[1] to the matrix(blue) SPI.transfer(data[3]); // tansfer data[3] to the matrix(scanning and display the data on matrix) digitalWrite(CE, HIGH); // when CE is High, means that matrix begin to display the array's information to the matrix. delay(temps); // a little bit delay, let the led light up and stay for a while so that it looks like it brightness. } }; void corMig() { int j; int x = 2; static uint8_t cor[8] = {0x00, 0x00, 0x24, 0x7E, 0x7E, 0x3C, 0x18, 0x00}; // change the hard to be the smaller one, all you need to do is change this parameter. for (j = 0; j < 8; j++) { data[0] = 0xFF; // color red data[1] = ~cor[j]; // color green data[2] = 0xFF; // color blue data[3] = 0x01 << j; digitalWrite(CE, LOW); SPI.transfer(data[0]); SPI.transfer(data[1]); SPI.transfer(data[2]); SPI.transfer(data[3]); digitalWrite(CE, HIGH); delay(x); } }; void corPetit() { int j; int x = 2; static uint8_t cor[8] = {0x00, 0x00, 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00}; // change the hard to be the smaller one, all you need to do is change this parameter. for (j = 0; j < 8; j++) { data[0] = 0xFF; // color red data[1] = 0xFF; // color green data[2] = ~cor[j]; // color blue data[3] = 0x01 << j; digitalWrite(CE, LOW); SPI.transfer(data[0]); SPI.transfer(data[1]); SPI.transfer(data[2]); SPI.transfer(data[3]); digitalWrite(CE, HIGH); delay(x); } }; // apaga la matriu de llums void matrixoff() { int j; int x = 2; static uint8_t cor[8] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}; // you can see, all of the led will go off here. for (j = 0; j < 8; j++) { data[0] = ~cor[j]; // color red data[1] = ~cor[j]; // color green data[2] = ~cor[j]; // color blue data[3] = 0x01 << j; digitalWrite(CE, LOW); SPI.transfer(data[0]); SPI.transfer(data[1]); SPI.transfer(data[2]); SPI.transfer(data[3]); digitalWrite(CE, HIGH); delay(x); } }; // possa la senyal del pin PE del reproductor-grabador en HIGH i al acabar en LOW void possarMusica(){ // Voice Recorder digitalWrite(VOICERECORDER_PIN_SIG, HIGH); delay(1000); //short signal is enough. digitalWrite(VOICERECORDER_PIN_SIG, LOW); }
La part principal del codi es el loop. La distancia del sensor la don el mètode ping_cm() de la classe NewPing.
Si la distancia està en el interval de 0.5 a 1 m, llavors s'executen els mètodes possarMusica() i encentMatriuLeds(), altrament no fa res.
////////////////////// loop /////////////////////////////////
void loop(){
// distancia al objecte en moviment en cm
int distancia = hcsr04.ping_cm();
Serial.print("distancia: ");Serial.println(distancia);
//si la distancia está en el interval de 0.5 a 1 metres, musica i llum
if( distancia>50 && distancia<100 ){
Serial.println("Comença la musica i les llums ");
possarMusica();
encentMatriuLeds();
}
else{
Serial.println("distancia fora de limits, silenci i foscor ");
}
delay(3000);
}
El mètode encentMatriuLeds().
Son dos bucles un a dins del altre, el primer bucle fa tres iteracions, una per cada cor, el segon bucle serveix per fer un retard per cada cor.
A dins del segon bucle hi ha un switch de i, en la primera iteració cas 0 executa el mètode corGran(), en la segona corMig() i en la tercera corPetit(). Entre cor i cor el mètode matrixoff() apaga els leds.
//la matriu de leds ilumina tres cors de mes gran a mes petit i s'apaga al acabar
void encentMatriuLeds(){
//primer for es per els tres cors
//i el segon per el temps de iluminació de cada cor
// el switch, quan i=0, executa corGran(),quan i=1 corMig() i i=2 corPetit()
for (int i = 0; i < 3; i++) {
for (int m = 100; m > 0; m--) { // make a for loop to let the data displayed on the matrix.
switch (i) {
case 0:
corGran();
break;
case 1:
corMig();
break;
case 2:
corPetit();
break;
default:
break;
}
}
matrixoff(); // s'apaga la maatriu de leds
delay(100); // delay 100 ms
}
}
El mètode possaMusica().
El que fa es posar el pin del reproductor gravador en HIGH i una vegada reproduïda la musica el torna en LOW.
// possa la senyal del pin PE del reproductor-grabador en HIGH i al acabar en LOW
void possarMusica(){
// Voice Recorder
digitalWrite(VOICERECORDER_PIN_SIG, HIGH);
delay(1000); //short signal is enough.
digitalWrite(VOICERECORDER_PIN_SIG, LOW);
}
Preparem la caixa per el muntatge.

Posem tot la electrònica a dins i a fora de una caixa de plàstic.
La part de la matriu de leds, l'altaveu, el sensor de moviment i la pila, a fora.
La part de la placa de Arduino i el reproductor gravador de musica a dins.
Encolem les peces amb silicona.



El mar.
Havaneres.
Lloret antic.
Lloret avui.
De cala Morisca a Sa Carabera.
De Sa Carabera a Treumal.
Lloret en kayak.
Vígilancia remota.
Caixa-tpv.
Cambrer-app.
Client webApp.
Relats del banc del si no fos
Històries d'ahir
Vídeos antics de Lloret
El caiac
Contes de l'avi.
Control d’accés amb contrasenya.
Orgue de llums.
Comparativa de editors Arduino.
Projecte bon Nadal.
Control de la qualitat del aire interior (CO2) amb semàfor LED.
NodeMCU-ThingSpeak
ThingSpeak.
NodeMCU com AccessPoint.
Control de la llum de casa per web.
Control de un led per el mòbil.
Sistema de fitxers en ESP8266.
Altura del nivell d'aigua.
Avis d’alarma a Telegram.
Control de la intensitat de llum de un LED per Internet.
Magatzematge de temperatura i humitat en Thinger.
Publicar temperatura i humitat en Google Sheets.
ESP8266 i Firebase.
La bàscula. ESP8266 NodeMCU amb cèl·lula de càrrega.
ESP32-CAM
ESP32-CAM captura fotos per ser vistes en la WEB.
Pujar fotos a un servidor FTP amb ESP32-CAM.
MicroPython en ESP8266.
Visual Estudio Code per Arduino.
Classificador d’imatges.
Instal·lar i configurar Apache en Ubuntu.
Accés a un servidor Linux remotament.
Client i Servidor FTP.
Màquina virtual UBUNTU.
WindowsXP en Virtualbox.
Multisim, simulador de circuits electrònics.
Proteus, simulador de circuits electrònics.
MySQL. Instal·lació.
MySQL. Aplicacions.
Netbeans Maven MySQL.
Java+Netbeans+Maven+EclipseLink+Mysql
Aplicació d’escriptori JavaFX
App JavaFX amb SceneBuilder
App Java-Swing










Noves tecnologies WEB Arduino Domótica MycroPython NodeMCU IoT Java ESP8266 Lora C++ Programació Server-Client