Schlagwort-Archive: ESP32

IOT – Wetterstation

Allgemeines

F√ľr die Erfassung und Verteilung¬†aktueller lokaler Wetterdaten wurde im Zuge eines Kundenauftrags diese IoT-Wetterstation mit integrierter Ethernet Schnittstelle auf Basis eines ESP32 entwickelt.

Alternativ kann auch auf die Anbindung √ľber die Ethernet Schnittstelle verzichtet werden und die Daten k√∂nnten stattdessen per WLAN Verbindung √ľber den Mikrokontroller ESP32 versendet werden.

Sie erfasst die folgenden Wetterdaten und sendet diese zyklisch per UDP-Broadcast √ľber den Port 8888 in das lokale Netzwerk. Auch hier w√§re der Versand per MQTT an einen Broker denkbar.

Wetterdaten:
  • Aktuelle Windgeschwindigkeit
  • Aktuelle Windrichtung (0 ‚Äď 360 ¬į)
  • Windrichtungswert als Windrichtungsindex
  • Aktuelle Au√üen- und Modultemperatur
  • Aktuelle Daten vom Kapazitiven Regensensor
  • Aktuellen LUX Wert, RAW Index und den Wei√ü Wert.
  • Regen Bit der Regenerkennung
  • D√§mmerungsbit der D√§mmerungserkennung
  • Windmax Bit der Windmax. Erkennung

Hardwareaufbau

Die Platine der Wetterstation hat eine Abmessung von 80 x 120 mm.
Sie besitzt Schraubklemmen zum Verbinden der Eingangssignale und eine RJ45 Buchse zum Anschluss der Netzwerkverbindung √ľber Ethernet, unten rechts im Bild.

IoT-Wetterstation Platine
IoT-Wetterstation Lux- und Kapazitiver Regensensor

Die Platine der verf√ľgt √ľber folgende Anschl√ľsse:

  • Einen Programmieranschluss f√ľr Firmware Updates
  • Einen RJ45 Netzwerkanschluss
  • Schraubanschl√ľsse f√ľr die Sensoren

Die ersten beiden Klemmanschl√ľsse dienen dem Anschluss der Versorgungsspannung, diese kann in einem Bereich von 7 ‚Äď 27 V= liegen.

Der n√§chste Anschluss wurde f√ľr einen potentialfreien Eingangskontakt vorgesehen, an den z.B. ein Regenmengenmesser mit Read Kontakt angeschlossen werden k√∂nnte (optional).

Der n√§chste Klemmenblock stellen zwei stabilisierte Ausgangsspannung 3.3V und 5.0 V zur Verf√ľgung. Hiermit k√∂nnen Beispielsweise externe Sensoren mit Spannung versorgt werden. Die n√§chsten beiden Klemmen GND und 1-Wire dienen zum Anschluss von externen 1-Wire Sensoren. In diesem Projekt wird hierr√ľber Au√üentemperatur mit einem 1-Wire Sensors vom Typ DS18B20 gemessen.

Die Letzten Klemmen sind Anschlussklemmen f√ľr zwei analogen Eingangskan√§le. Diese k√∂nne je nach Bedarf wahlweise 0 ‚Äď 10 V oder 0 ‚Äď 20 mA Eingangssignale verarbeiten.

Am ersten Analogeingang U-in1 und GND kann z.B. der Sensor zur Messung der Windgeschwindigkeit und am zweiten Analogeingang U-in2 und GND der Sensor f√ľr die Windrichtung angeschlossen werden.

Eine Kalibration der Messbereiche f√ľr die beiden Analogeneing√§nge U-in / I-in, erfolgt f√ľr jeden Kanal getrennt, mit je zwei Spindelpotentiometer.

Hierbei wird zuerst der Spannungseingang abgeglichen und das entsprechende Spindelpotentiometer zunächst gegen den Uhrzeiger auf seine linke Endposition gestellt.

Nach dem Anlegen einer Spannung von 10.0 V wird das Spindelpotentiometer solange verstellt, bis am entsprechenden Ausgangspin, Kanal 1 = Pin1 und Kanal 2 = Pin 7, des LM358 eine Ausgangsspannung von 3.0 V gemessen wird.

Anschlie√üend wird der Spannungseingang getrennt und derselbe Vorgang mit dem Stromeingang durchgef√ľhrt. So k√∂nnen beide Eingangskan√§le auf ihren Endbereich kalibriert werden.

Kanal 1:

  1. I – Abgleich 3.0V = 20 mA, CH1 Pin1 am LM358M
  2. U – Abgleich 3.0V = 10 V, CH1 Pin1 am LM358M

Kanal 2:

  1. I – Abgleich 3.0V = 20 mA, CH2 Pin 7 am LM358M
  2. U – Abgleich 3.0V = 10 V, CH2 Pin 7 am LM358M

Alle Eing√§nge der Wetterstation sind gegen ESD gesch√ľtzt, Die beiden Analogeing√§nge haben zus√§tzlich noch einen Verpolungsschutz und eine Einganswert Limitierung um bei einem zu hohen Spannungs- bzw. Stromwerts am Eingang den Mikrokontroller nicht zu zerst√∂ren.

Der Regensensor basiert auf einer Kapazitätsmessung.

Siehe hierzu:
Kapazitiver Regensensor mit einem ESP8266 / Arduino

Die ermittelte Kapazit√§t wird √ľber einen NE555 in ein digitales Frequenzsignal gewandelt und an den Mikrokontroller weitergeleitet, der dann die Berechnung und Auswertung √ľbernimmt.

Es sind zwei Temperaturmessung vorhanden, die √ľber den 1-Wire Bus erfasst und ausgewertet werden. Als Sensoren werden DS18B20 eingesetzt, der erste befindet sich direkt auf der Platine als TO-3 und dient zur Ermittlung der Geh√§useinnentemperatur, der zweite Sensor ist ein Wasserdichter Edelstahlsensor der in drei Leiter Technik √ľber die Klemmen des 1-Wire Eingangs angeschlossen ist und die Au√üentemperatur misst.

Zur Erfassung des LUX, RAW und Wei√üwerts wurde eine VEML7700 des Hersteller Vishay verbaut. Dieser ist √ľber eine I2C Schnittstelle an den Mikrokontroller angebunden und kann mit einer entsprechenden Parametrierung Lux Werte bis zu 150 Klx genau messen.

Das Herzst√ľck der Schaltung ist ein ESP32 Mikrokontroller mit 4 MB Flashspeicher der Firma Espressif. Dieser Kontroller verf√ľgt √ľber ein WLAN und Bluetooth Radio, das jedoch in diesem Projekt nicht zum Einsatz kommt, da der Datenaustausch √ľber Ethernet erfolgt.

Als Schnittstelle zum Ethernet ist ein USR-ES01 Modul mit W5500 Chipsatz vorhanden, die Anbindung an den Mikrokontroller erfolgt per SPI-Bus.

Die Spannungsversorgung f√ľr die Wetterstation k√∂nnte z.B. auch direkt √ľber das Netzwerkkabel, per Power Over Ethernet kurz PoE erfolgen. Hierf√ľr k√∂nnte ein PoE-Splitter, der eine stabilisierte Gleichspannung von 12V aus dem Signalkabel ausschleust, in das Geh√§use der Wetterstation eingebracht werden. Auf diese Weise k√∂nnte dann auch die Spannungsversorgung f√ľr den Wind- und Windrichtungssensor erfolgen.

Firmware Update

Um ein neues Firmware Update in den ESP32 Mikrokontroller zu laden, verf√ľgt die Platine √ľber einen zweireihigen, acht poligen Steckverbinder, an den der passende USB-Programmieradapter angesteckt werden kann, um eine neue Firmware in den Mikrokontroller der Wetterstation zu √ľbertragen.

Bei einer Verbindung per WLAN, k√∂nnte ein Update aber auch per OTA (Over the air) erfolgen. Diese Option seht leider bei einer Anbindung per Ethernet nicht zur Verf√ľgung.

Der USB-Programmieradapter muss dabei so aufgesteckt werden, dass er von der Grundplatine weg zeigt. Ein Vertauschen oder falsches aufstecken f√ľhrt zur sofortigen Zerst√∂rung der Wetterstation!

Das Herunterladen einer neuen Firmware darf deshalb nur von einer entsprechend eingewiesenen Person oder einem Fachmann durchgef√ľhrt werden!

F√ľr den Programmiervorgang muss die Spannungsversorgung zur Wetterstation unterbrochen sein und die Netzwerkverbindung getrennt werden! Des Weiteren kann es beim Flashvorgang zu Problemen kommen, wenn an den analogen Eingangskan√§len noch Sensoren angeklemmt sind. Deshalb wird auch hier empfohlen dies vor dem Flashvorgang zu entfernen!

Kapazitiver Regensensor Funktionsweise

Zum Blogbeitrag MQTT-Regensensor Modul

Allgemeines:

Im Internet wird eine Vielzahl von verschiedenen Regensensoren angeboten. Die meisten davon kommen aus Fernost und arbeiten nach dem Resistance Prinzip.

Trifft ein Regentropfen auf die nicht isolierten Kontakte des Sensors, werden die nebeneinanderliegenden kammf√∂rmigen Kontakte durch den Regen verbunden, was letztendlich zu einer Reduzierung des Sensorwiderstandes f√ľhrt.

Diese Widerstandsänderung ist abhängig vom Verschmutzungsgrad des Regenwassers, sowie der bereits eingetretenen Oxidation des Regensensors.

√úber eine Komparator Schaltung kann hierbei meist der Schaltpegel eingestellt werden, bei dem Regen detektiert wird und der dann ein digitales Ausgangssignal setzt.

Manche Sensoren stellen zus√§tzlich zu diesem Digitalausgang noch ein Analogsignal zur Verf√ľgung, was eine L√∂sung f√ľr eine zeitweilige Kalibrierung des Sensors durch die¬†Software erlauben w√ľrde.

Das große Problem bei dieser Messmethode ist es, dass selbst bei Sensoren mit vergoldeten Kontaktoberflächen immer parasitäre Ströme fließen.

Da praktisch immer ein kleiner Gleichstrom an beiden Polen des Sensors anliegt, f√ľhrt dies unabh√§ngig von der Qualit√§t des Sensors zu einem elektrochemischen Prozess und damit √ľber kurz oder lang zu einer schrittweisen Zerst√∂rung des Sensors.

Eine bessere Lösung stellt dieser Sensor dar, da er auf einem anderen Prinzip, dem kapazitiven Prinzip beruht.

Das Funktionsprinzip bei einem kapazitiven Sensor ist dem oben vorgestellten Messverfahren durchaus ähnlich. Es unterscheitet sich jedoch in einem wesentlichen Punkt, bei Regen wird hier keine leitende Verbindung hergestellt. Durch die Wassertropfen auf der Oberfläche wird lediglich die Kapazität des Sensors verändert, das Wasser wirkt als Dielektrikum.

Der Vorteil bei diesem L√∂sungsansatz liegt darin, dass keine blanken Leiterbahnoberfl√§chen der Witterung ausgesetzt sind und dadurch auch kein elektrochemischer Prozess ausgel√∂st wird, der den Sensor auf Dauer irreversibel besch√§digt. Alle leitenden Teile sind durch eine Lackschutzschicht vor Witterungseinfl√ľssen gesch√ľtzt.

Die Kapazit√§t des Sensors betr√§gt im trockenen Zustand ca. 170pF. Tritt eine Betauung ein oder trifft Regen auf den Sensor, steigt die Kapazit√§t an. Durch das ermittelte Delta C, l√§sst sich sogar eine Aussage √ľber die Art des Regens und dessen Intensit√§t treffen. Ist es Neblig oder es handelt sich um einen feinen Nieselregen, der die Sensoroberfl√§che benetzt, bilden sich viele kleine Wasser Tr√∂pfchen auf dem Sensor, was wiederrum zu einem gro√üen Delta C f√ľhrt.
Bei einem Durchschnittlichen Regen Ereignis sind es vorwiegend größere Tropfen, die zu einem großen Teil sofort wieder abrutschen, so ergibt sich ein kleineres Delta C.

Um schnell festzustellen zu können, ob der Regen zu Ende ist, besitzt der Sensor eine Heizung an der Platinen Unterseite. Diese besteht aus zwanzig 15 Ohm Heizwiderstände, die es bei einer Versorgungsspannung von 5V immerhin auf eine Heizleistung von knapp 1,8 W bringen.
Sie sorgen f√ľr eine z√ľgiges verdunsten der Fl√ľssigkeit bzw. einer Eisbildung auf der Sensoroberfl√§che.

Durch die sehr kleine Bauform des Sensors, kann selbst mit dieser relativ geringen¬† Leistung ein schnelles (ca. 5 Min√ľtiges) Abtrocknen sichergestellt werden.
Energetisch gesehen ist es sinnvoll, die Sensorheizung nur f√ľr die Dauer einer Regenerkennung zu betreiben. Das bedeutet, wird keine Feuchtigkeit oder Regen mehr detektiert, soll die Sensorheizung abgeschaltet werden!
Hierf√ľr ist ein Transistor auf der Sensorplatine vorgesehen.
Wird hier ein Mosfet best√ľckt und ist der Pin in dieser Hardware Version 1.00 f√ľr dessen Ansteuerung nicht angeschlossen, muss dieser auf Masse gelegt werden.
Da der Mosfet bei einem offenem Gate in einem Halbleitenden Zustand gehen k√∂nnte, was zur einer Zerst√∂rung des Bauteils f√ľhren w√ľrde.

Diese Bild zeigt die Best√ľckung der Unterseite des Sensors. Es ist gut zu erkennen, das im Layout zwar Pats f√ľr eine Befestigung der Sensorplatine vorgesehen sind, diese jedoch keine Bohrung besitzen. Weshalb hier auch kurz auf die Befestigung des Sensors eingegangen werden soll.

Wie zu sehen ist befinden sich die Anschl√ľsse ann√§hernd mittig auf der Sensorplatine.

Verwandt man z.B. eine feste wasserdichte Hensel Anschlussdose um die Elektronik darin zu verstauen, gen√ľgt es in den Deckel ein passendes rundes Loch zu bohren, damit die Anschl√ľsse nach innen geleitet werden k√∂nnen. Der Regensensor selbst wird am besten mit Silikon wasserdicht mit dem Deckel verklebt.
Sollten dennoch Befestigungslöcher benötigt werden, so können diese nachträglich ausgebohrt werden.

Es bietet sich an die Platine f√ľr die Auswertung mit dem entsprechenden Gegenst√ľck auszustatten, so dass diese von der Innenseite aufgesteckt werden kann.

Die Befestigung dieser Platine kann mit Distanzbolzen, die am Deckel eingeschraubt werden, erfolgen. Werden die Schrauben nicht vom Sensor (mit Silikon) √ľberdeckt, sollte hier auf Edelstahlschrauben zur√ľckgegriffen werden.

Im Unteren Bild ist der Schaltplan der Sensorplatine zu sehen.
Bei der Steckverbindung wurde wert daraufgelegt, dass die Signale f√ľr alle m√∂glichen Anschlussvarianten an den Pins herausgef√ľhrt wurden.

Somit stehen dem Endanwender auch alle m√∂glichen Messverfahren zur Verf√ľgung, die zur Kapazit√§tsmessung angewandt werden k√∂nnen.

Kapazitiver Regensensor V1.01

Pin Belegung:

  1.  VDD +5V / 3,3V
  2. NC
  3. Sensorheizung
  4. Ladewiderstand
  5. Analog wert (Ladezustand)
  6. Entladewiderstand
  7. GND
  8. GND

Kapazitätsmessung durch Laden- und Samplen der Kondensatorspannung

Die Platine des kapazitiven Regensensors wurde f√ľr verschieden Anwendungsbereiche entwickelt, deshalb gibt es auch verschieden Best√ľckungsvarianten.

Wenn man z.B. einen PIC Mikrokontroller mit einem Komperatoreingang verwnden, kann eine Messmethode angewendet werden, bei die Kapazit√§t des Sensor √ľber den Pin 6, R23 entladen wird (Pin auf LOW) und der Pin anschlie√üend wieder als Komperator Eingang umgeschaltet wird.
Der Pin 4, der zu diesem Zeipunkt im Tristate (hochohmig) war, wird nun als Ausgang programmiert und auf LOW geschaltet. Dieser l√§d nun die die Kapazit√§t des Regensensors √ľber R22 auf, bis der Komperatoreingang kippt.
Die ermittelte Zeit dient dann als Grundlage f√ľr die Kapazit√§tsbestimmung.
Beim MQTT-Regensensormodul wird ein anderes Messvervahren angewannt, da dieser nicht √ľber einen Komperatoreingang verf√ľgt.

Hier wird der AOUT (der gegen GND direkt die Kapazität des Sensors dartellt) als Kapazität eines Multivibrators genutzt, der abhängig von dieser Kapazität seine Ausgangsfrequenz ändert. Diese Ausgangsfrequenz wird an einem digitalen Eingang des ESP8266 gemessen und die Sensorkapazität aus der Frequenz berrechnet.

Da f√ľr dieses Messverfahren der C1, R22 und R23 nicht ben√∂tigt werden, m√ľssen diese Bauteile bei diesem Messverfahren nicht mit best√ľckt werden.

Das obengenannte Messverfahren, dass sich jedoch nur f√ľr gr√∂√üere Kapazit√§ten im Bereich zwischen 10 nF und 2000 uF eigent, beschreibt der folgende Source Code von von Matthias Busse

Quellenverweis :
Kapazitäten von 10nF bis 2000uF einfach messen mit dem Arduino

// Kapazität Messgerät 10nF bis 2000uF
//
// Matthias Busse 22.2.2015 Version 1.1

#define messPin 0            // Analog Messeingang
#define ladePin 13           // Kondensator lade Pin √ľber einen 10kOhm Widerstand
#define entladePin 11        // Kondensator entlade Pin √ľber einen 220 Ohm Widerstand 
#define widerstand  9953.0F  // 10 kOhm > gemessen 9,953 kOhm

unsigned long startZeit;
unsigned long vergangeneZeit;
float microFarad;
float nanoFarad;

void setup() {
  pinMode(ladePin, OUTPUT);     // ladePin als Ausgang
  digitalWrite(ladePin, LOW);  
  Serial.begin(9600);           // Serielle Ausgabe
  Serial.println("Kapazitaetsmesser Version 1.1");
}

void loop() {
  // Kondensator laden
  digitalWrite(ladePin, HIGH);            // ladePin auf 5V, das Laden beginnt
  startZeit = micros();                   // Startzeit merken
  while(analogRead(messPin) < 648){}      // 647 ist 63.2% von 1023 (5V) 
  vergangeneZeit= micros() - startZeit - 114; // 0-Messung abziehen (112-116 us)
  if(vergangeneZeit > 4294960000) vergangeneZeit = 0; // Minuswerte auf 0 setzen (ist long deshalb der hohe Wert)
 // Umrechnung: us zu Sekunden ( 10^-6 ) und Farad zu mikroFarad ( 10^6 ),  netto 1  
  microFarad = ((float)vergangeneZeit / widerstand);   
  Serial.print(vergangeneZeit);           // Zeit ausgeben
  Serial.print(" nS    ");         

  if (microFarad > 1){
    if(microFarad < 100) {
      Serial.print(microFarad,2);         // uF.x ausgeben
      Serial.println(" uF     ");
    }
    else {
      Serial.print((long)microFarad);     // uF ausgeben
      Serial.println(" uF     ");
    }
  }
  else {
    nanoFarad = microFarad * 1000.0;     // in nF umrechnen
    if(nanoFarad > 10) {
      Serial.print((long)nanoFarad);     // nF ausgeben
      Serial.println(" nF     ");
      }
    else
      Serial.println("kleiner 10 nF");  
  }

  /* Kondensator entladen */
  digitalWrite(ladePin, LOW);             // ladePin auf 0V 
  pinMode(entladePin, OUTPUT);            // entladePin wird Ausgang 
  digitalWrite(entladePin, LOW);          // entladePin auf 0V 
  while(analogRead(messPin) > 0){}        // bis der Kondensator entladen ist (0V)
  pinMode(entladePin, INPUT);             // entladePin wird Eingang
  
  while((micros() - startZeit) < 500000){}   // bis 500ms warten, d.h. max 2 Ausgaben pro Sekunde
}

Kapazitätsmessung sehr kleiner Kapazitäten

Da bei sehr kleien Kapazit√§ten die Ladezeit des Kondensators ebenfalls sehr klein wird, m√ľsste beim oben vorgestellten Messverfahren der Ladewiederstand im Verh√§ltnis hierzu entsprechend vergr√∂√üert werden, um mit der Samplingrate des AD-Wandlers im Mikrokontroller immer noch ein akzeptables Messergebnis erzielen zu k√∂nnen.

Das Problem bei einem sehr gro√üen Ladekondensator liegt darin, dass nat√ľrlich auch der analoge Eingang des Mikrokontrollers den Kondensator belastet und entl√§d. Der Messfehler wird also umso gr√∂√üer, je gr√∂√üer der Ladewiderstand wird, bis das System am Ende kippt und der Ladewiderstand die ben√∂tigte Ladung nicht mehr liefern kann.

Da sich die Kapazit√§t des Regensensors in einem Bereich von 170pF – max. 400 pF bewegt, wird hier f√ľr auf eine anderes Messverfahren zur√ľckgegriffen werden.

Das Frequenzmessverfahren

Bei diesem Messverfahren wird keine ADC benötigt, es kommt mit einem Digitaleingang des Mikrokontrollers aus.
Hierf√ľr kommt der hochgenaue Langzeittimer NE555 zum Einsatz.
Dieser Timer seht sowohl in einer 5V Variante als NE555, als auch f√ľr Mikrokontroller die nicht 5V tolerant in einer 3V Variante ICM7555 zur Verf√ľgung.

Arbeitet der Mikrokontroller mit 3,3,V und stehen nur ein NE555 zur Verf√ľgung, kann nat√ľrlich auch ein Spannungsteiler am Ausgang den Levelshift √ľbernehmen.

Der NE555 wird in dieser Schaltung als Multivibrator eingesetzt, der abhängig von angeschlossenen Kondensator seine Ausgangsfrequenz verändert.

Wenn am Ausgang gleiche Ein- und Ausschaltzeiten erzeugt werden sollen, muss die Standardschaltung (siehe oben) mit einer Diode parallel zum Widerstand R2 aufgebaut werden. Andernfalls kann diese Diode einfach entfallen. In der obigen Bauteilauslegung ist das Tastverhältnis annähernd 1:1 was auch hier die Diode unnötig macht.
Im Programm des Regensensors werden beide Varianten ber√ľcksichtigt. Da sowohl die Zeitdauer der negativen als auch der positive Halbwelle gemessen und anschlie√üend addiert werden. Und damit die ganze Periodendauer berechnet wird.

F√ľr die Messung wird vom Regensensor nur der Pin 5 (Analogwert) und Pin 7 (GND) ben√∂tigt.
Soll die Heizung genutzt werden kommen noch der Pin 1 (VDD) und Pin 3 (Sensorheizung aktivieren) hinzu.

Die Ein- Zeit berechnet sich wie folgt:
T1= 0,694 * (R1 + R2) * C

Die Aus- Zeit berechnet sich wie folgt:
T2= 0,694 * R2 * C

Die gesamte Periodendauer ist die Summe aus T1 +T2
T = 0,694 * C * (R1 +(2 * R2))
f = 1 / T

Die Frequenz ist 1 / T1 + T2, damit ergibt sich die Ausgangsfrequenz nach folgender Formel:
f = 1 / (0,694 * C * (R1 +2 * R2))

Da bei dieser Anwendung f√ľr uns nicht wichtig ist, welche Kapazit√§t der Sensor hat, kann bereits die gemessene Frequenz f√ľr eine Regenauswertung verwendet werden.

Der Vollständigkeit halber hier trotzdem noch die kurz die nach C umgestellte Formel:
C =1 / ( f * 0,694 * (R1 + 2 * R2))

Programaufbau f√ľr die Kapazit√§tsmessung des Regensensors

/* Capacitivemeasurement (c) by Dillinger-Engineering 10/2020

   Funktionsweise:
   Um die kleinen Kapazitätsveränderungen des Regensensors (pF-Bereich)
   mit einer hohen Genauigkeit zu messen, wird hier ein NE555/3V verwendet.
   Dieser arbeitet als Multivibrator mit einer Frequenz im KHz Bereich.
   √Ąndert sich die Messkapazit√§t, √§ndert (sinkt) auch die
   Frequenz. Je nach Auslegeung der Schaltung kann √ľber die
   Frequenzänderung dann die entsprechende Kapazität errechent werden. 
   Je gröer der Parameter "MeasuringCycleleTime" gewählt wird,
   um so genauer wird auch die Messung. Zu beachten ist dabei jedoch,
   dass sich, sollte ein Sensor Fehler (kein Signal vom Eingang) vorliegt, damit
   auch die Timeoutzeit entsprechnde verlängert !
*/

const byte InputPin = 5;                       // Wemos D1 mini (Pin D1)
const unsigned int MeasuringCycleleTime = 1e6; // 1000000 us
const long R1 = 10000;   //  10 KOhm
const long R2 = 100000;   // 100 KOhm


float GetFrequeny(){  // Ergebnis in Hz
  float fsum = 0.0;
  unsigned int counts = 0;
  double f, T;
  unsigned long SartTtime = micros();
  bool Fail = false;
  do {
    T = pulseIn(InputPin, HIGH, MeasuringCycleleTime) + pulseIn(InputPin, LOW, MeasuringCycleleTime);
    if(T==0){
      Fail = true;
    }
    f=1/T;      
    counts++;    
    fsum += f * 1e6;
  } while(micros() < (SartTtime + MeasuringCycleleTime) && !Fail); // 1 Sekunde mitteln
  if(Fail){
    return(0);
  }else{
    f = fsum / counts * 0.9925;    //Korrekturwert ermitteln und einrechnen
    return(f);
  }
}

float GetCapacity(){  // Ergebnis in pF
  return(1/(GetFrequeny() * 0.694 * (R1 + 2 * R2))* 1e12);
}

void setup() {
  pinMode(InputPin, INPUT);
  Serial.begin(115200);
}

void loop() {
  char CharStr[30];
  
  // Show Data on Serial if available
  sprintf(CharStr,"Capacity: %.3f pf", GetCapacity()); 
  Serial.println(String(CharStr));
  sprintf(CharStr,"Frequenz: %.3f Hz", GetFrequeny()); 
  Serial.println(String(CharStr));
}

 

ESP Interrupt Routiene Linkerattribute

Beim der Einbinden von ISR Routienen in den Quellcode des ESP kann es zu einer Fehlermeldung des Compilers kommen.

need to add the ICACHE_RAM_ATTR macro to interrup service routines (ISRs)

Das ICACHE_RAM_ATTR und ICACHE_FLASH_ATTR sind Linkerattribute. Bevor Sie Ihren Programmcode kompilieren, können Sie festlegen, ob die Funktion im RAM oder FLASH gespeichert werden soll (normalerweise legen Sie nichts fest: kein Cache).

Der ESP8266 ist Multitasking und der ESP32 verf√ľgt √ľber 2 Kerne. So k√∂nnen Sie Ihren Code als Multithreading ausf√ľhren, da er das RTOS verwendet.

Und jetzt das Problem: Der gesamte Flash wird f√ľr das Programm und die Speicherung verwendet. Das Lesen und Schreiben in den Flash kann aber nur √ľber einen Thread erfolgen. Wenn Sie versuchen √ľber 2 verschiedene Threads gleichzeitig auf den Flash zuzugreifen, kann es bei einem Konflikt zu abst√ľrzen Ihres ESP kommen.

Sie können Ihre Funktion anstelle des Flashs, aber auch im RAM ablegen. Selbst wenn Sie etwas in das EEPROM oder den Flash schreiben, kann diese Funktion aufgerufen werden, ohne auf den Flash zuzugreifen.

Mit ICACHE_RAM_ATTR stellen Sie die Funktion in den RAM.
und
mit ICACHE_FLASH_ATTR stellen Sie die Funktion in den FLASH, z.B. um RAM zu sparen.

Interrupt-Funktionen sollten deshalb immer mit dem ICACHE_RAM_ATTR Linkerattribute versehen werden.
Funktionen, die häufig aufgerufen werden, sollten kein Cache-Attribut verwenden.

Wichtig:
Greifen Sie NIEMALS innerhalb eines Interrupts auf Ihren Flash Speicher zu!
Da der Interrupt jeder Zeit während eines Flash-Zugriffs auftreten kann.
Wenn Sie also gleichzeitig versuchen, auf den Flash zuzugreifen, kommt es zu einem Absturz und das kann manchmal auch erst nach einer lägerer Betriebszeit geschehen.

Da Sie nur 32 KB IRAM (Instruction RAM) haben, sollten Sie versuchen, nur Interrupt-Funktionen in den RAM zu stellen.
Nicht alle Ihre Funktionen, auch wenn dies mit Linkerattributen möglich ist.

const uint8_t interruptPin = 14;
volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;
void ICACHE_RAM_ATTR handleInterrupt();

void setup() {

  Serial.begin(9600);
  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, CHANGE);

}

void handleInterrupt() {
  interruptCounter++;
}

void loop() {

  if(interruptCounter>0){

      interruptCounter--;
      numberOfInterrupts++;

      Serial.print("An interrupt has occurred. Total: ");
      Serial.println(numberOfInterrupts);
  }

}
// Quelltext by Alfredo Ramirez

 

 

Timekeeper, Zeitmessung mit Großdisplay und App

Technische Beschreibung Timekeeper alle Versionen
Technische Beschreibung Timekeeper alle Versionen

Key Features

  • Weiter Eingangsspannungsbereich von 8 ‚Äď 27V,¬† 12V Batteriebetrieb m√∂glich
  • Konfiguration aller Modulparameter direkt am Timekeeper m√∂glich.
  • Gro√ües 1024 Pixel LED DOT-Matrix Display f√ľr die Anzeige der gemessenen Zeiten
  • Konfiguration √ľber Taster am Modul oder die Blynk APP
  • Konfigurierbare Ruhelagen NO (normally open), NC (normally closed) der angeschlossenen Sensoren
  • Zeitanzeige am Display, √ľber die Blynk App oder das Web-Interface
  • F√ľr viele verschieden Messverfahren einsetzbar (Lichtschranken, Druckschlauchmessung oder Potentialfreie Eingangskontakte
  • Viele verschieden Messmodis ausw√§hlbar (Einzelzeiten, Rundenzeiten, Zwischenzeit, EinzelInitiator Messung uvm.)
  • Unterdr√ľckung von mehrfach Ausl√∂sungen beim √úberfahren bei Schlauchmessverfahren.
  • OTA Firmware Update
  • Time Display Funktion f√ľr Alge Comet Zeitmessmodule (ab Version VX.04)
  • Einstellung der Display Helligkeit f√ľr Energieeinsparung z.B. bei Battereibetrieb (ab Version VX.05)
  • Zeitdifferenz korrekt (ab Hardware Version 2, Software Version 1.27)

Allgemeines

Die hier beschriebene Zeitmessung ‚ÄěTimekeeper‚Äú entstand auf Anfrage f√ľr eine Zeitmessung zu Trainingszwecke f√ľr eine Gleichm√§√üigkeitspr√ľfung, wie sie bei Oldtimer Rennen zur Wertung durchgef√ľhrt wird.

Aufgabenstellung:

Beim Durch- bzw. √úberfahren eines Startinitiators sollte eine neue Zeitmessung begonnen werden, diese sollte mit dem Durch- bzw. √úberfahren des Zielinitiators enden.
Die Zeitnahme sollte in drei verschiedenen Modi erfolgen k√∂nnen, eine reine Zielzeiterfassung, eine Ziel- und Zwischenzeiterfassung (was einen weiteren Zeitmesseingange f√ľr die Zwischenzeit notwendig machte) und die Erfassung von zwei Rundenzeiten (LAP1 und LAP 2).

Die gemessenen Zeiten sollten durch eine große Anzeige, die gut aus dem Fahrzeug, nach Beendigung der Zeitnahme abzulesen wäre. Des Weiteren sollte die Möglichkeit bestehen, die gemessenen Zeiten zusätzlich in einer APP auf dem Smartphon angezeigt zu bekommen.

Eine Webserver Ansicht, die alternativ zur APP Ansicht benutzt werden könnte, wurde ebenfalls angestrebt.

Die Anforderungen wurden in diesem Projekt kurzbeschrieben wie folgt realisiert:
Die gesamte Zeitmessung erhielt ein robustes Aluminium Gehäuse mit einer verspiegelten Plexiglasscheibe, hinter der eine gut lesbare LED DOT Matrix Anzeige angebracht wurde.
Die Auflösung des Displays beträgt 1024 Led Bildpunkte.

Um die drei Initiatoren direkt per M12 Steckverbinder anzuschlie√üen, wurden auf der R√ľckseite des Geh√§uses drei Buchsen angebracht, die einen direkten Anschluss von Industrie Laserlichtschranken (z.B. der Firma Leutze) erm√∂glichen.
Aus diesem Grund wird das Modul mit einem =24V/2A Stecker Netzteil versorgt, dass sogleich die Versorgungsspannung f√ľr die angeschlossenen Initiatoren wie auch der internen Elektronik bereitstellt.

Die Zeiterfassung erfolgt Mikrocontroller gest√ľtzt, mit einem ESP8266.
Dieser Baustein bietet alle Voraussetzungen, die f√ľr die Realisierung des Projektes und eine Anbindung √ľber ein WIFI Netzwerk notwendig sind.
Die dabei erzielte Messgenauigkeit beträgt +/-1 ms.

Eine Externe Antenne sorgt f√ľr eine optimale Reichweite des Moduls.

Um die ermittelten Zeiten direkt auf einem Smartphone anzuzeigen, wurde eine Anbindung an die BLYNK APP realisiert.
Da diese APP ist sowohl f√ľr Android als auch f√ľr IOS erh√§ltlich ist. Sie √ľberzeugte durch ihr offenes und flexibles Konzept und ist zudem eine sehr kosteng√ľnstige L√∂sung f√ľr den Endkunden.

Durch den Kauf von zusätzlicher Energie, kann die App leicht und flexibel um weitere Anzeigen und Funktionen erweitert werden.

Ist keine Internetverbindung möglich oder vorhanden, arbeitet das Timekeeper Modul somit nach der Initialisierung im Standalone Modus, die ermittelten Zeiten werden auf dem Display angezeigt.

Zus√§tzlich k√∂nnen die gemessenen Zeitinformation in diesem Betreibsmodus aber auch √ľber ein integriertes Webinterface abgerufen und angezeigt werden. Hierf√ľr wird ein interner Access Point ge√∂ffnet, mit dem man sein Smartphon verbinden kann, um auf die ermittelten Zeiten zuzugreifen.

Ist eine Anbindung an ein lokales WLAN und somit eine Internet Verbindung vorhanden, bietet das Modul weitere Optionen f√ľr die Bedienung und die Zeitanzeige.

Es ist dann z.B. möglich die neusten Firmware Updates vom Webserver des Herstellers direkt in das Modul zu laden und zu installieren.

Ein integrierter NTP-Zeitservice stellt dann die aktuelle Uhrzeit und das Datum zur Verf√ľgung. Wird mit dem Modul l√§nger als 90 Sekunden keine neue Zeitmessung mehr durchgef√ľhrt wird diese dann automatisch auf dem Display angezeigt.

Die Auswahl verschiedener Funktionen erfolgt √ľber dem MODE-Taster auf der R√ľckseite des Moduls. Damit kann ein Men√ľ aufgerufen werden, um die Funktionsweis des Moduls zu konfigurieren.

Die M12 Buchsenanschl√ľsse sind kompatible mit der von uns empfohlenen Leuze Laserlichtschranken von Typ PRKL 25 4.1 200-S12 und k√∂nnen somit direkt angeschlossen und betrieben werden.

Steckerbelegung Lichtschranken:

Draufsicht M12 Buchse:



Blynk Applikation:

Webansicht:

Kundenreferenzen des Auftraggebers:

Folgende Links wurden uns vom Kunden, der die Entwicklung des Timekeeprer bei uns beauftragt hat zur Verf√ľgung gestellt.

Timekeeper auf YouTube

Versionsverlauf:


Intended:

  • Keine neuen Anforderungen

Released:

09.10.2023 HW Versionen 2, Firmware Version 1.29
¬†Korrekturwertfaktor f√ľr Abweichung der Millis() bei der Zeitnahme eingebaut. Integration des Korrekturwertfaktors der Millis() in das Webinterface
HTML Code √ľberarbeitet und Fehlerbeseitigung beim Time Div
√úberarbeitung Lokaler AP Fehlerbeseitigung

07.08.2023 HW Versionen 2, Firmware Version 1.28
Ab dieser Version wird der Hostname des Timkeepers dem Router mitgeteilt, so das dieser dort  im Klartext zu sehen ist!

27.06.2022 HW Versionen 2, Firmware Version 1.27
Alle Einstellungen, die urspr√ľnglich √ľber die BLYNK App vorgenommen werden konnten, wurden in dieser Version nun in die Weboberfl√§che integriert. Da der Anbieter der BLYNK App die¬† Unterst√ľtzung seines Dienstes bis Ende 2022 abgek√ľndigt hat!
Desweiteren wurden die Settings um ein Eingabefeld zur  Zeitdifferenz korrekt erweitert, diese erlaubt einen Abgleich mit anderen Messsystemen.

√Ąltere Versionen:
Aufgrund einer Server Umstellung unseres Providers, k√∂nnen OTA-Updates nun nur noch ab Version 1.x6 durchgef√ľhrt werden!
F√ľr eine Firmware Update Ihrer √§lteren Timekepper Version, muss Ihr Ger√§t zu uns eingeschkickt werden!
W√ľnschen Sie ein Update, fordern Sie bitte ein Angebot bei uns an.

  • 18.04.2021: Alle HW Versionen, Firmware Version 03
  • Einstellen der Display Helligkeit.

  • – √úberarbeitung der Interrupt Routiene bei der Zeiterfassung f√ľr
    eine höhere Genauigkeit.
    – Neuen Men√ľpunkt zum abschalten der WIFI Verbindung (Zeiteinsparung beim Starten, wenn kein WIFI verf√ľgbar).
    РAnzeige Fortschrittsanzeige während deines Firmwareupdates.
    РVerbesserung der Systemsabilität.
    – Ge√§nderte Hardware bei den DOT Matrix Displays von Maxim, unterscheidung √ľber die Hardware Version des Timekeeper Moduls bei OTA-Update

  • 15.12.2020: Version 1.02
    – Neue ‚ÄěHold Ini‚Äú Zeitnahmefunktion.
       Misst die Zeitdauer, die der Initiator aktiv war.
    – Eine √Ąnderung der Zeitnahmemethode direkt am Timekeeper
    ¬†¬† wird nun auch r√ľckw√§rts in der Blynk App Blynk App
       aktualisiert.
    – Wenn kein NTP Zeitserver Server erreichbar ist, wird die
       Uhrzeit / Datum Anzeige am Timekeeper Modul abschalten.
    – Erweiterte Webdarstellung, Listenansicht mit bis zu zwanzig
       Einträge und einem CSV Export Funktion.
  • 08.05.2019: Version 1.01
    ‚ÄěSingle Ini‚Äú Zeitnahmefunktion mit nur einem Initiator, Trenddarstellung der Zeitdifferenz und Umgestaltung der Bedienelemente.
    Erweiterung der Blynk App um ein Eingabefeld f√ľr die Entfernung zwischen dem Start- und Ziel Initiator sowie die Integration einer Anzeige der daraus berechneten Geschwindigkeit.
  • 20.04.2019: Version 1.00
    Timekeeper finale Version 1.00, Firmware released.