MONITOR PER BATTERIA CON PIC18F14K50 E ESP8266 V.1.0

 


IL PROGETTO

 

Chiunque ha intenzione di intraprendere un installazione di pannelli solari o un generatore eolico al fine di mantenere in carica una o più batterie da usare come alimentazione elettrica nella propria abitazione, sia completamente staccata da quella distribuita (in isola) o alimentarla parzialmente con il fine di ottenere un risparmio in bolletta, uno dei problemi che deve risolvere è la necessità di fornire la necessaria energia di carica alle batterie che deve essere superiore a quella di scarica. Il sistema più semplice da attuare per raggiungere lo scopo è quello di calcolare, con sufficiente margine, il numero di pannelli o la potenza del generatore eolico, nonché il numero e la potenza degli accumulatori.

Ciò che può risultare semplice su carta, il mondo reale può riservare delle sorprese, soprattutto ora che i cambiamenti climatici mettono in discussione le statistiche finora rilevate. Sono sufficienti uno o più giorni di pioggia o protratta calma di vento per coloro che optano per i generatori eolici, per ritrovarsi con gli accumulatori a terra. Da ricordare per tempo che i pannelli non presentano la stessa resa nel corso della loro vita e gli accumulatori degenerano. Altro fattore da considerare è la variabilità dei carichi durante la giornata e nel corso della settimana. Chi lavora tutto il giorno, di sicuro delega il lavaggio dei panni il fine settimana approfittando della giornata di riposo. Risulta logico che ciò che non viene consumato, in termini di energia elettrica, dal lunedì al venerdì, viene richiesto durante il week-end come surplus di energia, che le batterie potrebbero non essere in grado di fornire.

Il progetto chi vi presentiamo in queste pagine non pretende di essere il rimedio a tutti i problemi finora analizzati, ma un semplice e utile strumento con cui analizzare giorno per giorno l’equilibrio tra carica e scarica degli accumulatori. Lo strumento che proponiamo per l’analisi sia istantanea che divisa per ogni ora della giornata è lo smartphone per mezzo del WiFi di casa, senza nessun collegamento fisico. Vien da se che per coloro che hanno un ‘indirizzo IP statico la faccenda diventa interessante in quanto possono collegarsi da qualsiasi parte del mondo poichè l’analizzatore proposto viene visto dall’impianto WiFi di casa come un nodo qualsiasi.

Di sicuro qualcuno avrà l’esigenza di collegarlo in una abitazione isolata come una baita in montagna, in cui manca il router per il collegamenti WiFi. È stata prevista questa eventualità, dotando il dispositivo di un pulsante virtuale con la possibilità di programmare l’ESP8266 come Access Point oltre che come station. Questa eventualità è stata scelta come opzione poiché in modalità AP non è possibile mandare l’ESP8266 in “sleep” e ottenere un consistente risparmio energetico.

Schema elettrico

 

Il circuito proposto è molto semplice per  la presenza di un microcontrollore che svolge una buona parte del compito richiesto dal progetto e dall’impiego del modulo WiFi ESP8266. Il microcontrollore utilizzato è un PIC18F14K50 sostituibile con poche modifiche con il modello PIC18F14K50. Questi micro presentano una memoria flash di 16Kbyte sufficiente di contenere il firmware di gestione del ESP8266 e alcune pagine web sotto forma di vettori. Il numero di piedini è più che sufficiente per il collegamento del modulo WiFi e dei due ingressi analogici necessari per misurare la tensione e la corrente di carica e scarica della batteria e alcuni I/O utili per l’utilizzo della scheda come web server.

La schedina che si occupa del rilevamento della corrente è di tipo commerciale, la si trova completa di tutti i componenti per lavorare con un voltmetro o, come nel nostro caso, con il convertitore analogico/digitale di un microcontrollore. La corrente viene rilevata e misurata da un integrato costruito appositamente per questa funzione ACS712 di Allegro. La particolarità di questo integrato è quella di utilizzare un sensore ad effetto di Hall per misurare la corrente e quest’ultima è separata galvanicamente dal circuito di misura e condizionamento. La tensione in uscita è proporzionale alla corrente e il rapporto tensione/corrente dipende dal modello in lavoro. Di questi sensori ne sono stati prodotti di tre tipi la cui differenza sta nel valore misurato della corrente. Il primo misura la corrente tra ±5A, il secondo tra ±20A, il terzo tra ±30A. Ovviamente il rapporto corrente/tensione dipende dal valore di fondo scala del modello utilizzato e va da 185mV/A per il modello da 5A, 100mV/A per quello da 20A e, infine, 66 mV/A per il terzo modello. Abbiamo accennato alla misura di una corrente che può essere negativa quanto positiva. Lo scopo del progetto è quello di rilevare la direzione di lavoro della corrente. Per una convenzione tutta nostra abbiamo deciso che la corrente che scorre verso la batteria, quindi in accumulo, sia positiva, mentre quella che viene prelevata sia negativa. Il ACS712 in presenza di una corrente che scorre dai pins 1 e 2 verso i pins 3 e 4 incrementa la tensione in uscita del rapporto corrente/tensione partendo da ½ tensione di alimentazione dell’integrato, mentre per una corrente rilevata che scorre dai pins 3 e 4 ai pins 1 e 2, decrementa la tensione in uscita dello stesso rapporto partendo sempre da ½ Vcc. Chiariamo con un esempio riportando i dati del progetto stesso:

Ovviamente sarà compito del PIC gestire opportunamente i dati ma, come è evidente dagli esempi, una mansione tutt’altro che difficile. L’uscita del ACS712, la cui resistenza è molto bassa e quindi non è necessario interporre alcun buffer, è applicata direttamente all’ingresso C1 del PIC18F14K50 inizializzato come AN6.

La schedina amperometrica dovrà essere collegata alla morsettiera X4 che mette a disposizione i 5V e la massa per alimentare il sensore e X2,2 (ingresso analogico 2) per il segnale.

La sezione relativa alla misura della tensione della batteria è ancora più semplice: due resistenze che formano un partitore riduttore e un condensatore per assorbire o comunque limitare eventuali disturbi captati dai fili di collegamento. Il rapporto resistivo è di (47K+4K7)/4K7= 11, la massima tensione applicabile è quindi di 55V con il micro alimentato a 5V, se l’alimentazione è di 3,3V, la massima tensione applicabile all’ingresso del partitore resistivo sarà di 36,3V.

La misura della tensione è demandata all’ingresso C2 tramite il morsetto X2,1 che fa capo all’ingresso analogico AN5 del modulo convertitore analogico/digitale del PIC.

L’altro elemento di importanza vitale per la riuscita del progetto è il modulo ESP8266. Di questo modulo si è detto e scritto di tutto, quello che è certo è che gran parte del successo sta nel prezzo davvero basso. Ciò non vuol dire che sia una tecnologia di scarsa qualità, non siamo in grado di affermare una tesi del genere, fatto sta che funziona e per quello che deve fare, lo fa egregiamente.

Il collegamento tra il micro e il modulo ESP8266 avviene attraverso la seriale asincrona a due fili di cui è dotato il PIC e la frequenza di lavoro è di 115.200 bps. Il baud rate adottato garantisce una velocità elevata nell’invio dei pacchetti verso l’ESP8266 anche se di grandi dimensioni. Va ricordato che l’ESP8266 accetta pacchetti non più grandi di 2048 Byte, nel caso sia necessario inviare pacchetti più sostanziosi, p.e. una pagina web con molte informazioni, il pacchetto va diviso in pacchetti più piccoli. Il collegamento è quello classico, il piedino Rx del PIC (A1) va collegato al Tx del ESP8266, mentre quello del Tx del PIC viene condizionato da un partitore resistivo, che può essere bypassato, prima di arrivare al pin Rx del ESP8266. E’ stata scelta questa soluzione per avere la possibilità di lavorare con micro alimentati a 5V. La presenza dei jumper J1 seleziona i due casi, chiudendo J1a e lasciando aperto J1b, l’ESP8266 può lavorare con il PIC alimentato a 5V senza subire danni, mentre l’inserimento del ponticello su J1b e lasciando libero J1a, il modulo WiFi lavora con il PIC alimentato a 3,3V. il terzo filo di collegamento gestisce la funzione di reset del modulo ESP8266. Il circuito alimentato con la batteria, difficilmente va spento e riacceso, il collegamento di reset può risultare superfluo, è stato utile durante la fase di programmazione del PIC e nelle prove.

Il connettore TP1 permette il collegamento di un convertitore esterno del tipo UART/USB per monitorare la trasmissione tra il PIC e l’ESP8266 e viceversa.

A completamento della descrizione dello schema elettrico, va aggiunto che la presenza di 3 ingressi digitali che fanno capo ai morsetti X1 e i tre pulsanti S1, S2e S3, nonché la morsettiera X3 e i LED DL2, DL3, DL4 e DL5 sono stati inseriti solo per avere a disposizione alcuni ingressi e uscite con cui sperimentare. Anche il morsetto X2,3 mette adisposizione un’ulteriore ingresso analogico utile per collegare un termometro e misurare la temperatura esterna o dell’ambiente in cui opera il sistema di back-up. Sono disponibili diversi esempi per trasformare il circuito in un web server personalizzabile senza necessariamente conoscere la logica di funzionamento del PIC. Di questo ne parleremo nella parte riguardante il firmware del micro. Inoltre nel firmware è prevista una funzione che scollega la batteria dalla fonte di alimentazione periodicamente, in modo da scaricarla completamente prima di reinserirla nel circuito di ricarica. È molto importante che ciò avvenga almeno 3-4 volte in un anno per le batterie stazionarie piombo-acido per limitare il problema della solfatazione. Al tal fine è possibile collegare al morsetto OUT 1 (vedi X2) un modulo relè completo di transistor pilota. Il contatto NC va collegato in serie al circuito di alimentazione. Il relè, trascorso il tempo impostato, si eccita e scollega la fonte di alimentazione dalla batteria, ricollega il tutto quando la tensione della batteria scende sotto gli 11,8V.

Il LED DL1 ha il compito di segnalare quando il circuito sta inviando pacchetti di dati al router. Si accende in presenza di comunicazione tra il circuito e il browser e all’avvio durante l’inizializzazione del ESP8266.

Il quarzo previsto da 24 MHz è la soluzione ottimale per ottenere la massima precisione dal modulo UART del PIC alla velocità di 115.200 bps.

L’alimentazione del circuito è garantita dalla batteria. Una schedina stabilizzatrice di tipo switching (REG1) riduce la tensione da 12-13V della batteria ai 5V per alimentare correttamente il PIC e ACS712 e ridotta da un secondo stabilizzatore a 3,3V (REG2) per lESP8266. Al posto della schedina switching è possibile usare un semplice integrato tipo 7805 a cui va applicata una aletta di raffreddamento di adeguate dimensioni a dimostrazione del minor rendimento rispetto al sistema switching e quindi un maggiore consumo, fattore non propriamente positivo in un sistema alimentato da batterie. La presenza del jumper J1 è dovuta alla sperimentazione di vari micro, alcuni modelli non lavorano a velocità di clock elevate se alimentati con una tensione inferiore ai 5V. Con la soluzione adottata e selezionando di conseguenza J2, è possibile spaziare tra modelli diversi e scegliere il più opportuno.

La morsettiera X4 mette a disposizione i 5 Volt per alimentare la schedina dell’amperometro e, se si decide di farne uso, una o più schedine relè.

 

INSTALLAZIONE

Con uno spezzone di filo collegate il morsetto + di X5 con il morsetto X2,1 dando modo al PIC di leggere la tensione della batteria. Se optate per la funzione scarica periodica della batteria, alimentate la scheda relè con i 5 V della morsettiera X4 e collegate l’uscita del PIC (X2 OUT 1) con l’ingresso della scheda relè.

Consigliamo di racchiudere la scheda e quella dell’amperometro  in una scatola per derivazione elettrica, in particolare, se il tutto è esposto alle intemperie, si raccomanda l’utilizzo scatola e pressacavo adeguati.

Il collegamento con l’impianto di autoproduzione di energia è piuttosto semplice: dopo avere isolato la batteria scollegando i cavi dai poli + e -, scollegate il cavo positivo della batteria, di solito di colore rosso, in un punto del circuito a valle del fusibile di protezione e collegatelo al connettore di sinistra della schedina amperometrica. Potrete individuare il morsetto di sinistra orientando la scheda dalla parte dei componenti tenendo il connettore tre poli verso il basso e la morsettiera a due poli in alto. Con uno spezzone di filo della stessa sezione di quello scollegato dalla batteria, collegate l’altro morsetto della schedina amperometrica con il morsetto positivo della batteria a valle del fusibile.

Tutto l’impianto deve essere protetto da fusibile o da magnetotermico. La presenza di una protezione dalla batteria è molto importante per prevenire incidenti anche importanti come l’incendio in caso di corto circuito accidentale.

La morsettiera della schedina amperometrica è piccola e difficilmente può alloggiare conduttori la cui sezione sia maggiore di 1,5 mmq. Conviene saldare due spezzoni di cavo sulle piazzole della morsettiera e collegare a questi i cavi della batteria per mezzo di morsetti volanti tipo mamut.

A questo punto siete pronti per l’avviamento e il collaudo del sistema di monitoraggio della batteria. Collegate e serrate bene i morsetti ai poli + e – della batteria. Il LED rosso della nostra scheda si deve accendere per qualche secondo, il LED rosso del ESP8266 deve restare sempre acceso mentre quello blue deve lampeggiare per il tempo in cui resta acceso il LED rosso della scheda del PIC.

Prima di collegare il dispositivo alla LAN di casa, è necessario scegliere l’indirizzo IP con qui identificare la nostra scheda. Generalmente nei sistemi Windows la rete ha un indirizzo del tipo 192.168.1.XXX dove XXX è l’indirizzo del nodo. In ogni caso è necessario assegnare alla scheda un valore alto per non interferire con altri dispositivi, in genere indirizzati dal router. L’indirizzo di quattro Byte va programmato nell’area di memoria EEPROM a partire dall’indirizzo 0x08. Nella foto la parte di memoria in cui salvare l’indirizzo IP è evidenziata in rosso, 0xC0, 0xA8, 0x01, 0x6C, tradotta decimale: 192.168,1,108. L’indirizzo 0x03 mantiene in memoria il modo di funzionamento dell’ESP8266, qualsiasi valore superiore allo zero lo parametrizza come AP + station, zero solo come station.

Collegate il vostro tablet, PC o smartphone alla rete WiFi di casa, se disponibile, altrimenti collegatelo al AP del ESP8266, aprite il vostro browser preferito e, dalla riga degli indirizzi, digitate l’indirizzo IP che avete salvato della EEPROM del PIC o, se collegato al AP del modulo, all’indirizzo 192.168.4.1. Verrà visualizzata la pagina principale con i dati istantanei inerenti alla batteria. Tali dati sono aggiornati ogni 5 secondi, sfruttando delle funzioni in Java Script, in particolare delle implementazioni in AJAX. Potete navigare tra le pagine a disposizione, la seconda in particolare è quella che visualizza lo stato della batteria in ogni ora della giornata per mezzo di un istogramma la qui lunghezza è proporzionale alla potenza assorbita/ceduta dalla batteria e di colore diverso per distinguere l’energia di carica da quella di scarica. La terza pagina riguarda la programmazione dell’orario e del tempo in giorni prima della scarica completa della batteria. E’ inoltre disponibile l’alternativa “Access Point + station” o “solo station”. Molto utili i “pulsanti di opzione” che permettono di sostituire il sensore amperometrico con uno dal fondo scala inferiore p.e. con quello da ±5A se l’impianto è di piccole dimensioni e la taglia da 5A permette una definizione della misura migliore.

Proponiamo, infine, di provare la pagina dei test con la quale è possibile accendere e spegnere i LED di cui è dotata la scheda, e provare a premere i due pulsanti e visualizzare lo stato sullo schermo dell’apparecchio con qui state navigando.

TARATURA DELLO STRUMENTO

Alla messa a punto dello strumento è dedicata la terza pagina web “programm”. Seguendo l’ordine dei parametri della pagina iniziamo con la selezione del modo operativo del modulo ESP8266, cliccando sopra la scritta in rosso su sfondo nero possono essere selezionati il modo di funzionamento “solo station” o “AP + station”. Tenete presente che nel modo “solo station” è programmata la funzione “sleep” che permette di ottenere un minore consumo di corrente. Il modo “AP + station” diventa indispensabile nel caso non sia disponibile un router WiFi con cui collegarsi. Al fine di evitare sorprese, consigliamo di programmare la EEPROM del PIC all’indirizzo 0x03 con un valore superiore o uguale a 1, per essere sicuri di collegarvi sul posto in cui andrà alloggiato lo strumento nel caso non sia disponibile il router. Se il PIC è vergine, lasciate il valore di fabbrica, il firmware considera il valore “0” come “solo station” e tutti i valori superiori come “AP + station”.

L’aggiornamento dell’orario del sistema è semplice e intuitivo per  la presenza dei form dedicati. Un'unica annotazione, sia l’ora  che i minuti devono avere due cifre, altrimenti il sistema si rifiuterà di accettare il nuovo orario.

L’opzione “scarica profonda” richiede un valore di tre cifre ed è espresso in giorni.

Fondamentale è la scelta del sensore, di default il modello è quello da ±30A, se optate per un modello dalla portata diversa, selezionate il pulsante relativo e cliccate su “send”. Il tipo di sensore verrà salvato nella memoria EEPROM del PIC all’indirizzo 0x04.

LE PAGINE WEB

 

Come anticipato sono quattro, le prime tre sono legate al progetto, la quarta è stata programmata per testare le potenzialità della scheda e comprendere quali possono essere le possibili applicazioni della stessa sfruttando il firmware del PIC. Nella sezione successiva dell’articolo, verrà esaminato il firmware del micro con l’intento di offrire la possibilità a chiunque di modificare le pagine web e implementare le informazioni che saranno inviate al browser e creare il proprio web server senza toccare il codice che gestisce le pagine.

La prima pagina o index viene inviata alla prima richiesta proprio come succede in qualsiasi server. Contiene le informazioni inerenti alla carica/scarica della batteria, l’orario dell’orologio del PIC e il tempo rimanente per la prossima scarica completa della batteria, se implementata. L’aggiornamento avviene periodicamente per mezzo di un applet java script di tipo AJAX. Il sistema carica solo le informazioni richieste e non l’intera pagina. Se volete cambiare il tempo di aggiornamento trovate la riga

setTimeout('GetD()',5000);\n\

nel vettore “*AJAX_Java_Script”. Il tempo è in millisecondi.

Nella seconda pagina viene visualizzato l’istogramma che prevede 24 barre colorate la cui lunghezza è proporzionale all’energia assorbita/ceduta dalla batteria. Il colore rispecchia la direzione della corrente, rossa se in prelievo (scarica), verde se in carica. In questo caso, non è stato usato un vettore ma una funzione in grado di ripetere per 24 volte lo stesso codice aggiornato per ogni ora della giornata.

La terza pagina web gestisce le informazioni al contrario. Se nelle altre pagine la direzione delle informazioni va dal micro al browser, in questo caso possiamo immettere dei dati dentro al PIC dall’esterno per mezzo dei form. Nel menù abbiamo nominato la pagina “Programm” perché possiamo inserire l’aggiornamento dell’orologio del PIC, il tempo desiderato per la scarica profonda della batteria, nonché il modo di funzionamento del ESP8266 e l’acquisizione dello “0” Amper della schedina amperometrica.

L’ultima pagina analizzata permette di controllare i 4 LED della scheda con alcuni degli infiniti metodi che il codice HTML mette a disposizione e testare lo stato dei pulsanti con l’aggiornamento manuale della pagina web nella prima parte, e in automatico per mezzo dell’aggiornamento periodico in AJAX.

FIRMWARE

L’ambiente di sviluppo con qui è stato scritto il firmware è MikroC di Mikroelektronika, molto semplice da usare anche per chi non è un esperto programmatore e l’help di cui è dotato aiuta non poco, al contrario del vecchio MPLAB e la proposta recente XMPLAB di Microchip, che anche se gratuita, è molto difficile da usare per chi non ha una laurea in informatica.

Va innanzitutto detto che le pagine web, le risposte agli aggiornamenti periodici AJAX, i CSS, ecc., sono gestiti come un vettore. In questo modo, è possibile creare le pagine in modo semplice, isolandole dal resto del firmware. A tal fine è stato implementato un sistema di gestione del codice delle pagine web molto flessibile e soprattutto autonomo.

Per inviare una pagina web è sufficiente un comando:

Send_Web_Page (page_head, ch_id, 0);

Gli argomenti della funzione sono il vettore da inviare al browser (page_head in questo caso), l’identificativo di chiamata che sarà inserito automaticamente e un valore booleano, il quale se vale ‘0’ la porta aperta nel momento in cui il browser invia la richiesta resta aperta per i pacchetti che seguiranno, mentre se vale ‘1’ la porta verrà chiusa al termine dell’invio. Semplicemente inserite il nome del vettore o della pagina completa e ‘0’ nel caso sia necessario l’invio di altri vettori, ‘1’ se il pacchetto è unico o è l’ultimo.

Se consideriamo che alcune pagine hanno in comune l’intestazione, il menù, la parte finale con la firma del programmatore, al fine di risparmiare preziosi byte di memoria e ottimizzare il tutto, alcune parti della pagina sono state isolate per essere richiamate in tutte le pagine. Ad esempio la pagina principale è composta da più vettori:

Send_Web_Page (page_head, ch_id, 0);

Send_Web_Page (indexpage, ch_id, 0);

ajax_response = 1;

Send_Web_Page (AJAX_Java_Script, ch_id, 0);

ajax_response = 0;

Send_Web_Page (footer, ch_id, 1);      // Close connection

Quella dell’istogramma:

Send_Web_Page (page_head, ch_id, 0);

Send_Web_Page (style, ch_id, 0);

flag.isto = 1;

Send_Web_Page (isto, ch_id, 0);

Send_Web_Page (footer, ch_id, 1);      // Close connection

Come è possibile notare alcuni pacchetti sono in comune tra le pagine e solo l’ultimo pacchetto chiude la connessione. In particolare “page_head” contiene l’intestazione, il titolo, il menù che sono uguali in tutte le pagine web, “footer” contiene le chiusure dei tag principali e il nome del programmatore.

La variabile “ajax_response” ha lo scopo di sfruttare lo stesso codice AJAX in pagine diverse e ogni pagine ottiene una risposta diversa e adeguata. La possibilità di abbinare una risposta diversa relativa alla pagina in cui avviene la richiesta, è un’altra delle caratteristiche del firmware, le variabili dinamiche che vedremmo più avanti e sono molto importanti per la riuscita del progetto.

Il flag “flag.isto” è usato per ottimizzare il codice. Infatti la parte di HTML relativa alla costruzione dell’istogramma è ripetitiva per ogni ora della giornata in esame. Considerando che il codice HTML richiede al micro circa 2Kbyte di memoria flash solo per visualizzare le 24 barre dell’istogramma, con l’espediente adottato abbiamo risparmiato più della metà di memoria (vedi “unsigned int Isto_Ora (char mode)”).

La tecnica di spezzare la pagina in più pacchetti, diventa utile anche nel caso sia necessario l’invio di una pagina web di notevoli dimensioni. Infatti l’ESP8266 si rifiuta di inviare pacchetti che eccedono i 2048 Byte. In questo modo è possibile gestire con grande facilità dimensioni di dati importanti, memoria del micro permettendo.

Vediamo di capire come si utilizzano le variabili dinamiche. Va ricordato che l’idea delle variabili dinamiche è di Microchip e le possiamo trovare nelle prime versioni dello stack TCP/IP all’interno delle pagine web. Sfruttava un simbolo seguito da un valore. Il firmware, lo stack, quando trova tale simbolo durante il conteggio dei caratteri e l’invio della pagina, integra la pagina web con le informazioni che trova nel firmware usando come riferimento il numero della variabile. Tali variabili possono essere inserite all’interno del codice HTML o Java Script, le quali possono essere aggiornate al momento dell’invio verso il browser. Un esempio pratico potrà chiarire e farvi capire la potenzialità del sistema adottato. Nella pagina dei test, abbiamo la possibilità di accendere un LED della scheda. L’accensione viene segnalata dalla variazione di colore di fondo del pulsante virtuale e segnalata con la scritta adatta che rispecchia lo stato del LED (LED 2 ON, LED 2 OFF). La parte di codice HTML che gestisce il pulsante è la seguente:

<style type=\"text/css\">\

#Button {width:200px;height:60px;background:~63;borderstyle:none;

cursor:pointer;margin:20px auto;}\

</style>\

<form method=\"get\"action=\"L02t\">\

<button id=\"Button\"type=\"submit\">LED 2 ~61</button>\

</form>\

In questo caso abbiamo due variabili identificabili dal un numero di due cifre preceduto da un tilde (~63 e ~61). Quando il firmware del PIC conteggia il numero di caratteri e invia il pacchetto, sostituisce la variabile con l’informazione che trova nella funzione “unsigned int Calc_Value (unsigned short tilde, unsigned short count)” che altro non è che una serie di istruzioni di tipo switch-case. Il PIC salta direttamente all’istruzione “case” la cui costante è uguale al valore della variabile. Nel nostro esempio il “case” che viene analizzato per primo è il 63:

case 63: {

               if (LED_2) StrCopy_red ();          // Scrive “red”

                 else StrCopy_green ();  // Scrive “green”

                  break;

}

La variabile ~63 è sostituita da un array con la parola “red” se il LED 2 è acceso, “green” se spento.

Con la stessa logica, la variabile ~61 viene sostituita con l’informazione contenuta nell’istruzione case 61

case 61: {

               if (LED_2) StrCopy_on();            // Scrive “ON”

                 else StrCopy_off ();                    // Scrive “OFF”

                  break;

}

Al termine dell’operazione il codice HTML inviato aql ESP8266 e quindi al browser, ipotizzando che il LED 2 sia acceso, diventa:

<style type=\"text/css\">\

#Button {width:200px;height:60px;background:red;borderstyle:none;

cursor:pointer;margin:20px auto;}\

</style>\

<form method=\"get\"action=\"L02t\">\

<button id=\"Button\"type=\"submit\">LED 2 ON</button>\

</form>\

È sufficiente implementare tante funzioni “case” quante sono le variabili dinamiche contenute nel codice HTML, AJAX, CSS, ecc., del nostro web server.

Altro modo in cui sono state usate le variabili dinamiche ci ha permesso di sfruttare lo stesso vettore implementante codice Java Script in due pagine diverse con le risposte che ci aspettiamo quando ci troviamo in quella pagina. La riga del vettore “*AJAX_Java_Script

request.open(\"GET\",\"~99\"+nocache,true);\n\

contiene la variabile ~99 che ci riporta al case 99:

case 99: {   

                if (ajax_response == 1) strcpy(txt, "ajax");

                 else if  (ajax_response == 2) strcpy(txt, "a2ja");

                  break;

}

“ajax_response” viene parametrizzata con il valore ‘1’ se richiesta la pagina principale:

Send_Web_Page (page_head, ch_id, 0);

  Send_Web_Page (indexpage, ch_id, 0);

 ajax_response = 1;

      Send_Web_Page (AJAX_Java_Script, ch_id, 0);

        ajax_response = 0;

          Send_Web_Page (footer, ch_id, 1);      // Close connection

Con il valore ‘2’ se richiesta la pagina dei test:

Send_Web_Page (page_head, ch_id, 0);

  ajax_response = 2;

    Send_Web_Page (AJAX_Java_Script, ch_id, 0);

       ajax_response = 0;

         Send_Web_Page (test, ch_id, 0);

            Send_Web_Page (footer, ch_id, 1);      // Close connection

Come è possibile notare nell’istruzione “case 99” nella pagina principale l’aggiornamento AJAX richiesto è “ajax” contenenti le informazioni sulla carica/scarica della batteria, mentre nel secondo caso viene richiesto il vettore “a2ja” con lo stato dei pulsanti.

Sono gestibili fino a 100 variabili dinamiche. È importante che le variabili dinamiche siano composte da due caratteri (~00, ~01, ecc.). in caso di errore (p.e. ~3) ritorna la stringa “ERROR”.

ACCENDERE UN LED

Ovvero come attivare e/o disattivare un’uscita del PIC: semplicemente allo stesso modo con cui sono gestite le variabili dinamiche.

Vediamo uno dei modi usati per gestire un LED dalla pagina dei test.

<a style=\"color:red;background:~64\" href=\"L01t\">LED 1: ~60</a>\

Tralasciamo la spiegazione sulle variabili ~64 e ~60 di cui è stato dato ampiamente spazio del capitolo precedente e concentriamoci su quanto ritorna dal browser quando clicchiamo con il mouse sul pulsante del LED 1 ovvero L01t. L01t è composto da tre parti distinte: ‘L’ (maiuscola!) è la discriminante che informa il micro che è richiesta la gestione di un uscita. Il firmware a questo punto sposta la sua attenzione alla funzione “void Cnl_Output ()” in particolare all’istruzione “case” la cui costante è uguale al valore posto dopo la ‘L’.

case 1: { if (buff_16_ == 'n') LED_1 = 1;             // ON

                     else if (buff_16_ == 'f') LED_1 = 0;      // OFF

                      else { if (LED_1) LED_1 = 0;        // Togle

                               else LED_1 = 1;

                      }

                       break;

         }

Ciò che segue è quanto richiesto ovvero ‘n’ accende il LED, ‘f’ lo spegne, mentre ‘t’ togla il LED, in pratica simula il funzionamento di un relè passo-passo.

È un modo molto semplice di gestire un’uscita del PIC in quanto si agisce solo sulla pagina web per la visualizzazione lato browser, su un’unica funzione per ottenere l’effetto pratico dal PIC.

Tale sistema non è comunque limitato all’intervento su un’uscita, potrebbe essere aggiornato lo stato di un flag con il compito di impostare alcuni valori in un ipotetico calcolo o selezionare delle analogiche diverse da gestire con le variabili dinamiche. La selezione del modo in cui lavora l’ESP8266 tra AP o solo station, sfrutta tale sistema (vedi case 99).

Anche in questo caso sono possibili sino a 100 implementazioni e, come per le variabili dinamiche, il valore che segue il discriminante deve risultare di due cifre. In caso di errore, non succede nulla.

 

 

 

Ti può interessare: Tutorial Web Server


SCARICA il firmware del pic V.1.0

Pacchetto completo per ambiente Mikroc pro for PIC

RITORNA ALLA MAIN PAGE