• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 ). Решение было: вместо перемычки (резистора) поставить диод шоттки.

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