Timer giornaliero programmabile

 

 

 

Avevo necessità di utilizzare un timer, per azionare una piccola pompa nebulizzante per una piccola serra, programmabile nel seguente modo:

1): attivo dalle ore, alle ore nell’arco della giornata.

2): attivazione ad intervalli programmabili.

3): Pompa attiva per un tempo determinato.

Ho buttato su carta quello che mi serviva:

Sommario funzionamento timer usato all'inizio del progetto

In commercio ci sono timer con un disco programmatore che permettono una programmazione simile, ma non sono precisi come vorrei io, ad esempio ne ho uno che ha step di 15 minuti ovvero 4 selettori ogni ora. Non è quello che mi serve.

Allora, come detto, carta e penna, e comincio a definire le parti principali che costituiranno il timer.

PIC: è esagerato, ha molta memoria flash, ma numero pin adeguati: va bene il collaudato 16F876.

LCD: in primis, ho pensato al classico 16×2 ma poi ho optato per un 16×4 per una completa visualizzazione dei parametri impostati.

Ci deve chiaramente essere un orologio che mantenga l’orario anche in caso di mancanza alimentazione.

Questo è il primo  problema: potevo usare la EEprom interna e scriverci ore e minuti ma al ritorno dell’alimentazione, l’orario sarebbe errato: idea scartata.

Seconda soluzione, tenere alimentato sempre il PIC  e ad ogni riaccensione reinizializzare l’LCD…. Servirebbe una batteria ricaricabile abbastanza grande con i problemi annessi: idea scartata

In un progetto di qualche anno fa, avevo utilizzato una batteria che mi teneva alimentato tutto il circuito, ma non mi sembra il caso: batteria composta da 6 stilo 1,5V, non hanno una grande durata. Anche questa soluzione, scartata.

Ho nel cassettino alcuni RTC (Real Time Clock) tipo DS1307 mai utilizzati, è arrivato il momento di utilizzarli.

Per semplicità inizio a cercare in rete esempi di utilizzo di questo RTC e ce ne sono moltissimi: tutti però hanno la caratteristica che la programmazione dell’orario e del calendario, deve essere fatta nel programma che poi, una volta compilato, si inserisce nel PIC e da li parte.  Non mi piace per cui inizio a lavorare sul software in modo che si possa settare durante l’utilizzo.

Stabilito tutto quello che serve, il progetto inizia a prendere forma.

Prototipo

Dopo molto studio SW e HW, come si vede da questa prima foto, ecco realizzato il progetto sperimentale da cui nascerà la versione definitiva e funzionante. Premetto che da molti anni non realizzo più circuiti stampati ma utilizzo la comodissima basetta 1000 fori.

   SCHEMA:

Questo è lo schema principale del progetto.

Molto semplice, PIC 16F876 con quarzo da 4MHz, RTC DS1307 con quarzo da 32768Hz, batteria litio CR2032 che alimenta l’RTC in mancanza di alimentazione, sette pulsanti per le varie funzioni e un rele 12V con scambio da 10/15A per azionare la pompa.

Il PIC memorizza tutte le programmazioni fatte nella EEprom interna precisamente l’ora e minuti dello start, ora e minuti dello stop ovvero intervallo entro il quale il timer è attivo.    Poi di seguito memorizza la ciclicità della nebulizzazione in minuti e per ultimo la durata della stessa sempre in minuti. Tutto ciò avviene entrando nel MENU2 con il relativo pulsante. Faccio notare, che dopo la programmazione della Flash del pic con il file .hex, quindi al primo utilizzo, la programmazione  del TIMER DEVE essere  effettuata.

Nella EEprom,    vengono memorizzati anche    altri parametri.    Per semplicità, calcolo tutto in minuti (ore x 60+minuti)  per lo start e lo stop del timer.    Partendo dallo start, memorizzo nella EEprom a partire dall’indirizzo 16 (in decimale) questo valore.  Essendo una variabile WORD (2 Bytes) la seguente memorizzazione avverrà dalla locazione 18 e così via. La seconda memorizzazione, conterrà il valore precedente,  sommato   al tempo  della ciclicità e così via finchè non si arriva all’ora di stop timer.     Segue esempio:

 

Partendo da queste impostazioni con timer ON dalle 08:00 alle 22:30: nebulizzazione ogni 30 minuti con durata 10 minuti.

 

 

 

Come si vede dalla locazione 16 (10 in Esadecimele) avremo la prima attivazione a 480 minuti ovvero alle ore 08:00 e naturalmente dopo 10 minuti si disattiva.  L’attivazione seguente (locazione 18)  avverrà a 510 minuti ovvero alle 08:30 per 10 minuti.    Così via fino all’ultimo valore 1320 ovvero le 22:00. dopodichè il timer si disattiva.

Queste informazioni possone essere viste con chiarezza guardando il listato del programma.

 

Passando all’HW, Q1 è il transistor che permetterà l’attivazione del relè, Q2 invece permette l’accensione della retroilluminazione del display.  J1 è il connettore ICSP che serve per la programmazione della FLASH del PIC senza doverlo estrarre dal circuito. Notare che in questa fase, l’alimentazione del PIC deve essere fornita dal circuito del timer perchè non la prelevo dal PICKIT.

Nello schema non ho riportato le alimentazioni lell’LCD:  sono le seguenti:

PIN 1: GND

PIN2: VDD

PIN3 : va collegato al cursore di un trimmer da 10Kohm che a sua volta è collegato tra massa e VDD: regola il contrasto dei caratteri.

I PIN dal 7 al 10 (D0-D4), vanno collegati a massa o lasciati liberi: l’LCD funziona con bus a 4 bit.

Vediamo ora i pulsanti:

Partendo da sinistra, troviamo il pulsante Light per accendere/spegnere la retroilluminazione  del display.

Di seguito c’è il pulsante TIMER che attiva/disattiva il timer: lo stato, viene visualizzato sulla seconda riga dell’LCD con Ton o Toff.  Naturalmente su Toff, il relè non verrà mai attivato.

Di seguito il pulsante  Manuale.    Serve per effettuare prove, attivare la pompa.    Questo comando viene visualizzato dal led giallo sul pannello frontale.

Continuiamo con due pulsanti + e che servono durante le varie programmazioni dei due menu.

Segue il MENU2 o SET TIMER che permette di entrare nella programmazione degli orari del timer. Funziona nel seguente modo: premendolo, si accede alla programmazione delle START ORE timer. Se non si toccano i tasti + e – ripremendo menu2 si passa a START MINUTI timer. Se non si modificano, si avanza con menu2 a STOP ORE timer. Se non si modifica, com menu2 si prosegue con STOP MINUTI timer. Con menu2 si prosegue con POMPA OGNI: . Questa è la ciclicità di azionamento poi si passa a POMPA PER: che è la durata di accensione della pompa.

MENU2 termina qui, però ricordo che SOLO alla prima accensione dopo il caricamento della flash del PIC, la EEProm è vuota quindi è necessario effettuare una modifica con i tasti + e – di uno dei valori.  Se è stata effettuata una modifica, tutte le impostazioni vengono memorizzate nella EEprom compresi i dati calcolati dalla locazione di memoria 16 come descritto in precedenza.  Ripeto solo alla prima accensione.

Rimane il pulsante MENU1 o Set Clock che serve per impostare l’orologio e il calendario del DS1307.   I settaggi avvengono allo stesso modo del menu2. Prima giorno della settimana, poi il giorno del mese, il mese ed infine l’anno. Si prosegue con ora e minuti.  A questo punto, alla prssione di MENU1, i dati vengono inviati all’RTC e da li parte con i secondi =0.  Questo pulsante non sporge dal contenitore, essendo il suo utilizzo abbastanza raro.

Nell’LCD, troviamo anche altri due simboli alla fine della terza e quarta riga: un asterisco * indica che siamo all’interno della fascia START/STOP.  Sulla quarta riga appare un # che indica il relè attivo come il led rosso sul frontale del contenitore e quello vicino all’uscita (D4).

 

Questo è l’alimentatore, semplice e filtrato visto che alimenta una pompa attraverso il relè.

A sinista, c’è l’ingresso 12Vdc dove collego un alimentatore da 12V 5A. Si prosegue per due vie, la prima tramite il fusibile da 6,3A e attraverso il relè (che è quello comandato dal PIC). Di seguito ci sono diversi diodi FAST per cercare di eliminare il più possibile disturbi generati dall’attivazione della pompa. D2 è un doppio diodo in TO220 mentre D3 l’ho collegato direttamente sul connettore di uscita. Il LED D4, serve per indicare con la sua accensione, che in pratica il fusibile F1 non è guasto. L’indicazione del relè attivo, l’abbiamo anche dalla scheda principale e riportato sul pannello frontale con un LED rosso.   La seconda via, parte dal D1 e serve per fornire la 5VDC per tutto il circuito tramite un LM7805 munito di un piccolo dissipatore. Una nota da segnalare è proprio la presenza del gruppo D1 e C3 che nel momento di attivazione della pompa, dovrebbe garantire che  una eventuale caduta di tensione eccessiva sull’alimentatore non disturbi il PIC.

SOFTWARE:

Per quanto riguarda il software ho utilizzato il Proton basic visto che il basic lo conosco da molti anni, dai tempi dello ZX80, ZX81, Spectrum, QL, Qbasic per il dos e Visual basic per windows

Dal seguente link si può prelevare il file in basic basta copiarlo nella pagina vuota di PROTON e compilarlo.

Il file .hex ottenuto, verrà caricato nel PIC con un pickit2 o pickit3 o altri dispositivi a vostra scelta.

Il Proton è un programma molto valido, lo utilizzo da poco tempo ma scopro sempre funzioni interessanti: consente di essere utilizzato in modo FREE per diversi tipi di PIC tra cui c’è il 16F876.   Un grazie a Picmicro675 che mi ha fatto capire i vantaggi di questo programma e tante funzioni utilissime nella programmazione, senza poi contare che il compilato occupa meno flash di altri compilatori ed è più veloce nell’esecuzione:  e non è poco.

Vediamo come è strutturato il programma.    La parte iniziale, raccoglie tutti i parametri di settaggio del PIC e dei dispostivi usati e la definizione delle variabili utilizzate.  Viene anche abilitato l’utilizzo degli interrupt che ho utilizzato come spiegherò in seguito.    Si inizia chiaramente con il Main che è il programma principale dove sono descritti tutti i comandi che vengono eseguiti.  Per primo, viene chiamata la sub INIT  sezione dove vengono inizializzati registri e variabili poi si inizia leggendo il DS1307, i tasti e si agisce di conseguenza. Ci sono molte sub che elaborano i dati che gli vengono forniti e restituiscono i risultati.   Abbiamo di seguito la sub per settare il timer: qui c’è una variabile “modifica” che viene settata (=1) se viene modificato qualche dato e di conseguenza procede alla memorizzazione di tutti i dati relativi, nella EEprom.   Di seguito la sub per settare l’orologio/calendario simile al settaggio timer. Siamo così giunti alla sezione che gestisce gli interrupt. Ne ho dovuti utilizzare due e precisamente uno che reagisce alla pressione di uno dei tasti collegati sulla portaB da 4 a 7. Il secondo, relativo al RB0 che sente la pressione del tasto sulla portaB 0. Con questi due interrupt, gestisco l’accensione della retroilluminazione del display. Premendo un pulsante sulle portb4-7,  utilizzo il TIMER1, per generare un interrupt ogni 100mS : contati 10 interrupt, ottengo 1 secondo che utilizzo per una temporizzazione della retroilluminazione contandone 60.     Il pulsante sul Portb0 invece, lo utilizzo per accendere o spegnere la retroilluminazione senza temporizzazione. Per finire, ci sono due tabelle per la conversione da numero a giorno della settimana  e la seconda da numero a mese.

REALIZZAZIONE:   

Ecco il progetto realizzato:

     Vista interna: si vedono i connettori per il display e quello per i pulsanti e i led frontali.  In basso, lo stabilizzatore ed il relè. Sopra il relè la batteria CR2032.

 

 

 

 

Di seguito vista posteriore del display, tastiera e led

 

Vista interna lato componenti

 

 

 

 

 

 

 

Lato saldature: in basso, da notare quel piccolo anello (massa) fatto con il filo per wire-up, serve per dare maggiore schermatura al quarzo dell’RTC.

Per le etichette gialle: le ho create con Excel con vari tentativi per le dimensioni e le centrature dei caratteri. Poi le ho ritagliate, nastro biadesivo per attaccarle al contenitore e nastro trasparente per proteggerle.

 

 

 

   Montaggio terminato, lavoro finito.   Spero di non aver anniato nessuno, e spero anche che questo progetto possa essere utile.

Pierluigi

VOTO
6 commenti
  1. piero55
    piero55 dice:

    Grazie Giuseppe.
    Concordo con te riguardo la precisione ma penso che possa essere accettabile. Ne ho montati due come vedi nelle foto uno su breadboard e l’altro “inscatolato”. Sono diversi giorni che li tengo accesi e vedo che la precisione è accettabile, li verifico con orologi radiocontrollati. Poi, essendo fissato con il “riciclo” dei componenti, ho usato quello che ho nei cassettini.
    Grazie, Pierluigi

    Approvazioni
  2. Giuseppe
    Giuseppe dice:

    Complimenti per la realizzazione del progetto . Controlla il Ds1307 potrebbe portare un errore temporale causato dalla deriva del cristallo.
    Per una maggiore precisione si può utilizzare per chi vuole un DS3231 .

    Approvazioni
  3. Picmicro675
    Picmicro675 dice:

    Un temporizzatore pratico con periodi personalizzati. Proprio un bel progetto.
    Per la costruzione si adatta bene anche il montaggio su millefori con sbroglio veloce di montaggio. Se fosse un progetto che richiedesse maggior compattezza, allora si può pensare a quelli fatti da servizi professionali.
    Poi visto lo scopo di umidificatore, si potrebbe aggiungere un sensore di umidità.

    Approvazioni
  4. piero55
    piero55 dice:

    Mi diverto a fare questi progetti, non li faccio per lavoro quindi non perdo tempo per il circuito stampato. Ho smesso una ventina di anni fa quando li realizzavo con la fotoincisione a doppia faccia. Poi non sono più riuscito a trovare la vetroresina presensibilizzata di qualità: non venivano più bene per cui ho smesso. Ho tutto l’occorrente, ma non mi ci metto più.

    Approvazioni
  5. Amilcare
    Amilcare dice:

    Progetto originale, completo in ogni parte e facilmente replicabile.
    Solo una piccola pecca la realizzazione su millefiori che non rende la realizzazione professionale.
    Detto tra noi chi se ne frega hanno tutti gli elementi per farselo loro lo stampato. Quando devo liberare la mente come in questi giorni mi cimento anche io in realizzazioni complesse su millefiori. Un modo per “staccare la spina” e allontanare altri pensieri.

    Approvazioni

Lascia un Commento

Vuoi partecipare alla discussione?
Fornisci il tuo contributo!

Lascia un commento