INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP8266WebServer & attachInterrupt
17.01.2021, 00:34
Beitrag #25
RE: ESP8266WebServer & attachInterrupt
@all Danke für eure Unterstützung !

Nach etlichen Hilfeaktionen von Euch & suchen und Testen - jetzt passt es mal soweit.

@Tommy: ja du hattest recht! wenn die ISR halbwegs kurz ist, dann ist das kein Problem am D1 mit Serverbetrieb - Danke auch nochmals hier an dieser Stelle.

Und hier nun der Testsketch, fehlt nur mehr der Regentropfensensor, aber das ist ja kein Highlight mehr Wink

Was fehlt noch, die Korrektur von Jan, diverse Fehlerbehandlungsroutinen, OTA Update (das hab ich bereits getestet, ist aber in dem Test Abgeschalten)

Weiters muss ich mir noch Überlegen ob ich nicht gleich alle Sensoren Werte auf einmal via JSON bereitstelle, aber das ist eine andere Geschichte. Aber das wichtigste, das Grundgerüst steht und läuft Big GrinCool und das Gefällt!

Für weiteren Input, Verbesserung, konstruktive Kritik - wie immer gerne - Danke!

Sensor Daten, jetzt natürlich aus dem Wohnzimmer Wink
Code:
{"sensorId":"BME680","tempOUT":21.78,"pressOUT":986.47,"humiOUT":30,"gasOUT":12.988}
{"sensorId":"SI1145","lightOUT":259,"irOUT":256,"uvOUT":0.02,"proximity":250}
{"sensorId":"WH1080-KW9015R","windOUT":1.077601,"regenOUT":0}


Code:
#include "R:\ArduinoSketches\Prototyping\wwcfg.h"
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>
#include <Wire.h>;
#include <Adafruit_Sensor.h>;
#include <Adafruit_BME680.h>;
#include <SI1145_WE.h>
#include <ArduinoOTA.h>

#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme;
float tempOUT, pressOUT, gasOUT, altOUT;
uint16_t humiOUT;

SI1145_WE mySI1145 = SI1145_WE();
byte failureCode = 0;
uint16_t lightOUT = 0;
uint16_t irOUT = 0;
uint16_t proximity = 0;
float uvOUT = 0.0;

unsigned long sensorMillis = 0;
const uint16_t sensorinterval = 5000;

#define WIND_FACTOR 2.4
#define RAIN_FACTOR 0.5787 // Liter je m² und Click
#define TEST_PAUSE 60000
#define WH1080_PIN D5
#define WH1080_INT D5
#define KW9015R_PIN D6
#define KW9015R_INT D6
volatile uint32_t WH1080_count = 0;
volatile uint32_t WH1080_last = 0;
volatile uint32_t WH1080_min = 0xffffffff;
volatile uint32_t KW9015R_count = 0;
volatile uint32_t KW9015R_last = 0;
float windOUT = 0.0;
float regenOUT = 0.0;

WiFiServer server(80);

void ICACHE_RAM_ATTR WH1080Click()
{
  long thisTime = micros() - WH1080_last;
  WH1080_last = micros();
  if (thisTime > 500)
  {
    WH1080_count++;
    if (thisTime < WH1080_min)
    {
      WH1080_min = thisTime;
    }
  }
}

void ICACHE_RAM_ATTR KW9015RClick()
{
  long thisTime = micros() - KW9015R_last;
  KW9015R_last = micros();
  if (thisTime > 500)
  {
    KW9015R_count++;
  }
}

double getWH1080()
{
  unsigned long reading = WH1080_count;
  WH1080_count = 0;
  return (WIND_FACTOR * reading) / (TEST_PAUSE / 1000);
}

double getWINDKmH()
{
  unsigned long reading = WH1080_min;
  WH1080_min = 0xffffffff;
  double time = reading / 1000000.0;
  return (1 / (reading / 1000000.0)) * WIND_FACTOR;
}

double getKW9015R() {
  unsigned long reading = KW9015R_count;
  KW9015R_count = 0;
  double unit_rain = reading * RAIN_FACTOR;
  return unit_rain;
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  Serial.println("");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(STASSID);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (!bme.begin()) {
    // -> Fehlerbehandlung Einbauen
  }

  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150);

  mySI1145.init();
  mySI1145.enableHighSignalVisRange();
  mySI1145.enableHighSignalIrRange();
  mySI1145.enableMeasurements(PSALSUV_TYPE, AUTO);

  if (!MDNS.begin("garten01")) {
    // -> Fehlerbehandlung Einbauen
  }
  Serial.println("mDNS responder started");

  server.begin();
  MDNS.addService("http", "tcp", 80);

  pinMode(WH1080_PIN, INPUT);
  digitalWrite(WH1080_PIN, HIGH);
  attachInterrupt(WH1080_INT, WH1080Click, FALLING);
  pinMode(KW9015R_PIN, INPUT);
  digitalWrite(KW9015R_PIN, HIGH);
  attachInterrupt(KW9015R_INT, KW9015RClick, FALLING);
}

void loop(void) {

  MDNS.update();
  //ArduinoOTA.handle();

  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  while (client.connected() && !client.available()) {
    delay(1);
  }

  String req = client.readStringUntil('\r');
  int addr_start = req.indexOf(' ');
  int addr_end = req.indexOf(' ', addr_start + 1);
  if (addr_start == -1 || addr_end == -1) {
    // Fehlerbehandlung einbauen
    return;
  }
  req = req.substring(addr_start + 1, addr_end);
  client.flush();

  String s;
  if (req == "/") {
    IPAddress ip = WiFi.localIP();
    String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
    s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>Hello from Reverend's garten01 WiFi Sensor at ";
    s += ipStr;
    s += "</html>\r\n\r\n";
  }
  else if (req == "/BME680") {

    DynamicJsonDocument doc(512);
    doc["sensorId"] = "BME680";
    doc["tempOUT"] = tempOUT;
    doc["pressOUT"] = pressOUT;
    doc["humiOUT"] = humiOUT;
    doc["gasOUT"] = gasOUT;
    serializeJson(doc, s);
  }
  else if (req == "/SI1145") {

    DynamicJsonDocument doc(512);
    doc["sensorId"] = "SI1145";
    doc["lightOUT"] = lightOUT;
    doc["irOUT"] = irOUT;
    doc["uvOUT"] = uvOUT;
    doc["proximity"] = proximity;
    serializeJson(doc, s);
  }
  else if (req == "/windregen") {

    DynamicJsonDocument doc(512);
    doc["sensorId"] = "WH1080-KW9015R";
    doc["windOUT"] = windOUT;
    doc["regenOUT"] = regenOUT;
    serializeJson(doc, s);
  }
  else {
    s = "HTTP/1.1 404 Not Found\r\n\r\n";
  }
  
  client.print(s);

  unsigned long currentMillis = millis();
  if (currentMillis - sensorMillis >= sensorinterval) {
    sensorMillis = currentMillis;
    getBME680();
    getSI1145();
  }

  //getWH1080();
  windOUT = getWINDKmH();
  regenOUT = getKW9015R();
}

void getBME680() {

  if (! bme.performReading()) {
    return;
  }
  
  tempOUT = bme.temperature;
  pressOUT = bme.pressure / 100.0;
  humiOUT = bme.humidity;
  gasOUT = bme.gas_resistance / 1000.0;
  altOUT = bme.readAltitude(SEALEVELPRESSURE_HPA);
}

void getSI1145() {

  lightOUT = mySI1145.getAlsVisData();
  irOUT = mySI1145.getAlsIrData();
  proximity = mySI1145.getPsData();
  uvOUT = mySI1145.getUvIndex();

  failureCode = mySI1145.getFailureMode();  // reads the response register
  if ((failureCode & 128)) { // if bit 7 is set in response register, there is a failure
    handleFailure(failureCode);
  }
}

void handleFailure(byte code) {
  String msg = "";
  switch (code) {
    case SI1145_RESP_INVALID_SETTING:
      msg = "Invalid Setting";
      break;
    case SI1145_RESP_PS1_ADC_OVERFLOW:
      msg = "PS ADC Overflow";
      break;
    case SI1145_RESP_ALS_VIS_ADC_OVERFLOW:
      msg = "ALS VIS ADC Overflow";
      break;
    case SI1145_RESP_ALS_IR_ADC_OVERFLOW:
      msg = "ALS IR Overflow";
      break;
    case SI1145_RESP_AUX_ADC_OVERFLOW:
      msg = "AUX ADC Overflow";
      break;
    default:
      msg = "Unknown Failure";
      break;
  }
  Serial.println(msg);
  mySI1145.clearFailure();
}

Gruß aus Wiener Neustadt
Toni

=================================================================
Seit die Mathematiker über die Relativitätstheorie hergefallen sind, verstehe ich sie selbst nicht mehr.

Wer Rechtschreibfehler findet darf sie behalten Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2021, 00:38 (Dieser Beitrag wurde zuletzt bearbeitet: 17.01.2021 01:43 von rev.antun.)
Beitrag #26
RE: ESP8266WebServer & attachInterrupt
(16.01.2021 21:41)Bitklopfer schrieb:  Interessante Entprellschaltung. Habe ich so auch noch nie gesehen, aber mal drüber nachgedacht muß ich sagen das die Pfiffig Idea ist.
lgbk

Servus!

Ist auch nicht direkt auf meinem Mist gewachsen. Hab ich von einer "Industriellen" Lösung, wo bei Fertigprodukten mit Sensoren die Prellen in dieser Form eingesetzt werden. Ich hab nur die Schaltung genommen, und auf meine Bedürfnisse Umgerechnet. Meiner Meinung nach, und meinen Kenntnissen - sollte jede Universaldiode der 1n4xxx Serie da keinen Unterschied machen.

Funktioniert, und das ist das Wichtigste - aber Danke Cool

Gruß aus Wiener Neustadt
Toni

=================================================================
Seit die Mathematiker über die Relativitätstheorie hergefallen sind, verstehe ich sie selbst nicht mehr.

Wer Rechtschreibfehler findet darf sie behalten Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2021, 01:50
Beitrag #27
RE: ESP8266WebServer & attachInterrupt
Grüss Euch!

Sad jetzt läuft alles wunderbar, OTA aktiviert, nur zeigt es mir im IDE nicht mehr an - wie geht das, hat ja schon Funktioniert Huh sogar mit dem ESP8266mDNS

Pffff, kaum was gelöst, neue Baustelle - nein kein jammern - das wird gelöst!

Ideen? Danke schon mal ...

Gruß aus Wiener Neustadt
Toni

=================================================================
Seit die Mathematiker über die Relativitätstheorie hergefallen sind, verstehe ich sie selbst nicht mehr.

Wer Rechtschreibfehler findet darf sie behalten Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2021, 22:18
Beitrag #28
RE: ESP8266WebServer & attachInterrupt
Da sich bisher keiner gemeldet hat, OTA läuft bei mir eigentlich problemlos, solange der Loop schnell genug ist. Hast Du da noch Blockaden drin?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2021, 22:57
Beitrag #29
RE: ESP8266WebServer & attachInterrupt
Servus Tommy!

OTA selbst auf dem D1 Server läuft, ABER im IDE zeigt er mir es nicht mehr an - also im Menü Werkzeuge/Ports ist der Punkt wie von Zauberhand verschwunden Sad

Hoffe hab das jetzt korrekt rübergebracht ...

Gruß aus Wiener Neustadt
Toni

=================================================================
Seit die Mathematiker über die Relativitätstheorie hergefallen sind, verstehe ich sie selbst nicht mehr.

Wer Rechtschreibfehler findet darf sie behalten Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2021, 00:12
Beitrag #30
RE: ESP8266WebServer & attachInterrupt
(17.01.2021 22:57)rev.antun schrieb:  Servus Tommy!

OTA selbst auf dem D1 Server läuft, ABER im IDE zeigt er mir es nicht mehr an - also im Menü Werkzeuge/Ports ist der Punkt wie von Zauberhand verschwunden Sad

Hoffe hab das jetzt korrekt rübergebracht ...

Welches Betriebssystem läuft auf deinem Rechner ?
Bei Win7 kenne ich das auch.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2021, 00:14
Beitrag #31
RE: ESP8266WebServer & attachInterrupt
Servus!

W10

Gruß aus Wiener Neustadt
Toni

=================================================================
Seit die Mathematiker über die Relativitätstheorie hergefallen sind, verstehe ich sie selbst nicht mehr.

Wer Rechtschreibfehler findet darf sie behalten Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2021, 17:21
Beitrag #32
RE: ESP8266WebServer & attachInterrupt
(17.01.2021 01:50)rev.antun schrieb:  Grüss Euch!

OTA aktiviert, nur zeigt es mir im IDE nicht mehr an - wie geht das, hat ja schon Funktioniert Huh sogar mit dem ESP8266mDNS

So, in der ganzen Umbauerei hat sich das ebenfalls gelöst - ESP8266mDNS rausgeschmissen ESP8266mDNS, Tipp von Tommy mit WiFi.hostname("Garten01"); dazu, und im IDE bleibt jetzt der D1 auch in den Netzwerkschnittstellen drinnen - da weis ich zwar nicht genau warum, aber es passt.

Pfff, jetzt zwischendurch wieder Zufrieden Big Grin

Gruß aus Wiener Neustadt
Toni

=================================================================
Seit die Mathematiker über die Relativitätstheorie hergefallen sind, verstehe ich sie selbst nicht mehr.

Wer Rechtschreibfehler findet darf sie behalten Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266WebServer RAW Post Data gesucht Nichtraucher 10 1.373 12.11.2020 12:11
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste