| 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.
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: <?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); } ?> oraz nadawczy z którego można odczytać liczbę o nazwie odczyttemp.php: <?php function getHits() { if(($fp = @fopen("temp.txt", "r+")) === false) return false; $count = fgets($fp); return $count; } ?> 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/postAtnel/zapistemp.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. Wynik można pobrać z serwera wywołując w przeglądarce adres https://www.jaglarz.info/android/postAtnel/odczyttemp.php Można także wynik pomiaru wyświetlać w aplikacji.
Link do aplikacji: http://www.jaglarz.info/android/postAtnel/result.apk Aby sprawdzić działanie w ustawieniach należy wpisać/wkleić: www.jaglarz.info/android/postAtnel/odczyttemp.php Przy własnych próbach należy w tym miejscu wkleić ścieżkę dostępu do własnego pliku php. Wersja na minimum Android 7 Kod Arduino dla ESP32: |
/*********
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
}