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
15.01.2021, 20:18
Beitrag #9
RE: ESP8266WebServer & attachInterrupt
Grüß Euch!

Hab jetzt mal die Windstärke im Code geändert, um den Schnitt von ein paar Clicks zu Ermitteln. Nachteil bei wenig Wind bringt diese Lösung nun leider nix.

Anregungen von eurer Seite?

Code:
#define WIND_FACTOR 2.4
volatile uint16_t windCounter = 0;
volatile uint32_t lastwindMillis = 0;
volatile uint32_t windMillis = 0;
float kmH;

void ICACHE_RAM_ATTR windISR()
{
  if (millis() - lastwindMillis > 5) {
    windCounter++;
    windMillis = windMillis + (millis() - lastwindMillis);
    lastwindMillis = millis();
  }
}

void kmHWind()
{
  kmH = (1000 / (windMillis / windCounter)) * 2.4;
  windMillis = 0;
  windCounter = 0;
}

void setup() {
  Serial.begin(115200);
  pinMode(D5, INPUT_PULLUP);
  digitalWrite(D5, HIGH);
  attachInterrupt(D5, windISR, FALLING);
}

void loop() {

  if (windCounter >= 5) {
    kmHWind();
    Serial.println(kmH);
  }
}

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
15.01.2021, 20:26
Beitrag #10
RE: ESP8266WebServer & attachInterrupt
Ich hatte Dir mal was zum atomaren Lesen von Variablen, die länger als 1 Byte sind, geschrieben. Warum ignorierst Du das hartnäckig?

Wenn Du in Deiner ISR 3 Mal millis() aufrufst, ist es effektiver (und genauer), wenn Du einen Aufruf in eine Variable machst und diese dann verwendest.

Wenn keine Impulse kommen, kannst Du auch keine messen. Warum rufst Du kmWind nicht in größeren Abständen auf?

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
15.01.2021, 21:16
Beitrag #11
RE: ESP8266WebServer & attachInterrupt
(15.01.2021 20:26)Tommy56 schrieb:  Ich hatte Dir mal was zum atomaren Lesen von Variablen, die länger als 1 Byte sind, geschrieben. Warum ignorierst Du das hartnäckig?

Ich ignorier es nicht, ich Teste jetzt mal nur die Grundfunktion. Im Serversketch kann ich die Interrupts nicht sperren, nur mit attachInterrupt/detachInterrupt für Wind bzw. Regenwippe an-/abschalten.

(15.01.2021 20:26)Tommy56 schrieb:  Wenn Du in Deiner ISR 3 Mal millis() aufrufst, ist es effektiver (und genauer), wenn Du einen Aufruf in eine Variable machst und diese dann verwendest.

Siehe dazu weiter unten.

Daher würde im Serverloop

Code:
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) {
    Serial.print("Invalid request: ");
    Serial.println(req);
    return;
  }
  req = req.substring(addr_start + 1, addr_end);
  Serial.print("Request: ");
  Serial.println(req);
  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 {
    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();
  }
  getWIND();
  getREGEN();
}

und für getWIND folgendes machen wollen

Code:
void getWIND(){

  attachInterrupt(D5, windISR, FALLING);
  // --> hier Zeitdauer der Messung
  detachInterrupt(D5);  
}

Die ISR dann noch anpassen - hast das mit der Variable so gemeint?

Code:
void ICACHE_RAM_ATTR windISR()
{
  if (millis() - lastwindMillis >= 5) {
    windCounter++;
    windMillis[windCounter] = windMillis + (millis() - lastwindMillis);
    lastwindMillis = millis();
  }
}

so in etwa hab ich mir das mit meinem vorhandenen Wissen vorgestellt. Und generell Interrupt abdrehen für die Messungen, nein. Da hab ich nur gelesen in diversen WWW Seiten, dass es nur Probleme bereitet wenn der Server am laufen ist.

Lass mich gern von euch inspirieren Wink

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
15.01.2021, 21:34 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2021 21:38 von Tommy56.)
Beitrag #12
RE: ESP8266WebServer & attachInterrupt
Du darfst nicht alles glauben, was im Web geschrieben steht. Oft wird damit nur eine Ursache für die eigene schlampige Programmierung gesucht, weil die ISR zu lang ist.

Wieso führst Du jetzt ein Array ein?

Mein Weg wäre (ungetestet):
Code:
volatile uint32_t counter = 0; // die einzige Variable, die in ISR und loop gebraucht wird
const uint32 prell = 20; // je nach Güte des Kontakts - woher bekommst Du die Impulse?
const uint32_t messZeit = 1000;
uint32_t lastPrell = 0;
uint32_t lastMess = 0;


void ISR() {
  uint32_t aktMillis = millis();
  if (aktmillis - lastPrell >= prell) {
    counter++;
    lastPrell = aktMillis;
  }
}

// im loop

uint32_t aktMillis = millis();
uint32_t tmpCount;
if (aktMillis - lastMess >= messZeit) {
  nointerrupts()
  tmpCount = count;
  count = 0;
  interrupts();
  // mit tmpCount und aktMillis-lastMess rechnen
  lastMess = aktMillis + messZeit;
}

Gruß Tommy

Edit: Du kannst auch die Messzeit in abhängigkeit vom count anpassen.

"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
16.01.2021, 00:38
Beitrag #13
RE: ESP8266WebServer & attachInterrupt
Servus Tommy!

Hab jetzt etwas länger getestet jetzt mal das rausgekommen

Code:
#define WIND_FACTOR 2.4
volatile uint32_t count = 0; // die einzige Variable, die in ISR und loop gebraucht wird
const uint32 prell = 1; // je nach Güte des Kontakts - woher bekommst Du die Impulse?
const uint32_t messZeit = 1000;
uint32_t lastPrell = 0;
uint32_t lastMess = 0;
uint32_t lastMesstmp = 0;

void ICACHE_RAM_ATTR ISR() {
  uint32_t aktMillis = millis();
  if (aktMillis - lastPrell >= prell) {
    count++;
    lastPrell = aktMillis;
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(D5, INPUT_PULLUP);
  digitalWrite(D5, HIGH);
  attachInterrupt(D5, ISR, FALLING);
}

void loop() {

  uint32_t aktMillis = millis();
  uint32_t tmpCount;

  if (aktMillis - lastMess >= messZeit) {
    noInterrupts();
    tmpCount = count;
    count = 0;
    interrupts();
    // mit tmpCount und aktMillis-lastMess rechnen
    if (tmpCount > 0) {
      Serial.println((messZeit / (lastMess - lastMesstmp))*WIND_FACTOR);
      lastMesstmp = lastMess;
    }
    lastMess = aktMillis + messZeit;
  }
}

Grundsätzlich, glaub ich, dass die Berechnung ja passt - hab es mal zu fuß mit dem Taschenrechner nach gerechnet - soweit so gut

Code:
00:25:26.092 -> 0.00
00:25:27.333 -> 0.00
00:25:27.493 -> 14.40
00:25:27.533 -> 31.20
00:25:27.613 -> 28.80
00:25:27.693 -> 28.80
00:25:27.813 -> 26.40
00:25:27.893 -> 26.40
00:25:27.973 -> 24.00
00:25:28.066 -> 24.00
00:25:28.191 -> 21.60
00:25:28.311 -> 19.20
00:25:28.431 -> 19.20
00:25:28.551 -> 19.20
00:25:28.671 -> 16.80
00:25:28.831 -> 16.80
00:25:28.991 -> 14.40
00:25:29.151 -> 14.40
00:25:29.312 -> 12.00
00:25:29.472 -> 12.00
00:25:29.672 -> 12.00
00:25:29.872 -> 12.00
00:25:30.072 -> 9.60
00:25:30.312 -> 9.60
00:25:30.553 -> 9.60
00:25:30.793 -> 7.20
00:25:31.077 -> 7.20
00:25:31.357 -> 7.20
00:25:31.677 -> 7.20
00:25:31.998 -> 7.20
00:25:32.358 -> 4.80
00:25:32.758 -> 4.80
00:25:33.158 -> 4.80
00:25:33.599 -> 4.80
00:25:34.079 -> 4.80
00:25:34.600 -> 2.40
00:25:35.200 -> 2.40
00:25:35.801 -> 2.40
00:25:36.481 -> 2.40
00:25:37.242 -> 2.40
00:25:38.123 -> 2.40
00:25:39.084 -> 2.40
00:25:40.165 -> 0.00

Wo ich nicht durchblicke im Moment, dass ist das eben nur jeweils nur die WIND_FACTOR um ein vielfaches rauskommen, ja klar geht ja nicht anders Sad

Und ja, deinen Vorschlag etwas abgeändert, hoffentlich nicht falsch.

Prellen wie gesagt ist nicht. Hab es auch mit nur count in der ISR getestet, selbiges Ergebnis Sad

Irgendwie übersehe ich da etwas ...

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
16.01.2021, 10:52
Beitrag #14
RE: ESP8266WebServer & attachInterrupt
Deine Berechnung verstehe ich nicht. Ich halte sie inhaltlich für Unsinn.
Code:
Serial.println((messZeit / (lastMess - lastMesstmp))*WIND_FACTOR);

Da ist weder aktMillis noch tmpCount drin - warum zählst Du dann eigentlich?

Woher die Impulse kommen, hast Du auch noch nicht beantwortet.

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
16.01.2021, 15:08
Beitrag #15
RE: ESP8266WebServer & attachInterrupt
Irgendwie muss doch da sowas wie Impulse/Zeit * Faktor raus kommen.
Woher hast Du denn die 2.4?

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
16.01.2021, 20:29
Beitrag #16
RE: ESP8266WebServer & attachInterrupt
(16.01.2021 10:52)Tommy56 schrieb:  Deine Berechnung verstehe ich nicht. Ich halte sie inhaltlich für Unsinn.
Code:
Serial.println((messZeit / (lastMess - lastMesstmp))*WIND_FACTOR);

Da ist weder aktMillis noch tmpCount drin - warum zählst Du dann eigentlich?

Woher die Impulse kommen, hast Du auch noch nicht beantwortet.

Gruß Tommy

Servus Tommy!

Bei dieser Berechnung bekomm ich die Zeit zwischen zwei Impulsen - die Impulszeiten passen, das Ergebnis KmH, wird aber aufgrund eines Fehlers meiner seits, denn ich nicht Durchblick, immer nur das 1 bis mehrfache von 2.4Kmh. Es gibt keine Werte dazwischen. Die Impulse kommen von dem (ist Ident mit meinem) WH1080 das über ein RC-Glied an GPIO14 am Wemos D1 hängt, und lt. Datenblatt 2.4KmH je Puls pro Sekunde (wobei hier aber 2 Impulse je Umdrehung [2 Reed 180°] kommen)

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