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 lequilibrio tra carica e scarica degli accumulatori. Lo strumento che proponiamo per lanalisi 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è lanalizzatore proposto viene visto dallimpianto WiFi di casa come un nodo qualsiasi.
Di sicuro qualcuno avrà lesigenza 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 lESP8266 come Access Point oltre che come station. Questa eventualità è stata scelta come opzione poiché in modalità AP non è possibile mandare lESP8266 in sleep e ottenere un consistente risparmio energetico.
Il circuito proposto è molto semplice per la presenza di un microcontrollore che svolge una buona parte del compito richiesto dal progetto e dallimpiego 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 lutilizzo 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 questultima è 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 dellintegrato, 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 tuttaltro che difficile. Luscita del ACS712, la cui resistenza è molto bassa e quindi non è necessario interporre alcun buffer, è applicata direttamente allingresso 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 lalimentazione è di 3,3V, la massima tensione applicabile allingresso del partitore resistivo sarà di 36,3V.
La misura della tensione è demandata allingresso C2 tramite il morsetto X2,1 che fa capo allingresso analogico AN5 del modulo convertitore analogico/digitale del PIC.
Laltro 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 nellinvio dei pacchetti verso lESP8266 anche se di grandi dimensioni. Va ricordato che lESP8266 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, lESP8266 può lavorare con il PIC alimentato a 5V senza subire danni, mentre linserimento 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 lESP8266 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 unulteriore ingresso analogico utile per collegare un termometro e misurare la temperatura esterna o dellambiente 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 allavvio durante linizializzazione 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.
Lalimentazione 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 dellamperometro 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 luscita del PIC (X2 OUT 1) con lingresso della scheda relè.
Consigliamo di racchiudere la scheda e quella dellamperometro in una scatola per derivazione elettrica, in particolare, se il tutto è esposto alle intemperie, si raccomanda lutilizzo scatola e pressacavo adeguati.
Il collegamento con limpianto 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 laltro morsetto della schedina amperometrica con il morsetto positivo della batteria a valle del fusibile.
Tutto limpianto deve essere protetto da fusibile o da magnetotermico. La presenza di una protezione dalla batteria è molto importante per prevenire incidenti anche importanti come lincendio 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 lavviamento 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 lindirizzo IP con qui identificare la nostra scheda. Generalmente nei sistemi Windows la rete ha un indirizzo del tipo 192.168.1.XXX dove XXX è lindirizzo del nodo. In ogni caso è necessario assegnare alla scheda un valore alto per non interferire con altri dispositivi, in genere indirizzati dal router. Lindirizzo di quattro Byte va programmato nellarea di memoria EEPROM a partire dallindirizzo 0x08. Nella foto la parte di memoria in cui salvare lindirizzo IP è evidenziata in rosso, 0xC0, 0xA8, 0x01, 0x6C, tradotta decimale: 192.168,1,108. Lindirizzo 0x03 mantiene in memoria il modo di funzionamento dellESP8266, 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 lindirizzo IP che avete salvato della EEPROM del PIC o, se collegato al AP del modulo, allindirizzo 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 lenergia di carica da quella di scarica. La terza pagina riguarda la programmazione dellorario e del tempo in giorni prima della scarica completa della batteria. E inoltre disponibile lalternativa 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 limpianto è 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 dellapparecchio con qui state navigando.
TARATURA DELLO STRUMENTO
Alla messa a punto dello strumento è dedicata la terza pagina web programm. Seguendo lordine 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 allindirizzo 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.
Laggiornamento dellorario del sistema è semplice e intuitivo per la presenza dei form dedicati. Un'unica annotazione, sia lora che i minuti devono avere due cifre, altrimenti il sistema si rifiuterà di accettare il nuovo orario.
Lopzione 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 allindirizzo 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 dellarticolo, verrà esaminato il firmware del micro con lintento 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, lorario dellorologio del PIC e il tempo rimanente per la prossima scarica completa della batteria, se implementata. Laggiornamento avviene periodicamente per mezzo di un applet java script di tipo AJAX. Il sistema carica solo le informazioni richieste e non lintera 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 listogramma che prevede 24 barre colorate la cui lunghezza è proporzionale allenergia 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 dallesterno per mezzo dei form. Nel menù abbiamo nominato la pagina Programm perché possiamo inserire laggiornamento dellorologio del PIC, il tempo desiderato per la scarica profonda della batteria, nonché il modo di funzionamento del ESP8266 e lacquisizione dello 0 Amper della schedina amperometrica.
Lultima 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 laggiornamento manuale della pagina web nella prima parte, e in automatico per mezzo dellaggiornamento periodico in AJAX.
FIRMWARE
Lambiente di sviluppo con qui è stato scritto il firmware è MikroC di Mikroelektronika, molto semplice da usare anche per chi non è un esperto programmatore e lhelp 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), lidentificativo 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 dellinvio. Semplicemente inserite il nome del vettore o della pagina completa e 0 nel caso sia necessario linvio di altri vettori, 1 se il pacchetto è unico o è lultimo.
Se consideriamo che alcune pagine hanno in comune lintestazione, 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 dellistogramma:
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 lultimo pacchetto chiude la connessione. In particolare page_head contiene lintestazione, 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, è unaltra 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 dellistogramma è 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 dellistogramma, con lespediente 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 linvio di una pagina web di notevoli dimensioni. Infatti lESP8266 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 lidea delle variabili dinamiche è di Microchip e le possiamo trovare nelle prime versioni dello stack TCP/IP allinterno delle pagine web. Sfruttava un simbolo seguito da un valore. Il firmware, lo stack, quando trova tale simbolo durante il conteggio dei caratteri e linvio 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 allinterno del codice HTML o Java Script, le quali possono essere aggiornate al momento dellinvio 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. Laccensione 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 linformazione 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 allistruzione 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 linformazione contenuta nellistruzione case 61
case 61: {
if (LED_2) StrCopy_on(); // Scrive ON
else StrCopy_off (); // Scrive OFF
break;
}
Al termine delloperazione 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 nellistruzione case 99 nella pagina principale laggiornamento 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 unuscita 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 allistruzione 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 unuscita del PIC in quanto si agisce solo sulla pagina web per la visualizzazione lato browser, su ununica funzione per ottenere leffetto pratico dal PIC.
Tale sistema non è comunque limitato allintervento su unuscita, 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 lESP8266 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