Forum: Mikrocontroller und Digitale Elektronik automatisierte Wasserverbrauchsmessung durch Impulserfassung!!


von Neuling A. (jesuisla)


Lesenswert?

​Guten Morgen,

ich möchte die Werte von einem Wasseruhr digitalisieren und zwar mittels 
einen Sensor, der die Impulse misst und wenn sie gleich 200ms dann 
schickt er mir über einen esp8266 einen Impuls, der esp6288 schickt mir 
dann die abgelesene Impulse über mqtt Broker.

vorgestern hat es noch gut funktioniert aber heute bekomme ich leider 
keine Werte.. meine erste Frage wäre, wie kann ich einen MicroPython 
Programm automatisch neu starten? also falls der esp8266 nicht direkt 
mit Wlan oder mqtt server connected, dass das Programm nochmal 
ausgeführt wird?

eine Status-Led hilft ja auch in diesem Fall, habt ihr eine Idee, wie 
ich eine einsetze bzw programmiere, dass wenn der esp8266 mit Wlan und 
umqtt verbunden ist, die Led leuchtet?

viele Grüsse.
1
from machine import Pin, ADC
2
import network
3
from time import sleep
4
from umqttsimple import MQTTClient
5
import sys
6
import uasyncio
7
from machine import time_pulse_us
8
9
trigger_pin = Pin(12, Pin.IN, Pin.PULL_UP)
10
dataQueue = []
11
last = 0
12
count = 0
13
countall = 0
14
15
WIFI_SSID = 'xxxxx'
16
WIFI_PASSWORD = 'xxxxxxx'
17
mqtt_client_id = 'testclient' # Just a random client ID
18
ADAFRUIT_IO_URL = 'xxxxxx'
19
ADAFRUIT_USERNAME = ''
20
ADAFRUIT_IO_KEY = ''
21
TOGGLE_FEED_ID = 'TOPIC'
22
23
def pulse2liter(pin):
24
# Time a pulse on the given pin, and return the duration of the pulse in microseconds.
25
# The pulse_level argument should be 0 to time a low pulse or 1 to time a high pulse.
26
27
    result = time_pulse_us(pin, 1)
28
    if result in (-1, -2):
29
       return 0
30
    # alles was kürzer als 400 ms ist
31
    if result <= 400000:
32
        return 1
33
    else:
34
        return 0
35
36
wifi = network.WLAN(network.STA_IF)
37
wifi.active(True)
38
wifi.disconnect()
39
wifi.connect(WIFI_SSID,WIFI_PASSWORD)
40
if not wifi.isconnected():
41
    print('connecting..')
42
    timeout = 0
43
    while (not wifi.isconnected() and timeout < 100):
44
        print(100 - timeout)
45
        timeout = timeout + 1
46
        sleep(1)
47
    if(wifi.isconnected()):
48
        print('connected')
49
    else:
50
    print('not connected')
51
    sys.exit()
52
#connect_wifi() # Connecting to WiFi Router
53
client = MQTTClient(client_id=mqtt_client_id, keepalive=30, server=ADAFRUIT_IO_URL, port = 1883)
54
try:
55
    client.connect()
56
except Exception as e:
57
    print('could not connect to MQTT server {}{}'.format(type(e).__name__, e))
58
sys.exit()
59
print(count)
60
client.publish('testclient', str(count), qos=1)
61
62
while True:
63
   count = pulse2liter(trigger_pin)
64
   countall = count + countall
65
   if count > 0:
66
        print('Literverbrauch:',countall)
67
        client.publish('testclient', str(count), qos=1)
68
#sleep(0.1)
69
70
sleep(0.1)

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bitte mach das nächste mal die [c] oder [code] Tags selber mit rein. Und 
formatiere den Code halbwegs leserlich...

: Bearbeitet durch Moderator
von Εrnst B. (ernst)


Lesenswert?

Lothar M. schrieb:
> Und formatiere den Code halbwegs leserlich...

Gerade bei Python code. So kann man ja nicht mehr sehen, was wo in 
welchem while/if/else/... Block steht.

von Neuling A. (jesuisla)


Lesenswert?

ich habs angepasst, danke!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Interessant, ich wusste gar nicht, dass man den Startbeitrag nach einem 
Folgepost noch bearbeiten kann. Aber dank der Tags ist jetzt wenigstens 
der eingefügte Code leserlich.

Neuling A. schrieb:
> meine erste Frage wäre, wie kann ich einen MicroPython Programm
> automatisch neu starten?
Warum mit dem Dapfhammer draufhauen? Gibt es nicht eine weniger 
"brutale" Mehtode, um gegen den Verbindungsabbruch vorzugehen?

> vorgestern hat es noch gut funktioniert aber heute bekomme ich leider
> keine Werte..
Ich würde vorneweg versuchen, diese einfache Frage zu beantworten: 
Warum?

von Neuling A. (jesuisla)


Lesenswert?

Leider ist es hier eine weitverbreitete Unart, neunmalkluge Fragen zu 
stellen, statt zu sagen, was man zu sagen hat...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Neuling A. schrieb:
> Leider ist es hier eine weitverbreitete Unart, neunmalkluge Fragen zu
> stellen, statt zu sagen, was man zu sagen hat...
Leider ist es hier eine weitverbreitete Unart, dass TO nicht die nötigen 
Informationen zur Problemlösung liefern. Ich wünsche dir viel Glück beim 
Finden des Workarounds.

von Εrnst B. (ernst)


Lesenswert?

Du hast kein Fehlerhandling drinnen. Wenn die Verbindung zum MQTT-Server 
abbricht (DSL-Reconnect o.Ä.), dann fliegt beim client.publish eine 
Exception, entweder direkt aus dem umqttsimple, oder aus der socket-Lib, 
die es verwendet, oder aus einem assert im code ...

also:
try ... except

außenherum, bei Fehler entweder reset oder mqtt-reconnect oder 
Alarmsirene an oder, oder, oder...

von Neuling A. (jesuisla)


Lesenswert?

Εrnst B. schrieb:
> Du hast kein Fehlerhandling drinnen. Wenn die Verbindung zum
> MQTT-Server
> abbricht (DSL-Reconnect o.Ä.), dann fliegt beim client.publish eine
> Exception, entweder direkt aus dem umqttsimple, oder aus der socket-Lib,
> die es verwendet, oder aus einem assert im code ...

beim letzen Versuch kam diese Meldung an,:

Traceback (most recent call last):
  File "<stdin>", line 67, in <module>
  File "umqttsimple.py", line 144, in publish
  File "umqttsimple.py", line 184, in wait_msg
OSError: -1


umqttsimple:
        if qos == 1:
            while 1:
144             op = self.wait_msg()
                if op == 0x40:
                    sz = self.sock.read(1)
                    assert sz == b"\x02"
                    rcv_pid = self.sock.read(2)
                    rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
                    if pid == rcv_pid:
                        return


...

def wait_msg(self):
        res = self.sock.read(1)
        self.sock.setblocking(True)
        if res is None:
            return None
        if res == b"":
184         raise OSError(-1)
        if res == b"\xd0":  # PINGRESP

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

Neuling A. schrieb:
> beim letzen Versuch kam diese Meldung an,:

jep. sag ich doch.
per try...except kannst du die abfangen, und dich einfach neu mit dem 
MQTT verbinden. Dann geht dir auch kein Tropfen Wasser durch die Lappen.

von Neuling A. (jesuisla)


Lesenswert?

du meinst, try.. except in der while true?

while True:
   count = pulse2liter(trigger_pin)
   countall = count + countall
   if count > 0:
        print('Literverbrauch:',countall)
        try:
            client.publish('testclient', str(count), qos=1)
        except:
           print('cound not publish')
sleep(0.1)

bin nicht so profi beim pragrammieren..

von Steve van de Grens (roehrmond)


Lesenswert?

Ich würde in der Fehlermeldung die Exception auch "printen", sonst muss 
man raten, was schief gelaufen ist.
1
except Exception as e:
2
        sys.print_exception(e)

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Frikandel schrieb:
> Ich würde in der Fehlermeldung die Exception auch "printen",

Meinst Du die?:

https://de.wikipedia.org/wiki/Aachener_Printen

von Stefan F. (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Meinst Du die?:
> https://de.wikipedia.org/wiki/Aachener_Printen

Erinnere mich nicht dran. Wir hatten mal (zu viert) bei einem Ausflug 
nach Aachen frische Printen für 40 Euro gekauft und die allesamt auf dem 
Rückweg nach hause verschlungen. So war das eigentlich nicht geplant. 
Aber die Dinger machen süchtig. Da ist irgendwas drin, was verboten 
gehört.

von Martin H. (horo)


Lesenswert?

Wilhelm M. schrieb:
> Aachener_Printen

Und die haben (bei mir) eindeutig einen Elektronik-Bezug, denn die 
quadratischen Blechdosen, in denen wir viele Jahre Lambertz-Printen aus 
Aachen geschickt bekamen, kann man stapeln und ich bewahre darin 
Komponenten und fertige Baugruppen auf - robust und antistatisch. :)

Ok - back on topic

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.