/************************************************************************************************* PROGRAMMINFO ************************************************************************************************** Funktion: LoRa Empfaenger mit WEB-Server ************************************************************************************************** Version: 11.07.2022 ************************************************************************************************** Board: TTGO LORA32-OLED V1 ************************************************************************************************** Libraries: https://github.com/espressif/arduino-esp32/tree/master/libraries C:\Users\User\Documents\Arduino D:\gittemp\Arduino II\A156_Wetterdaten_V3 ************************************************************************************************** C++ Arduino IDE V1.8.19 ************************************************************************************************** Einstellungen: https://dl.espressif.com/dl/package_esp32_index.json http://dan.drown.org/stm32duino/package_STM32duino_index.json http://arduino.esp8266.com/stable/package_esp8266com_index.json **************************************************************************************************/ // Wi-Fi Library #include #include "ESPAsyncWebServer.h" #include //LoRa Library #include #include //OLED Display Library #include #include #include // NTP Server Library #include #include //Definiere die Pins, die vom LoRa-Transceiver-Modul verwendet werden #define SCK 5 #define MISO 19 #define MOSI 27 #define SS 18 #define RST 14 #define DIO0 26 //433E6 Asia //866E6 Europa //915E6 North America #define BAND 866E6 //TTGO OLED Pins #define OLED_SDA 21 #define OLED_SCL 22 #define OLED_RST 16 #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // WiFi const char* ssid = "xxx"; const char* password = "xxx"; // NTP-Client definieren WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); // Variablen zum Speichern von Datum und Uhrzeit String formattedDate; String day; String hour; String timestamp; // Initialisieren von Variablen zum Abrufen und Speichern von LoRa-Daten int rssi; String loRaMessage; String temperature; String humidity; String pressure; String readingID; // Erstellen eines AsyncWebServer-Objekts auf Port 80 AsyncWebServer server(80); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST); // Ersetze Platzhalter durch DHT-Werte String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATURE"){ return temperature; } else if(var == "HUMIDITY"){ return humidity; } else if(var == "PRESSURE"){ return pressure; } else if(var == "TIMESTAMP"){ return timestamp; } else if (var == "RRSI"){ return String(rssi); } return String(); } //Initialisiere OLED Display void startOLED(){ //reset OLED display via software pinMode(OLED_RST, OUTPUT); digitalWrite(OLED_RST, LOW); delay(20); digitalWrite(OLED_RST, HIGH); //Initialisiere OLED Wire.begin(OLED_SDA, OLED_SCL); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32 Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(0,0); display.print("LORA SENDER"); } //Initialisiere LoRa Modul void startLoRA(){ int counter; //SPI LoRa Pins SPI.begin(SCK, MISO, MOSI, SS); //LoRa-Transceiver-Modul einrichten LoRa.setPins(SS, RST, DIO0); while (!LoRa.begin(BAND) && counter < 10) { Serial.print("."); counter++; delay(500); } if (counter == 10) { // Erhöhe die Lese-ID bei jedem neuen Messwert Serial.println("Das Starten von LoRa ist fehlgeschlagen!"); } Serial.println("LoRa-Initialisierung OK!"); display.setCursor(0,10); display.clearDisplay(); display.print("LoRa-Initialisierung OK!"); display.display(); delay(2000); } void connectWiFi(){ // Verbinde mich mit dem Wi-Fi-Netzwerk Serial.print("Verbinde mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // Lokale IP-Adresse ausgeben und Webserver starten Serial.println(""); Serial.println("WiFi verbunden."); Serial.println("IP Addresse: "); Serial.println(WiFi.localIP()); display.setCursor(0,20); display.print("WEBServer IP-Addresse: "); display.setCursor(0,30); display.print(WiFi.localIP()); display.display(); } // Lese das LoRa-Paket und erhalte die Sensormesswerte void getLoRaData() { Serial.print("Lora-Paket empfangen: "); // RLese Packet while (LoRa.available()) { String LoRaData = LoRa.readString(); // LoRaData-Format: LeseID/Temperatur&Feuchtigkeit#Luftdruck // String Beispiel: 1/27.43&654#95.34 Serial.print(LoRaData); // Lese ID, Temperatur, euchtigkeit und Luftdruck int pos1 = LoRaData.indexOf('/'); int pos2 = LoRaData.indexOf('&'); int pos3 = LoRaData.indexOf('#'); readingID = LoRaData.substring(0, pos1); temperature = LoRaData.substring(pos1 +1, pos2); humidity = LoRaData.substring(pos2+1, pos3); pressure = LoRaData.substring(pos3+1, LoRaData.length()); } // Lese RSSI rssi = LoRa.packetRssi(); Serial.print(" mit RSSI "); Serial.println(rssi); } // Funktion zum Abrufen von Datum und Uhrzeit von NTPClient void getTimeStamp() { while(!timeClient.update()) { timeClient.forceUpdate(); } // Das formattedDate hat das folgende Format: // 2018-05-28T16:00:13Z // Wir müssen Datum und Uhrzeit extrahieren formattedDate = timeClient.getFormattedDate(); Serial.println(formattedDate); // Datum extrahieren int splitT = formattedDate.indexOf("T"); day = formattedDate.substring(0, splitT); Serial.println(day); // Zeit extrahieren hour = formattedDate.substring(splitT+1, formattedDate.length()-1); Serial.println(hour); timestamp = day + " " + hour; } void setup() { // Initialisiere Seriellen Monitor Serial.begin(115200); startOLED(); startLoRA(); connectWiFi(); if(!SPIFFS.begin()){ Serial.println("Beim Mounten von SPIFF ist ein Fehler aufgetreten"); return; } // Starte WEB-Server server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(SPIFFS, "/index.html", String(), false, processor); }); server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", temperature.c_str()); }); server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", humidity.c_str()); }); server.on("/pressure", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", pressure.c_str()); }); server.on("/timestamp", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", timestamp.c_str()); }); server.on("/rssi", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", String(rssi).c_str()); }); server.on("/winter", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(SPIFFS, "/winter.jpg", "image/jpg"); }); // Start server server.begin(); // InitialisiereNTPClient timeClient.begin(); // Zeit Offset // GMT +1 = 3600 // GMT +8 = 28800 // GMT -1 = -3600 // GMT 0 = 0 timeClient.setTimeOffset(7200); } void loop() { // Überprüfe, ob LoRa-Pakete verfügbar sind int packetSize = LoRa.parsePacket(); if (packetSize) { getLoRaData(); getTimeStamp(); } }