Forum: Mikrocontroller und Digitale Elektronik ESP8266 - Interrupt


von ESP_FR (Gast)


Lesenswert?

Moin,

ich versuche mit einem ESP8266 (nodemcu amica v2) meinen Gaszähler 
auszulesen.
Ich programmiere über die Arduino IDE und versuche den Wert über MQTT zu 
verschicken.

Ich habe einen Reed-Kontakt an Pin 0 (mit Pullup) und GND angeschlossen.
Das Programm sieht wie folgt aus:
1
#include <ESP8266WiFi.h>
2
#include <PubSubClient.h>
3
#include <Wire.h>
4
5
const char* SSID = "ssid";
6
const char* PSK = "key";
7
const char* MQTT_BROKER = "192.168.178.40";
8
WiFiClient espClient;
9
PubSubClient client(espClient);
10
int Reed = 0;
11
12
float IstZaehlerstand = 57353.82;
13
float AktuellerZaehlerstand = 0;
14
15
volatile byte interruptCounter = 0;
16
int numberOfInterrupts = 0;
17
18
void IRAM_ATTR handleInterrupt() {
19
  interruptCounter++;
20
}
21
22
void setup() {
23
  setup_wifi();
24
  client.setServer(MQTT_BROKER, 1883);
25
  pinMode(Reed, INPUT);
26
  attachInterrupt(digitalPinToInterrupt(Reed), handleInterrupt, FALLING);  
27
  AktuellerZaehlerstand = IstZaehlerstand;
28
}
29
30
void setup_wifi() {
31
  delay(10);
32
  WiFi.begin(SSID, PSK);
33
34
  while (WiFi.status() != WL_CONNECTED) {
35
    delay(500);
36
  }
37
}
38
39
void reconnect() {
40
  while (!client.connected()) {
41
    Serial.print("Reconnecting...");
42
    if (!client.connect("ESP8266Client")) {
43
      delay(5000);
44
    }
45
  }
46
}
47
48
void loop() {
49
  if (!client.connected()) {
50
    reconnect();
51
  }
52
  client.loop();
53
54
  if(interruptCounter>0){
55
    delay(500);
56
    interruptCounter=0;
57
    numberOfInterrupts++;
58
    AktuellerZaehlerstand = AktuellerZaehlerstand+0.01;
59
    client.publish("Home/Keller/Gaszaehler/Zaehlerstand", String(AktuellerZaehlerstand).c_str());
60
    client.publish("Home/Keller/Gaszaehler/NumberOfInt", String(numberOfInterrupts).c_str());
61
  }  
62
}

Auf dem Schreibtisch funktioniert das auch wunderbar.
Nur am Gaszähler nicht.

Den Gaszähler habe ich mit einem Logic Analyser überprüft. Er gibt einen 
2ms Impuls alle 0,01m3 aus.

Warum erkenne ich den Impuls nicht mit dem ESP? Was muss ich einstellen?

Vielen Dank und Gruß

von Bernhard S. (b_spitzer)


Lesenswert?

Was für einen Impuls gibt der Gaszähler aus? Spannung, Strom, Licht?
Wie soll das ein Reed-Kontakt erkennen können? Oder macht der Gaszähler 
wirklich ein wechselndes Magnetfeld? Ist das dann stark genug, um den 
Reed-Kontakt zu schalten (ich glaube nicht, dass der in 2ms geschaltet 
hat.)

von Stefan F. (Gast)


Lesenswert?

ESP_FR schrieb:
> IRAM_ATTR

Falls dein Arduino core älter als 3.0.0 ist, musst du ICACHE_RAM_ATTR 
verwenden.

> Den Gaszähler habe ich mit einem Logic Analyser überprüft.
> Er gibt einen 2ms Impuls alle 0,01m3 aus.
> Warum erkenne ich den Impuls nicht mit dem ESP?

Messe die Spannungspegel am Eingang des ESP gegen GND. Vielleicht sind 
sie in einem Grenzbereich wo es nicht zuverlässig funktioniert.

Hast du einen Pull-Up Widerstand am Reed Kontakt? Da ist zwar auch die 
blaue LED mit dran, aber die zieht den Pin nicht hoch genug, um einen 
eindeutigen HIGH Pegel zu geben.

Ich würde mal innerhalb des Interrupt-Handlers eine weitere LED toggeln, 
um zu sehen, oder der überhaupt aufgerufen wird.

Ist deine Stromversorgung stark genug und stabil?

von Jester (Gast)


Lesenswert?

ESP_FR schrieb:
> Auf dem Schreibtisch funktioniert das auch wunderbar.
> Nur am Gaszähler nicht.
>
> Den Gaszähler habe ich mit einem Logic Analyser überprüft. Er gibt einen
> 2ms Impuls alle 0,01m3 aus.
>
> Warum erkenne ich den Impuls nicht mit dem ESP? Was muss ich einstellen?
>
> Vielen Dank und Gruß

Aussagekräftiges Foto vom Aufbau?

von ESP_FR (Gast)


Lesenswert?

>Was für einen Impuls gibt der Gaszähler aus? Spannung, Strom, Licht?
>Wie soll das ein Reed-Kontakt erkennen können? Oder macht der Gaszähler
>wirklich ein wechselndes Magnetfeld? Ist das dann stark genug, um den
>Reed-Kontakt zu schalten (ich glaube nicht, dass der in 2ms geschaltet
>hat.)

Das ist so üblich, die mit einem Reed-Kontakt auszulesen.
Ich gebe dir recht, die 2ms sind sportlich. Ich kann dazu aber leider 
auch nichts im Netz finden.

>Falls dein Arduino core älter als 3.0.0 ist, musst du ICACHE_RAM_ATTR
>verwenden.

Ich müsste 3.0.1 haben. Das prüfe ich aber noch einmal.

>Messe die Spannungspegel am Eingang des ESP gegen GND. Vielleicht sind
>sie in einem Grenzbereich wo es nicht zuverlässig funktioniert.

>Hast du einen Pull-Up Widerstand am Reed Kontakt? Da ist zwar auch die
>blaue LED mit dran, aber die zieht den Pin nicht hoch genug, um einen
>eindeutigen HIGH Pegel zu geben.

Das prüfe ich noch einmal bzw. probiere es aus.
Wie gesagt, der Aufbau funktioniert ja auf dem Schreibtisch. Nur am 
Zähler bekommt er die Impulse nicht mit.

Danke und Gruß

Beitrag #7146522 wurde von einem Moderator gelöscht.
Beitrag #7146546 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

ESP_FR schrieb:
> Wie gesagt, der Aufbau funktioniert ja auf dem Schreibtisch. Nur am
> Zähler bekommt er die Impulse nicht mit.

Trenne dich von diesem Gedanken. Er verleitet dich zu der Annahme, 
keinen Fehler gemacht zu haben. Doch wenn das wahr wäre, würde die 
Schaltung funktionieren. Du hast einen Fehler gemacht. Mach deinen Kopf 
frei dafür, damit du ihn finden kannst. Trenne dich von offensichtlich 
falschen Annahmen, die deine Gedanken in die falsche Richtung leiten.

von ESP_FR (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Trenne dich von diesem Gedanken

Da hast du natürlich Recht.

Stefan ⛄ F. schrieb:
> Messe die Spannungspegel am Eingang des ESP gegen GND. Vielleicht sind
> sie in einem Grenzbereich wo es nicht zuverlässig funktioniert.

Habe 3,3V mit dem Multimeter gemessen.

Stefan ⛄ F. schrieb:
> Hast du einen Pull-Up Widerstand am Reed Kontakt? Da ist zwar auch die
> blaue LED mit dran, aber die zieht den Pin nicht hoch genug, um einen
> eindeutigen HIGH Pegel zu geben.

Ist die blaue LED nicht an GPIO 16 (D0)? GPIO 0 müsste der Taster sein, 
oder?
Einen externen Pull-Up Widerstand muss ich gleich mal einlöten und 
ausprobieren.

von Stefan F. (Gast)


Lesenswert?

ESP_FR schrieb:
> Habe 3,3V mit dem Multimeter gemessen.

Und die Werte gehen nur dich etwas an? So können wir nicht gut helfen.

ESP_FR schrieb:
> Ist die blaue LED nicht an GPIO 16 (D0)?

Ja, das ist der Pin, wo du den Reed-Kontakt angeschlossen hast. Oder 
doch nicht?

ESP_FR schrieb:
> GPIO 0 müsste der Taster sein, oder?

Meinst du den "Flash" Taster für den Firmware Upload? Der hängt an GPIO 
0 (D3) und hat mit deinem Problem nichts zu tun.

von ESP_FR (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Und die Werte gehen nur dich etwas an? So können wir nicht gut helfen.

Ich verstehe nicht ganz was meinst. Ich sollte am Eingang vom ESP gegen 
Masse messen. Dort liegen 3,3V an. Welche Werte meinst du denn?

Stefan ⛄ F. schrieb:
> ESP_FR schrieb:
>> Ist die blaue LED nicht an GPIO 16 (D0)?
>
> Ja, das ist der Pin, wo du den Reed-Kontakt angeschlossen hast. Oder
> doch nicht?
>
> ESP_FR schrieb:
>> GPIO 0 müsste der Taster sein, oder?
>
> Meinst du den "Flash" Taster für den Firmware Upload? Der hängt an GPIO
> 0 (D3) und hat mit deinem Problem nichts zu tun.

Der Reed-Kontakt ist an GPIO 0 angeschlossen. So steht es ja auch im 
Quelltext. Und laut Schematic ist an diesem Pin ein Pull-up Widerstand 
von 12k verbaut.

von ESP_FR (Gast)


Lesenswert?

ESP_FR schrieb:
> Stefan ⛄ F. schrieb:
>> Und die Werte gehen nur dich etwas an? So können wir nicht gut helfen.
>
> Ich verstehe nicht ganz was meinst. Ich sollte am Eingang vom ESP gegen
> Masse messen. Dort liegen 3,3V an. Welche Werte meinst du denn?

Beim Auslösen des Reed-Kontakts, messe ich natürlich 0V. Falls du das 
wissen wolltest.

von Stefan F. (Gast)


Lesenswert?

ESP_FR schrieb:
> Ich verstehe nicht ganz was meinst. Ich sollte am Eingang vom ESP gegen
> Masse messen. Dort liegen 3,3V an. Welche Werte meinst du denn?

Der Kontakt mus zwei eindeutige Werte liefern (LOW und HIGH), sonst ist 
klar dass das nicht funktioniert. 3,3 Volt für High sind gut, aber wie 
sieht der Low Pegel aus? So kurze Impulse wirst du wohl mit einem 
Oszilloskop messen müssen.

Wenn du keins hast und Geld sparen musst, kaufe dir ein DSO150. Diese 
Spielzeuge sind immer noch viel nützlicher, als gar keins zu haben.

ESP_FR schrieb:
> Beim Auslösen des Reed-Kontakts, messe ich natürlich 0V. Falls du das
> wissen wolltest.

Diese Info fehlte. Ich würde es trotzdem richtig im laufenden betrieb 
messen, nicht durch manuelle Simulation (mit Magnet oder so).

von Stefan F. (Gast)


Lesenswert?

ESP_FR schrieb:
> Der Reed-Kontakt ist an GPIO 0 angeschlossen.

Das ist nicht gut. Wenn der Reed Kontakt bei Einschalten der 
Stromversorgung im falschen Moment geschlossen ist, startet der ESP 
nicht. Der Pin steuer nämlich den Bootloader.

Der Pull-Up an diesem Pin hat 12kΩ. Ich empfehle dir, einen mit 1kΩ zu 
verwenden, damit deine Schaltung nicht auf Funk/Radiowellen reagiert. 
Bedenke: Jede Leitung ist eine Antenne.

Wenn deine Leitung länger als 30cm ist, würde ich sogar einen R/C Filter 
(Tiefpass) verwenden.

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.