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

Запуск main.py

NikNep

New member
Подскажите в чем проблема. На ESP8266 через webrepl загружены файлы boot.py и main.py. При перезагрузке модуль включается, но программа из main.py не выполняется. Работает только ручной запуск функции main() через webrepl. Тогда все работает. Пробовал и в main.py и в boot.py конце и в начале ставить запуск функции main(), но тогда или модуль подвисает или все равно срабатывает только по команде вручную.
В boot.py стандартно старт webrepl и подключение к сети.
В main.py - подключение к MQTT брокеру и отправка каждые 5 сек. данных с встроенного датчика освещения (ниже код main.py,).

Код:
from umqtt.simple import MQTTClient
from machine import Pin
import ubinascii
import machine
import micropython
import time

adc = machine.ADC(0)
TOPIC = b'topic'
SERVER = "xxx.xxx.x.x"
CLIENT_ID = ubinascii.hexlify(machine.unique_id())

def main(server=SERVER):
    c = MQTTClient(CLIENT_ID, server)
    c.connect()
    print("Connected to %s, subscribed to %s topic" % (server, TOPIC))

    try:
        while True:
            print(adc.read())
            c.publish(b"topic", str(adc.read()))
            time.sleep(5)
          
  
    finally:
        c.disconnect()
 
Последнее редактирование:

__ab__

New member
Так в main.py нет команды на запуск.
Туда стоит последней строкой добавить
Код:
main()
а еще лучше не добавлять такую строку, а поправить boot.py вот так:
Код:
import gc, webrepl
webrepl.start()
gc.collect()
import main
main.main()
И, кстати, print совсем лишнее, если запускать автоматом.
 
Последнее редактирование:

NikNep

New member
Так в main.py нет команды на запуск.
Туда стоит последней строкой добавить
Код:
main()
а еще лучше не добавлять такую строку, а поправить boot.py вот так:
Код:
import gc, webrepl
webrepl.start()
gc.collect()
import main
main.main()
И, кстати, print совсем лишнее, если запускать автоматом.

Подскажите в чем проблема. На ESP8266 через webrepl загружены файлы boot.py и main.py. При перезагрузке модуль включается, но программа из main.py не выполняется. Работает только ручной запуск функции main() через webrepl. Тогда все работает. Пробовал и в main.py и в boot.py конце и в начале ставить запуск функции main(), но тогда или модуль подвисает или все равно срабатывает только по команде вручную.
В boot.py стандартно старт webrepl и подключение к сети.
В main.py - подключение к MQTT брокеру и отправка каждые 5 сек. данных с встроенного датчика освещения (ниже код main.py,).

Код:
from umqtt.simple import MQTTClient
from machine import Pin
import ubinascii
import machine
import micropython
import time

adc = machine.ADC(0)
TOPIC = b'topic'
SERVER = "xxx.xxx.x.x"
CLIENT_ID = ubinascii.hexlify(machine.unique_id())

def main(server=SERVER):
    c = MQTTClient(CLIENT_ID, server)
    c.connect()
    print("Connected to %s, subscribed to %s topic" % (server, TOPIC))

    try:
        while True:
            print(adc.read())
            c.publish(b"topic", str(adc.read()))
            time.sleep(5)
         
 
    finally:
        c.disconnect()
Так я и описывал, что и в main.py и в boot.py прописывал запуск (как в Вашем первом так и втором варианте) . С вторым вариантом (в boot.py импорт и запуск) все равно не запускается. только вручную (Снимок1). Также пробовал загрузить start.py с функцией run и протестировать вручную импорт и запуск - результат снимок 2, где опять старт только вручную.
 

Вложения

NikNep

New member
Разобрался. Проблема была в том что сеть еще не успевала подключится и при запуске main() - если команда была записана в конце в файле main.py или boot.py - сразу шло подключение к брокеру и соответственно вылетало с ошибкой OSError: [Errno 113] EHOSTUNREACH. Добавил проверку перед выполнением c.connect() и все работает. Поэтому вручную и запускалось, так как сеть была подключена после перезапуска.
 

gwvsol

New member
Вот пример как сделать подключение к WiFi.
По аналогии сможете запустить другой код.
Создаете файл с кодом. Например: wifi.py
Код:
import network
import time

def do_connect():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('*****', '*********')
        time.sleep(3)
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())
   
do_connect()
В эту строку подставьте свои данные для подключения
wlan.connect('*****', '*********')
Теперь осталось только в main.py добавить только одну строку
import wifi
Оба файла закидываете на ESP8266 и перегружаете. При этом контроллер должен как и прежде поднять точку доступа для webrepl и выполнить wifi подключение. Если вы будет использовать REPL через COM порт вы сможете увидеть вывод всех print которые есть в коде
 
Сверху Снизу