Web Client Repeating HTTP Request con Arduino MKR1000

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 valoreuser 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: