Sending data to the Internet via Ethernet and Wifi, processing

When we need to use Arduino's full potential in connectivity mode, we have two options. Make a webserver from Arduin, or send data to the Internet, which will make Arduino much easier. This tutorial contains sketches that are used to send data to the Internet via HTTP, HTTPS protocol, sending mode can be called Webclient mode, or simply a client when we connect to a remote server. All sample sketches will be designed for sending and processing of 2x temperature from DS18B20 sensors, DHT12 humidity, atmospheric pressure for BMP280. To process the result on the webserver side, we use the PHP language in the procedural version.
Tutorial for Arduino (Wiznet W5100 Ethernet shield - HTTP only):
Obrázek
#include <OneWire.h> //KNIZNICA ONEWIRE PRE VYUZITIE ONEWIRE ZBERNICE #include <DallasTemperature.h> //KNIZNICA PRE TEPLOTNE CIDLA DS18B20 #define ONE_WIRE_BUS 6 //DEFINICIA PINU AKO ZBERNICE PRE ONEWIRE ZARIADENIA.. TU ZBIERAME UDAJE OneWire oneWire(ONE_WIRE_BUS); //ONEWIRE ČÍTAŤ IBA NA PORTE DEFINOVANOM VYSSIE DallasTemperature sensors(&oneWire); //PRIRADENIE SENZOROV DALLAS DS18B20 NA ONEWIRE ZBERNICU #include <SPI.h> //KNIZNICA SPI.H, PODPORUJE AJ I2C PRIPOJENIA PRE BMP280 #include <DHT12.h> //KNIŽNICA NA SENZOR DHT12 PRE ZAZNAM VLHKOSTI #include <Ethernet.h> //KNIZNICA ETHERNET.H PRE MOZNOST VYUZITIA ETHERNET SHIELDU #define Hostname "Meno zariadenia v sieti" //DEFINICIA MENA V SIETI Adafruit_BMP280 bmp; // BMP280 NA ZBERNICI I2C #include <Adafruit_Sensor.h> #include "Adafruit_BMP280.h" //LOKALNA KNIZNICA SENZORA BMP byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; //MAC ADRESA --> VOLITELNA char server[] = "www.mojastranka.sk"; //ADRESA WEBSERVERA (MOZE BYT AJ IP ADRESA, AK NEVYUZIVA DNS) IPAddress ip(192, 168, 1, 100); //IP ADRESA ZARIADENIA V SIETI V LOKALNEJ SIETI EthernetClient client; //SPUSTENIE ETHERNETU AKO CLIENTA DHT12 dht12; //INICIALIZACIA SENZORU DHT12 void setup() { //FUNKCIA NA DEFINICIU VSTUPOV A VYSTUPOV ZAPNUTIE sensors.begin(); //START SENZOROV POD ONEWIRE (DALLASTEMPERATURE) bmp.begin(); //SPUSTENIE SNIMACA BMP280 delay(2000); //POZDRZANIE PROGRAMU 2 SEKUNDY POKYM SA INICIALIZUJE BMP280 a SENZORY Serial.begin(9600); //SPUSTENIE SERIOVEJ LINKY NA CITACIU RYCHLOST 9600 while (!Serial) { ; //CAKA POKYM SA SERIOVY PORT NEZAPNE } } void loop() { //ZACIATOK SLUCKY if (Ethernet.begin(mac) == 0) { //V PRIPADE ZLYHANIA NASTAVENIA MAC ADRESY VYPIŠ Serial.println("Chyba konfiguracie cez DHCP"); //SERIOVY VYPIS CHYBY KONFIGURACIE DHCP Ethernet.begin(mac, ip); //NASTAVENIE IP A MAC ADRESY PRE ETHERNET MODUL } if (client.connect(server, 80)) { // AK SA NAPOJI NA SERVER NA PORTE 80 (HTTP) sensors.requestTemperatures(); //VYZIADANIE HODNOT ZO SENZOROV Serial.println("Pripojenie uspesne na webserver"); //VYPIS NA SERIOVU LINKU client.print("GET /add.php?temp1="); //ZAČIATOK HTTP REQUEST --> client.print GET METODOU s oznacenim premennej, do ktorej pridame hodnotu v URL client.print(sensors.getTempCByIndex(0)); // VYPIS HODNOTY 1. SENZORU NA INDEXE 0 DO URL client.print("&tempinside="); //TEXTOVE DOPLNENIE DRUHEJ PREMENNEJ DO KTOREJ UVEDIEME COMU SA ROVNA TAKTIEZ V URL client.print(sensors.getTempCByIndex(1)); // VYPIS HODNOTY 2. SENZORU NA INDEXE 1 DO URL client.print("&humidity="); //TEXTOVE DOPLNENIE TRETEJ PREMENNEJ DO KTOREJ UVEDIEME COMU SA ROVNA TAKTIEZ V URL client.print(dht12.readHumidity()); // VYPIS VLHKOMERU DO LINKU, HODNOTA, KTOREJ SA ROVNA PREMENNA HUM1 client.print("&pressure="); //TEXTOVE DOPLNENIE STVRTEJ PREMENNEJ DO KTOREJ UVEDIEME COMU SA ROVNA TAKTIEZ V URL client.print((bmp.readPressure() / 100) + 30, 120481927710843373493975903614); // VYPIS BAROMETRA DO LINKU + PRIPOCITANA KONSTANTA NA ZAKLADE NADMORSKEJ VYSKY PRE SPRAVNY PREPOCET NA RELATIVNY TLAK client.println(" HTTP/1.1"); // UKONCENIE REQUESTU ZALOMENIM RIADKA A DOPLNENIM HLAVICKY HTTP S VERZIOU client.println("Host: www.mojastranka.sk"); // ADRESA HOSTA, NA KTOREHO BOL MIERENY REQUEST (NIE PHP SUBOR) client.println("Connection: close"); //UKONCENIE PRIPOJENIA ZA HTTP HLAVICKOU client.println(); //ZALOMENIE RIADKA KLIENTSKEHO ZAPISU client.stop(); // UKONCENIE PRIPOJENIA ETHERNET SHIELDU Serial.println("Odoslane hlavicky s datami: "); //SERIOVY VYPIS O STAVE USPESNOSTI PRENOSU Serial.println("Teplota von: "); //SERIOVY VYPIS TEXT O TEPLOTE Serial.println(sensors.getTempCByIndex(0)); //SERIOVY VYPIS STAV TEPLOTY NA SENZORE EVIDOVANOM NA INDEXE 0 Serial.println("Teplota dnu: "); //SERIOVY VYPIS TEXT O TEPLOTE Serial.println(sensors.getTempCByIndex(1)); //SERIOVY VYPIS STAV TEPLOTY NA SENZORE EVIDOVANOM NA INDEXE 1 Serial.println("Vlhkost vzduchu: "); //SERIOVY VYPIS TEXT O VLHKOSTI VZDUCHU Serial.println(dht12.readHumidity()); //SERIOVY VYPIS STAVU VLHKOSTI Serial.println("Atmosfericky tlak: "); //SERIOVY VYPIS TEXT O TLAKU VZDUCHU Serial.println((bmp.readPressure() / 100) + 30, 120481927710843373493975903614); //SERIOVY VYPIS STAVU RELATIVNEHO TLAKU 30,... je konstanta pre nadmorsku vysku, ktora sa prirata k teplote. (Použite pri nadmorskej do 1000m nadmorska vyska/8,3 tuto hodnotu napiste namiesto 30,...) Serial.println("Odpojenie uspesne."); //SERIOVY VYPIS O STAVE USPESNOSTI PRENOSU } else { // AK SA PRIPOJENIE NA SERVER NEPODARI Serial.println("Pripojenie zlyhalo"); //SERIOVY VYPIS O NEUSPESNOSTI PRIPOJENIA --> ŽIADNY HTTP REQUEST NEBOL VYKONANY } delay(15000); //15 SEKUND PAUZA POKYM NANOVO POBEZI SLUCKA PRE NOVE PRIPOJENIE A ODOSLANIE DALSICH HODNOT }
When using wifi, we can use the Arduino shield, or the board with an ESP8266 integrated chip (NodeMCU), or a separate ESP chip.

Sketch for NodeMCU HTTPS variant
Obrázek
#include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <OneWire.h> Adafruit_BMP280 bmp; // BMP280 NA ZBERNICI I2C #include <Adafruit_Sensor.h> #include "Adafruit_BMP280.h" //LOKALNA KNIZNICA SENZORA BMP #include <DallasTemperature.h> //KNIZNICA PRE TEPLOTNE CIDLA DS18B20 #define ONE_WIRE_BUS 14 //D5 DEFINICIA PINU AKO ZBERNICE PRE ONEWIRE ZARIADENIA.. TU ZBIERAME UDAJE OneWire oneWire(ONE_WIRE_BUS); //ONEWIRE ČÍTAŤ IBA NA PORTE DEFINOVANOM VYSSIE DallasTemperature sensors(&oneWire); //PRIRADENIE SENZOROV DALLAS DS18B20 NA ONEWIRE ZBERNICU #include <DHT12.h> #include <Wire.h> //The DHT12 uses I2C comunication. DHT12 dht12; #include <SPI.h> const char* ssid = "wifimeno"; const char* password = "wifiheslo"; const char* host = "mojweb.sk"; //bez https a www const int httpsPort = 443; const char* fingerprint = "13 9f 87 1d b1 85 be e6 bd 73 c1 8d 04 63 58 99 f0 32 43 92"; //sha1 certifikat stranky void setup() { Wire.begin(); sensors.begin(); bmp.begin(); Serial.begin(115200); Serial.println(); Serial.println("pripajam na wifi siet: "); Serial.println(ssid); } void loop(){ sensors.requestTemperatures(); WiFiClientSecure client; if (!client.connect(host, httpsPort)) { return; } if (client.verify(fingerprint, host)) { } else { } String temp1 = String (sensors.getTempCByIndex(0)); String tempinside = String (sensors.getTempCByIndex(1)); String humidity = String (dht12.readHumidity()); String pressure = String ((bmp.readPressure() / 100) + 30, 12); //30,12 konstanta, prepisat na: vasanadmorskavyska/8,3, vysledokom nahradit 30,12. String url = "/add.php?temp1=" + temp1+"&tempinside="+ tempinside+"&humidity="+ humidity+"&pressure="+ pressure; // client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n"); Serial.println("Odoslane"); delay(15000); 
}
Processing results online:
Once the data arrives on the web, it is necessary to process and save it to the database. The database is a great tool for archiving data for several thousand records. Data can then be easily used, can be used for charts, interactive reports, and various other actions and visualizations by programming.
First, you need to create 4 spreadsheets to which data will be sent:
TempOutside - id (Auto_increment, Primary Key) temperature (float), time (timestamp, on CURRENT_TIMESTAMP update)
TempLivingRoom - id (Auto_increment, Primary Key) temperature (float), time (timestamp, on CURRENT_TIMESTAMP update)
Humidity - id (Auto_increment, Primary Key) Humidity (float), time (timestamp, on CURRENT_TIMESTAMP update)
PressureOutside- id (Auto_increment, Primary Key) pressure (float), time (timestamp, on CURRENT_TIMESTAMP update)

PHP data processing code:
Obrázek
<?php include ("connect.php"); $temp1 = $_GET["temp1"]; $t2 = $_GET["tempinside"]; $p = $_GET["pressure"]; $h = $_GET["humidity"]; if($temp1== "" || $t2=="" || $p=="" || $h=="" || $temp1== 0 || $t2==0 || $p==0 || $h==0 || $temp1< -40 || $t2< -40 || $temp1>50 || $t2>50 || $p>1050 || $p<950 || $h==0.01 || $h==0.02 || $h==0.03 || $h==95){ echo 'Zabránenie nesprávnemu typu/hodnote dát uložiť sa do databázy!'; } else{ $ins = mysqli_query($con,"INSERT INTO `TempOutside` (`temperature`) VALUES ('".$temp1."')") or die (mysqli_error($con)); $ins2 = mysqli_query($con,"INSERT INTO `TempLivingRoom` (`temperature`) VALUES ('".$t2."')") or die (mysqli_error($con)); $ins3 = mysqli_query($con,"INSERT INTO `PressureOutside` (`pressure`) VALUES ('".$p."')") or die (mysqli_error($con)); $ins4 = mysqli_query($con,"INSERT INTO `Humidity` (`humidity`) VALUES ('".$h."')") or die (mysqli_error($con)); } 
?>
This tutorial is fully compatible with the Weather station project, which is also available in ready-made solutions. We have shown how two different Ethernet and Wifi technologies can upload data to the database via both HTTP and HTTPS protocol using PHP code to which the GET method will sell recorded data.

Comments

Popular posts from this blog

Web scraper via Arduino & NodeMCU & ESP32

ESP32 control via UDP datagrams

Biking on Google Maps - Arduino Leonardo (32u4) - HID device