Wemos D1 Mini Pro mit Eltako Anemometer

Hitman46NL

New member
Hallo zusammen,
Hab 2 Fragen:

Meine 1. Frage
Habe seit letzter Woche ein Anemometer mit einem Wemos D1 mini pro und mqtt am laufen. Das funktioniert auch auch alles wundertbar kann das ueber einen Wemos D1 mqtt Client mit Display oder home Assistant sehen wenn draussen wind ist. Was mir aufgefallen ist wenn der wind unter 2,16 km/h liegt wird 0,00 km/h angezeigt. Das heisst es wird erst etwas angezeigt ueber 2,16 km/h.
meine Frage waere woran liegt das und laesst sich sowas aendern und wenn ja wie.

Meine 2. Frage waere wuerdet ihr ein Anemometer ueber Deep Sleep laufen lassen wuerde dann aber bedeuten, das in der deep sleep zeit keine daten von anemometer kommen bis er geweckt wird.Wollte das Anemometer ueber Lipro Akku 3,7V 1000mAh laufen lassen mit ladung ueber Solar.

Frage 1 Code
Code:
#include <ESP8266WiFi.h>
#include "settings.h"
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x26,20,4);
//LiquidCrystal_I2C lcd(0x27,20,4);

unsigned long  next_timestamp = 0;
volatile unsigned long i = 0;
float wind = 0;
float last_wind = 0;
int count = 0;
volatile unsigned long last_micros;
long debouncing_time = 5; //in millis
int input_pin = 13;
char charBuffer[32];

WiFiClient espClient;
PubSubClient client(espClient);

void ICACHE_RAM_ATTR Interrupt()
{
  if((long)(micros() - last_micros) >= debouncing_time * 1000) {
    i++;
    last_micros = micros();
  }
}

void setup() {
  lcd.init();
  lcd.clear();
  lcd.backlight();
  Serial.begin(115200);
  delay(10);
  pinMode(input_pin, INPUT_PULLUP);//D7
  // We start by connecting to a WiFi network
  if(debugOutput){
    Serial.println();
    Serial.println();
    Serial.print("Verbinde mit ");
    lcd.setCursor(0, 0);
    lcd.print("Verbinde mit ");
    Serial.println(ssid);
    lcd.setCursor(0, 1);
    lcd.print(ssid);
  }
  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  int maxWait = 500;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    if(debugOutput) Serial.print(".");
    lcd.print(".");
    if(maxWait <= 0)
     ESP.restart();
    maxWait--;
  }
  if(debugOutput){
    delay(1000);
    lcd.clear();
    Serial.println("");
    Serial.println("WiFi Verbunden");
    lcd.print("WiFi connected");
    delay(10);
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    lcd.setCursor(0, 0);
    lcd.print(ssid);
    lcd.setCursor(0, 1);
    lcd.print("IP address: ");
    lcd.setCursor(0, 2);
    lcd.print(WiFi.localIP());
    lcd.setCursor(0, 3);
    lcd.print("(c) 2022 by Th.Alex");
    delay(100);
//
//lcd.clear();
  }
  delay(500);
//  do_update();
  client.setServer(mqtt_host, mqtt_port);
  reconnect();
  attachInterrupt(input_pin,Interrupt,RISING);
}


void loop()
{
  if (millis() > next_timestamp )   
  {
    detachInterrupt(input_pin);
    count++;
    float rps = i/number_reed; //computing rounds per second
    if(i == 0)
      wind = 0.0;
    else
      wind = 1.761 / (1 + rps) + 3.013 * rps;// found here: https://www.amazon.de/gp/customer-reviews/R3C68WVOLJ7ZTO/ref=cm_cr_getr_d_rvw_ttl?ie=UTF8&ASIN=B0018LBFG8 (in German)
    if(last_wind - wind > 0.8 || last_wind - wind < -0.8 || count >= 10){
      if(debugOutput){
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Eltako Anemometer");
        lcd.setCursor(0, 1);
        lcd.print("--------------------");
        Serial.print("Wind: ");
        lcd.setCursor(0, 2);
        lcd.print("Wind: ");
        Serial.print(wind);
        lcd.print(wind);
        Serial.println(" km/h");
        lcd.print(" km/h");
        lcd.setCursor(0, 3);
        lcd.print("(c) 2022 by Th.Alex");
      }
      String strBuffer;
      strBuffer =  String(wind);
      strBuffer.toCharArray(charBuffer,10);
      if (!client.publish(mqtt_topic_prefix, charBuffer, false))
      {
        ESP.restart();
        delay(100);
      }
      count = 0;
    }
    i = 0;
    last_wind = wind;
    if(WiFi.status() != WL_CONNECTED) {
      ESP.restart();
      delay(100);
    }
    next_timestamp  = millis()+1000; //intervall is 1s
    attachInterrupt(input_pin,Interrupt,RISING);
  }
  yield();
}

void reconnect() {
  int maxWait = 0;
  while (!client.connected()) {
    if(debugOutput) Serial.print("Attempting MQTT connection...");
    if (client.connect(mqtt_id)) {
      if(debugOutput) Serial.println("connected");
    } else {
      if(debugOutput){
        Serial.print("failed, rc=");
        Serial.print(client.state());
        Serial.println(" try again in 5 seconds");
      }
      delay(5000);
      if(maxWait > 10)
        ESP.restart();
      maxWait++;
    }
  }
}
 
Also ohne da jetzt groß Ahnung von zu haben, aber... Wenn das Ding quasi erst etwas nach "einer (oder mehr!) Umdrehung/en pro Sekunde" ausspuckt...
Was mir aufgefallen ist wenn der wind unter 2,16 km/h liegt wird 0,00 km/h angezeigt. Das heisst es wird erst etwas angezeigt ueber 2,16 km/h.
meine Frage waere woran liegt das und laesst sich sowas aendern und wenn ja wie.
... sieht das für mich erstmal so aus, als würde alles darunter keine Umdrehung pro Sekunde schaffen.... mag sein, dass ich völlig daneben liege (habe von sowas überaupt keine Ahnung), aber für mich sieht das frei übersetzt und recht banal formuliert ungefähr so aus:

Du hast eine Zeit "eine" Umdrehung (oder mehrere) pro Sekunde zu schaffen.... GO!

1km/h .... 0,4 Runden - nicht geschafft, also "0"
2km/h ... 0,8 Runden- nicht geschafft, also "0"
3km/h ... 1,2 Runden - geschafft! -> "Wind = 3km/h"

bzw. konkreter müsste man ja sagen "1 Runde nach X,XX Sekunden geschafft, Wind-Wert beträgt somit X km/h". Das würde - für mich persönlich - zumindestens erklären, warum es entweder "0 km/h" oder ">2 km/h" wäre. Wenn die "eine" vollständige Umdrehung "pro Sekunde" entscheidend darüber ist, ob ein Wert ausgegeben wird, oder nicht, wäre es mitunter zweckdienlich, wenn man statt "1 Sekunde" ggf. einen grösseren Zeitraum angibt (z.B. 2 Sekunden oder gar 10), wobei man das dann natürlich auch bei allen Berechnungen berücksichtigen müsste.

So, da ich keine Ahnung habe, ob das irgendwie sinnig und zielführend ist, hör ich jetzt mal mit dem (evtl. völlig nutzlosen) Geschwafel auf und überlass das Feld mal den Leuten, die auch etwas davon verstehen 😅
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.480
Beiträge
46.096
Mitglieder
4.110
Neuestes Mitglied
Chris11
Zurück
Oben