• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

wemos d1 mini deepsleep

kds

New member
Добрый день.

Понадобилось собрать очередную "метеостанцию". Взял готовую платку 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()

Снимок экрана_2023-12-26_22-44-30.png
 

kds

New member
Добавлю: простой скетч

Python:
import machine, time
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, 10000)
machine.deepsleep()
тоже не работает, как нужно

1703613311424.png
 

fps

Active member
Судя по всему, столкнулся с аналогичной проблемой.

Плата ESP12-S. IO16 соединил с RST через резистор 100 Ом. Другой обвязки, судя по схеме платы, не требуется.

При выходе из deepsleep пишет в терминал на скорости 74800 одну строку:
Код:
ets Jan 8 2013, rst cause: 2, boot mode: (3,6)
и на этом висит.

Пробовал убрать перемычку IO16 - RST, перевести в deepsleep, а затем нажать ресет вручную.
Ситуация аналогичная - пишет "ets Jan 8 2013, rst cause: 2, boot mode: (3,6)" и висит.
Если после этого нажать ресет повторно, то нормально перезагружается.
Воспроизводится стабильно.

Прошивку использую micropython. Пробовал и последнюю версию, и старую - воспроизводится одинаково.
Вот тут такой же случай описан https://stackoverflow.com/questions/65720707 с ардуино прошивкой, тоже без решения.

Нет мыслей у кого, как это можно диагностировать и полечить?
 

CodeNameHawk

Moderator
Команда форума
К esp12f модулю, подключал переходник на FT232RL, так его нога подключенная к ресет не давала выйти из сна.
Проверьте, или отключите ногу ресет от переходника, резисторы на 10 ком на плюс и 470 ом на 16 ногу нужны.
 

fps

Active member
отключите ногу ресет от переходника
Отключил и ресет и IO16 - они теперь в воздухе. (RST внутри модуля подтянут к плюсу, см. схему)

Включаю плату и увожу ее в deepsleep:
Python:
machine.deepsleep()
После этого замыкаю пинцетом RST на землю. Вижу ту самую строчку и всё. А должен перезагрузиться.

01.png

А если замкнуть RST второй раз - то перезагружается нормально:

02.png

резисторы на 10 ком на плюс и 470 ом на 16 ногу нужны.
IO16 сейчас вообще в воздухе висит, ни к чему не подключен.
10к на плюс - это ведь не режим устанавливает, это чтоб сброс формировался (?)
А сброс я вручную сейчас жму - но всё равно, то же самое.
 

gromush

Member
Та же хрень, и именно с 12F - 12E работает отлично с тем же кодом на той же разведенной плате.
 

fps

Active member
Может в этом проблема
А в чем в этом-то? Вроде так и надо ведь. Тестером прозванивал - всё честно, резистор R1 есть, номинал примерно такой как указано.

ESP-12S.png


У меня открывается. Приложил файл, который по этой ссылке.
 

Вложения

gromush

Member
Судя по интернет поиску - эта проблема у многих на отдельных экземплярах. Я на днях проверю, есть у меня 10-к esp-шек - скажу.
 

fps

Active member
Спасибо, не видел то обсуждение.
Вероятно это действительно источник проблемы.
Но в ESP-12S эти пины не выведены :)
Не хочется вскрввать его. При том что в остальном он работает вроде нормально.
Оставлю этот экземпляр для использования там, где не нужен режим сна.
 

balzak1155

New member
У меня были проблемы с перемычкой RST - - D0 ( IO16 ). Решение было: вместо перемычки (резистора) поставить диод шоттки.

С Уважением.
 
Сверху Снизу