Schlagwort-Archive: Internet-of-Things

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));
}

 

Einen lokalen Blynkserver beim Booten der Raspberry PI Starten

In diesem Beitrag wird am Beispiel eines lokalen Blynk Servers gezeigt, wie auf einer Raspberry PI eine Java File beim Starten und Herunterfahren der PI automatisch gestartet und heruntergefahren werden kann.

  1. Zuerst wird ein Startscript und ein Stopscript erstellt, die später die Applikation mir Rootrechten startet und stoppt. Hier für wechseln wir mit sudo bash unsere Benutzerrechte auf Root.In unserem Beispiel speichern wir die Scripte im Verzeichnis /usr/local/bin/…
  • Start Script: /usr/local/bin/startBlynk.sh
  • Stop Script: /usr/local/bin/stoppBlynk.sh

Nach dem erstellen der Scripte müssen noch deren Attribute auf ausführbar gesetzt werden. Dies geschieht mit dem Befehl chmod +x NAME

Zu Starten des BlynkServers kann der Inhalt des Scripts startBlynk.sh im einfachsten Fall so aussehen:

#!/bin/bash
/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/bin/java -jar /home/pi/Blynk/server-0.39.10.jar -dataFolder /home/pi/Blynk &

Zu Stoppen des BlynkServers kann der Inhalt des Scripts stoppBlynk.sh im einfachsten Fall so aussehen:

#!/bin/bash
#sucht und beendet die Java Applikation
ps auxf |grep ’server-0.xx.x.jar ‚|`awk ‚{ print „kill “ $2 }’`

Als nächstes benötigen wir noch das folgendes Script (localBlynk) , wir speichere es in das Verzeichnis /etc/init.d/localBlynk

  • sudo nano /etc/init.d/localBlynk
  • Inhalt der Date:#! /bin/sh
    ### BEGIN INIT INFO
    # Provides:        localBlynk
    # Required-Start:
    # Required-Stop:
    # Default-Start:        2 3 4 5
    # Default-Stop:         0 1 6
    # Short-Description:    Stars & Stops BlynkServer
    # Description:          Stars & Stops BlynkServer
    ### END INIT INFO

 

# Start Stop Blynk local Blynk Server

case $1 in
start)
/bin/bash /usr/local/bin/startBlynk.sh
;;
stop)
/bin/bash /usr/local/bin/stopBlynk.sh
;;
restart)
/bin/bash /usr/local/bin/stopBlynk.sh
/bin/bash /usr/local/bin/startBlynk.sh
;;
esac
exit 0

  • Um das Script zum Systemstart hinzu zu fügen, führen wir nun noch  folgende Kommandos aus:cd /etc/init.d/
    sudo chmod 755 localBlynk
    sudo update-rc.d localBlynkdefaults

 

Einen eigenen lokalen Blynk Server auf dem Raspberry PI installieren

Logen Sie sich auf ihrer Raspberry z.B. per ssh ein.

Nun wird die aktuelle Java Version (Java 8) installiert :

sudo apt-get install oracle-java8-jdk

Stellen Sie sicher, dass nun die aktuelle Java Version installiert wurde.

java -version
Output: java version "1.8.0_40"

Download des Blynkserver jar Files in das „/home/pi/Blynk Verzeichnis.
Sollte das Verzeichnis noch nicht existiert muss es zuerst angelegt werden.

Alle folgenden „sudo“ Anweisungen kann man sich sparen, wenn man gleich in den „sudo bash“ wechselt, dies ist vergleichbar mit dem „su“ bei anderen Linux Distributionen.

pwd
/home/pi/
sudo mkdir Blynk
cd Blynk
sudo wget "https://github.com/blynkkk/blynk-server/releases/download/v0.39.10/server-0.39.10.jar"

Es ist auch möglich,  die Server Datei manuell via ssh oder scp herunter zuladen und in das entsprechende Verzeichnis hinein zu kopieren .

Um den Mailversand zu aktivieren, muss im Verzeichnis /home/pi/Blynk eine Datei mit dem Namen mail.properties angelegt werden.

Der Inhalt dieser Datei hat folgendes Format.

mail.smtp.auth=true
mail.smtp.starttls.enable=true
mail.smtp.host=smtp.gmail.com
mail.smtp.port=587
mail.smtp.username=Anmeldename
mail.smtp.password=Kennwort

Die aktuelle Blynk Server Version ist unter:
https://github.com/blynkkk/blynk-server/releases
zu finden.

  • Server mit den default Einstellungen starten (Hardware Port 9443 SSL)
    sudo java -jar server-0.39.10.jar -dataFolder /home/pi/Blynk        
    
  • Als Rückmeldung des Servers erscheint eine Meldung wie diese :
    Blynk Server successfully started.
    All server output is stored in current folder in 'logs/blynk.log' file.
    

Aktiviere automatischen Server Neustart

Um diese Option zu aktivieren, suchen Sie das Verzeichnis:
/etc/init.d/rc.local
öffnen sie die Datei mit dem vi Editor und fügen sie die folgende Zeile hinzu:

sudo vi rc.local
java -jar /home/pi/Blynk/server-0.39.10.jar -dataFolder /home/pi/Blynk &

Sollte dieser Ansatz nicht funktionieren, versuche Sie bitte folgendes:

sudo crontab -e

und fügen sie die folgenden Zeilen hinzu

    @reboot java -jar /home/pi/server-0.39.10.jar -dataFolder /home/pi/Blynk &

anschließend speichern und beenden.

Der Administrationsbereich kann anschließend bei laufendem Blynk Server mit folgender URL im Browser geöffnet werden.

https://your_ip|(127.0.0.1):9443/admin

Um den Blynkserver im Lokalen Netzwerk auch über das Internet erreichen zu können wird der Einsatz einer DynDNS Adresse empfohlen. Diese kann dann z.B. in einer Fritzbox hinterlegt werden, ändert sich die IP-Adresse der Fritzbox (alle 24 Stunden veranlaßt durch den Provider), wird automatisch die DynDNS Adresse informiert und der Server ist somit immer mit einem Pseudo Domain Name erreichbar.
In lokalen Router müssen außerdem noch ein paar Portfreigaben definiert werden. EIn Auszug der wichtigsten Einstellungen ist hier zu sehen.

 

Viele weitere Informationen zur Konfiguration der Blynk Servers.