HTML-Ausgabe von ESP8266 D1 Mini + DHT 11 Temperatursensor auf Webseite

Hallo,

die HTML-Ausgabe meines ESP8266 D1 Mini mit DHT 11 Temperatursensor erfolgt aktuell bei mir im eigenen Netzwerk unter http://192.168.022.7

Nun möchte ich aber gerne, dass die HTML-Ausgabe auf meiner Webseite im Internet erfolgt. Wie kriege ich das am einfachsten hin?

Bereits jetzt vielen Dank für eure Antworten.

Viele Grüße,
Sigi

Hallo
Dein ESP8266 D1 Mini hat die interne Internetadresse 192.168.022.7.
Über deinen Router muss diese interne Internetadresse, über eine Portzuweisung, extern sichtbar gemacht werden.
Und nicht vergessen, dass dein Router alle 24h eine neue IP_Adresse erhält.

siegbert:
Nun möchte ich aber gerne, dass die HTML-Ausgabe auf meiner Webseite im Internet erfolgt. Wie kriege ich das am einfachsten hin?

was hast du auf deinem Webspace/Webserver im Internet zur Verfügung?

hast du eine Datenbank?
kannst du eigene PHP scripts erstellen?
kannst mit PHP files anlegen?

Dann könntest du den ESP Daten an deinen Webspace periodisch Daten senden lassen und deine Webserver diese Daten anzeigen lassen.

Ansonsten musst du halt einen weg finden wie du die HTML Seite deines ESP's auch von Außen zugreifbar machst (Dyndns, Portweiterleitung am Router, Daten einbinden...)

Also die Variante mit dynamischen DNS und Portzuweisung/-freigabe hatte ich mir schon gedacht und sollte ich auch hinkriegen.

Aber sehr interessant ist die Variante die ESP Daten an meinem Webspace periodisch zu senden und diese dann vom Webserver anzeigen lassen.

Also ich kann Datenbanken anlegen, php läuft bei mir in Version 8. Allerdings wird es nur funktionieren, wenn ich eure Hilfe bekommen. Denn ich kann leider keine PHP Scripts erstellen.

Da müsste mich Jemand durchleiten und helfen.

Dazu noch eine Frage. Ich wollte den ESP8266 D1 mini mit Batterie betreiben und damit die Batterie länger hält in nee Stunde in den Tiefschlaf versetzen und dann kurz zur Erstellung neuer Daten aus dem Schlaf holen. Würde das bei der zweiten Variante funktionieren? Bei der ersten Variante, also die mit dynamischen DNS und Portweiterleitung müsste es doch so sein, dass so lange der ESP8266 D1 mini im Tiefschlaf ist, auch keine Seite aufrufbar ist, oder?

also wenn batteriebetrieben, dann mach wirklich die Variante den ESP mittels httpclient etwas an den webserver senden zu lassen.

Arduino IDE:

ESP8266HTTPClient | BasicHttpclient

Dachte ich mir.

Dann brauche ich jetzt Hilfe. Das kriege ich nur mit eurer Hilfe hin. Was muss ich genau machen? Ich bin zu allen Schandtaten bereit. :slight_smile:

ESP8266HTTPClient | BasicHttpclient

das könnte man auch lesen:

https://werner.rothschopf.net/202009_iot_webserver_intro.htm

Gut, dann können wir uns nebenan ja die Antworten sparen.

Gruß Tommy

Ich lese mir nachher die Anleitung durch. Sorry, dass das Thema auch noch im anderen Forum erscheint. Da ist mein Bruder drinnen. Schlechte Abstimmung zwischen uns Beiden.

Kurze Info.

Die Anleitung ist super. Wir versuchen jetzt Beide das gemeinsam umzusetzen. Ich werde berichten und bei Problemen fragen.

Mein Bruder wird im anderen Forum noch das Thema schließen, bzw. darum bitten, ob man da das Thema schliessen kann.

Ich brauche, wer hätte es gedacht, tatsächlich mal eure Hilfe.
Also hier der Inhalt vom Sketch (STASSID und STAPSK habe ich hier mit xxxx überschrieben. Da stehen natürlich sonst die korrekten Daten drinnen und bei Server_IP steht jetzt meinedomain.de und nicht die richtige Domain):

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#include "DHT.h"
#define DHT11Pin 14
#define DHTType DHT11


#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFiUdp.h>

#include <NTPClient.h>  // für die Uhrzeit
//Zeitverschiebung UTC <-> MEZ (Winterzeit) = 3600 Sekunden (1 Stunde)
//Zeitverschiebung UTC <-> MEZ (Sommerzeit) = 7200 Sekunden (2 Stunden)
const long utcOffsetInSeconds = 3600;
char daysOfTheWeek[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);


#ifndef STASSID
#define STASSID "xxxx"
#define STAPSK  "xxxx"
#endif

//#define SERVER_IP "10.0.1.7:9080" // PC address with emulation on host
#define SERVER_IP "meinedomain.de"

#define SERVER_RESOURCE "iot/entry.php"  // define the script you want to call 
#define USE_BOARD 0                      // an ID for your board 

const byte pin1 = 0;
const byte pin2 = 2;
const byte pin3 = 14;
const byte adc = A0;
String Uhrzeit(5);

float humi;
float tempC;
float tempF;


DHT HT(DHT11Pin,DHTType);

//OLED define
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void Uhrzeit_anzeigen () {
  // Uhrzeit
  // display.display(); 
  display.clearDisplay();
  timeClient.update();
  oledDisplayHeader(0,0,daysOfTheWeek[timeClient.getDay()]);
  display.setTextSize(4);
  Uhrzeit  = timeClient.getFormattedTime();
  display.setCursor(1, 30);
  display.println(Uhrzeit.substring(0,5));
  delay(500);
}

void oledDisplayHeader(int x,int y,String unit){
  display.setTextSize(2);
  display.setCursor(x, y);
  display.print(unit);}

void oledDisplay(int size, int x,int y, float value, String unit){
  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x, y);
  display.print(value,1);
  display.setCursor(x+100, y);
  display.print(unit);}


void Temperatur_anzeigen () {
  humi = HT.readHumidity();
  tempC = HT.readTemperature() ;

  // Temperatur 
  display.display(); 
  display.clearDisplay();
  oledDisplayHeader(0,0,"Temperatur");
  oledDisplay(4,1,30,tempC,"C");
  delay(10000);

  // Luftfeuchtigkeit
  display.display();
  display.clearDisplay();
  oledDisplayHeader(0,0,"Feuchte");
  oledDisplay(4,1,30,humi,"%");
  delay(10000);


Serial.print("Temperatur:");
Serial.println(tempC);
Serial.print(" Feuchte  :");
Serial.println(humi);
Serial.println();
}

void doWebclient() {
  if ((WiFi.status() == WL_CONNECTED)) {
    String message;
    WiFiClient client;
    HTTPClient http;
    
    Serial.print(F("[HTTP] begin\n"));
    // configure traged server and url
    Serial.println ("https://" SERVER_IP "/" SERVER_RESOURCE);
    http.begin(client, "https://" SERVER_IP "/" SERVER_RESOURCE);   // MISSING ... in configuration?
    http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // // standard content type for simple form-posts, for more see https://en.wikipedia.org/wiki/Media_type
    // build your post data
    message = "board=";
    message += USE_BOARD;
    message += "&uptime=";
    message += millis()/1000;
    message += "&adc=";
    message += analogRead(adc);
    message += "&pin1=";
    message += digitalRead(pin1);
    message += "&pin2=";
    message += digitalRead(pin2);
    // start connection and send HTTP header and body
    int httpCode = http.POST(message);
    // httpCode will be negative on error
    if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      Serial.printf("[HTTPs] POST code: %d\n", httpCode);
      if (httpCode == HTTP_CODE_OK) {                  // file found at server
        const String& payload = http.getString();
        Serial.println(F("received payload:\n<<"));
        Serial.println(payload);
        Serial.println(F(">>"));
      }
    } else {
      Serial.printf("[HTTP] POST failed, error: %s\n", http.errorToString(httpCode).c_str());
    }
    http.end();
  }
  else
  {
    Serial.println("[HTTP] not connected");
  }
}

void timerWebclient()
{
  const uint16_t interval = 60 * 1000UL;           // set the interval for your webclient to post data
  static uint32_t previousMillis = - interval;
  uint32_t currentMillis = millis();
  if (currentMillis - previousMillis > interval)
  {
    doWebclient();
    previousMillis = currentMillis;
  }
}

void setup() {
  Serial.begin(9600);
  
  //For OLED I2C
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);  }
    
  Serial.print  (F("\n\nESP8266 POST HTTP webclient\nBoard "));
  Serial.println(USE_BOARD);
  pinMode(adc, INPUT);
  pinMode(pin1, INPUT);
  pinMode(pin2, INPUT);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.print(".");
     }
  Serial.print(F("\nConnected! IP address: "));
  Serial.println(WiFi.localIP());
  timeClient.begin(); // Uhrmodul starten
}

void loop() {
  timerWebclient();                   // call the timer for the webclient
  Temperatur_anzeigen ();
  delay(10000);
  // do other things in your loop
}

Und über den seriellen Monitor erscheint dann diese Meldung:

Bitte stört auch nicht an der Ausgabe von der Temperatur und der Luftfeuchtigkeit. Die Werte werden im Moment noch falsch angezeigt.

Im nächsten Schritt habe ich dann die https://meinedomain.de/iot/entry.php über den Browser aufgerufen. Da erscheint der Hinweis

NOK; valid=0; data not valid

Wo liegt der Fehler und es gibt im Sketch zweimal einen Eintrag bei Server_IP. Aktuell steht da auch noch die IP 10.0.1.7:9080. Was ist das für eine IP? Muss die auskommentiert werden?

Bereits jetzt Danke für eure Hilfen und Antworten.

da ist viel zu viel "neues" drinenn was nur ablenkt.

Funktioniert das Basisbeispiel?

ESP8266HTTPClient | BasicHttpclient

Funktioniert das Beispiel so wie ich es im ZIP veröffentlich habe?

Ich hab zwar einen Verdacht (HTTPS), aber ich möchte erst mal die Basis als funktionierend wissen.

Die Meldung
NOK; valid=0; data not valid

vom PHP script ist klar. Wenn du keine validen Parameter übergibst kommt genau diese Meldung.
Du kannst ja testweise das script mit GET Paramter (also mit ?board=usw) aufrufen.

Öhmmm??? Was für ein Basisbeispiel? Sehe jetzt den Wald vor lauter Bäumen nicht mehr. :o

Mit den GET Parametern funktioniert das Script.

direkt aus der IDE

ESP8266HTTPClient | BasicHttpclient

Ich hatte:

https://meinedomain.de/iot/entry.php?board=0&uptime=42&adc=1&pin1=1&pin2=2

eingeben. Natürlich mit meiner Domain und als Ausgabe, gab es ein:

OK; valid=5

Zudem steht nun dadurch auch der entsprechende Eintrag in der Datei board0 im Verzeichnis data.

Meinst Du das?

gut wie gesagt. Das PHP script läuft wie vorgesehen.

Jetzt nimmst du mal genau diesen URI inkl. Parameter und gibst ihn ins IDE Beispiel

ESP8266HTTPClient | BasicHttpclient

was bekommst du dann als Antwort?

Habe ich gerade gemacht. Also bei:

#define SERVER_IP "meinedomain.de"

steht jetzt:

#define SERVER_IP "meinedomain.de/iot/entry.php?board=0&uptime=42&adc=1&pin1=1&pin2=2"

Natürlich mit der richtigen Domain. Und eine Sache noch. Es geht nur wenn ich die komplette URL ohne https:// eintrage, sonst kommt bei der Ausgabe zweimal das https:// .
Leider trägt sich unter iot/data nichts in die Datei board0.csv ein.
Hier die Ausgabe:

Upps, sehe gerade das am Ende bei der URL automatisch ein /entry.php angehängt wird. Das darf ja nicht sein.

Soll ich das die Zeile:

#define SERVER_RESOURCE "iot/entry.php"

auskommentieren?

du sollst es zunächst mit den Arduino IDE Beispielen probieren:

/**
BasicHTTPClient.ino

Created on: 24.05.2015

*/

Arduino IDE
Menü Datei
Beispiele
ESP8266HTTPClient
BasicHttpclient

Wenn das nicht klappt dann

Arduino IDE
Menü Datei
Beispiele
ESP8266HTTPClient
BasicHTTPSClient

immer erst wifi credentials setzen und so ausführen wie vorgegeben
Danach erst in einem zweiten Schritt die URI ändern.

4 Versuche.
Berichte was funktioniert, was nicht.

BasicHttpclient --> unverändert
BasicHttpclient --> mit angepasstem URI
BasicHTTPSClient --> unverändert
BasicHTTPSClient --> mit angepasstem URI

Was ist mit dem ESP8266WiFi ?

Den nach wie vor included lassen?