Forum: Mikrocontroller und Digitale Elektronik ESP8266 mit Berührungssensor


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Erwin K. (kaloschke)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe einen STBTECH 12V LED Touch Dimmer Schalter von Amazon, den ich 
über einen ESP8266 auswerten möchte.

Als Versorgungsspannung des Sensors (Anschlüsse rot(+) und schwarz(-)) 
benutze ich die 3,3V des ESP. Diese werden bei Berührung an dem Ausgang 
(Anschlüsse blau(+) und grün(-)) dann langsam - so über 1 bis 2 sec lang 
-  bereit gestellt bzw. nach erneuter Berührung auf ca. 0.5V reduziert.

Ich wollte nun den Vorgang auswerten, indem ich den Ausgang blau auf den 
Pin D1 des ESP und den Ausgang grün auf Masse gelegt habe. Leider wird 
in diesem Fall keine Spannung mehr am Ausgang ausgegeben. Mit dem 
Spannungsmesser kann ich nur bei direktem Anschluss an das Messgerät 
zwischen blau und grün Spannung messen (also ohne Masseverbindung von 
grün).

Gibt es hier für mich eine Lösung? Ich hoffe, ich konnte mich 
verständlich ausdrücken.

Viele Grüße

von Sebastian R. (sebastian_r569)


Lesenswert?

Erwin K. schrieb:
> Diese werden bei Berührung an dem Ausgang
> (Anschlüsse blau(+) und grün(-)) dann langsam - so über 1 bis 2 sec lang
> -  bereit gestellt bzw. nach erneuter Berührung auf ca. 0.5V reduziert.

Wenn das ein LED-Dimmer ist, dann kommt da zu 99.9% PWM raus und keine 
analoge Spannung.

Da musst du schon ein wenig mehr Aufwand betreiben.

von Heinz R. (heijz)


Lesenswert?

Erwin K. schrieb:
> Ich wollte nun den Vorgang auswerten, indem ich den Ausgang blau auf den
> Pin D1 des ESP und den Ausgang grün auf Masse gelegt habe. Leider wird
> in diesem Fall keine Spannung mehr am Ausgang ausgegeben.

Da wird wohl ein N-Kanal Mosfet verbaut sein - es wird Minus geschaltet

von Alexander (alecxs)


Lesenswert?

Welchen LED Treiber hast Du vorgeschaltet?

von Erwin K. (kaloschke)


Lesenswert?

@sebastian_r569
Wow, das ging ja fix. Danke für die Info. Das übersteigt dann wohl meine 
doch recht beschränkten Fähigkeiten. Schade.
Könnte ich mit einem ESP8266 einen "anderen" Berührungssensor auswerten?
Falls ja, wonach müsste ich suchen?

P.S. Muss hier ne halbe Stunde warten, bevor ich antworten darf.
Skurille Regel :-(

@heijz
Bin (s.o.) eher der Laie.

@alecxs
Nix. Der ESP soll per WLAN einfach nur ein Item in Openhab setzen.

: Bearbeitet durch User
von Heinz R. (heijz)


Lesenswert?

Erwin K. schrieb:
> Könnte ich mit einem ESP8266 einen "anderen" Berührungssensor auswerten?
> Falls ja, wonach müsste ich suchen?

Du könntest statt einem ESP8266 einen ESP32 nehmen - der hat schon 8 
Touchsensoren integriert

Falls Du fertige Software suchst - schau mal z.B. hier:

https://espeasy.readthedocs.io/en/latest/Plugin/P097.html

von Alexander (alecxs)


Lesenswert?

Du beziehst den Strom aus dem AMS1117 des ESP? Hängt überhaupt eine Last 
an? Du könntest natürlich Minus (grün) auf den Pin legen und mit 
pulseIn() auswerten.

: Bearbeitet durch User
von Erwin K. (kaloschke)


Lesenswert?

Super Infos. Danke.
Da ich den ESP8266 schon habe, fange ich erstmal mit dem von alecxs an 
:-)

von Joachim B. (jar)


Lesenswert?

Erwin K. schrieb:
> fange ich erstmal mit dem von alecxs an
> :-)

viel Spaß

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

Ein N-Kanal Mosfet benötigt natürlich irgendeine Last. Häng mal einen 1- 
10k dran damit Du ein sauberes PWM Eingangssignal erhältst.

Hier mal ein Beispiel Code wie du das PWM Signal messen könntest:
1
#define pulse_ip GPIO_NUM_5
2
int ontime,offtime,duty;
3
float freq,period;
4
    
5
void setup()
6
{
7
  pinMode(pulse_ip,INPUT);
8
  Serial.begin();
9
}
10
11
void loop()
12
{
13
   ontime = pulseIn(pulse_ip,HIGH);
14
   offtime = pulseIn(pulse_ip,LOW);
15
   period = ontime+offtime;
16
   freq = 1000000.0/period;
17
   duty = (ontime/period)*100;
18
19
   Serial.println(duty);
20
   delay(1000);
21
}

Quelle: 
https://projecthub.arduino.cc/ambhatt/frequency-and-duty-cycle-measurement-using-arduino-20fbfb

: Bearbeitet durch User
von Erwin K. (kaloschke)


Lesenswert?

Danke für den Code, aber wo hänge ich den 10K "dran"?
Zwischen Pin 5 und Masse? Und zusätzlich an Pin 5 den grünen 
Sensorausgang?
Und was ist mit dem blauen?

von Alexander (alecxs)


Lesenswert?

Du hast noch nicht geantwortet wo die Stromversorgung her kommt. Wenn 
Vin+ (rot) = Vout+ (blau) = 3.3 V dann ist ein Lastwiderstand an Vout+ 
(blau) / Minus- (grün) dasselbe, wie ein Pull-up Widerstand an Vin+ 
(rot) / Pin D1. Vout+ (blau) kannst Du auch weg lassen. Wenn es mehr als 
3.3 V sind müsste man sich über einen Spannungsteiler Gedanken machen. 
Zeichne doch bitte einen Schaltplan.

: Bearbeitet durch User
von Erwin K. (kaloschke)


Angehängte Dateien:

Lesenswert?

Die Stromversorgung des ESP erfolgt über ein USB-Netzteil, also 5V.
Der Sensor wird wie am Anfang beschrieben über den ESP mit 3,3V 
betrieben.
Die Abb. zeigt meinen ursprünglichen Plan.

: Bearbeitet durch User
von Alexander (alecxs)


Angehängte Dateien:

Lesenswert?

Versuchs mal ohne Widerstand vielleicht reicht das schon. Sieht so aus 
als wäre da ein LED Treiber drin.

von Erwin K. (kaloschke)


Lesenswert?

Also einfach den Grünen an Pin5 und den blauen frei lassen?

von Rainer W. (rawi)


Lesenswert?

Erwin K. schrieb:
> ich habe einen STBTECH 12V LED Touch Dimmer Schalter von Amazon, den ich
> über einen ESP8266 auswerten möchte.

Ist das dieser hier?
https://www.amazon.de/STBTECH-Ber%C3%BChrungsschalter-Sensorschalter-Lichtleiste-erforderlich/dp/B0BX65MG58

Ist bei deinem intern Rot mit Blau oder Grün mit Schwarz verbunden?

von Alexander (alecxs)


Lesenswert?

Erwin K. schrieb:
> Also einfach den Grünen an Pin5 und den blauen frei lassen?

genau so. auf einem von beiden muss ja das PWM ankommen.

: Bearbeitet durch User
von Erwin K. (kaloschke)


Lesenswert?

Grrr. Muss wieder warten.

@alecxs
Da tut sich was. Handauflegen (so 1 sec) ändert den Wert auf ca. 0-60 
bzw. größer 2100000000. Ein kurzes Antippen reicht leider nicht, ist 
aber okay so.
Das hat mein Problem gelöst.

Vielen vielen Dank!

@rawi
Meiner ist dieser 
https://www.amazon.de/dp/B0BX66ZR34?ref=ppx_yo2ov_dt_b_product_details&th=1
Weiß nicht, ob die gleich sind. Und aufmachen wollte ich meinen nicht.

von Steve van de Grens (roehrmond)


Lesenswert?

Der 3,3V Regler auf dem Wemos Modul reicht gerade eben für das Modul 
selbst aus. Er eignet sich nicht zur Versorgung weiterer Lasten. Mit dem 
Aufbau ist kein stabiler Betrieb zu erwarten.

von Erwin K. (kaloschke)


Lesenswert?

Danke für den Hinweis. Hatte eben auch schon einen Aussetzer beobachtet. 
Wäre die Situation bei einem ESP32 besser?

von Steve van de Grens (roehrmond)


Lesenswert?

Erwin K. schrieb:
> Wäre die Situation bei einem ESP32 besser?

Der nimmt noch mehr Strom auf. Entscheidend ist der verbaute 
Spannungsregler, seine Kühlung, der Innenwiderstand des USB Kabels und 
der Zustand der Steckverbinder.

Für beide ESP Chips empfiehlt der Hersteller eine Stromversorgung, die 
mindestens 500mA liefern kann - sonstige Bauteile drumherum kommen noch 
dazu.

Wie viel Strom nimmt denn dein Sensor auf?

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

Erwin K. schrieb:
> Handauflegen (so 1 sec) ändert den Wert auf ca. 0-60 bzw. größer
> 2100000000.

Da ist ein Überlauf. ändere mal auf unsigned long und mache einen 
typecast auf float
1
unsigned long ontime,offtime,period;
2
...
3
   duty = (int)((float)ontime/period*100);

: Bearbeitet durch User
von Erwin K. (kaloschke)


Lesenswert?

@roehrmond
Vielleicht war ich zu ungenau oben. Der ESP wird über ein 
USB-Steckernetzteil mit 1A versorgt.
Die Aufnahme sollte also nicht das Problem sein. Ich dachte, du 
meintest, der 3,3V Anschluss hätte nicht genug Power für meinen Sensor.
Wenn ich mein einfaches Vielfach-Messgerät anschließe, funktioniert die 
Schaltung nicht mehr.

@alecxs
Danke für die Ergänzung, aber mit ihr funktioniert es nicht mehr so gut 
wie vorher. Die Daten variieren jetzt zwischen 0 und 90, liegen aber oft 
auch in der Mitte, so dass keine "0" oder "1" gefunden werden kann. Die 
"Ausreißer" größer 2 000 000 000 kommen trotzdem vor.

@Forenbetreiber
Ich bin sehr glücklich, dass mir hier so schnell und kompetent geholfen 
wird, aber wenn ich auf einen Beitrag oft erst mit 30 Min. Verzögerung 
reagieren kann, ist das sehr frustrierend. So etwas habe ich noch in 
keinem anderen Forum erlebt.

von Alexander (alecxs)


Angehängte Dateien:

Lesenswert?

Erwin K. schrieb:
> Die Daten variieren jetzt zwischen 0 und 90, liegen aber oft auch in der
> Mitte, so dass keine "0" oder "1" gefunden werden kann.

Es wird der Tastgrad (duty cycle) des PWM ausgegeben in Prozent, also 0 
- 100% ist schon richtig. Du musst Dir dafür schon selbst die Grenze 
ziehen was für Dich an oder aus ist (z.B. 20 % Prozent) und das in eine 
neue Variable schreiben:
1
out = (duty < 20) ? 0 : 1;

Wenn es immer noch unsauber ist, verwende einen Pull-up Widerstand.

Erwin K. schrieb:
> Die "Ausreißer" größer 2 000 000 000 kommen trotzdem vor.

Dann liegt es wohl am fehlenden Timeout wenn kein PWM mehr gemessen 
wird. Füge mal ein Timeout hinzu, dann kannst Du die vorherigen 
Änderungen verwerfen.
1
ontime = pulseIn(pulse_ip, HIGH, 50000);

: Bearbeitet durch User
von Erwin K. (kaloschke)


Lesenswert?

Dank dir für die weiteren Infos. Probiere ich morgen weiter ...
Bez. "Grenze ziehen" ist leider nicht so einfach, wenn 50 gleichermaßen 
für Low wie für High vorkommen kann.

von Alexander (alecxs)


Lesenswert?

Ach Quatsch, das ist ganz einfach. Schließe einfach eine LED an und 
entscheide, ab welcher Dimmstufe die für Deinen Geschmack "aus" ist. Im 
Zweifel nimm halt alles größer 0 % als "ein" an.

P.S. Es kann sein dass der LED Treiber zu hochfrequent ist, maximal 50 
kHz lassen sich sauber mit pulseIn() messen. Dazu müsste man aber mal 
ins Datenblatt des ICs schauen. Und dazu brauchen wir ein Foto von dem 
Aufdruck.

: Bearbeitet durch User
von Heinz R. (heijz)


Lesenswert?

Alexander schrieb:
> P.S. Es kann sein dass der LED Treiber zu hochfrequent ist, maximal 50
> kHz lassen sich sauber mit pulseIn() messen.

man könnte wohl auch einen Elko nebst Widerstand nehmen - dann einfach 
mit dem ADC auswerten?

Aber es wohl auch ein selbst erschaffenes Problem - eigentlich soll ja 
kein bauseitig vorhandener und nicht änderbarer Touchsensor ausgewertet 
werden - es geht rein um die Erfassung eines Touchimpulses

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

Ja das hatte ich auch im Sinn. Manche Bausteine können 1 MHz da würde 
mit pulseIn() natürlich nur Quatsch rauskommen. Trotzdem kann ein Blick 
ins Datenblatt nicht schaden.

@Erwin K. (kaloschke)
https://www.mikrocontroller.net/articles/Pulsweitenmodulation#DA-Wandlung_mit_PWM

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Alexander schrieb:
> Manche Bausteine können 1 MHz da würde ...

1 MHz für einen LED-Dimmer?
Das macht die Sache nur unnötig teuer, weil ausreichende EMV nicht vom 
Himmel fällt, ganz abgesehen von der Kühlung.

von Alexander (alecxs)


Lesenswert?

Wobei alles unter 100 Hz schon in den sichtbaren Bereich fiele. Du hast 
ja die Frequenz schon da, musst sie nur mal mit Serial.print() mit 
ausgeben.

von Steve van de Grens (roehrmond)


Lesenswert?

Erwin K. schrieb:
> Wenn ich mein einfaches Vielfach-Messgerät anschließe, funktioniert die
> Schaltung nicht mehr.

Mit welcher Einstellung hast du es wo angeschlossen? Zeichne das in den 
Schaltplan ein.

von Steve van de Grens (roehrmond)


Lesenswert?

Erwin K. schrieb:
> Der ESP wird über ein USB-Steckernetzteil mit 1A versorgt.

OK. Dennoch kann das an schlechten Kabeln oder Steckverbindern 
scheitern.

> Die Aufnahme sollte also nicht das Problem sein.

Was für eine Aufnahme?

> Ich dachte, du meintest, der 3,3V Anschluss hätte
> nicht genug Power für meinen Sensor

Kann sein. Kommt drauf an, wie vie Strom der Sensor aufnimmt. 10mA 
werden wohl gehen, 100mA sind sicher zu viel.

von Erwin K. (kaloschke)


Lesenswert?

@alecxs

Habe nun einen Pull-Up Widerstand (10k) dazu genommen und den von dir 
vorgeschlagenen Timeout.
In jedem Fall kommen die Ausreißer IMMER, wenn der Duty cycle sinkt. Und 
nur dann.
Hast du noch eine Idee?

von Alexander (alecxs)


Lesenswert?

Wo liegt denn die Frequenz? Schwankt die ebenfalls oder ist da eine 
eindeutige Frequenz messbar?

von Erwin K. (kaloschke)


Lesenswert?

Du meinst den Wert für "freq" in deinem Code?
Der schwankt so zwischen so zwischen 4000 und 5000.

von Alexander (alecxs)


Lesenswert?

Dann musst Du wohl leider zu Plan B übergehen, da die tatsächliche 
Frequenz anscheinend nicht erfasst wird. Hat der ESP8266 einen 
Analogeingang?

von Erwin K. (kaloschke)


Lesenswert?

Ja

von Alexander (alecxs)


Lesenswert?

Dann geht's hier weiter. Schau mal ob Du irgendeinen Kondensator findest 
zum glätten, und dann berechne einen halbwegs passenden Widerstand.

Alexander schrieb:
> 
https://www.mikrocontroller.net/articles/Pulsweitenmodulation#DA-Wandlung_mit_PWM

von Erwin K. (kaloschke)


Lesenswert?

Hmm. Das überfordert mich wahrscheinlich ...
Wenn die Grenzfrequenz in deinem Link meiner obigen von 4000 bis 5000 Hz 
entspricht, könnte ich das Beispiel ja ungefähr so nehmen.
Habe hier einen 10nF (auch 47nF) und einen 100k.

Dann schließe ich "grün" vom Sensor an R1 an und U_Gleich an den 
Analogeingang?

von Alexander (alecxs)


Lesenswert?


von Erwin K. (kaloschke)


Lesenswert?

Okay, dann mal herzlichen Dank an alle hier,
besonders natürlich an alecxs!

von Heinz R. (heijz)


Lesenswert?

Dir ist aber klar das Du einen Mega-Aufwand für ein eigentlich ganz 
einfaches Problem machst?

Du willst wennich es recht verstehe einfach nur einen Berührungssensor 
haben?

Denk vielleicht doch mal über einen ESP32 nach....

von Erwin K. (kaloschke)


Lesenswert?

Habe ich vorhin bestellt :-)

von Heinz R. (heijz)


Lesenswert?

Erwin K. schrieb:
> Habe ich vorhin bestellt :-)

Ist ja auch kaum teurer als ein ESP8266 :-)

Beitrag #7651047 wurde vom Autor gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.