Arduino MKR1000 può essere utilizzato come Client per effettuare richieste HTML ad un server in modo continuativo ad intervalli predefiniti.
In questo tutorial vediamo come effettuare ad intervalli di 5 secondi invii di HTTP Request al server tramite un file php che scrive su un Database i valori rilevati della Temperatura dal MKR1000 di un determinato USER.
Tali valori vengono poi visualizzati, una riga per ogni user connesso, su di una pagina HTML online sul server web (WebApp), raggiungibile dal link:
– www.funlab.info/corso_arduino/visualizza_valori
Questa applicazione web (visualizza_valori.php) preleva i valori inseriti da ogni user direttamente da un database sul quale questi vengono memorizzati attraverso le query lanciate dal nostro MKR1000.
All’interno del programma viene indicato il Nickname di chi le invia, che viene memorizzato insieme al Valore acquisito dal Sensore di temperatura collegato all’Arduino. Se il nickname non è presente viene aggiunta una riga indicante valore, user e data di inserimento, mentre se già presente viene solo aggiornato il valore.
La pagina php (inserimento_valori.php) di inserimento dei valori sul DB, alla quale i valori vengono passati in GET, viene lanciata attraverso la HTTP Request di Arduino.
E’ possibile eliminare un record corrispondente ad un certo user lanciando da browser il link:
– www.funlab.info/corso_arduino/elimina_valori.php?user=xxxxxxxx
dove xxxxxxxx è il nickname dello user.
Per effettuare queste azioni Arduino deve essere settato come Web Client Repeating attraverso connessioni HTML di tipo persistente.
Arduino, utilizzando la libreria WiFi101, crea un WebClient e, dopo la connessione alla rete wifi, lo connette al Server (www.funlab.info) attraverso la porta 80.
Ad ogni ripetizione del loop legge il valore acquisito sull’ingresso A6 attraverso il Sensore di Temperatura LM35 (10mV/°C) e, dopo averlo condizionato riportandolo in °C, con una HTTP Request lo invia in GET al link www.funlab.info/corso_arduino/inserisci_valori.php oltre al nickname dello user.
Es: www.funlab.info/corso_arduino/inserisci_valori.php?valore=28&user=nickname
Il circuito di collegamento del Sensore di Temperatura LM35 ad Arduino MKR1000 é:
Il codice del programma perArduino è il seguente:
/* Repeating Wifi Web Client Questo programma si connette al Server https://www.funlab.info inviando HttpsRequest attraverso file php per la scrittura dei valori sul DB. I valori inseriti dai vari utenti possono essere visualizzati al link: www.funlab.info/corso_arduino/visualizza_valori.php Modificato da: http://arduino.cc/en/Tutorial/WifiWebClientRepeating modificato il 10 Aprile 2018 Fabrizio Silvetti | Corso Informatica e Telecomunicazioni Istituto "Cattaneo-Dall'Aglio" | Castelnovo Monti RE fb: FunLab - Informatica e Telecomunicazioni */ #include <WiFi101.h> char ssid[] = "arduino2"; char pass[] = "corso_arduino"; int status = WL_IDLE_STATUS; // vars sensori T int acq_T = 0; int t_value = 0; String t_string; char user[] = "xxxxxxxx"; // nickname const int LED_connection = 6; const int pinSH = A6; //vars per lettura risposta server String risposta = ""; int risposta_length; int int_risposta_T; // server address: char server[] = "funlab.info"; unsigned long lastConnectionTime = 0; // ultima volta che ci si è connessi al server, in millisecondi const unsigned long postingInterval = 5L * 1000L; // ritardo tra le ripetizioni, in millisecondi // Inizializzazione Wifi client library WiFiClient client; void setup() { Serial.begin(9600); pinMode(LED_connection, OUTPUT); // creazione connessione alla rete NetworkConnection(); // stampa stato connessione printWifiStatus(); // connetto il client client.connect(server, 80); digitalWrite(LED_connection, HIGH); } void loop() { // lettura Sensori acq_T = analogRead(pinSH); // T0 t_value = map(acq_T,0,1023,0,330); // converto il valore di acq_T (0-1023) in °C sapendo che Vref=3,3v -> 330°C t_value = char(t_value); t_string = t_value; // quando ci sono dati provenienti dalla risposta del server alla HTTP Request while (client.available()) { char c = client.read(); //caratteri restituiti dal server //-------- Leggo i valori degli Attuatori dalla risposta dell'HTML request String txt = String(c); risposta += txt; //faccio il concatenamento dei vari caratteri usciti dal server // Length (ha in più il carattere 'null terminator', perciò sottraggo 1) risposta_length = risposta.length() - 1; Serial.print(c); } risposta = ""; // se sono passati 5 sec dall'ultima connesione, // ci riconnettiamo al server per una nuova richiesta if (millis() - lastConnectionTime > postingInterval) { httpRequest(); } verificaStatoConnessione(); } // connessione alla rete WIFI void NetworkConnection() { // attesa per la connessione Wifi while ( status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); status = WiFi.begin(ssid, pass); // ritardo di 10 sec per permettere la connessione iniziale alla rete Wifi: delay(10000); } } // verifica stato connessione WIFI void verificaStatoConnessione() { if(WiFi.status() == WL_CONNECTED){ //Serial.println("WL_CONNECTED"); } else if(WiFi.status() == WL_CONNECTION_LOST){ //Serial.println("WL_CONNECTION_LOST"); NetworkConnection(); } else if(WiFi.status() == WL_DISCONNECTED){ //Serial.println("WL_DISCONNECTED"); NetworkConnection(); } else { Serial.print("Status = "); Serial.println(WiFi.status()); } } // Print Stato WIFI void printWifiStatus() { // stampa SSID della rete Wifi Serial.print("SSID: "); Serial.println(WiFi.SSID()); // stampa IP della scheda Wifi dell'Arduino MKR1000 IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // stampa il valore dell'intensità del segnale Wifi long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); Serial.println("----------------------------------------"); Serial.println(""); } // questo metodo crea una connessione al server tramite httpRequest // www.funlab.info/corso_arduino/inserisci_valori.php?valore=28&user=fabrizio void httpRequest() { // liberando il socket nel WiFi client.flush(); // se la connessione ha successo if (client.connected()) { Serial.println("connected"); client.print("GET /corso_arduino/inserisci_valori.php?"); client.print("valore="); client.print(t_string); client.print("&user="); client.print(user); client.println(" HTTP/1.1"); client.println("Host: funlab.info"); client.println("Connection: keep-alive"); client.println(); // memorizziamo il momento della connessione lastConnectionTime = millis(); } else { // se la connessione fallisce Serial.println("connection failed"); digitalWrite(LED_connection, LOW); } }
Link correlati: