Добрый день.
Понадобилось собрать очередную "метеостанцию". Взял готовую платку wemos d1 mini v4 чтобы не возиться с подпаиванием резисторов и т.д.. Прошил micropython 1.21, сваял программу. Принцип очень простой - после старта поднимается wifi, опрашиваются датчики 18b20, показания сливаются на mqtt. Затем плата уходит в deepsleep. По замыслу плата должна сама проснуться и повторить цикл.
Однако, что-то пошло не так - после пробуждения плата не стартует, выводит какую-то ересь в uart и все. Чтобы исключить кривые ручонки и конкретный битый экземпляр - повторил эксперимент на старой версии wemos d1 mini (в ней пришлось припаивать резистор 470Ом между gpio16 и rst) и nodemcu v3 (просто соеденил gpio16 и rst перемычкой). Nodemcu завелась сразу и заработала как часы, подключил 1-wire на gpio2 - продолжила работать. А вот предыдущий wemos работать (точне нормально просыпаться) отказался.
Голову сломал, где ошибка и с чем связано такое поведение макетки. Кто занает, где собака порылась?
Понадобилось собрать очередную "метеостанцию". Взял готовую платку wemos d1 mini v4 чтобы не возиться с подпаиванием резисторов и т.д.. Прошил micropython 1.21, сваял программу. Принцип очень простой - после старта поднимается wifi, опрашиваются датчики 18b20, показания сливаются на mqtt. Затем плата уходит в deepsleep. По замыслу плата должна сама проснуться и повторить цикл.
Однако, что-то пошло не так - после пробуждения плата не стартует, выводит какую-то ересь в uart и все. Чтобы исключить кривые ручонки и конкретный битый экземпляр - повторил эксперимент на старой версии wemos d1 mini (в ней пришлось припаивать резистор 470Ом между gpio16 и rst) и nodemcu v3 (просто соеденил gpio16 и rst перемычкой). Nodemcu завелась сразу и заработала как часы, подключил 1-wire на gpio2 - продолжила работать. А вот предыдущий wemos работать (точне нормально просыпаться) отказался.
Голову сломал, где ошибка и с чем связано такое поведение макетки. Кто занает, где собака порылась?
Python:
import machine, onewire, ds18x20, time, network
from machine import Pin
import binascii
from umqtt.simple import MQTTClient
import json
import sys
class Config:
def __init__(self):
self.wifi_sid=""
self.wifi_psw=""
self.wifi_wait=10000
self.mqtt_addr="127.0.0.1"
self.mqtt_user=""
self.mqtt_pass=""
self.mqtt_topic="topic"
self.onewire_pin=2
self.wts_sleepms=10000
self.wts_break=False
self.wts_ds18b20={}
self.wts_name=binascii.hexlify(machine.unique_id()).decode('utf-8')
def __str__(self):
return f'{self.wifi_sid} {self.mqtt_addr} {self.mqtt_user} {self.mqtt_pass} {self.mqtt_topic} {self.onewire_pin} {self.wts_sleepms} {self.wts_break}'
def readConfig():
ret=Config()
with open("wts-config.json","r") as f:
config=json.load(f)
ret.wifi_sid=config['wifi']['sid']
ret.wifi_psw=config['wifi']['psw']
ret.mqtt_addr=config['mqtt']['addr']
ret.mqtt_user=config['mqtt']['user']
ret.mqtt_pass=config['mqtt']['pass']
ret.mqtt_topic=config['mqtt']['topic']
ret.onewire_pin=config['onewire']['pin']
ret.wts_sleepms=config['wts']['sleepms']
ret.wts_break=config['wts']['break']
ret.wts_ds18b20=config['wts']['ds18b20']
if 'name' in config['wts']:
ret.wts_name=config['wts']['name']
return ret
def ds18b20Name(config, name):
if addr in config.wts_ds18b20:
return config.wts_ds18b20[name]
else:
name
config=readConfig()
print(config)
offpin = machine.Pin(config.onewire_pin, Pin.IN)
print(f'normal startup {offpin.value()}')
if offpin == 0:
sys.exit(1)
chipid=binascii.hexlify(machine.unique_id()).decode('utf-8')
print(f'esp8266 id {chipid} {config.wts_name}')
ds_pin = machine.Pin(config.onewire_pin)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
#------------------------------------------------------------------
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(config.wifi_sid, config.wifi_psw)
roms = ds_sensor.scan()
for rom in roms:
addr=binascii.hexlify(rom).decode()
print(f'ds18b20 {addr} {ds18b20Name(config, addr)}')
if len(roms) > 0:
ds_sensor.convert_temp()
time.sleep_ms(500)
i=config.wifi_wait
while not station.isconnected() and i > 0:
time.sleep_ms(100)
i-=100
if not station.isconnected():
print(f'can not connect to {config.wifi_sid}, exiting')
sys.exit(1)
print(f'connected to {config.wifi_sid} ip {station.ifconfig()[0]}')
mqtt=MQTTClient(config.wts_name, config.mqtt_addr, user=config.mqtt_user, password=config.mqtt_pass)
mqtt.connect()
for rom in roms:
temp=ds_sensor.read_temp(rom)
sens=binascii.hexlify(rom).decode()
name=ds18b20Name(config, sens)
print(name,' ',temp)
topic=config.mqtt_topic+'/'+config.wts_name+'/ds18b20/'+name
mqtt.publish(topic,str(temp))
mqtt.disconnect()
if not config.wts_break:
print(f'wait for 60000ms before deepsleep')
time.sleep_ms(60000)
print(f'go sleep for {config.wts_sleepms} ms')
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, config.wts_sleepms)
machine.deepsleep()