Zdalny odczyt czujnika z dowolnego miejsca na Ziemi (pod warunkiem że jest tam dostęp do internetu).
Zasada przesyłania i pobierania danych:
Wykorzystamy do tego celu ESP32 (może być dowolny), czujnik DS18B20, router z uruchomioną siecią WiFi (2,4 GHz) w domu, biurze lub zakładzie pracy oraz skrypty php na serwerze.
Podłączenie DS18B20 do ESP32:
DS w tym przykładzie jest podłączony pod D15. Można podłączyć pod inny pin tylko trzeba wtedy zmienić to w programie dla ESP.
Kod dla ESP32:[syntax=cpp]/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com
*********/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "ESP32"; // Nazwa twojej sieci WiFi (tylko 2,4 GHz!)
const char* password = "m5hwhsGk_dupa_malkontenta_demt"; //hasło do twojej sieci WiFi
const char* serverName = "https://www.jaglarz.info/android/postAtnel/zapistemp.php?temperature=";
//powyższy adres musisz sobie dostosować do swojego ustawienia, nazwa domeny + katalogi + nazwa pliku php
// GPIO where the DS18B20 is connected to
const int oneWireBus = 15;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
int a = 0;
void setup() {
Serial.begin(115200);
sensors.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Łączenie z siecią Wi-Fi...");
}
Serial.println("Połączono z siecią Wi-Fi!");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String serverPath = serverName;
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
serverPath += temperatureC;
http.begin(serverPath.c_str());
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.print("Kod odpowiedzi HTTP: ");
Serial.println(httpResponseCode);
String response = http.getString();
Serial.println(response);
} else {
Serial.print("Błąd wysyłania żądania: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("Błąd połączenia z siecią Wi-Fi");
}
delay(3000); //czas po którym na serwer zostanie wysłana następna dana, można ustawić dowolnie, jedną sekundę lub 10 minut - jak komu pasuje
}[/syntax]
W Arduino IDE muszą być zainstalowane 4 biblioteki:
OneWire.h DallasTemperature.h WiFi.h oraz
HTTPClient.h Potrzebujemy jeszcze na serwerze www umieścić 2 skrypty php:
Odbiorczy do którego ESP32 będzie wysyłać pomiary o nazwie zapistemp.php:
[syntax=php]<?php
//if(isset($_GET['temperature'])) {//
$str = $_GET['temperature'];
if(!$fd = fopen("temp.txt", 'wb')){
echo("Nie mozna otworzyć");
}
else{
if(fwrite($fd, $str) === false){
echo("Nie zapisano");
}
else{
}
fclose($fd);
}
?>[/syntax]
oraz nadawczy z którego można odczytać liczbę o nazwie odczyttemp.php:
[syntax=php]<?php
function getHits()
{
if(($fp = @fopen("temp.txt", "r+")) === false)
return false;
$count = fgets($fp);
return $count;
}[/syntax]
Oba pliki php należy umieścić na serwerze www. U mnie są one umieszczone w katalogu
android i podkatalogu
postAtnel co widać w adresie
https://www.jaglarz.info/android/postAt ... istemp.php. Pod ten adres dana jest wysyłana.
Jeśli wszystko będzie dobrze zrobione i wszystkie nazwy/ścieżki będa prawidłowe aktualne wyniki pomiarów można wyświetlić wywołując w przeglądarce adres
https://www.jaglarz.info/android/postAtnel/odczyttemp.php Jest tu wyświetlana temperatura w moim pokoju.
Oczywiście wasz adres będzie inny. Zgodny z nazwą domeny oraz nazwą katalogów.
Można w ten sposób odczytywać dane z wszystkich czujników które da się odczytać przy pomocy mikrokontrolera - temperatury, wilgotności, ciśnienia, odległości, stany włączników/wyłączników, czujki podczerwieni.
Jeśli ktoś zna php + ewentualnie mySQL może sobie zrobić rejestrowanie danych o określonej godzinie, wykresy i inne cuda.
Ktoś powie że są już gotowe rozwiązania. No i dobrze. Niech każdy stosuje co chce.
Ja mam nudzący się serwer + chciałem sprawdzić czy dam radę tak zrobić.
Teoretycznie wygodniej wynik pomiaru byłoby wyświetlać w aplikacji. Być może taka powstanie na potrzeby tego postu. Jest już gotowa w 90% ale mam dysfunkcję systemu motywacyjnego czyli mówiąc inaczej choruję na Lenius Pospolitus.
Kody nie są optymalne. Są to efekty prób jakie robiłem. Proszę nie bić lutownicą.