Schlagwort-Archive: ESP8266

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!

Pressure Sensor

Beschreibung Pressure Sensor
Beschreibung Pressure Sensor
Pressure-Sensor.pdf
Version: V1.01
1.3 MiB
3 Downloads
Details

Allgemeines

Die hier beschriebene Druckmessung entstand aus dem Projekt Timekeeper, dass auf Anfrage für eine Zeitmessung zu Trainingszwecke für eine Gleichmäßigkeitsprüfung durchgeführt wurde.
Als der Timekeeper beim Auftraggeber im Einsatz war, stellte sich heraus, dass das justieren der Lichtschranken gerade bei Sonnenschein eine mühselige Unterfangen darstellt.

Außerdem hängt die Genauigkeit der Erfassung hierbei auch immer von der Justierung der Lichtschranken ab. Da je nach Höhe und Winkel der Start- und Ziellichtschranke, diese bei verschieden Fahrzeugen unterschiedlich ausgelöst werden können. Diese Fehler bewegen sich zwar meist nur in Millisekunden Bereichen, können aber durchaus die Wertungsergebnisse beeinflussen.

So wurde die Idee geboren, einen alternative Messmethode zu testen. Es sollte eine Druckschlauchmessung aufgebaut werden, die quer über die Fahrbahn gelegt werden kann, umso eine Messmethode zu erhalten, die direkt an den Rädern des Fahrzeugs misst. Also Unabhängig von der Form und Bauart der Karosserie.

Es wurde ein PVC-Schlauch, der an einem Ende geschlossen war, an eine Handelsübliche Druckmessung angeschlossen und der Potentialfreie Ausgangskontakt mit dem entsprechenden Initiator Eingang des Timekeeper Moduls verbunden.

Die ersten Tests lieferten bereits sehr viel versprechend Ergebnisse und bewiesen, dass der grundsätzliche Testaufbau funktionierte.

Nach dem die ersten Erfahrungen mit verschiedene Schlauchmaterialien, Druckaufnehmer und den in der Praxis auftretenden Störeinflüssen gesammelt wurden. War schnell klar, dass eine handelsübliche Druckmessung die Anforderungen an diese Aufgabe nur bedingt erfüllen kann.

Der Nachteil eines solchen Messverfahrens ist eine vergleichsweise ungenaue Messung, da die Kunststoffschläuche ein gewisses Eigenleben haben, das zum Beispiel zu temperaturabhängigen Kriecheffekten und Offsetproblemen führt.

Es musste also eine speziell auf diese Art der Anwendung zuggeschnittene Lösung entwickelt werden.

Spezielle Funktion für die Schlauchdruckmessung

Das Hauptproblem stellt nicht die Messung an sich dar, sondern die Umgebungsbedingungen. Den der Druck im inneren des Schlauches ist natürlich in erster Linie abhängig von der Umgebungstemperatur.

Stellen wir uns folgendes vor, der Messaufbau wird am frühen Morgen installiert und getestet. Die Auslöseschwelle beim Überfahren des Schlauchs wird auf ein optimales Auslöseverhalten für die Art und Länge des Schlauchs programmiert.

Der Tag beginnt mit einem relativ kühlen Vormittag, entwickelt sich aber gegen die Mittagszeit zu einem sehr sonnigen Tag.
Am Nachmittag entstehen am Himmel größere vorbeiziehende Wolkenfelder.

So könnte ein normaler Sommer Tag aussehen … was passiert aber nun mit dem Druck im Sensorschlauch?

In der Früh wurde die Messung kalibriert und optimal eingestellt.
Am Vormittag steigt der Druck im Schlauchsensor jedoch stetig an. Im Extremfall sogar bis über die programmierte Auslöseschwelle.

Am Nachmittag wechselt der Druck im Schlauch im Verhältnis der vorbeiziehenden Wolkenfelder hin und her.
All dies hat Einfluss auf das Auslöseverhalten und die Genauigkeit der Messung und kann sogar zu Fehlauslösungen führen.

Genau für diesen Anwendungsfall wurde eine spezielle Zusatzfunktion in diese Druckmessung integriert.

Diese überwacht ständig den Druck im Sensorschlauch, steigt bzw. fällt der Druck (Delta P) über- oder unter einen programmierbaren Schwellwert und bleibt für eine definierbare Zeit (t) außerhalb der definierten Grenze, wird eine (AC) automatische Nullpunkt Kalibration des Relativdruckwertes durchgeführt.

Aufgabenstellung:

Es sollte eine Druckmessung mit einem weiten Eingangsspannungsbereich von 8 – 27V entwickelt werden.
Damit ein Betrieb mit einem Bleiakku (12V KFZ-Batterie), einem externen Netzteil oder eine direkte Versorgung aus dem Timekeeper Modul möglich ist. Dieser wird üblicherweise mit 24V gespeist.

Die Konfiguration der Modulparameter sollte direkt am Pressure Sensor Modul möglich sein. Für die Anzeige sollte ein kleines OLED-Display für die Anzeige der Messwerte und der Menüfunktionen vorhanden sein. Die Bedienung erfolgt dabei über einen Drehwahlschalter bzw. alternativ über einen Taster, der die Navigation und Auswahl der Menü Punkte erlaubt.

Das Modul sollte über drei konfigurierbare, potentialfreie Ausgangskontakte verfügen. Welche das Über- und Unterschreiten einer einstellbaren Druckschwelle, sowie einen Sensorfehler ausgeben können. Für jedes dieser drei Relais kann die Ruhelage NO (normally open) oder NC (normally closed) separat festgelegt werden.

Optional zur Werte- und Fehleranzeige am Sensor Modul, sollten diese Informationen auch über die Blynk App und ein Web Interface zugänglich sein.

Über die integrierte Micro USB-Schnittstelle sollen nach Aktivierung dieser Funktion im Menu, die Messwerte sowie die Statusmeldungen im Textformat ausgegeben werden. Damit diese für eine externe Weiterverarbeitung genutzt werden können.

Bei der Entwicklung der Messung sollte Wert daraufgelegt werden, dass diese sehr vielseitig, auch für beliebige andere Druckmessaufgabe eingesetzt werden kann.
Es sollen zwei verschiedene Messarten möglich sein, Messung des Absoluten Drucks sowie die Messung des Relativen Drucks.

Die Messung des Relativen Drucks sollte auch manuell Kalibriert werden können.

Für den Einsatz in Verbindung mit einer Druckschlauchmessung, muss eine spezielle Funktion implementiert werden, die bei Bedarf einen automatischen Differenzdruckabgleich durchführen kann. Dieser soll immer dann durchgeführt werden, wenn der Druck einen definierbaren Schwellwert (P) für eine definierbare Zeit (t) über- bzw. unterschreitet.

Das Pressure Sensor Modul sollte ein Teilbares System werden, das aus einem wechselbaren Drucksensor, dem eigentlichen Auswertemodul und einem schnell wechselbaren Schlauchsystem besteht.

Auf diese Weis ist es leicht möglich das Sensorsystem je nach Anforderung kundenspezifisch anzupassen.

In einem weiterer Entwicklungsschritt, soll die Firmware um eine eigenständige Zeitnahme Funktionalität erweitert werden.
Die Zeitmessung beginnt mit dem ersten Überfahren des Schlauchsensors und endet mit dem zweiten Überfahren.
Damit die Zeitmessung nicht sofort nach dem Überfahren mir den Hinterreifen wieder beendet wird, soll eine Verzögerungszeit zwischen der Start- und Endzeiterfassung eingegeben werden können, um dies zu verhindern.

Der Drucksensor:

Der verwendete Drucksensor ist ein analog arbeitender Sensor vom Typ: NP-TP-0016.
Er besitzt ein robustes Edelstahlgehäuse in dem sich ein präziser Druckkeramiksensor befindet. Die Vorverarbeitung des Messwerts übernimmt ein integrierter Mikrocontroller.
Der Sensor besitzt eine lange Lebensdauer bei einer geringen Langzeitdrift.

Die Verbindung zur Auswerteelektronik wird über eine dreipolige wasserdichte PACK-Steckverbindung hergestellt.
Die Versorgungsspannung des Sensors beträgt 5V ± 0,25V
Der Messbereich beträgt 0 – 15 psi / 0 – 1 bar
Der Analogausgang arbeitet in einem Spannungsbereich von 0,5V – 4,5V linear zum Skalendruck. Der Zerstörungsdruck liegt beim 3-fachen Skalendruck.

Da der Sensorwert über ein Analogsignal im Bereich von 0,5V – 4,5V übertragen wird, ist es leicht möglich, beim einem Über- bzw. Unterschreiten dieser Werte, eine Drahtbruch bzw. Kurzschluss Auswertung vorzunehmen.

Farbcode der Sensoranschlussdrähte:

  • Analogausgang 0,5-4,5V                   Grün
  • +5V (VDD)                                                 Schwarz
  • Masse (GND)                                            Rot
Datenblatt Drucksensor NP-TP-0016
Datenblatt Drucksensor NP-TP-0016
5V-Druck-Sensor-0-15-PSI-Edelstahl.pdf
271.2 KiB
40 Downloads
Details

Anschlussbelegung Hardware

Anschlussbelegung V1.00

REL. MIN      Potentialfreier Kontakt für eine min. Druck
REL. MAX    Potentialfreier Kontakt für eine max. Druck
REL. ERR      Potentialfreier Kontakt für eine Sensorstörung
SENS.             Sensor analog Eingang max. 0-5V
GND               Ground (Minus)
+5V                 Spannungsversorgung 5V Sensor
+3,3V             Spannungsversorgung 3,3V Sensor
+8-27V-       Spannungsversorgung Pressure Sensor Modul

Versionsverlauf:

Intended:

  • Integration Zeitmessmethode durch Druckauslösung
  • Ergebnisliste im Webserver.
  • Ergebnistabelle im Webserver als CSV exportieren.
  • Anzeige der Ergebnisse in der Blynk App.
PressureSensor V101
PressureSensor V101
PressureSensor_V101.png
Version: 1.01
2.9 KiB
30 Downloads
Details

Released:

  • 15.12.2020: Version 1.00
    – Druckmessung relativ / absolut
    – Autocalibration
    – Sensorfehlererkennung Relaisausgang NC/NO
    – Seriale Ausgabe der Werte über USB,
    – Min/Max Wert Relaisausgänge NC/NO
    – Webbrowser Darstellung
    – Blynk Applikation
PressureSensor V1.00
PressureSensor V1.00
PressureSensor_V100.png
Version: 1.00
10.7 KiB
29 Downloads
Details

Kapazitiver Regensensor mit einem ESP8266 / Arduino

Allgemeines:

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

Resistance Regensensor

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 ireversiebel 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 auf, 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 z.B. 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, wann der Regen wieder 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 oder der Eisbildung auf der Sensoroberfläche.

Durch die sehr kleine Bauform des Sensors, kann selbst mit dieser relativ geringen  Leistung ein schnelles  (ca. 5 Minuten) 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 bereits ein Transistor auf der Platine vorgesehen.
Wird hier ein Mosfet bestückt und ist der Pin 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.

Bestückung der Platinen Unterseite

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 werden, 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 alle möglichen Verfahren zur Verfügung, die zur Kapazitätsmessung angewandt werden können.

Schaltplan Kapazitiver Regensensor V1.00

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

Source  Code als Anwendungsbeispiel 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, damit mit der Samplingrate des AD-Wandlers im Mikrokontrolers immer noch ein akzeptables Messergebnis erzielt werden könnte.

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 kippt und der Ladewiderstand die benötigte Ladung nicht mehr liefern kann.

Da sich der Regensensor in einem Kapazitätsbereich von 170pF – max. 400 pF bewegt, musste hierfür auf eine anders Messprinzip 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 der 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 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.
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));
}

 

ESP8266 EEProm richtig verwenden

Grundlagen

Der ESP8266 verfügt je nach Bestückung des verwendeten ESP-Moduls über ein Flash Speicher, der von 512 Byte bis zu 16KByte reichen kann.

Beim ESP wird hiervon fester Bereich von 4096 Byte für eine „qasi“ EEProm reserviert, welches vom Programm gelesen und auch beschrieben werden kann. Diese Daten bleiben wie das Programm nach einem Neustart erhalten.

Die Größe dieses für den EEProm reservierten Bereichs ist in der spi_flash.h unter SPI_FLASH_SEC_SIZE (4096) definiert.

Quelle: www.ullisroboterseite.de
Quelle: www.ullisroboterseite.de

EEproms eignet sich perfekt zum speichern non Daten bzw. von Daten Strukturen, die nach einem Neustart des ESP wieder zur Verfügung stehen sollen.
Da es sich hierbei aber immer noch um eine Flash Ram handelt und diese vom Hersteller mit einer maximalen beschreibbarkeit von ca. 10.000 mal angegeben werden, sollten hier nur Daten gespeichert werden, die keiner häufigen oder gar zyklischen Änderung unterliegen. 

Deshaln eignet sich dieser Speicher auch nicht für Messdaten, für  Konfigurationsdaten, die sich aber nur selten ändern, ist er perfekt.

Verwendung

Die definition erfolgt als Arduino-typischer Klassenkonstruktor mit der Klasse EEPROMClass, diese stellt eine Reihe vordefinierter Funktionen bereit, die für das Handling mit dem EEProm notwendig sind.

Mit „void EEPROMClass::begin(size_t size)“ wird das Objekt zunächst initialisiert.

Dabei wird ein interner Puffer mit Namen _datain der angegeben Größe angelegt.
In diesen Bereich, der nun als EEPROM deklarierte ist, wird nun der Puffer eingelesen.
Alle nachfolgende Lese- bzw. Schreib Operationen in disem Zwischenpuffer.
Dieser Zwischenpuffer wird erst dann in den Flash Speicher übertragen, wenn man dies mit der Methode EEPROM.commit(); anfordert oder das Programm die Operation mit einem EEPROM.end(); abschließt.

Die internen Variablen _dirty vermerkt, ob eine Änderung des Dateninhalts stattgefunden hat. Ein Zurückschreiben des Pufferinhalts erfolg deshalb nur dann, wenn auch eine Änderung stattgefunden hat.

Die Methode getDataPtr() liefert den Zeiger auf den internen Pufferspeicher. Bei einem Aufruf dieser Methode wird _dirty gesetzt, da der Pufferinhalt über diesen Zeiger abgeändert werden könnte.

Der Kalssenaufruf EEPROMClass benötigt beim Konstruktor die Angabe der Speicheradresse (Sektornummer) in EEPROM.cpp, _SPIFFS_end ergibt sich aus der in der IDE festgelegten SPIFFS-Konfiguration.

Die vordefinierte Instanz der Klasse EEPROM wir folgt angelegt:

EEEPROMClass EEPROM((((uint32_t)&_SPIFFS_end - 0x40200000) / SPI_FLASH_SEC_SIZE));

Um z.B. Konfigurationsdaten in Verbindung mit dem EEPROM zu lesen und zu speichern, bietet es sich an die Daten in einer Structur zu verwalten.

 

typedef struct {
  int PHysteresisH1 = 10;          // Fall Back Hysteresis für Relais 
  int PThresholdH1 = 100;          // Schwellwert für Relais 
  int PHysteresisL1 = 10;          // Fall Back Hysteresis für Relais 
  int PThresholdL1 = 50;           // Schwellwert für Relais 
  int PRelaisStateL1 = 0;          // 0- NO / 1- NC
  int PRelaisStateH1 = 0;          // 0- NO / 1- NC
  int PRelaisStateErr = 1;         // 0- NO / 1- NC
  int PSerialOutState = 0;         // 0- OFF / 1- ON
  int PWifiState = 0;              // 0- OFF / 1- ON
  int PMode = 0;                   // 0= relative / 1= Absolut Druck
  int PACMode = 0;                 // 0= keine Autocalibration / 1= Autokalibration
  int PDeltaAC = 10;               // Maximale Abeichung Druckdifferenz 
  int PCalibrationTime = 5000;     // Calibration Counter Time in ms
  unsigned long PHoldTime = 500;   // Für Abfallverzögerung in ms
} PSettings;
PSettings psettings;

Um Speicherplatz zu sparen, sollte der Pufferspeicher nicht größer als notwendig initialisiert werden. Die Maximale Größe beträgt 4096.

Lesen von Daten aus dem Pufferspeicher

EEPROM.begin(1024); // Puffergröße die verwendet werden soll
EEPROM.get(512, psettings); // Anfangsadresse bei der die definierte Structur abgelegt ist
EEPROM.end(); // schließen der EEPROM Operation

Schreiben von Daten in den Pufferspeicher und anschließende Übernahme in den Flash mit commit()

EEPROM.begin(1024);
EEPROM.put(0, settings); //Schreiben einer zweiten Structur ab Adresse 0
EEPROM.commit();
EEPROM.end();

Quellen Verweise:
www.ullisroboterseite.de
www.kriwanek.de

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

 

 

Start- Stop Zeitmessung mit DOT Matrix Display und WLAN Anbindung

Timekeeper Manual
Timekeeper Manual
Timekeeper-Manual.pdf
Version: 1.03
3.1 MiB
664 Downloads
Details

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/1A 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.

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:

Versionsverlauf:

Aufgrund einer Server Umstellung auf HTTPS, können OTA-Updates nun  nur noch ab der Version 1.02 durchgeführt werden!

Besitzen Sie noch eine ältere Firmware Version und möchten diese aber weiterhin aktualisieren, kontaktieren sie uns bitte über unser Support Center.

Intended:

  • – Keine weiteren Anfragen offen.

Released:

  • 18.04.2021: Alle HW Versionen, Firmware Version 03
    – Ü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 ist.
    – Anzeige Fortschrittsanzeige während deines Firmwareupdates.
    – Verbesserung der Systemsabilität.
    Timekeeper-BLYNK-Token V.03
    Timekeeper-BLYNK-Token V.03
    Timekeeper-BLYNK-Token-V.03.png
    Version: V.03
    2.9 KiB
    1 Downloads
    Details
  • 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.
    Timekeeper-BLYNK-Token-V1.02
    Timekeeper-BLYNK-Token-V1.02
    Timekeeper-BLYNK-Token-V1.02.png
    2.9 KiB
    30 Downloads
    Details
  • 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.
    Timekeeper BLYNK Token V1.01
    Timekeeper BLYNK Token V1.01
    Timekeeper-BLYNK-Token-V1.01.png
    Version: 1.01
    39.9 KiB
    604 Downloads
    Details
  • 20.04.2019: Version 1.00
    Timekeeper finale Version 1.00, Firware released.
    Timekeeper BLYNK Token V1.00
    Timekeeper BLYNK Token V1.00
    Timekeeper-BLYNK-Token-V1.00.png
    Version: 1.00
    10.7 KiB
    442 Downloads
    Details

Sonoff Hack für Alexa von Amazon

Download Arduino Sourcecode von Github

In diesem Projekt wird gezeigt, wie man seinen WIFI Sonoff Switch  der Firma ITEAD direkt und ohne Umwege über eine App oder den ITEAD Server, über seine eigen Amazon Alexa ansteuern kann.

Hierfür sind ein paar kleinere Änderungen an der Hard- und Firmware des Sonoff nötig, die nachfolgend gezeigt werden. Nach dem Umbau bietet der Switch viele neue Möglichkeiten.

  • Konfiguration der WIFI Parameter über ein Captiv Portal.
    Zur Inbetriebnahme des Sonoff startet der Switch im Access Point Modus, hier können anschließend alle Betriebsparameter eingegeben werde, die für den Betrieb im eigenen WLAN und mit Alexa notwendig sind.
  • Wurde der Sonoff an das eigenen WLAN gebracht, kann über ein Web Interface der Schalter bedient und der Timer konfiguriert werden.
  • Zusätzlich kann der Sonoff über das in der Konfiguration definieren Schlüsselwort über Amazon Alexa angesprochen und geschaltet werden.

Allgemeines

Vom Sonoff Switch sind zwei verschiedene Modul Varianten verfügbar. Eine mit und eine ohne RF-Funkmodul.
Wir werden uns hier mit dem Modul ohne RF-Funkmodul beschäftigen, da wir nur das WLAN-Modul fü dieses Projekt benötigen.

Etwas neuer auf dem Markt sind nun auch die Sonoff Schalter Steckdosen mit der Bezeichnung Sonoff S20, hier von habe ich ein paar bestellt. Diese können genau so wie die oben beschreibenen Module mit der geänderten Firmware geflasht werden.

Warum ein Sonoff?

Der Sonoff ist nicht der erste seiner Art, also warum er und nicht ein anderer?
Das angesagte Ziel ist es, selbst die Kontrolle zu behalten. Und nicht auf irgend einen Anbieter angewiesen zu sein.
Im Auslieferungszustand ist bereits eine Firmware auf dem Sonoff vorinstalliert, so kann der Switch direkt von einem Smartphone über die App gesteuert werden.

Den Kern des Sonoff bildet ein WiFi Modul Names ESP8266, der kompatibel mit dem Arduino ist.
Somit kann eine neue Firmware leicht mit der Arduino IDE erstellt und direkt von dort in den Mikrocontroller geladen werden.
ITEAD war sogar so nett und hat alle für die Programmierung benötigten Signale herausgeführt 🙂

Lets hack!

Bevor irgend welche Arbeiten an dem Switch durchgeführt, sei es das öffnen des Gehäuses, ein Hardware Umbau oder das flashen, muss unbedingt die Netzspannung entfernt werden!!!
Es besteht LEBENSGEFAHR!!!

Im ersten Schritt wird der Flash RAM Speicher des Sonoff (1 MBit) gegen einen größeren Speicher 4MBit ausgetauscht. So bleib genügend Platz für weitere neue Innovationen.

Dieses YouTube Video zeigt die Vorgehensweise.

Eine genaue Beschreibung über die Programmierung mit der Arduino IDE und dem Austausch des Speichers finden Sie in diesem Link.

Zugriff für die Programmierung des Sonoff bietet ein Stiftleistenslot auf der Platine, der wie folgt belegt ist.

Wichtig:
Der ESP8266 arbeitet mit einer Betriebsspannung von 3.3V Vergessen deshalb nicht vor dem Anschluß ihres Programmiergerät dies auf 3.3V um zu stellen.

Programmer Sonoff (gezählt vom quadratischen Pin)
3V3 1
TX 2 (RX)
RX 3 (TX)
GND 4
 NC 5

Für die Programmierung halten sie den Taster gedrückt und schalten sie anschließend die Spannungsversorgung 3V3 des Sonoff zu. So startet der ESP8266 im Flash Modus.

Pin Belegung des Sonoff

Funktion GPIO NodeMCU
Button 0 3
Relay 12 6
Green LED 13 7
Spare (pin 5) 14 5

Die LED auf der Platine ist aktuell eine rot/grün bi-color led, bei der aber nur die grüne led verwendet wird. Die rote LED ist für die Variante mit dem RF-Modul geplant und, die in meiner Version aber nicht vorhanden ist

Nach dem flashen der neuen Firmware, was erstmalig über die Serielle Schnittstelle erfolgen muss, ist es dann möglich weitere Firmware Updates OTA in den Sonoff zu übertragen.
In der Arduino IDE sollte nach dem konfigurieren des Switches ein entsprechender Eintrag unter Port zu finden sein.

Dash Button mit Bestellsystem Software

Was ist ein Dash Button?

In diesem Projekt entsteht eine Batterie betriebener WLAN Dash Button in robuster Ausführung.
Die Elektronik soll in einem Gehäuse aus Metall untergebracht werden und eine Schutzart von IP64 erfüllen (Schutz gegen Spritzwasser und Staub).

Ein Dash Button ist eine kleine Mikrocontroller gestützte Schaltung, die bei Anforderung mit einem lokalen WLAN Netzwerk eine Verbindung herstellen kann, um so Daten an einen beliebigen Server zu senden.

Um einen Dash Button in ein bestehendes WLAN Netzwerk zu integrieren, startet der Dash Button im AP-Modus, nach dem Verbinden z.B. mit einem Smartphone oder Laptop, wird automatisch ein Captive Portal auf dem Endgerät geöffnet.

Hier können anschließend folgende Credentials definiert werden:

  • SSID des lokalen WLAN Netzwerks
  • Passwort des lokalen WLAN Netzwerks
  • Hostname des Ziel-Servers
  • URL
  • Dash Token, ein ein-eindeutiger Schlüssel für die Aktion die der Dash Button auslösen soll

Aufbau der Hardware

Der Dash Button soll unabhängig von einer externen Energieversorgung arbeiten können. Das bedeutet, dass die Energieversorgung mit Batterien realisiert wird, die im Gehäuse untergebracht werden.

Prototyp Dash Button von oben

Prototyp Dash Button von unten

Prototyp eines DashButtons im Metallgehäuse, zum Testen der Feldstärke mit einer ext. Antenne.

Deep Sleep Modus

Softwaretechnisch wird hierfür die sogenannte Deepsleep Funktion des Mikrocontrollers verwendet. In diesem Modus hat die Schaltung eine Stromaufnahme <70uA, was eine lange Lebensdauer der Batterien im Standby garantiert.

Nach Herstellerangaben, liegt der Deepsleep Ruhestrom bei ca. 10uA. Gemessen wurde beim Dashbutton jedoch eine Ruhestromaufnahme von ca. 60 uA. Dies muss jedoch noch genauer untersucht werden, da hier eine Messfehlertoleranz des Multimeters anzunehmen ist.

20150112172151.jpg

Eine Standard ESP-07 enthält einen Flash RAM von 1M, für die Programmierung wird ein SPIFFS von 64 K voreingestellt.
Direkt auf dem Modul befinden sich zwei LED’s , die rote LED ist direkt mit der Versorgungsspannung verbunden. Diese LED verursacht auch im Deepsleep Modus einen schadhaften Ruhestrom von ca. 15 mA und muss deshalb entfernt werden.
Die blaue LED ist mit TxD verbunden und zeigt die Aktivität an diesem Pin an.

Änderung des Energieversorgungsskonzeptes

Bei den Tests mit verschiedenen Primärquellen hat sich gezeigt, das mit dem ersten Layoutentwurf immer nur ein relativ kleiner Teil der zu Verfügungstehenden Kapazitäten entnommen werden kann. Deshalb wird nun in einer überarabeitenen Hardware Revision ein StepUp Booster vom Typ   NCP1402SN33T1 eingesetzt.

Dieser Baustein hat eine sehr niedrige Anlaufspannung von ca. 0.8V. Werden zwei AA-Battereien in Reihe betrieben, kann jede Zelle bis zu einer Spannung von 0.4V entladen werden, was knapp 90% der Gesamtkapazität der Zellen entspricht.

Der Baustein hat einen sehr niedrige Standby Stromaufnahme von nur 10uA und er stellt am Ausgang einen konstante Spannung von 3.3V zur Verfügung.

Das Schaltungsdesigne wird auch dahingehend geändert, dass auf den Standbystrom des NCP1402SN33T1 und den Deep Sleep Modus des ESP6288 verzichtet werden kann, da die Summe der beiden Ruhestromaufnahmen dann doch einen beträchtlichen Anteil von ca. 70 uA aus mahen würden.

Zu Einsatz kommt ein Mos Fet Transistor, der gleich zwei Aufgaben erfüllt. Zum einen dient er dem Verpolungsschutz, wenn die Batteriene versehentlich falsch eingelegt wurden und schützt so die Schaltkreise vor der Zerstörung.
Und zum anderen, wird er als Schalter für die Sapannungsversorgung verwendet.

Mit dem Betätigen des Tasters wird der Mos Fet leitend und stellt die Versorgungsspannung des Schaltkreises zur Verfügung. Ms nach dem starten des ESP 8266 steuert dieser dann übereinen Ausgang den Mos Fet an und verhindert so das sie Versorungsspannung nach dem loslassen des Taster wieder abgeschaltet wird.

Sobald alle nötigen Programmaktionen abgearbeitet wurden, gibt der ESP 8266 den Schaltausgang des Mos Fet’s wieder frei und die Spannungsversorgung wird abgeschaltet.

Batterie Kapazität

Die Richtwerte für Alkalien Batterien schwanken lt. Herstellerangaben in folgenden Bereichen:

AAA 1000  - 1500  mAh
AA  2000  - 3000  mAh
D   12000 - 20000 mAh

Eine Duracell Plus soll lt. Herstellers Angaben bis zu 2.9 Ah haben, was einer Laufzeit im Deepsleep Modus von mehreren Jahren entspräche.

Für Batterietests bietet das Layout unter anderem auch die Möglichkeit den Dash Button mit einer Knopfzelle zu betreiben.
Es hat sich jedoch gezeigt, dass eine Standard LR2032 nicht in Frage kommt, da bei diesem Typ bei einer Pulsbelastung die Spannung kurzfristig auf 2,8V einbricht. Was deutlich außerhalb der Spezifizierten Parameter des ESP8266 liegen würde.

Deshalb wurde für den Test eine Lithium Ionen Zelle z.B. Typ LIR 2032 (35mAh) verwendet. Da diese Typen auch bei einer Pulsbelastung in der für den ESP8266 definierten Spezifikation bleibt.
Der Nachteil dieser kleinen Bauform liegt jedoch in der kurzen Standbyzeit,  die bei rund 60 uA Ruhestromaufnahme gerade mal für ca. 25 Tage reicht.

Bei der Verwendung von zwei in Reihe geschalteten AA-Zink Kohle Batterien ist der Arbeitsspannungsbereich für den Betrieb eines ESP8266 sehr eingeschränkt. Bei neuen Batterien liegt die Spannung bei ca. 3,2 V. Nach einer Entladung von ca. 5% liegt die Spannung nur noch bei 3,0V. Somit erscheint der Einsatz solcher Batterietypen als wenig sinnvoll.

Eine weitere denkbare Option wäre der Verwendung von drei in Reihe geschalteten AA-Zellen, um das Spannungsniveau  in einen besseren Auslastungsbereich zu bekommen. Hier bei müsste dann jedoch wieder ein Spannungsregler eingesetzt werden, der zusätzliche Verluste mit sich bringt, was die Lebensdauer aber bei der verhältnismäßig geringen Einschaltzeit kaum einschränken dürfte.

Typische Kennlienie einer Duracell AA Batterie. (Quelle Duracell Datenblatt)

So wird nun im dritten Anlauf für dieses Projekt angenommen, dass entweder zwei paralell geschaltete LiFEPO4 AA Akkus zum Einsatz kommen oder drei AA-Zellen die in Reihe geschaltet werden. Oder die Dritte Option ein LIPO Akku mit einer Ausgangsspannung von 3.7V.

Die Platine erhält einen 3,3 V low drop Spannungsregler der Firma Mikrochip, vom Typ MIC5219-3.3BM5 LG33 3.3V –40°C to +125°C SOT-23-5.

Dieser Baustein besitzt einen Enable Eingang, der es erlaubt die komplette Schaltung abzuschalten ohne das ein merklicher Ruhestrom fließt.

Durch den Einsatz dieses Reglers kann ein ein Eingangsspannungsbereiche zwischen 3 – 5v abgedeckt werden. Darurch sind alle drei Varianten der oben beschriebenen Spannungsversorgungen möglich.

LiFEPO4 AA Akkus liefern eine Spannung von 3,4 V / 700 mA, was einer Batteriekapazität von 100% entspräche.
Durch eine Parallelschaltung von zwei LiFePO4 Akkus kann somit die Kapazität auf 1400 mAh erhöht werden.

Hierbei läge die Ausnützung der Batteriekapazität bei etwa 60% (800 mAh), im Vergleich zu drei Zink-Kohle Batteriene. Deren Entladeschlussspannung bei 1v liegt, was bei drei in reihe geschaltenenen Zellen ca. 3V entspricht  = minimale Eingangsspannung der EPS lt. Spec.

Es ergäbe sich rein rechnerisch eine Standbybetriebszeit von ca. 1,5 Jahren.

Ein großer Vorteil bei der Verwendung von LiFePO4 Zellen liegt darin, dass die Zellen wiederaufladbar sind und somit viele Male wieder verwendet werden können.
Ein gravierender Nachteil der Parallelschaltung von zwei Zellen liegt jedoch in einer Verpolung.
Wenn die Zellen von nicht fachkundigem Personal gewechselt werden sollen,  kann es durch die Parallelschaltung der beiden Zellen bei einem falschen Einlegen zu einem Kurzschluss kommen, der dann zur thermischen Zerstörung der Akkus und letztendlich des Dashbuttons führen würde.

Endladekennlinie einer LiFePO4 Zelle. (Quelle https://evtv.wordpress.com/2010/04/21/april-16-friday-show/)

Um eine lange Lebensdauer von Akkus zu gewährleisten, sind diese unbedingt vor einer Tiefentladung  zu schützen. Deshalb ist in der Firmware des DashButtons ein Schwellwert von 2,9 V programmiert, ab dem sich der Dash Button nicht mehr starten lässt. Die LED geht kurz an, blinkt für 1 Sekunde sehr schnell und geht dann sofort wieder aus!

Laut Herstellerangaben darf sich die Betriebsspannung eines ESP 8266 in einem Bereich von 3,0V – 3,6V bewegen (Typisch 3,3V).
Somit entspräche eine Batteriespannung von 3,0V gleich 0% Batteriekapazität, was einen sofortigen Batteriewechsel nötig machen würde!

Server Software

Die Server Software bietet die Möglichkeit, neben den Nutzinformation (Token) auch Informationen zur aktuellen Batteriespannung, Hard- und Software Version  und eine Statusinformation des DashButtons zu liefern.

Die Betriebsspannung wird mit dem Parameter &vbatt=x.xxx an den Server übergeben.
Er gibt die Batteriespannung in Volt an.

Beispielberechnung für die Batteriekapazität:

Bei Betrieb mit einer Li Fe PO4 Zelle , wird am Messeingang des Mikrocontrollers etwa eine  Betriebsspannung von 3,3V erreicht.
Was in diesem Fall einer prozentualen Batteriekapazität von 100 % entspräche.
Die minimale Betriebsspannung sollte 3,0V nicht unterschreiten, was somit die 0% der Batteriekapazität fest legt.

Im folgenden Beispiel wird angenommen, dass die Batterie noch eine Spannung von 3,15V (50%) liefert:

Y = Eingangsspannung 3,15V
Y0= 3,0 V
Y100= 3,3 V

X= Ergebnis in %
X0 = 0 %
X100 = 100%

X:= ((X100 – X0) * ( Y – Y0 )  /  (Y100 – Y0)) + X0;

        100 * 0.1
Y = ————-  + 0 = 50%
               0.2

Wird der Parameter nicht übergeben, wird der Wert im Server automatisch auf -1 gesetzt. Was soviel bedeutet, dass der Batteriestatus nicht ermittelt werden konnte bzw. nicht bekannt ist.

In der Server Software kann für jeden DashButton der verwendete Batterietyp ausgewählt werden. Somit kann die Berechnung der Batteriekapazität anhand einer hinterlegten Herstellerkennlinie erfolgen, was eine genauere Anzeige der tatsächlichen Kapazität ermöglicht.

Mit diesen Informationen kann in der Serverapplikation ein Mechanismus angestoßen werden, der den Admin rechtzeitig darüber informiert, wann ein Batteriewechsel erforderlich wird.

Das Layout bietet die Möglichkeit, verschieden Batterietypen in verschiedenen Leistungsklassen und Größen zu verwenden.

Externe Antenne

Um eine stabile Funkverbindung etablieren zu können, muss bei der Verwendung eines Metall- bzw. metallisierten Gehäuses eine externe Antenne verwendet werden!

Bei einem Standard ESP-07 Modulen ist bereits ein Anschluss für eine externe Antenne vorhanden. Wird der externe Antennenanschluss verwendet, muss die Verbindung zur internen (aufgelöteten) Antenne unterbrochen werden. Hierfür ist der Null Ohm Wiederstand neben dem Antennenanschluss zu entfernen.

Für die Verwendung einer externen Antenne muss der null Ohm Wiederstand (rotes Quadrat) entfernt werden. Wird das ESP07 Modul mit einer Batterie betrieben muss zusätzlich die Power LED (roter Kreis) entfernt werden, um ein unnötiges entladen der Batterie zu vermeiden.

 

Wurde die interne Antenne entfernt,ist zwingend darauf zu achten, dass das Modul nicht ohne eine angeschlossene externe Antenne betrieben wird. Da dies zur Zerstörung des ESP-Moduls führen kann.

Programmierung

Die Programmierung des Mikrocontrollers erfolgt über einen Programmieranschluss, der auf der Platine vorhanden ist.
Diese Schnittstelle ist notwendig, um erstmalig eine Firmware in den Mikrocontroller laden zu können.

Hierbei ist zu beachten, dass die Lötbrücke J1 die im Bild mit einem Stern gekennzeichnet ist, nicht geschlossen sein darf. Da im Auslieferungsstand der Pin GPIO16 auf low liegt und somit eine Dauer Reset anliegen würde.

Im Programm darf somit der GPIO16 nicht mit pinMode() konfiguriert werden.

Lötbrücke für ein optionales automatisches aktivieren des DashButton nach einer fest definierten Zeitspanne. Sie verbindet den Pin GPIO16 mit dem Eingang RESET.

Funktionsweise des Tasters und der LED

Das Layout bietet je nach Bestückung die Möglichkeit einen Taster und eine LED in SMD Technik oder aber auch bedrahteten Bauelemente zu verwenden. Somit ist es auch möglich andere Bedientasten z.B. mit Kabelanschlüssen ein zu löten.

Befindet sich das Modul im Deepsleep Modus, kann es durch einen Tastendruck aufgeweckt werden.

Je nachdem wie lange der Taster  gedrückt gehalten wir, werden unterschiedliche Funktionen aufgerufen:

  • Drücken bis eine Verbindung ausgebaut wurde  – Test Modus (Status 0).
  • Drücken über einen Zeitraum von 10 Sekunden – WIFI Setup (Status 1).
  • kurzes Drücken des Tasters – löst eine Bestellung aus (Status 2).

Anschließend versucht das Gerät eine Netzwerkverbindung zum lokalen AP zu etablieren, was durch ein langsames blinken der LED signalisiert wird.
Kann keine Verbindung hergestellt werden, beginnt die LED schnell zu blinken und man hat die Möglichkeit für 240 Sekunden eine Verbindung zu diesem Dash Button aufzubauen und die Konfiguration vor zu nehmen.
Erfolgt in dieser Zeit kein Login auf dem Dash Button, wird der Mikrocontroller wieder in den Deepsleep Modus versetzt, um die Batterie nicht unnötig zu strapazieren.

Ist der Verbindungsaufbau zum lokalen WLAN geglückt, wird die Nutzinformation (Dash Token) an den in den Credentials definierten Server verschickt.
Wurde der Empfang der Information vom Server bestätigt, leuchtet die Status LED für drei Sekunden kontinuierlich.
Wird der Empfangs nicht vom Server bestätigt, wird dies durch schnelles Blinken der LED für drei Sekunden angezeigt.
Anschließend wechselt der Mikrocontroller wider in den Deepsleep Modus.

Je nachdem welches Ereignis am Dashbutton ausgelöst wurde, wird eine entsprechende Statusinformation im Parameter &status=x dem HTTP Put Request übergeben. Wird der Parameter nicht mit übergeben, wird der Wert im Server automatisch auf -1 gesetzt, was soviel bedeutet das der Status nicht bekannt ist.

Server Applikation für den DashButton

DashButtonServer
DashButtonServer
DashButtonServer.zip
Version: V 1.0.0.0
7.9 MiB
425 Downloads
Details

Die Serverapplikation kann auch direkt mit dem Webbrowser getestet werden. Hierfür wird in die Adresszeile der folgende Aufruf eingegeben:

http://HOST
/URL?&token=ef98c8246ef0409da5fb3a27afa4ec61
&vbatt=3.12&hv=1.00&sv=1.03&status=1

  • Host:
    Ist die IP-Adresse des Servers z.B. 192.168.1.123
  • URL:
    Ist eine Pfadangabe (optional für den augenblicklichen Stand) soll später der Einordnung der Einträge dienen, z.B. für die Standorte.
  • token:
    Ist ein 32 stelliger ein eindeutiger Schlüssel des betreffenden Dash Buttons.
  • vbatt:
    Gibt die Batteriespannung in Volt an.
  • hv:
    Gibt die aktuelle Hardware Revision des DashButton an.
  • sv:
    Gibt die aktuelle Firmware Version des DashButton an.
  • status:
    Information über den Auslöser des Ereignisses.
    0 – Test (Button wurde kürzer als drei Sekunden gedrückt)
    1 – Settings (Die Einstellungen wurden aufgerufen, durch langes drücken des Tasters)
    2 – Order (Ein Bestellauftrag wurde abgesetzt)
    3 – n Für weitere Statusinformationen reserviert
Weitere Ideen:
  • Der Dash Token sollte im Prinzip ein 32 Byte Hashcode sein, der einen Prüfsumme oder einen CRC Check enthält, um die Authentizität des Tokens auf dem Server verifizieren zu können.
  • Es wäre denkbar, dass sich ein Dash Button der längere Zeit nicht betätigt wurde, automatisch aktiviert (z.B. alle 24h) und seinen Batteriestatus an den Server sendet.
    Der Parameter „status“ würde das Ereignis dann als Test identifizieren.
    Hierbei wäre zu bedenken, dass ein zyklisches Verbinden mit dem WLAN und das Senden dieser Statusinformationen die Batterielebensdauer zusätzlich verkürzen würde.