2019-07-06

Esp32 Windsensor TX23 als Arduino Tab.

TX23.ino

// ****************************************************************
// Sketch Esp32 TX23 Windgeschwindigkeit- und Richtung Modular(Tab)
// created: Jens Fleischer, 2019-06-30
// last mod: Jens Fleischer, 2019-07-06
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp32, TX23
// Braun (Schwarz) DATA an GPIO 15
// Red an Vcc
// Grün --
// Gelb an GND
// Software: Esp32 Arduino Core 1.0.0
// Getestet auf: ESP32 NodeMCU-32s
/******************************************************************
  Copyright (c) 2019 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version vom Windsensor sollte als Tab eingebunden werden.
// #include <WebServer.h> muss im Haupttab aufgerufen werden
// Die Funktionalität des ESP32 Webservers ist erforderlich.
// Die Funktion "tx23();" muss im Setup aufgerufen werden.
// Zum speichern muss die Funktion "tx23Read();" im loop(); aufgerufen werden.
/**************************************************************************************/

#include <LaCrosse_TX23.h>                                    // https://github.com/egzumer/Arduino-LaCrosse-TX23-Library

LaCrosse_TX23 anemometer = LaCrosse_TX23(15);                 // Pin anpassen

const byte FIFOSIZE = {60};                                   // Puffer Größe
float fifoBuf[FIFOSIZE];                                      // Fifo Puffer

void tx23() {                                                 // Funktionsaufruf "tx23();" muss im Setup eingebunden werden
  server.on("/tx23", []() {
    server.send(200, "application/json", tx23Read());
  });
}

const char* tx23Read() {                                      // Funktionsaufruf "tx23Read();" muss im Loop eingebunden werden
  static char buf[30];
  static bool error {0};
  static float maxSpeed {0}, speed;
  static int direction;
  static auto letzteMillis = 0;
  auto aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 3000) {                // aller 3 Sekunden
    letzteMillis = aktuelleMillis;
    error = anemometer.read(speed, direction);                // Sensor auslesen
    if (speed > maxSpeed) maxSpeed = speed;                   // max Wert ermitteln
  }
  fifoWrite(maxSpeed);                                        // max Wert an den Puffer übergeben
  snprintf(buf, sizeof(buf), R"(["%.1f","%d","%.1f"])", speed, direction, fifoMaxRead());
  return error ? buf : "[\"nan\"]";
}

float fifoMaxRead() {                                         // max Wert aus Puffer lesen
  float maxSpeed {0};
  for (auto& value : fifoBuf) if (maxSpeed < value) maxSpeed = value;
  return maxSpeed;
}

void fifoWrite(float &val) {
  static byte fifoIndex;                                      // Index Fifo Puffer
  static auto letzteMillis = 0;
  auto aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 60000UL) {             // jede Minute
    letzteMillis = aktuelleMillis;
    fifoBuf[fifoIndex] = val;                                 // Wert in den Puffer schreiben
    val = 0;                                                  // maxSpeed zurücksetzen
    ++fifoIndex = fifoIndex % FIFOSIZE;                       // Zeiger im Puffer vorrücken
  }
}

Zurück