Onewire, Wifi, MQTT, crash...
-
Hi!
I finally had the time to go further with my project with the Lopy : reading temperature from a DS18B20 (onewire) sensor, and send it to my MQTT broken on the LAN via WIFI.
Ok, I manage to read the temperature by using the code from this forum post : https://forum.pycom.io/topic/303/ds18b20-temperature-sensor. It works perfectly, I can leave it running for a long time without any issue.
Wifi is quite straightforward, and I used this a MicroPython library for MQTT : https://pypi.python.org/pypi/micropython-umqtt.simple/1.3.2. I did a simple test program that send a value on the broker, and it can run forever too.
But... when I read the temperature and send it on MQTT in a loop... it freezes after 2-3 minutes.
On a firmware version from late december 2016 (1.4 or 1.5 something), a lot of messages were printed on the console when it crashed :
Running temperature_wifi_app.py Soft resetting the LoPy Connecting to WIFI... I (10786) wifi: mode : sta (24:0a:c4:00:c0:52) I (12716) wifi: n:13 0, o:6 0, ap:255 255, sta:13 0, prof:6 I (13690) wifi: state: init -> auth (b0) I (13693) wifi: state: auth -> assoc (0) I (13697) wifi: state: assoc -> run (10) I (13710) wifi: connected with Zataboy-2.4Ghz, channel 13 WIFI OK Connecting to MQTT MQTT OK Init temperature sensor.. I (24082) wifi: pm open, type:0, st: 0, sending null data: 0 E (306439) wifi: error malloc bcn_param E (306542) wifi: error malloc bcn_param E (306644) wifi: error malloc bcn_param E (306747) wifi: error malloc bcn_param E (306849) wifi: error malloc bcn_param E (306951) wifi: error malloc bcn_param E (308078) wifi: error malloc bcn_param E (308180) wifi: error malloc bcn_param E (308283) wifi: error malloc bcn_param E (308385) wifi: error malloc bcn_param E (308487) wifi: error malloc bcn_param E (308590) wifi: error malloc bcn_param E (310023) wifi: error malloc bcn_param E (310126) wifi: error malloc bcn_param E (310228) wifi: error malloc bcn_param E (311355) wifi: error malloc bcn_param E (311457) wifi: error malloc bcn_param [[[ EDIT : a lot more of this message]]] E (413652) wifi: error malloc bcn_param E (413754) wifi: error malloc bcn_param E (414983) wifi: error malloc bcn_param E (415085) wifi: error malloc bcn_param E (415188) wifi: error malloc bcn_param E (415290) wifi: error malloc bcn_param E (415392) wifi: error malloc bcn_param E (416621) wifi: error malloc bcn_param E (416724) wifi: error malloc bcn_param E (416826) wifi: error malloc bcn_param E (416928) wifi: error malloc bcn_param E (417031) wifi: error malloc bcn_param I (417142) wifi: state: run -> auth (2c0) I (417142) wifi: n:13 0, o:13 0, ap:255 255, sta:13 0, prof:6 I (417144) wifi: pm close, st: 7, sending null data: 0, total sleep time: 0/393061512 I (417264) wifi: n:13 0, o:13 0, ap:255 255, sta:13 0, prof:6 I (417264) wifi: state: auth -> auth (b0) I (417267) wifi: state: auth -> assoc (0) I (417270) wifi: state: assoc -> run (10) I (417283) wifi: connected with Zataboy-2.4Ghz, channel 13 Traceback (most recent call last): File "<stdin>", line 39, in <module> File "mqtt/mqtt_simple.py", line 110, in publish OSError: [Errno 113] EHOSTUNREACH > MicroPython v1.8.6-264-gadacebe on 2016-12-22; LoPy with ESP32 Type "help()" for more information. >>> I (427271) wifi: pm open, type:0, st: 0, sending null data: 0I've just upgraded to firmware version 1.6.1.b1. It still crashes, with no message on the console.
Here is the code of the full application:
from network import WLAN from mqtt.mqtt_simple import MQTTClient import machine import time import sys sys.path.insert(0, '/flash/DS18B20') import ds18x20, machine print("Connecting to WIFI...") wlan = WLAN(mode=WLAN.STA) wlan.connect("Zataboy-2.4Ghz", auth=(WLAN.WPA2, "AZERTYUIOP")) while not wlan.isconnected(): time.sleep(1) print("WIFI OK") print("Connecting to MQTT") client = MQTTClient("lopy", "192.168.1.109", port=1883) client.connect() print("MQTT OK") print("Init temperature sensor..") temp = ds18x20.DS18X20(machine.Pin('G22',machine.Pin.OPEN_DRAIN, machine.Pin.PULL_UP)) tempValue = 0.0 while True: tempValue = temp.read_temp() client.publish("/test", str(tempValue)) time.sleep(1)I copied the code for onewire/ds18b20 in my Github repo : https://github.com/JF002/lopy-snippets/tree/master/DS18B20.
And the MQTT library : https://github.com/JF002/lopy-snippets/tree/master/mqttDo any of you experience this kind of error? What could I try in order to fix this?
Thanks for your help!
-
@JF002 said in Onewire, Wifi, MQTT, crash...:
for ds18b20 look here:
https://github.com/pycom/pycom-libraries/tree/master/examples/onewirethere are few fixes (some mine ;-) ) e.g. for negative temperature
and working with many roms
also look at not merged pull request
https://github.com/pycom/pycom-libraries/pull/2/filesyou then can worok with driver with many roms and with float or integer calculations
I recommend use
gc.collect()because mqtt use more big amout of memory
and i suppose you go into 0 free mem
look at free mem:
gc.mem_free() -
Thank you @livius for you help. I didn't know there was an example for this in the repo from Pycom.
Anyway, I tried the OneWire and DS18X20 modules, but it always returns 60.25 or -7.5... while the ambient temperature should be around 19°C for now... Is this example working for you?
As for the memory, I used gc.mem_free() to see the available RAM memory, and as you said, it dropped very quickly. So, gc.collect() could be a workaround, but it just seem to freeze the Lopy... (it does not respond and I have to reset it with the reset button).
I'm using firmware version 1.6.1.b1.
-
@JF002
yes, it work for me
which sensor do you have - waterproof?
but i use both and work for meexample data i got:
[UID=24:0a:c4:00:6e:c2] 2162, 22, 35, 0 [UID=24:0a:c4:00:6e:c2] 2162, 23, 35, 0 [UID=24:0a:c4:00:6e:c2] 2162, 24, 35, 0 [UID=24:0a:c4:00:6e:c2] 2162, 25, 35, 0 [UID=24:0a:c4:00:6e:c2] 2162, 26, 35, 0first is from ds18X20 waterproof
21,62 C -
It's a DS18B20. It looks like a transistor, and is not waterproof. Here is an example : https://tushev.org/images/electronics/arduino/ds18x20/DS18B20.jpg
EDIT : after a closer look, it's a DS1820 (w/o the B). Does it change anything?
I tried to connect the DATA pin on G17 (P10) and G22, with no luck.
Did you try the gc.collect thing on this version of the firmware?
-
@JF002
did you use also pullup resistor? -
@livius Yes, there is a resistor between 3.3V and the data pin.
-
The freeze with gc.collect seems to be a bug in the firmware. @daniel is already working on it : https://forum.pycom.io/post/4219
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login