ESP8266上的不稳定Micropython

ESP8266上的不稳定Micropython,python,microcontroller,esp8266,micropython,Python,Microcontroller,Esp8266,Micropython,我在ESP8266上的Micropythone中迈出了第一步。我上传了最新版本1.13,当我尝试在AP模式下运行wifi时,奇怪的事情发生了。每隔几次wifi运行一次就可以正常工作,但大多数情况下都没有响应(我的电脑看不到wifi网络)。这是我的密码: boot.py # Libraries import uos, machine, ujson import gc # Changing CPU from 80MHz to 160MHz machine.freq(160000000) # Lo

我在ESP8266上的Micropythone中迈出了第一步。我上传了最新版本1.13,当我尝试在AP模式下运行wifi时,奇怪的事情发生了。每隔几次wifi运行一次就可以正常工作,但大多数情况下都没有响应(我的电脑看不到wifi网络)。这是我的密码:

boot.py

# Libraries
import uos, machine, ujson
import gc

# Changing CPU from 80MHz to 160MHz
machine.freq(160000000)

# Load and check the config file
print('BOOT: Loading database.json...')

data = open('database.json', 'r')
config = ujson.load(data)
data.close()

# Config is corrupted
if config['Device']['Manufacture'] != 'ACME' or config['Checksum'] != '18caE':

  print('BOOT: database.json is corrupted! Uploading from backup.')

  # Copy clean from backup
  dataBackup = open('database-backup.json', 'r')
  configBackup = ujson.load(dataBackup)
  dataBackup.close()

  if configBackup:
    data = open('database.json', 'w')
    ujson.dump(configBackup, data)
    data.close()

    print('BOOT: Uploading from backup completed! Rebooting system...')

  # Reboot OS
  machine.reset()

# Config is correct
else:

  print('BOOT: database.json loading completed!')

  # Clean memory
  gc.collect()
# Libraries
import network, servers

print('MAIN: Loading module...')
import network

print('SERVER: Loading module...')

# Setup Wi-Fi card
# As Access Point
if config['Configuration']['WiFiMode'] == 'Access Point':

  print('SERVER: Setup as Access Point')

  wifi = network.WLAN(network.AP_IF)
  wifi.active(True)
  wifi.config(essid = config['Device']['Name'] + ' ' + config['Device']['SerialNumber'], password = config['Configuration']['WiFiAPPassword'])
  wifi.ifconfig(('192.168.0.1','255.255.255.0','192.168.0.1','192.168.0.1'))

# As Wi-Fi client
elif config['Configuration']['WiFiMode'] == 'Client':

  print('SERVER: Setup as client ' + config['Configuration']['WiFiClientSSID'] + ' with password ' + config['Configuration']['WiFiClientPassword'])

else:
  machine.reset()
main.py

# Libraries
import uos, machine, ujson
import gc

# Changing CPU from 80MHz to 160MHz
machine.freq(160000000)

# Load and check the config file
print('BOOT: Loading database.json...')

data = open('database.json', 'r')
config = ujson.load(data)
data.close()

# Config is corrupted
if config['Device']['Manufacture'] != 'ACME' or config['Checksum'] != '18caE':

  print('BOOT: database.json is corrupted! Uploading from backup.')

  # Copy clean from backup
  dataBackup = open('database-backup.json', 'r')
  configBackup = ujson.load(dataBackup)
  dataBackup.close()

  if configBackup:
    data = open('database.json', 'w')
    ujson.dump(configBackup, data)
    data.close()

    print('BOOT: Uploading from backup completed! Rebooting system...')

  # Reboot OS
  machine.reset()

# Config is correct
else:

  print('BOOT: database.json loading completed!')

  # Clean memory
  gc.collect()
# Libraries
import network, servers

print('MAIN: Loading module...')
import network

print('SERVER: Loading module...')

# Setup Wi-Fi card
# As Access Point
if config['Configuration']['WiFiMode'] == 'Access Point':

  print('SERVER: Setup as Access Point')

  wifi = network.WLAN(network.AP_IF)
  wifi.active(True)
  wifi.config(essid = config['Device']['Name'] + ' ' + config['Device']['SerialNumber'], password = config['Configuration']['WiFiAPPassword'])
  wifi.ifconfig(('192.168.0.1','255.255.255.0','192.168.0.1','192.168.0.1'))

# As Wi-Fi client
elif config['Configuration']['WiFiMode'] == 'Client':

  print('SERVER: Setup as client ' + config['Configuration']['WiFiClientSSID'] + ' with password ' + config['Configuration']['WiFiClientPassword'])

else:
  machine.reset()
servers.py

# Libraries
import uos, machine, ujson
import gc

# Changing CPU from 80MHz to 160MHz
machine.freq(160000000)

# Load and check the config file
print('BOOT: Loading database.json...')

data = open('database.json', 'r')
config = ujson.load(data)
data.close()

# Config is corrupted
if config['Device']['Manufacture'] != 'ACME' or config['Checksum'] != '18caE':

  print('BOOT: database.json is corrupted! Uploading from backup.')

  # Copy clean from backup
  dataBackup = open('database-backup.json', 'r')
  configBackup = ujson.load(dataBackup)
  dataBackup.close()

  if configBackup:
    data = open('database.json', 'w')
    ujson.dump(configBackup, data)
    data.close()

    print('BOOT: Uploading from backup completed! Rebooting system...')

  # Reboot OS
  machine.reset()

# Config is correct
else:

  print('BOOT: database.json loading completed!')

  # Clean memory
  gc.collect()
# Libraries
import network, servers

print('MAIN: Loading module...')
import network

print('SERVER: Loading module...')

# Setup Wi-Fi card
# As Access Point
if config['Configuration']['WiFiMode'] == 'Access Point':

  print('SERVER: Setup as Access Point')

  wifi = network.WLAN(network.AP_IF)
  wifi.active(True)
  wifi.config(essid = config['Device']['Name'] + ' ' + config['Device']['SerialNumber'], password = config['Configuration']['WiFiAPPassword'])
  wifi.ifconfig(('192.168.0.1','255.255.255.0','192.168.0.1','192.168.0.1'))

# As Wi-Fi client
elif config['Configuration']['WiFiMode'] == 'Client':

  print('SERVER: Setup as client ' + config['Configuration']['WiFiClientSSID'] + ' with password ' + config['Configuration']['WiFiClientPassword'])

else:
  machine.reset()
database.json

{
    "Device": {
        "Manufacture": "ACME",
        "Name": "My device",
        "SerialNumber": "M0J4"
    },
    "Configuration": {
        "WiFiAPPassword": "test1test",
        "WiFiAPIP": "192.168.0.1",
        "WiFiAPMask": "255.255.255.0",

        "WiFiClientSSID": "Network name",
        "WiFiClientPassword": "Network password",

        "WiFiMode": "Access Point",
    },
    "Checksum": "18caE"
}
有时此代码会启动,但通常在boot.py之后停止。我崩溃了,因为我在没有ESP8266的情况下编写了很多代码,从12小时开始,我就厌倦了一开始的工作…

一个“全局”变量只是模块中的全局变量。您的
config
变量在
main.py
boot.py
和REPL中可见,因为它们都在相同的上下文中执行(隐式
\uuuuuuuu main\uuuuu
模块),但在其他模块中不可见

一种解决方案是将配置处理代码移动到另一个模块中。例如,使用以下内容创建
config.py

import gc
import json
import machine

config = {}


def load_config():
    global config

    # Load and check the config file
    print("BOOT: Loading database.json...")

    try:
        with open("database.json", "r") as fd:
            config = json.load(fd)
    except OSError:
        # failed to open file (maybe it didn't exist)
        config = {}

    # Config is corrupted
    if (
        config.get("Device", {}).get("Manufacture") != "ACME"
        or config.get("Checksum") != "18caE"
    ):

        print("BOOT: database.json is corrupted! Uploading from backup.")

        # Copy clean from backup
        with open('database-backup.json', 'r') as fd:
            configBackup = json.load(fd)

        with open('database.json', 'w') as fd:
            json.dump(configBackup, fd)

        print("BOOT: Uploading from backup completed! Rebooting system...")

        # Reboot OS
        machine.reset()
    # Config is correct
    else:

        print("BOOT: database.json loading completed!")

        # Clean memory
        gc.collect()
然后您的
boot.py
变成:

import machine
import gc

# Changing CPU from 80MHz to 160MHz
machine.freq(160000000)

gc.collect()
servers.py
看起来像:

import config
import machine
import network

print("SERVER: Loading module...")


config.load_config()

# Setup Wi-Fi card
# As Access Point
if config.config["Configuration"]["WiFiMode"] == "Access Point":

    print("SERVER: Setup as Access Point")

    wifi = network.WLAN(network.AP_IF)
    wifi.active(True)
    wifi.config(
        essid="{} {}".format(
            config.config["Device"]["Name"],
            config.config["Device"]["SerialNumber"],
        ),
        password=config.config["Configuration"]["WiFiAPPassword"],
    )
    wifi.ifconfig(("192.168.0.1", "255.255.255.0", "192.168.0.1", "192.168.0.1"))

# As Wi-Fi client
elif config.config["Configuration"]["WiFiMode"] == "Client":

    print(
        "SERVER: Setup as client {} with password {}".format(
            config["Configuration"]["WiFiClientSSID"],
            config["Configuration"]["WiFiClientPassword"],
        )
    )

else:
    machine.reset()

此代码没有运行…在
servers.py
中没有名为
config
的变量,因此代码将失败,并在第7行出现
namererror
异常。但为什么此代码有时会工作?配置数组不是全局的?当我打印(*config)时,我得到了一个答案。对于字符串连接,请使用str.format()函数,它将帮助您节省宝贵的内存字节<代码>打印(“服务器:设置为客户端{},密码为{}”)。格式(config['Configuration']['WiFiClientSSID'],config['Configuration']['WiFiClientPassword'])感谢您的支持和宝贵时间。我很感激!我照你写的做了,但这里还是有些问题。配置可见,但聚光灯模块没有执行:Trackback(最近一次调用last):文件“main.py”,第1行,文件“spotlight.py”,第7行缩进错误:unident没有任何外部缩进级别该文件似乎混合了空格和制表符。那会引起各种各样的问题。Python代码应该只使用空格进行缩进;大多数现代编辑都有这样的背景。考虑使用一个工具如<代码> FLAKE8/COD>对代码进行一些基本检查。如果你有其他问题,你可能想提出一个新问题;评论不是解决问题的好地方。