Zapis danych za pomocą ESP do bazy danych MySQL

Ten artykuł zaprezentuje Ci w jaki sposób dokonać zapisu danych za pomocą płytek z ESP8266 w bazie danych MySQL.

Ja do prezentacji użyję klona płytki WeMos D1 Mini ale kod przedstawiony w tym poradniku będzie działać dla wszystkich płytek których sercem jest ESP8266, np WeMos D1, NodeMCU i wielu innych.

Lista potrzebnych elementów:

  • Płytka z ESP8266 (w przykładzie użyty WeMos D1 Mini)
  • Dowolny serwer WWW obsługujący PHP
  • Dowolny serwer MySQL

Lista elementów dodatkowych:

  • Płytka stykowa
  • Przewody
  • Przycisk
  • Termometr DS18B20
  • Rezystor 4,7kΩ

Zacznijmy od utworzenia bazy danych w MySQL gdzie zaczniemy od utworzenia tabeli o nazwie „test” która będzie zawierać kolumny o nazwach „ID” z włączoną opcją Auto Increment, „Dane1″ i” Dane2″ z ustawionym typem zmiennej text. Gotowa tabela powinna wyglądać tak jak na załączonym obrazku:

Tabelę można dodać np. w popularnym phpMyAdmin który znajdziemy w większości hostingów lub w mniej popularnym lubianym prze zemnie lekkim skrypcie Adminer.

Teraz utworzymy plik PHP który będzie dodawać dane do naszej bazy danych, plik nazwiemy add.php oraz umieścimy go na serwerze WWW.

<?php
$servername = "mysql.ct8.pl"; //Adres serwera MySQL
$username = "m2969_tutorial"; //Nazwa konta użytkownika MySQL
$password = "Tutorial123"; //Hasło do konta użytkownika MySQL
$dbname = "m2969_tutorial"; //Nazwa bazy danych
 
$conn = new mysqli($servername, $username, $password, $dbname); //Utworzenie połączenia z MySQL

if ($conn->connect_error) { //Sprawdzenie połączenia z MySQL
    die("Connection failed: " . $conn->connect_error); //Wyświetlenie informacji o problemie z połączeniem
}

$a = $_GET["a"]; //Odebranie danych wysłanych przez ESP
$b = $_GET["b"]; //Odebranie danych wysłanych przez ESP

$sql = "INSERT INTO test (Dane1, Dane2)
 VALUES ('$a', '$b')"; 
 //W pierwszej lini następuje zdefiniowanie nazwy tabeli oraz kolumn do których mają zostać dodane dane
 //a w drugiej definiowanie danych które zostaną dodane to tabeli

 //  Można to polecenie także zapisać w formie jednej lini ale polecam pozostać przy zapisie w dwóch liniach ponieważ jest bardziej przejrzysty
 //  $sql = "INSERT INTO test (Dane1, Dane2) VALUES ('$a', '$b')"; 
 
if ($conn->query($sql) === TRUE) { //Sprawdzenie czy dane zostały poprawnie dodane do tabeli
    echo "Rekord zostal dodany poprawnie!"; //Wyświetlenie komunikatu o powodzeniu
} else {
    echo "Error: " . $sql . "<br>" . $conn->error; //Wyświetlenie komunikatu o niepowodzeniu wraz z informacjami na temat błędu
}
 
$conn->close(); //Zamknięcie połączenia z MySQL
?>

Teraz w celu przetestowania czy poprawnie skonfigurowaliśmy skrypt PHP możemy wejść na naszą stronę zawierającą plik php.
Po wejściu na stronę powinniśmy ujrzeć komunikat „Rekord zostal dodany poprawnie!” a w bazie danych powinien pojawić się pusty wiersz posiadający ID 1 tak jak na załączonej grafice.

Zapis do bazy danych od strony serwera mamy już gotowy, teraz nadszedł czas na zaprogramowanie naszego ESP.

A więc zacznijmy od przykładu który po uruchomieniu ESP wyśle do bazy danych wartość zwróconą przez millis() oraz napis test.

#include <ESP8266WiFi.h> //dodanie biblioteki odpowiedzialnej za komunikacje WiFi
#include <ESP8266WiFiMulti.h> //dodanie biblioteki odpowiedzialnej za komunikacje WiFi
#include <ESP8266HTTPClient.h> //dodanie biblioteki odpowiedzialnej za komunikacje WiFi
ESP8266WiFiMulti WiFiMulti; //Utworzenie zmiennej przechowujacej dane o sieci WiFi

void setup() {
	Serial.begin(115200); //Uruchomienie polaczenia o szybkosci 115200
	WiFiMulti.addAP("NazwaSieciWiFi", "HasloDoSieciWiFi"); //Ustalenie danych do polaczenia z WiFi
	while ((WiFiMulti.run() != WL_CONNECTED)) { //oczekiwanie na polaczenie
		Serial.print("."); //wyswietlanie kropek w czasie oczekiwania na polaczenie
		delay(200); //odczekanie 200ms do kolejnego sprawdzenia czy upolaczono z siecia
	}
	if ((WiFiMulti.run() == WL_CONNECTED)) { //sprawdzenie czy polaczono z siecia
		HTTPClient http; //ustalenie zmiennej polaczenia jako klijent
		String content = "http://strona.pl/add.php?a="; //utworzenie zmiennej której zawartość zostanie potem wykorzystana do polaczenia, nalezy tutaj zmienic adres z "strona.pl" na adres naszej strony
		content += millis(); //dodanie danych do zmiennej

		content += "&b="; //dodanie danych do zmiennej
		content += "test"; //dodanie danych do zmiennej

		Serial.print("[HTTP] begin...\n"); //wyswietlenie komunikatu o oczekiwaniu na odpowiedz serwera
		http.begin(content); //wykonanie polaczenia z wykorzystaniem zmiennej
		int httpCode = http.GET(); //odczytywanie informacji o polaczeniu z strona
		if (httpCode > 0) { //sprawdzenie czy polaczenie z strona nastapilo poprawnie
			Serial.printf("[HTTP] GET... code: %d\n", httpCode); //wyswietlenie kodu polaczenia
			if (httpCode == HTTP_CODE_OK) { //sprawdzanie czy strona cos zwrocila
				String payload = http.getString(); //odczytanie informacji zwroconych przez strone
				Serial.println(payload); //wyswietlanie informacji zwroconych przez strone
			}
		}
		else {
			Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); //wyswietlenie bledu jesli polaczenie nie nastapilo poprawnie
		}
		http.end(); //zakonczenie polaczenia
	}
}

void loop() {

}

Po wgraniu tego kodu w monitorze portu szeregowego powinniśmy ujrzeć podobne informacje jak ja:

„………..[HTTP] begin…
[HTTP] GET… code: 200
Rekord zostal dodany poprawnie!”

A w bazie danych powinny zostać dodane informacje (liczba może się różnić):

Teraz czas na bardziej praktyczny przykład, dodawanie danych do bazy po wciśnięciu przycisku.

Przycisk podpinamy do GND oraz pinu D5 a termometr do GND, 3,3V oraz pinu D6, między D6 a 3,3V wpinamy rezystor 4,7kΩ, na załączonym obrazku użyłem wodoodpornej wersji termometru DS18B20.

Po podłączeniu przychodzi czas na napisanie programu:

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
ESP8266WiFiMulti WiFiMulti;

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
	sensors.begin();
	Serial.begin(115200);
	WiFiMulti.addAP("NazwaSieciWiFi", "HasloDoSieciWifi");
	while ((WiFiMulti.run() != WL_CONNECTED)) {
		Serial.print(".");
		delay(200);
	}
	pinMode(D5, INPUT_PULLUP);
}
int dodania = 0;
void loop() {
	if (digitalRead(D5) == LOW){
		if ((WiFiMulti.run() == WL_CONNECTED)) {
			dodania = dodania + 1;
			sensors.requestTemperatures();
			HTTPClient http;
			String content = "http://strona.pl/add.php?a=";
			content += sensors.getTempCByIndex(0);

			content += "&b=";
			content += dodania;

			Serial.print("[HTTP] begin...\n");
			http.begin(content);
			int httpCode = http.GET();
			if (httpCode > 0) {
				Serial.printf("[HTTP] GET... code: %d\n", httpCode);
				if (httpCode == HTTP_CODE_OK) {
					String payload = http.getString();
					Serial.println(payload);
				}
			}
			else {
				Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
			}
			http.end();
		}
	}
}

Ja u mnie wcisnąłem przycisk 4 razy co w efekcie dało nam 4 zapisy temperatury.

Napiszmy więc teraz skrypt PHP który odczyta te dane i wyświetli na stronie, a więc zacznijmy od utworzenia pliku read.php

<html>
    <head>
        <title>Tutorial</title>
    </head>
    <body>
		<?php
		$servername = "mysql.ct8.pl";
		$username = "m2969_tutorial";
		$password = "Tutorial123";
		$dbname = "m2969_tutorial";
		$conn = new mysqli($servername, $username, $password, $dbname);
		if ($conn->connect_error) {die("Connection failed: " . $conn->connect_error);}
		$sql = "SELECT id, dane1, dane2 FROM test ORDER BY id DESC LIMIT 100";
		$result = $conn->query($sql);
		if ($result->num_rows > 0) {
			echo '<table cellspacing="0" border="1" rules="rows" bordercolor="black">';
			echo '<tr>
					<td width="100px" bgcolor="silver" align="center">ID:</td>
					<td width="100px" bgcolor="gray" align="center">Dane1:</td>
					<td width="100px" bgcolor="silver" align="center">Dane2:</td>
				</tr>';
			while($row = $result->fetch_assoc()) {
				echo '<tr>
						<td bgcolor="silver" align="center">' . $row["id"]. '</td>
						<td bgcolor="gray" align="center">' . $row["dane1"].'</td>
						<td bgcolor="silver" align="center">' . $row["dane2"]. "</td>
					</tr>";
			}
			echo "</table>";
		} else {
			echo "0 results";
		}
		$conn->close();
		?>
    </body>
</html>

Po wejściu na stronę ujrzymy taką o to tabelkę:

I to by było na tyle w dzisiejszym poradniku, dziękujemy za zainteresowanie naszymi poradnikami. 🙂

Dawid Przychodni

Create Account



Log In Your Account