Stránka 1 z 1

DHT 11 a odesílání dat do MySQL

Napsal: 12 kvě 2020, 20:06
od Kony
Ahoj, řeším nyní odesílání dat z DHT 11 senzoru do MySQL...

NodeMCU:

Kód: Vybrat vše

#include <ESP8266WiFi.h>
#include <DHT.h>


//Def
const int myPeriodic = 300; // Time to sleep (in seconds):
#define DHTPIN D1     // what pin we're connected to
#define DHTTYPE DHT11   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

// Nazev Wi-Fi site, do ktere se mam pripojit
const char* ssid = "Kony";
// Heslo Wi-Fi site, do ktere se mam pripojit
const char* password = "xxxxxxxx";
char server[] = "xxxxxx.eu"; //URL adresa serveru
WiFiClient client;

void setup() {
 // Nastartuj seriovou linku, do ktere budu vypisovat provozni informace
 Serial.begin(9600);

 // Na pin D1 je pripojene rele, nastavim jej tedy na vystup
 // Zaroven nastavim nizkée napeti, aby se rele po startu nesepnulo
 pinMode(D1, OUTPUT);

 // Pripojeni k Wi-Fi
 Serial.println();
 Serial.print("Pripojuji k ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);

 // Dokud nejsem pripojeny k Wi-Fi,zapisuj do seriove linky tecky progressbaru
 while (WiFi.status() != WL_CONNECTED) {
 delay(100);
 Serial.print(".");
 }

 // Jsem pripojeny k Wi-Fi a mohu pokracovat
 Serial.println();
 Serial.println("WiFi pripojena!");

 // Napis IP adresu, kterou mikropocitac dostal
 Serial.print("Pouzij k pripojeni tuto adresu: ");
 Serial.print("http://");
 Serial.println(WiFi.localIP());
}

// Smycka loop se opakuje stale dokola

void loop() {
    if(client.connect(server, 80)){
        delay(1000);
        Serial.println("OK");
        delay(100);
       float temp = dht.readTemperature();
         delay(100);
        float hum = dht.readHumidity();
          Serial.print(" Temperature: ");
        Serial.println(temp);
          Serial.print(" Humidity: ");
        Serial.println(hum);
        client.print("GET http://xxxxxx.eu/aaaaaa/logger_venku_teplota.php?hodnota=");
        client.println(temp);
        client.println("Host: xxxxxx.eu");
        client.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        client.println("Connection: close");
        client.println();
        client.stop();
        delay(60000);
        client.print("GET http://xxxxxx.eu/aaaaaa/logger_venku_vlhkost.php?hodnota=");
        client.println(hum);
        client.println("Host: xxxxxx.eu");
        client.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        client.println("Connection: close");
        client.println();
        client.stop();
        delay(10000);
    }
}
na adrese www serveru :

Kód: Vybrat vše

<?php
        $server = "localhost";
        $user = "kony";
        $pass = "xxxxxxxx";
        $db = "Domacnost";

        $mysqli = mysqli_connect($server, $user, $pass, $db); //připojení k MySQL

        if($mysqli and isset($_GET['hodnota'])){ //pokud GET obsahuje 'hodnota', pokračuj
                $hodnota = sanitize($_GET['hodnota']);

                $sql = "INSERT INTO dht_venku_vlhkost (hodnota) VALUES (".$hodnota.")"; //sestavení SQL
                $doSql = $mysqli->query($sql); //vykonání SQL

                if($doSql){ //test úspěchu
                        echo 'Zápis byl úspěšný';
                }
                else{
                        echo 'Něco se nepovedlo';
                }

        }
        else{
                echo "Neco je špatně";
        }

        function sanitize($input){ //ořízne řetězec
                $input = htmlspecialchars($input);
                $input = htmlentities($input);
                $input = strip_tags($input);
                $input = trim($input);
                return $input;
        }
?>
Pokud to mám takto, tak se mi do databáze zapisuje pouze teplota, ale vlhkost ani prd....když hodnoty přehodím v pořádí odesílaní, tak se zase odešle vlhkost, ale ne teplota, takže to vždy odešle pouze první hodnutu..
V konzole, to krásně ukazuje obě hodnoty. Jestliže manuálně zapíšu do řádku na odeslání hodnotu, tak se do DB zapíše, ale Arduino ani prd...

Dále bych se chtěl zeptat, jestli lze udělat to, aby byla jedna databáze z tabulkou s hodnotama ID|timestemp|teplota|vlhkost
a aby se ty hodnoty zapisovali podle toho, takto jak to mám já, mám dvě tabulky s hodnotama ID/timestemp|hodnota, ale pro další práci a tvoření grafů by bylo určitě lepší to mít v jedné tabulce...

Re: DHT 11 a odesílání dat do MySQL

Napsal: 12 kvě 2020, 20:53
od martinius96
Funkciou client.stop(); si ukončíš spojenie.
musíš opäť zavolať if(client.connect(server, 80)){

Re: DHT 11 a odesílání dat do MySQL

Napsal: 12 kvě 2020, 21:00
od Kony
UUUUUplne presne ono. uz to fici... :roll: :roll: :roll: :roll:

Re: DHT 11 a odesílání dat do MySQL

Napsal: 12 kvě 2020, 21:02
od pavel1tu
Kdyby se ti stávalo, že se sem tam nějaká data nezapíší,
dej před řádek "klient.stop" nějaký delay() mne pomohlo 500ms u pomalejších free hostingů

Re: DHT 11 a odesílání dat do MySQL

Napsal: 12 kvě 2020, 21:20
od Kony
Ted nějak zkouším ještě pořešit ten zápopis obou hodnot do jedné tabulky

Nyní to mám zvlášť

Kód: Vybrat vše

http://konycz.eu/doma/graf_teplota.php

Kód: Vybrat vše

http://konycz.eu/doma/graf_vlhkost.php
Ale chtěl bych to dostat do jednoho grafu

Re: DHT 11 a odesílání dat do MySQL

Napsal: 12 kvě 2020, 22:05
od KamilV
A v čem je problém?

V ardu:

Kód: Vybrat vše

client.print("GET http://xxxxxx.eu/aaaaaa/logger_venku.php?teplora=");
client.print(temp);
client.print("&vlhkost=");
client.println(hum);
V php:

Kód: Vybrat vše

if($mysqli && isset($_GET['teplota']) && isset($_GET['vlhkost'])){ //pokud GET obsahuje 'hodnota', pokračuj
                $teplota = sanitize($_GET['teplota']);
                $vlhkost = sanitize($_GET['vlhkost']);
                
                $sql = "INSERT INTO dht_venku (teplota, vlhkost) VALUES (".$teplota.", ".$vlhkost.")"; //sestavení SQL

Re: DHT 11 a odesílání dat do MySQL

Napsal: 13 kvě 2020, 16:43
od Kony
Jsi jednička, funguje krásně...

A mohl bych jen info o tom jak vypsat hodnotu posledniho zaznamu ??? Abych si udělal graf a nad něj vypisoval přímo hodnoty...

Zkouším :

Kód: Vybrat vše

<?php
//index.php
$connect = mysqli_connect("localhost", "kony", "xxxxxxxxxx", "Domacnost");
$query = "SELECT * FROM dht_venku ORDER BY ID DESC LIMIT 0, 1";
$result = mysqli_query($connect, $query);
$chart_data = '';
while($row = mysqli_fetch_array($result))
{
 $chart_data .= "{ teplota:'".$row["teplota"]."', vlhost:".$row["vlhkost"].", tlak:".$row["tlak"]."}, ";
}
$chart_data = substr($chart_data, 0, -2);
 echo ($teplota);
 echo ($vlhkost);
 echo ($tlak);
?>

Re: DHT 11 a odesílání dat do MySQL

Napsal: 13 kvě 2020, 17:14
od martinius96
LIMIT musí byť 1, pričom sa ide od ID s maximálnou hodnotou, ak je order DESC. V prípade, že by si chcel opačne od minimálnej hodnoty (najstarší záznam) tak by si používal ASC v tom dopyte.

Kód: Vybrat vše

<?php
//index.php
$connect = mysqli_connect("localhost", "kony", "xxxxxxxxxx", "Domacnost");
$query = "SELECT * FROM dht_venku ORDER BY ID DESC LIMIT 1"; // v tabuľke dht_venku sa nachádza riadok s názvom ID
$result = mysqli_query($connect, $query );
$line = mysqli_fetch_assoc($result);
echo htmlspecialchars($line['teplota'])." °C";
echo htmlspecialchars($line['vlhkost'])." %";
echo htmlspecialchars($line['tlak'])." hPa";
?>
Môžeš to rozšíriť o ten substring a ten JSON formát, ktorý tam máš použitý... Tu som ho nepoužíval, iba vzorový výpis dát.

Re: DHT 11 a odesílání dat do MySQL

Napsal: 13 kvě 2020, 18:35
od Kony
Díky moc....