2019-12-16

Esp8266 Windsensor TX23 als Arduino Tab.

TX23.ino

// ****************************************************************
// Sketch Esp8266 TX23 Windgeschwindigkeit- und Richtung Modular(Tab)
// created: Jens Fleischer, 2019-12-09
// last mod: Jens Fleischer, 2019-12-16
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266, TX23
// Braun (Schwarz) DATA an D2
// Red an Vcc
// Grün --
// Gelb an GND
// Software: Esp8266 Arduino Core 2.4.2 / 2.5.2 / 2.6.3
// Getestet auf: Nodemcu
/******************************************************************
  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 ESP8266 Webservers ist erforderlich.
// Die Funktion "tx23();" muss im Setup aufgerufen werden.
// Zum speichern muss die Funktion "tx23Read();" im loop(); aufgerufen werden.
/**************************************************************************************/

template <typename T, size_t size, typename U> void fifoWrite(T maxValue, T (&fifo)[size], U &index) {
  fifo[index] = maxValue;                                     // Wert in den Puffer schreiben
  ++index = index % size;                                     // Zeiger im Puffer vorrücken
}

template <typename T, size_t size> T maxRead(T (&value)[size], T maxValue = 0) {
  for (auto &v : value) maxValue = max(maxValue, v);          // max Wert ermitteln
  return maxValue;
}

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

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

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 speed, maxSpeed {0}, fifoHour[60] {0}, fifoDay[24] {0};
  static uint8_t indexHour {0}, indexDay {0};                 // Index Fifo Puffer
  static int32_t direction;
  static uint32_t letzteMillis {0}, letzteMillisMin {0};
  auto aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 3e3) {                 // aller 3 Sekunden
    letzteMillis = aktuelleMillis;
    error = anemometer.read(speed, direction);                // Sensor auslesen
    maxSpeed = max(maxSpeed, speed);                          // max Wert ermitteln
  }
  if (aktuelleMillis - letzteMillisMin >= 6e4) {              // jede Minute
    letzteMillisMin = aktuelleMillis;
    fifoWrite(maxSpeed, fifoHour, indexHour);                 // max Wert an den 1h Ringpuffer übergeben
    maxSpeed = 0;                                             // maxSpeed zurücksetzen
    if (indexHour == 0) {
      fifoWrite(maxRead(fifoHour), fifoDay, indexDay);        // max Wert an den 24h Ringpuffer übergeben
    }
  }
  snprintf(buf, sizeof(buf), R"(["%.1f","%d","%.1f","%.1f"])", speed, direction, maxRead(fifoHour), maxRead(fifoDay));
  return error ? buf : "[\"nan\"]";
}

Zurück