Arduino schéma - arduino.sk

Odosielanie dát do internetu Ethernet a Wifi, spracovanie

Kompletné projekty s návodom a zdrojovým kódom
Príspevky: 44
Registrovaný: Uto 23. Dec 2014 2:15:50

Odosielanie dát do internetu Ethernet a Wifi, spracovanie

Poslaťod martinius96 » Štv 14. Dec 2017 19:45:40

Keď potrebujeme využiť potenciál Arduina naplno v režime konektivity, máme 2 možnosti. Urobiť si webserver z Arduina, alebo odosielať dáta do internetu, čo nám Arduino značne odľahčí. Tento tutoriál obsahuje sketche, ktoré sa používajú na odosielanie dát do internetu cez HTTP, HTTPS protokol, režim odosielania môžeme nazvať Webclient mód, alebo jednoducho client, kedy sa pripájame k vzdialenému serveru. Všetky vzorové sketche budú konštruované pre odosielanie a spracovanie 2x teploty z čidiel DS18B20, vlhkosti z DHT12, atmosferický tlak pre BMP280. Na spracovanie výsledku na strane webservera použijeme jazyk PHP v procedurálnom prevedení.
Tutoriál pre Arduino (Ethernet shield Wiznet W5100 - podpora iba HTTP):
Obrázok
Kód: Vybrať všetko
#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
}

Pri pripojení prostredníctvom wifi môžeme použiť shield pre Arduino, alebo dosku s integrovaným čipom ESP8266 (NodeMCU), alebo samostatný ESP čip.

Sketch pre NodeMCU HTTPS varianta
Obrázok
Kód: Vybrať všetko
#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);
  }

Sketch pre NodeMCU HTTP varianta
Obrázok
Kód: Vybrať všetko
#include <ESP8266WiFi.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 = "mojserver.sk";
void setup() {
  sensors.begin();                                              //START SENZOROV POD ONEWIRE (DALLASTEMPERATURE)
  bmp.begin();
  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Pripajam na wifi siet");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi pripojene"); 
  Serial.println("IP adresa: ");
  Serial.println(WiFi.localIP());
}


void loop() {
  delay(5000);

  Serial.print("Pripajam sa na web: ");
  Serial.println(host);
sensors.requestTemperatures();   
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("pripojenie neuspesne");
    return;
  }
 
 
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; //
 
  Serial.print("Request na URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
 

 

  Serial.println("Odoslane");
  delay(15000);
}

Knižnice ESP8266WiFi.h a WiFiClientSecure.h sú obsiahnuté v Arduino Core pre NodeMCU a iné ESP dosky.

Spracovanie výsledku online:
Keď už dáta dorazia na web, je nutné ich spracovať a uložiť do databázy. Databáza je skvelý nástroj na archiváciu dát aj o niekoľko tisíc záznamoch. S dátami sa dá následne ľahko pracovať, dajú sa využiť na grafy, interaktívne prehľady a rôzne iné akcie a vizualizácie podľa naprogramovania.
Najskôr je nutné si vytvoriť 4 tabuľky, do ktorých sa budú dáta odosielať:
TempOutside - id (Auto_increment, Primary Key) temperature (float), time (timestamp, on update CURRENT_TIMESTAMP)
TempLivingRoom - id (Auto_increment, Primary Key) temperature (float), time (timestamp, on update CURRENT_TIMESTAMP)
Humidity - id (Auto_increment, Primary Key) humidity(float), time (timestamp, on update CURRENT_TIMESTAMP)
PressureOutside- id (Auto_increment, Primary Key) pressure (float), time (timestamp, on update CURRENT_TIMESTAMP)

PHP kód spracovania dát:
Obrázok
Kód: Vybrať všetko
    <?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)); 
       }
    ?>

Tento tutoriál je plne kompatibilný s projektom Meteostanice, ktorá sa tiež nachádza v hotových riešeniach. Ukázali sme si, ako dvomi rôznymi technológiami Ethernet a Wifi je možné nahrať údaje do databázy cez HTTP aj HTTPS protokol s využitím PHP kódu, ktorému GET metódou predáme zaznamenané dáta.

Späť na Hotové projekty