Tutoriál pre Arduino (Ethernet shield Wiznet W5100 - podpora iba HTTP):
Kód: Vybrat vše
#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
}
Sketch pre NodeMCU HTTPS varianta
Kód: Vybrat vše
#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);
}
Kód: Vybrat vše
#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);
}
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:
Kód: Vybrat vše
<?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));
}
?>