Come realizzare un fuoco con 3 LED per il presepe – PIC12F629

Qualche giorno fa sono entrato in un negozio dove vendono molti prodotti natalizi, fra cui tanti accessori per fare il presepe e cercando fra gli scaffali ho trovato un forno a legna con la dicitura “fuoco a led realistico”!
Prodotto molto carino, non è una riproduzione vera in scala, ma molto scenico per il presepe.  Nelle note si fa presente che è un prodotto che funziona a batterie, ma fin qui nessun problema.
Acquisto il prodotto, visto che farmi il circuito e il forno, mi costerebbe di più in tempo e denaro.
Appena posso, inserisco le batterie e lo provo.
Ma perchè non l’ho provato in negozio? rabbia, molta rabbia!
Un’altra fregatura!!!! E si, perchè il così detto fuoco realistico non è altro che un semplice LED da 5mm lampeggiante collegato diretto alle batterie. Non è un fuoco realistico, ma un lampeggiante!
Avete mai visto un fuoco che si accende e si spegne con regolarità?
Quindi, mi tocca come avevo preventivato farmi il circuito, che da tempo stava prendendo forma nella mia testa.

Qui potete vedere il progetto funzionante:

 

Premesso che voglio utilizzare i LED da 5mm che ho in giro e che voglio ottenere un certo effetto luce in uno spazio ristretto, decido di usare 3 LED, uno rosso sempre fisso e 2 gialli che lampeggeranno in modalità random. Il circuito deve essere semplice, piccolo e se dovesse guastarsi, facile da riparare o sostituire.
Utilizzo un Pic12F629: ho in casa alcuni microprocessori per dei progetti in corso e questo è perfetto. Forse un po’ esagerato…
Assemblo su breadboard il tutto, recuperando un vecchio progetto con un Pic12F675 mantenendo i collegamenti per il PicKit3 che mi permetterà di caricare il firmware.

Qui sotto inserisco lo schema del circuito finito senza i collegamenti al PicKit3, che potete trovare nella pagina dedicata a questo programmatore.

Schema elettronico fuoco presepe 3 LED PIC12F629

Utilizzerò uno zoccolo a 8 pin nel circuito, in questo modo potrò sostituire il Pic in caso di problemi  o rimuoverlo se volessi eventualmente aggiornare il firmware.

Un problema che avevo era come ottenere i numeri random per l’accensione e lo spegnimento dei led in modo casuale. Qualche tempo fa avevo già visto  la funzione rand(), ma c’era un bug o non era gestita bene dalle versioni che stavo utilizzando del XC8.
Avevo letto però in un articolo che qualcuno era riuscito ad utilizzare la funzione rand() e quindi ho voluto sbatterci un po’ la testa.

Con la versione che sto utilizzando oggi, XC8 1.44 (l’ultima disponibile il 09/2017) sembra che qualcosa sia migliorato e una volta impostata la funzione in modo corretto è stato possibile ottenere dei numeri random.
La funzione, occupa buona parte della memoria Data, ma il suo riutilizzo per generare altri numeri, non comporta ulteriori sprechi.
Non avendo bisogno di altro spazio di memoria Data per questo progetto, non ho indagato molto se c’era il modo di abbassare questi valori.
Per il corretto funzionamento della funzione rand() occorre passare un parametro seed o seme e lo si fa con la funzione srand().
Utilizzando il valore del timer  TMR0 ottengo quello che mi serve e quindi imposto così srand(TMR0) ricordandosi di inizializzare il Timer con il codice OPTION_REG = 1;

Se avete spazio o desiderate ottenere una luce diversa con effetti più adeguati alle vostre esigenze, potete prendendo spunto dal codice che posterò e modificare il progetto.
Ad esempio avendo un pochino di spazio in più si può aggiungere un quarto led, che può essere impostato come luce fissa oppure, come nel caso degli altri LED lampeggianti, creare un ciclo for per impostare un delay random.
Se volete aumentare o diminuire la velocità di lampeggio potete andare a modificare i parametri di delay , ad esempio cambiando il valore massimo ottenibile con il random: si può diminuire il valore %15 con un valore più piccolo ottenendo un lampeggio più frequente.

Qui sotto potete trovare il codice che ho creato per questo progetto.

//*****************************************************************************/
// Fuoco Presepio con 3 LED
// www.mdn75.it
//
// modulo: main.c
// autore: MDN75
// data: 24/10/2017 Update: 11/11/2017
// descrizione: Fuoco Presepio con 3 LED
// picmicro: PIC12F629
// clock: interno a 4 MHz
//
//*****************************************************************************/

/******************************************************************************/
/* Files to Include                                                           */
/******************************************************************************/


#include <xc.h>         /* XC8 General Include File */
#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */
#include <stdlib.h>



/******************************************************************************/
/* Configurazione del PIC12F675 per il nostro programma!                      */
/******************************************************************************/
#pragma config MCLRE = OFF, CP = OFF, CPD = ON, BOREN = ON, WDTE = OFF
#pragma config PWRTE = ON, FOSC = INTRCIO
#define _XTAL_FREQ  4000000

int i= 0;

void init_ports(void) /* Funzione di iniziazione delle porte */
{
   TRISIO = 0;        /* Imposto tutte le porte in uscita */
   CMCON = 0x07;      //Disable analog comparator   
   OPTION_REG = 1;    /* Inizializzo Timer0 */
}

void main(void) {
    
    init_ports();       // Richiamo la funzione per inizializzare le porte
    srand(TMR0);        // Imposto funzione Random
    GPIO1 = 1;          // Accendo LED1 rosso
    int n = rand()%15;  // Ottengo numero random n
    int x = rand()%15;  // Ottengo numero random x
    for(i;i<=n;i ++) __delay_ms(40);      //ciclo for per Delay lungo

GPIO2 = !GPIO2;          //LED2 accendo e spengo

    for(i;i<=x;i ++) __delay_ms(60);      //ciclo for per delay lungo
GPIO4 = !GPIO4;          //LED3 accendo e spengo
      
    return;
}

e qui il firmware da caricare solo sul PIC12F629

 

Il firmware per i PIC 12F675 o 12F683 deve essere ricreato, benchè il codice da me postato sia perfettamente funzionante anche su questi pic. Questo perchè il compilatore del XC8 adatta il codice importando le librerie in base al PIC impostato nel progetto.

Se avete qualche dubbio sul progetto che vi ho presentato  contattatemi!

Se questo articolo vi è sembrato interessante e vi è stato d’aiuto, condividetelo.
Aiutami a mantenere online il sito con un piccolo aiuto:  paypal.
Grazie di cuore 🙂