PRIMA DI INIZIARE La prima volta che si collegano le schede WiFi per IoT (Internet of Things) (di seguito chiamate anche NanoESP), può accadere che il computer non trovi automaticamente i driver necessari per il convertitore USB seriale. Se ciò accade, scaricare i driver dalla pagina www.iot.fkainka.de/driver e installarli manualmente. Il software di Arduino consente di selezionare la porta e la scheda Arduino Nano (processore: Atmega328). A questo punto il controller dovrebbe essere pienamente operativo.
nuovi progetti degli utenti e l'ultima versione dei programmi presentati. Il kit di apprendimento è una breadboard alla quale è possibile collegare la scheda NanoESP, come mostrato nella foto seguente. Questo lascia ampio spazio di sperimentazione, mentre il modulo WLAN si estende dietro, sopra la breadboard. Quindi è possibile inserire il cavo Micro-USB, che interferisce minimamente, come illustrato nella figura della sezione seguente.
Il modulo WLAN è controllato dai cosiddetti comandi AT. La parte Arduino della scheda è quindi collegata al modulo WLAN tramite i pin 11 e 12. Un piccolo circuito converte il livello di 5 V nel livello compatibile di 3,3 V. I pin 11 e 12 non devono essere utilizzati nei propri progetti. Altre importanti caratteristiche hardware della scheda sono elencate brevemente nella tabella seguente.
COMPONENTI DEL KIT DI APPRENDIMENTO Di seguito viene offerta una panoramica dei componenti inclusi nel kit di apprendimento.
1.1 | Comandi AT base Una prima impressione sull'uso dei comandi AT si ottiene semplicemente provandoli. Ecco perché in questa sezione vengono descritti alcuni dei comandi base del modulo. Aprire il programma P01_SoftwareSerial nell'IDE di Arduino. Si tratta di un programma molto semplice, che non fa altro che filtrare tutti i dati ricevuti tramite l'interfaccia hardware seriale del microcontroller attraverso l'interfaccia software definita dall'utente sul controller ESP.
AT sul monitor seriale e premendo [Enter]. Il programma caricato inoltra il comando al modulo ESP, che a sua volta risponde con AT e quindi con OK. Il comando successivo che è possibile testare è: AT+GMR Tramite questo comando è possibile visualizzare il firmware attuale e il numero di versione. Tramite il comando AT+RST è possibile ripristinare il modulo. Il terminale visualizza alcuni caratteri incomprensibili e alla fine la parola ready per indicare che il modulo è pronto.
Primi test con i comandi AT 1.1.2 | Comandi WLAN I seguenti comandi WLAN consentono di modificare le funzioni WLAN del modulo. Per alcuni comandi è possibile non solo definire uno stato, ma anche controllare lo stato attuale. Questo viene fatto inserendo un punto interrogativo immediatamente dopo il comando, per esempio AT+CWMODE? Il valore di ritorno è in genere +CWMODE=2 seguito da OK. Se si immette AT+CWMODE=? il modulo risponde con i possibili parametri del comando, in questo caso 1-3.
CWMODE è il comando tramite il quale è possibile impostare la modalità WLAN. Tre sono le modalità operative, descritte nel seguente ordine. 1 AT+CWMODE=2 – il modulo come un punto di accesso (modalità AP) Al momento della consegna, il modulo è un access point. Ciò significa che è possibile abilitare una connessione diretta con il modulo tramite un dispositivo che supporta la WLAN, come per esempio uno smartphone o un PC. È sufficiente cercare la rete WLAN aperta denominata NanoESP e collegarsi ad essa.
Il modulo in modalità Station. L'IP del computer collegato è evidenziato. 2 AT+CWMODE=1 – il modulo in modalità Stazione Tramite il comando AT+CWMODE=1 è possibile impostare il modulo in modalità Station. Questa modalità consente il collegamento al router WLAN. Il modulo viene così collegato anche a Internet e dispone di molte più opzioni. Prima però occorre elencare tutte le reti presenti nel raggio di ricezione tramite il comando AT+CWLAP e quindi verificare se la propria rete è presente.
nome della rete WLAN (chiamata anche SSID) e la password, entrambi racchiusi tra virgolette e separati da una virgola. Una connessione a un secondo modulo, impostato con i dati descritti nella sezione precedente sarebbe simile a questa: AT+CWJAP="MyNanoESP","MyPassword" La connessione può richiedere alcuni secondi e poi dovrebbe restituire OK. Tra l'altro si può richiamare dal router l'indirizzo IP assegnato del modulo tramite il comando AT+CIFSR .
3 AT+CWMODE=3 – la doppia modalità La terza opzione possibile delle impostazioni WLAN è la doppia modalità che, come suggerisce il nome, consente il funzionamento del modulo sia in modalità Station che AP. Questo significa che i dispositivi possono stabilire sia una connessione WLAN diretta con il modulo oppure raggiungere il modulo come stazione intermedia attraverso il router.
viene descritta la comunicazione con il modulo. 1 Comunicazione seriale La comunicazione avviene tramite l'interfaccia software seriale fornita insieme alla libreria SoftwareSerial. Durante l'inizializzazione è necessario specificare anche i pin utilizzati, in questo caso, 11 e 12. 001 #include 002 SoftwareSerial esp8266(11, 12); Proprio come nel caso di un'interfaccia seriale normale, tramite i comandi esp8266.print o esp8266.println si possono trasmettere byte o intere righe.
Quando si richiama la funzione, è quindi necessario passare ad essa anche il comando e il valore di ritorno previsto, per esempio AT e OK. Tramite println() il comando viene trasmesso e si attende fino a quando viene ricevuto il valore di ritorno previsto o il messaggio ERROR. Se l'attesa viene soddisfatta, la funzione restituisce il valore "true".
La seconda funzione è altrettanto semplice. Se viene richiamata la funzione serialDebug, il programma entra in un loop infinito e da quel momento in poi si comporta come il primo programma SoftwareSerial testato. Ciò significa che tutti i dati che vengono inviati al controller tramite il monitor seriale saranno inoltrati direttamente al modulo e viceversa. In caso di errore, è possibile richiamare la funzione e inviare i comandi manualmente per verificare dove si trova l'errore.
011 debug("WLAN Connected"); 012 debug("My IP is:"); 013 debug(sendCom("AT+CIFSR")); 014 } 015 else 016 { 017 018 success &= false; } 019 020 success &= sendCom("AT+CIPMODE=0", "OK"); 021 success &= sendCom("AT+CIPMUX=0", "OK"); 022 023 return success; 024 } All'inizio della funzione la variabile success viene prima impostata su true, perché ora viene collegata a varie funzioni AND.
003 boolean success = true; 004 success &= (sendCom("AT+CWMODE=1", "OK")); 005 esp8266.setTimeout(20000); 006 success &= (sendCom("AT+CWJAP=\"" + String(vSSID) + "\",\"" + String(vPASSWORT) + "\"", "OK")); 007 esp8266.setTimeout(1000); 008 return success; 009 } La funzione configStation() è stata richiamata nella funzione espConfig(). Qui viene eseguita l'impostazione della modalità WLAN sulla modalità Station tramite il comando CWMODE e infine la connessione alla rete tramite il comando CWJAP.
001 void setup() 002 { 003 // Open serial communications and wait for port to open: 004 Serial.begin(19200); 005 // set the data rate for the SoftwareSerial port 006 esp8266.begin(19200); 007 008 if (!espConfig()) serialDebug(); 009 else debug("Config OK"); 010 011 if (sendCom("AT+PING=\"www.google.de\"", "OK")) 012 { 013 Serial.println("Ping OK"); 014 digitalWrite(13, HIGH); 015 } 016 else 017 { 018 019 Serial.
baud. Solo a questo punto viene richiamata la funzione espConfig(). In caso di guasto viene avviata immediatamente la funzione serialDebug(). Se tutto funziona correttamente, viene inviato il relativo messaggio. Nei programmi successivi il LED sul pin 13, contrassegnato sulla scheda con D3, si accende se la configurazione è stata eseguita correttamente. Si dispone così di un feedback, se il modulo non è collegato a un PC con il monitor seriale.
Collegamento dell'altoparlante piezoelettrico Il codice sorgente per questo progetto è diverso da quello dell'esperimento precedente soprattutto per quanto riguarda le seguenti funzioni: 001 void findSSID() 002 { 003 004 005 esp8266.println("AT+CWLAP"); if (esp8266.
013 014 for (int i; i <=30; i++) 015 { 016 tone(PIEZO, 400, 500); 017 delay(500); 018 tone(PIEZO, 800, 500); 019 delay(500); 020 } 021 022 digitalWrite(LED_ALARM, LOW); 023 } La funzione findSSID() viene richiamata circa ogni 30 secondi nella routine loop e cerca tutte le reti nella zona. Se viene trovata la rete desiderata, viene attivata la funzione alarm() che accende il LED D3 ed emette un segnale acustico sul componente piezoelettrico.
quindi che il valore di un numero può essere al massimo 255. Fondamentalmente esistono indirizzi IP locali, ossia che ad esempio vengono distribuiti sul computer e sui dispositivi della rete domestica, e IP globali. Gli IP locali sono di solito distribuiti dal router. In genere iniziano con i numeri 192.168. I numeri che seguono variano da router a router. Se NanoESP funge da access point e aggancia computer nella propria rete, i PC ricevono un indirizzo che inizia con 192.168.4.
U Non prevede una sola connessione, bensì è possibile lo scambio veloce dei dati. U Ci sono poche variazioni nel ritardo di trasmissione. U Il formato, per esempio, è adatto per il VoIP (Voice over IP - cioè le chiamate via Internet). Questi sono solo i principi fondamentali più importanti per la descrizione dei concetti dei progetti seguenti. L'argomento potrebbe essere trattato in modo ancora più approfondito, e al momento opportuno saranno fornite ulteriori informazioni.
Le impostazioni corrette nel programma Packet Sender Il programma sul computer ora serve come server UDP, mentre il controller è impostato come client UDP. Nel protocollo UDP la distinzione client/server non è chiara, ma in questo caso significa che è possibile inviare i dati al computer tramite il controller.
Il messaggio è stato trasmesso correttamente. Per inviare i dati, utilizzare il comando: AT+CIPSEND=7 7 indica il numero dei caratteri da inviare. Viene visualizzato il carattere> come valore di ritorno. Questo significa che ora è possibile trasmettere il messaggio. Immettere Hello e confermare ancora con [Enter], Come valore di ritorno il modulo invia SEND OK, anche se sono stati immessi solo cinque caratteri.
002 { 003 boolean success = true; 004 005 success &= (sendCom("AT+CIPMODE=0", "OK")); 006 success &= (sendCom("AT+CIPMUX=0", "OK")); 007 success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2\",90", "OK"); //UDP-Server 008 return success; 009 } Nel programma Arduino, per il percorso di comunicazione è fondamentale la funzione configUDP(). Qui vengono eseguite impostazioni importanti per la trasmissione. In primo luogo, la modalità di trasparenza dei dati viene impostata con CIPMODE su 0.
001 +IPD,2:Hi 002 OK Packet Sender ha trasmesso correttamente "Hi". Il messaggio è stato quindi ricevuto. È possibile rispondere utilizzando nuovamente il comando CIPSEND, quindi, per esempio: 001 AT+CIPSEND=7 002 >Hello La differenza rispetto al programma precedente è in una sola riga: success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.
Come si può vedere, è stata specificata una seconda porta. La porta in questione, con il numero 91, è quella attraverso cui il modulo attende a sua volta i dati in ingresso. Con gli allegati a questa semplice riga è possibile inviare anche dati al modulo. Tra l'altro, è anche possibile ascoltare sulla stessa porta da cui si sta inviando. Quindi per entrambe le porte si potrebbe immettere il numero 90. In teoria il cambiamento rende inoltre possibile che il modulo riceva i propri dati. 2.
tramite il messaggio +IPD. I comandi legittimi che possono essere inviati tramite Packet Sender sono led1 e led0. Il controller li interpreta e di conseguenza accende o spegne il LED. Viene anche trasmesso un feedback al mittente. Se viene inviato un altro comando, sul monitor seriale appare il messaggio "Wrong UDP Command". Lo stesso messaggio viene trasmesso al mittente anche attraverso la rete.
016 017 else { 018 debug("Wrong UDP Command"); 019 if (sendCom("AT+CIPSEND=19", ">")) 020 { 021 sendCom("Wrong UDP Command", "OK"); 022 } 023 024 } 025 } 026 } 027 } L'analisi dei comandi in ingresso avviene nella routine loop, che viene eseguita continuamente. Se i dati arrivano dal modulo (esp8266.available()), saranno analizzati per ricercare caratteri "+IPD".
Lo switch collegato a D8 consente di risparmiare spazio Il programma Il programma valuta ulteriormente i comandi in entrata. Inoltre, il pulsante riceve continue query. Se azionato dall'utente, il controller invia il testo Button=1 alla rete. Tutti i dispositivi collegati al modulo con un server UDP sulla porta 90 possono ricevere il comando. È possibile verificarlo nuovamente tramite Packet Sender.
Il Processo in Packet Sender Le modifiche al programma si trovano principalmente nella routine loop. Una semplice query if controlla se l'interruttore viene premuto. Se questo è il caso, il controller trasmette il messaggio Button=1 alla rete. Inoltre, viene trasmesso un messaggio debug. Il loop while seguente fa sì che non venga inviata una marea di comandi finché si tiene premuto il l'interruttore. È necessario rilasciare il pulsante affinché il programma possa continuare.
sensori e attuatori. 2.5 | Sensore analogico Nell'ultimo progetto è stata trattata la forma più semplice di sensore con un tasto. Questa volta si tratta di un potenziometro utilizzato come sensore analogico per inviare letture alla rete in modo permanente. Il potenziometro fornito viene utilizzato con 10 kΩ. La configurazione è visibile nella figura seguente.
La comunicazione con la scheda è simile a quella degli esperimenti precedenti. Purtroppo l'IP del modulo e del computer sono cambiati, perché entrambi i dispositivi ora hanno un indirizzo IP assegnato dal router. Dopo l'avvio Packet Sender non riceve ancora nessun dati di misurazione. Innanzi tutto è necessario inviare un comando al modulo, per esempio led=1. Basta immettere in Packet Sender il nuovo IP del modulo, che si può ricavare dal monitor seriale.
di default, che è evidente quando si osservano le altre modalità. 2 Modus 1: Le impostazioni cambiano una volta. Questo significa che: Quando il modulo inizia con l'indirizzo di broadcasting già utilizzato, e poi si riceve qualcosa da un PC, il modulo si imposta sul nuovo indirizzo del PC. In altre parole, l'indirizzo IP di destinazione immesso diventa superfluo e l'invio viene fatto al nuovo indirizzo. L'indirizzo viene mantenuto anche quando il modulo riceve dati inviati da un altro PC.
CLIENT TCP Il capitolo finale descrive il protocollo UDP e la ricezione e l'invio semplice dei dati. Il protocollo prevede già una varietà di applicazioni. In questo capitolo sarà discusso il protocollo TCP (Transmission Control Protocol). Il modulo assumerà il ruolo di client TCP. Questo è il ruolo che a casa assume un PC nei confronti di un server web. La differenza tra TCP e UDP può essere più o meno riassunta nei punti seguenti: U il collegamento esiste solo tra due dispositivi.
successivo, che si conosce già: AT+CIPSEND=40 Ora si può inviare un messaggio tramite la connessione appena stabilita. Quando viene chiesto di > per inserire un testo, immettere quanto segue: GET / HTTP/1.1 e premere [Enter]. [Enter] non viene visualizzato nel monitor seriale, ma il modulo ha ricevuto il comando. Dopo di che, il messaggio prosegue con Host:www.example.com seguito da due [Enter], È necessario inviare le immissioni in rapida successione.
possono trovarsi diversi siti web. Se si desidera richiedere una pagina diversa da home page, scrivere invece /, per esempio /example.html, Oltre alla sottopagina richiesta, il browser invia molte altre informazioni in aggiunta alla risorsa richiesta. Tra l'altro vengono trasmessi dati come browser utilizzato, sistema operativo, risoluzione dello schermo e molto altro ancora. Ciò consente al server di personalizzare i contenuti. Quindi segue la risposta del server, che in un primo momento sembra complessa.
004 int xyear, xmonth, xday, xhour, xminute, xsecond; //lokal variables 005 006 success &= sendCom("AT+CIPSTART=\"TCP\",\"" + Host + "\",80", "OK"); 007 String getRequest = "GET " + Subpage + " HTTP/1.1\r\nHost:" + Host + "\r\n"; 008 success &= sendCom("AT+CIPSEND=" + String(getRequest.length() + 2), ">"); 009 010 esp8266.println(getRequest); 011 012 if (esp8266.find("+IPD")) 013 { 014 if (esp8266.find("\r\n\r\n")) 015 { 016 xyear = esp8266.parseInt(); 017 xmonth = esp8266.
029 return true; 030 } 031 else return false; 032 } 033 else return false; 034 } Questi parametri della funzione vengono passati per l'indirizzo host e indirizzo secondario. Infine viene creata la query Get-Request e successivamente viene stabilito un collegamento con il server TCP del sito. Ora la risposta del server deve essere analizzata. A tale scopo, l'intera parte header della richiesta viene ignorata, cercando \r\n\r\n ovvero nient'altro che un doppio Carriage Return und New Line.
Collegamento del LED RGB ai pin D3, D5 e D6 Il programma Nel disegno si tratta di nuovo della chiamata a un sito web, ma questa volta è una pagina appositamente programmata per questo progetto che si riferisce ai dati meteo del sito http://www.openweathermap.com/ . In questa pagina, variando l'URL è possibile ottenere informazioni sul tempo della propria città. Il nome della città per la quale si desidera eseguire una query può essere immesso nel codice sorgente dietro City.
004 005 006 007 if (val <= 10 & val >= -20) blue = map(val, -20, 10, 255, 0); else blue = 0; 008 009 010 if (val >= 10 & val <= 40) green = map(val, 10, 40, 255, 0); 011 else if (val >= -20 & val < 10) green = map(val, -20, 10, 0, 255); 012 else green = 0; 013 014 if (val > 10 & val <= 40) red = map(val, 10, 40, 0, 255); 015 else red = 0; 016 017 analogWrite(RED, red); 018 analogWrite(GREEN, green); 019 analogWrite(BLUE, blue); 020 } La regolazione della luminosità del LED viene eseguita
vediamo ora il suo funzionamento come server TCP vero e proprio. Anche in questo caso esiste un semplice comando AT che consente di avviare questa complessa applicazione del server. Il modulo si comporterà quindi come un server TCP da Internet, è necessario programmare solo l'invio della pagina web. 4.1 | Server web TCP I primi passi per l'impostazione del server TCP non richiedono configurazione hardware aggiuntiva. Come prima cosa, provare i comandi principali sul monitor seriale.
Il browser attende una risposta e visualizza un tempo di caricamento fino a quando la connessione viene interrotta da un timeout. È possibile inviare un messaggio al browser con una variante di un comando noto: AT+CIPSEND=0,7 In questo caso il parametro 0 indica il client al quale deve essere inviato il messaggio. Questo è necessario perché sono consentite più connessioni, per cui possono essere collegati più client.
Collegare quindi una batteria alla struttura di prova. Il programma Il programma invia una pagina più complessa rispetto all'esperimento precedente. Inoltre, è possibile comandare il LED sul pin D9 immettendo /LED in corrispondenza dell'IP del modulo. Lo stato attuale del LED viene quindi invertito, e sarà commutato ogni volta (toggle). Inserire i dati della WLAN e caricare il programma. L'IP della scheda viene visualizzato sul monitor seriale.
010 011 String webpage = "
Hello World!
Open [IP]/LED to Toggle LED on D9"; 012 013 if (sendCom("AT+CIPSEND=" + String(connectionId) + "," + String(webpage.length()), ">")) 014 { 015 sendCom(webpage,"SEND OK"); 016 sendCom("AT+CIPCLOSE=" + String(connectionId),"OK"); 017 debug("Send and Close"); 018 } 019 020 } } 021 } Per avviare il server web è nuovamente disponibile una semplice funzione denominata configTCPServer() che svolge le operazioni già eseguite manualmente in precedenza.tramite un LED. La costruzione di questo esperimento non differisce da quella del precedente: un LED sul pin D9, che può essere controllato dal modulo. Ma il codice sorgente contiene alcune novità. Il programma Dopo il caricamento del programma è possibile richiamare la pagina web del controller da un browser. Per questo è necessario digitare solo l'IP del modulo, che viene visualizzato all'avvio sul monitor seriale.
probabilmente sono già state viste in altri progetti che contengono stringhe. Un'anteprima della pagina web in formato HTML è disponibile anche nella cartella del programma.
011 else 012 { 013 success = false; 014 } 015 return success; 016 } La routine loop attende ora una richiesta Request. Se arriva, viene richiamata la funzione sendWebsite(), che viene passata come parametro della funzione createWebsite(). In questo modo è possibile rilevare la lunghezza del testo tramite la funzione length(). Dopo aver trasferito la pagina web, la connessione viene nuovamente chiusa con il comando AT+CIPCLOSE.
005 006 Dopo HEAD segue BODY, ovvero il contenuto della pagina web. Nell'area iniziale di BODY vengono stabiliti anche parametri quali il colore dello sfondo e del testo. Possono essere regolati a piacimento, in qualsiasi momento. Segue la definizione di un font e la dimensione del carattere nell'elemento FONT. Questi valgono solo per il testo Switch LED che sembra particolarmente grande, allora l'elemento FONT viene nuovamente terminato con .
L'elemento form, come suggerisce il nome, ha lo scopo di creare moduli su Internet. Possono essere moduli di registrazione per una pagina oppure questionari o documenti simili. Il trasferimento dei dati dell'utente può essere fatto in modo diverso. In questo elemento si utilizza il metodo GET, in cui i dati saranno facilmente trasferiti utilizzando l'URL sul server web. In questo modulo vengono utilizzati due pulsanti.
La pagina del Swiss Converter Tool dopo la conversione corretta Incollare il testo dagli Appunti e passare al punto 2. Select Output: le impostazioni C/C++/PHP – StringText e UTF-8 – Unix (LF). Nella finestra inferiore appare già il noto testo Arduino che può essere copiato nella variabile Progmem site. Se si utilizza il programma modificato con le nuove variabili caricate, è possibile visualizzare la nuova pagina web richiamando la scheda IP nel browser. 4.
Collegamento del LED RGB ai pin D3, D5 e D6 Il programma La nuova pagina web si trova ancora nelle variabili Progmem site. Anche in questo caso, è possibile visualizzare la pagina HTML nella cartella dei disegni. Dopo l'impostazione dei dati della WLAN e il caricamento del programma è possibile raggiungere la pagina web del server web tramite l'IP del modulo. Per quanto riguarda il colore dello sfondo e il titolo, la pagina è stata configurata come la precedente.
La pagina web nel browser La selezione del colore nel browser Chrome Sebbene il design della pagina web non è molto diverso dal precedente, vi sono ancora alcuni elementi che vorrei brevemente descrivere in maggior dettaglio. In primo luogo, una modifica nell'intestazione del documento HTML, che interessa la riga seguente: Questa riga indica che il browser non tenta di caricare il cosiddetto favicon dopo aver caricato la pagina.
onchange="this.form.submit()"), che assicura che il modulo venga inviato immediatamente in caso di una modifica. L'elemento Color Picker nel browser Android 5.0 Ciò consente di risparmiare un ulteriore pulsante. 001
Il colore selezionato viene ora trasmesso nella forma /?rgb=%23, seguito da altri sei caratteri. L'espressione 23% suggerisce che si tratta di un numero esadecimale.007 int g = number >> 8 & 0xFF; 008 int b = number & 0xFF; 009 010 analogWrite(RED, r); 011 analogWrite(GREEN, g); 012 analogWrite(BLUE, b); 013 } Tramite la funzione strtol() , il testo ricevuto dopo 23% viene prima convertito in un numero long e successivamente in tre valori di byte attraverso la manipolazione dei bit. Questi valori vengono infine trasferiti al LED RGB tramite la funzione analogWrite(). 4.
Collegamento del fototransistor al pin A6 con resistenza trasversale da 10 kOhm Il programma Fino ad ora i siti del server web sono sempre stati composti da una pagina non modificabile che inviava dati al controller. Ora il sito deve essere modificato prima della trasmissione al browser per visualizzare la luminosità misurata del fototransistor. Questo funziona perché il codice sorgente della pagina web è un segnaposto nascosto.
Per il funzionamento del sistema, nei file HTML sono state apportate altre piccole modifiche. La prima si trova di nuovo nell'area intestazione: Questa piccola riga assicura che il browser carichi automaticamente la pagina ogni tre secondi. Ciò consente di evitare di premere continuamente [F5]per vedere i nuovi valori aggiornati.
014 } La sostituzione del segnaposto avviene nella funzione createWebsite(). Innanzitutto, la variabile Progmem viene caricata come al solito dalla memoria e memorizzata in una stringa. Prima che la funzione restituisca questa stringa, tutte le catene di caratteri *bright* vengono sostituite dal valore di misura corrente sul sensore. La funzione stringa replace() svolge questo compito in modo completamente automatico.
Attenzione! I LED non possono essere collegati senza resistenze. Se ciò in questo caso è consentito, le resistenze ON dei FET interni delle porte raggiungono circa i 30 Ohm. Poiché i LED si trovano tra due porte, lavorano effettivamente con una pre-resistenza di 60 Ohm. A seconda del tipo e del colore del LED, una corrente LED si regola tra 15 mA e 30 mA, valori ancora ammissibili. Il programma La pagina web di questo programma utilizza le cosiddette caselle di controllo come elementi HTML.
006 D5 007 D6 008 D7 009
010 011