Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ESP32+Thonny+固件烧录+编写建议

ESP32+Thonny+固件烧录+编写建议

作者头像
云深无际
发布于 2021-03-12 07:49:55
发布于 2021-03-12 07:49:55
2.8K00
代码可运行
举报
文章被收录于专栏:云深之无迹云深之无迹
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://micropython.org/download/esp32/
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://www.netbian.com/desk/23211.htm

我们此次的主角

这个实在是太新了,我不敢用

我们下载这个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://micropython.org/resources/firmware/esp32-idf3-20210202-v1.14.bin
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://docs.micropython.org/en/latest/

然后把我的秃头鸭拿出来,秃头保平安

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://thonny.org/

我们下载这个软件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github-releases.githubusercontent.com/163728962/a2487d00-755d-11eb-8f46-001a6cb020d5?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210301%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210301T111206Z&X-Amz-Expires=300&X-Amz-Signature=d51ba988a6cf3969dfaaaa6be70a87cb61f4a380fd781e31582d9d165b8bf0f5&X-Amz-SignedHeaders=host&actor_id=36230576&key_id=0&repo_id=163728962&response-content-disposition=attachment%3B%20filename%3Dthonny-3.3.5.exe&response-content-type=application%2Foctet-stream

下一步

完成

选择中文,标准

选择这里

我们在这里选择32

右下角,我们来烧录一下我们上面下载的固件

安装

稍等片刻

就看到这个了,我们现在已经可以开始开发了

在编辑区可以使用补全功能

我们可以有选择的打开一些窗口

可以打开一个程序树图,这里我们程序太短看不出来

也可以看到栈结构.可以用列表来构建


这里使用 WiFi 管理器库,就不必再硬编码网络凭据了。ESP32 设置一个接入点,显示可用的 Wi-Fi 网络。只需要选择您的网络并输入密码即可将ESP32设置为Wi-Fi站。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import network
import socket
import ure
import time

ap_ssid = "ESP32"
ap_password = "12345678"
ap_authmode = 3  # WPA2

NETWORK_PROFILES = 'wifi.dat'

wlan_ap = network.WLAN(network.AP_IF)
wlan_sta = network.WLAN(network.STA_IF)

server_socket = None


def get_connection():
    """return a working WLAN(STA_IF) instance or None"""

    # First check if there already is any connection:
    if wlan_sta.isconnected():
        return wlan_sta

    connected = False
    try:
        # ESP connecting to WiFi takes time, wait a bit and try again:
        time.sleep(3)
        if wlan_sta.isconnected():
            return wlan_sta

        # Read known network profiles from file
        profiles = read_profiles()

        # Search WiFis in range
        wlan_sta.active(True)
        networks = wlan_sta.scan()

        AUTHMODE = {0: "open", 1: "WEP", 2: "WPA-PSK",
            3: "WPA2-PSK", 4: "WPA/WPA2-PSK"}
        for ssid, bssid, channel, rssi, authmode, hidden in sorted(networks, key=lambda x: x[3], reverse=True):
            ssid = ssid.decode('utf-8')
            encrypted = authmode > 0
            print("ssid: %s chan: %d rssi: %d authmode: %s" %
                  (ssid, channel, rssi, AUTHMODE.get(authmode, '?')))
            if encrypted:
                if ssid in profiles:
                    password = profiles[ssid]
                    connected = do_connect(ssid, password)
                else:
                    print("skipping unknown encrypted network")
            else:  # open
                connected = do_connect(ssid, None)
            if connected:
                break

    except OSError as e:
        print("exception", str(e))

    # start web server for connection manager:
    if not connected:
        connected = start()

    return wlan_sta if connected else None


def read_profiles():
    with open(NETWORK_PROFILES) as f:
        lines = f.readlines()
    profiles = {}
    for line in lines:
        ssid, password = line.strip("\n").split(";")
        profiles[ssid] = password
    return profiles


def write_profiles(profiles):
    lines = []
    for ssid, password in profiles.items():
        lines.append("%s;%s\n" % (ssid, password))
    with open(NETWORK_PROFILES, "w") as f:
        f.write(''.join(lines))


def do_connect(ssid, password):
    wlan_sta.active(True)
    if wlan_sta.isconnected():
        return None
    print('Trying to connect to %s...' % ssid)
    wlan_sta.connect(ssid, password)
    for retry in range(100):
        connected = wlan_sta.isconnected()
        if connected:
            break
        time.sleep(0.1)
        print('.', end='')
    if connected:
        print('\nConnected. Network config: ', wlan_sta.ifconfig())
    else:
        print('\nFailed. Not Connected to: ' + ssid)
    return connected


def send_header(client, status_code=200, content_length=None):
    client.sendall("HTTP/1.0 {} OK\r\n".format(status_code))
    client.sendall("Content-Type: text/html\r\n")
    if content_length is not None:
      client.sendall("Content-Length: {}\r\n".format(content_length))
    client.sendall("\r\n")


def send_response(client, payload, status_code=200):
    content_length = len(payload)
    send_header(client, status_code, content_length)
    if content_length > 0:
        client.sendall(payload)
    client.close()


def handle_root(client):
    wlan_sta.active(True)
    ssids = sorted(ssid.decode('utf-8') for ssid, *_ in wlan_sta.scan())
    send_header(client)
    client.sendall("""\
        <html>
            <h1 style="color: #5e9ca0; text-align: center;">
                <span style="color: #ff0000;">
                    Wi-Fi Client Setup
                </span>
            </h1>
            <form action="configure" method="post">
                <table style="margin-left: auto; margin-right: auto;">
                    <tbody>
    """)
    while len(ssids):
        ssid = ssids.pop(0)
        client.sendall("""\
                        <tr>
                            <td colspan="2">
                                <input type="radio" name="ssid" value="{0}" />{0}
                            </td>
                        </tr>
        """.format(ssid))
    client.sendall("""\
                        <tr>
                            <td>Password:</td>
                            <td><input name="password" type="password" /></td>
                        </tr>
                    </tbody>
                </table>
                <p style="text-align: center;">
                    <input

注意里面改自己的连接信息

ctrl+S,保存在外部设备

注意这个名字,我写错了.按照我下面的来

改成这个上传

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import wifimgr
from time import sleep
import machine

try:
  import usocket as socket
except:
  import socket

led = machine.Pin(2, machine.Pin.OUT)

wlan = wifimgr.get_connection()
if wlan is None:
    print("Could not initialize the network connection.")
    while True:
        pass  # you shall not pass :D

# Main Code goes here, wlan is a working network.WLAN(STA_IF) instance.
print("ESP OK")

def web_page():
  if led.value() == 1:
    gpio_state="ON"
  else:
    gpio_state="OFF"
  
  html = """<html><head> <title>ESP Web Server</title> <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
  h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none; 
  border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
  .button2{background-color: #4286f4;}</style></head><body> <h1>ESP Web Server</h1> 
  <p>GPIO state: <strong>""" + gpio_state + """</strong></p><p><a href="/?led=on"><button class="button">ON</button></a></p>
  <p><a href="/?led=off"><button class="button button2">OFF</button></a></p></body></html>"""
  return html
  
try:
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  s.bind(('', 80))
  s.listen(5)
except OSError as e:
  machine.reset()

while True:
  try:
    if gc.mem_free() < 102000:
      gc.collect()
    conn, addr = s.accept()
    conn.settimeout(3.0)
    print('Got a connection from %s' % str(addr))
    request = conn.recv(1024)
    conn.settimeout(None)
    request = str(request)
    print('Content = %s' % request)
    led_on = request.find('/?led=on')
    led_off = request.find('/?led=off')
    if led_on == 6:
      print('LED ON')
      led.value(1)
    if led_off == 6:
      print('LED OFF')
      led.value(0)
    response = web_page()
    conn.send('HTTP/1.1 200 OK\n')
    conn.send('Content-Type: text/html\n')
    conn.send('Connection: close\n\n')
    conn.sendall(response)
    conn.close()
  except OSError as e:
    conn.close()
    print('Connection closed')

同理把这个也上传

然后电脑上面可以看到

接着输入这个IP就会出现

最后附上一张流程图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time

time.sleep(1)           # sleep for 1 second
time.sleep_ms(500)      # sleep for 500 milliseconds
time.sleep_us(10)       # sleep for 10 microseconds
start = time.ticks_ms()  # get value of millisecond counter
delta = time.ticks_diff(time.ticks_ms(), start)  # compute time difference
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://docs.singtown.com/micropython/zh/latest/pyboard/pyboard/quickref.html

可以写一些延时的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://docs.python.org/3/reference/index.html

如果你是一个小白,我觉得以上的网站就很适合你


在编写中断程序的时候可以按照以下的建议来编写

  • 尽量使代码短而简单。
  • 避免内存分配:无附加列表或插入字典,无浮点数。
  • 在ISR返回多个字节的情况下,使用预先分配的 bytearray 。若在ISR何主程序之间共享多个整数,则使用数组( array.array )。
  • 在主程序和ISR之间共享数据的情况下,考虑在主程序中访问数据前禁用中断,并在此后立即重新启。
  • 分配紧急异常缓冲区

这就是缓存区

由于各种原因,保持ISR代码尽可能简短十分重要。其应在事件发生后;自己执行:可延迟的操作应委托给主程序循环。典型情况下,一个ISR将处理引起中断的硬件设备,为下一个中断做好准备。ISR将与主循环通信,通过更新共享数据来表明中断已发生, 并返回。ISR应尽快将控制权返还给主循环。

ISR和主程序间的通信

通常,ISR需与主程序通信。最简单的通信方式是通过一个或多个共享数据对象,申明为全局或通过一类共享(见下)。但是这种方法有很多局限性和危害,下面将进行详细介绍。整数、 bytesbytearray 对象以及数组(来自数组模块,可储存多种数据类型)通常用于此目的。

创建Python对象

ISR无法创建Python对象的实例。这是由于MicroPython需从称为堆的空闲内存块的存储中为对象分配内存。这在中断处理程序中是不允许的,因为堆分配并非可重入的。换言之,当主程序正在执行分配时, 中断可能发生-为保持堆的完整性,解释器不允许ISR代码中的内存分配。

其影响之一为ISR无法使用浮点数算法;这是因为浮点数为Python对象。类似地,ISR无法附加项目到列表中。在实际操作中,很难精准确定哪个代码结构将尝试执行内存分配并引发错误信息:使ISR代码尽可能简短的另一原因。

避免此类问题的一个方法是ISR使用预分配缓冲区。例如,一个类构造函数创建一个 bytearray 实例和一个布尔标志。ISR方法将数据分配到缓冲区中的 位置并设置标志。当实例化对象时,内存分配在主程序代码中实现,而非在ISR中。

MicroPython库I/O方法通常提供使用预分配缓冲区的选项。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[esp32]ESP8266使用micropython连接MQTT控制家电
经历了很长很长很长很长的时间,跳过了各种坑,终于,在居家隔离的日子里,把这个项目搞定了 首先呢,淘宝购买了设备,先用 Raspberry pi RP 连接ESP01S、控制继电器,联网,控制电器,发现硬件多、预算高,然后就更换成了ESP8266继电器。刷了很长很长时间的固件,发现只能成功刷入原厂AT,micropython刷不进去,或者刷进去启动乱码,毕竟咱们AT语句不熟,最后,搁置了一段时间,成功刷入micropython
一朵灼灼华
2022/08/05
2.3K3
[esp32]ESP8266使用micropython连接MQTT控制家电
(一)MicroPython——WIFI点灯
目录 学习目标 成果展示  硬件知识 代码  总结  学习目标 成果展示  预备知识 代码  总结 学习目标         我们今天来学习有关MicroPython的知识点,相比于用C语言来开发,MicroPython有许多的优点,比如可以交互,有大量的库可以调用等等,对于我们程序的编写带来了极大的便捷。我们使用的开发板是ESP32,本身是国产芯片,而且还自带WIFI和蓝牙模块,目前使用起来感觉良好,本次实验我们先点亮LED灯和使用PWM来实现呼吸灯的效果,好了,就让我们开始今天的学习吧! 成果展示 
小点点
2023/01/13
1K0
(一)MicroPython——WIFI点灯
ESP32 MQTT连接到中移OneNET物联网平台(附源码)
前言:MQTT是当下物联网用的比较多的协议,本篇聊一聊用esp32通过MQTT连接到中移OneNET物联网平台。
ManInRoad
2020/09/27
4.5K0
ESP32 MQTT连接到中移OneNET物联网平台(附源码)
esp32➡遥控篇➡turtlesim➡mobot➡turtlebot3
turtle1/cmd_vel mobot/cmd_vel cmd_vel 代码如下: #include <ros2arduino.h> #include <WiFi.h> #include <WiFiUdp.h> #include <WiFiClient.h> #define SSID "***" #define SSID_PW "***" #define AGENT_IP "***" #define AGENT_PORT *** //AGENT port numbe
zhangrelay
2021/12/02
2620
esp32➡遥控篇➡turtlesim➡mobot➡turtlebot3
(二)MicroPython——通过WIFI开关灯与传输信息
目录 学习目标 成果展示  预备知识 代码  总结 ---- 学习目标         之前我们就介绍过,ESP32自带WIFI和蓝牙模块,所以我们今天就来介绍一下如何使用MicroPython来连接WIFI,从而实现单片机与电脑通信,最后我们将要实现通过我们电脑发送数据来实现开关灯的效果。 成果展示  https://live.csdn.net/v/embed/241846 WiFi控制开关灯 预备知识         这个的话,我们需要对于UDP有一个基本的认知。然后我们选择的是STA模
小点点
2022/12/12
1.8K0
(二)MicroPython——通过WIFI开关灯与传输信息
ESP32与MQTT:物联网通信的完美搭档
ESP32 是由 Espressif 开发的一系列低成本低功耗系统级芯片(SoC)微控制器,包括 Wi-Fi 和蓝牙无线功能以及双核处理器。如果你熟悉 ESP8266,那么 ESP32 就是它的继任者,拥有许多新功能。
Hello工控
2025/06/08
5230
ESP32与MQTT:物联网通信的完美搭档
【玩转ESP32】7、ESP32连接wifi
前言:ESP32 WIFI功能支持STA、AP、APSTA三种模式,本文聊聊在STA模式下,连接到路由器。
ManInRoad
2021/05/18
6.5K0
【玩转ESP32】7、ESP32连接wifi
ESP8266学习笔记4:ESP8266的SmartConfig
今天花了将近一天的时间来研究ESP8266的SmartConfig功能,这个应该算是wifi云产品的标配。这篇文章先把SmartConfig操作一遍,后面我再写篇文章梳理下物理层的具体协议。
twowinter
2020/04/17
1.3K0
esp32与ros2的开关灯
单片机开关灯是必须的,如何告知ros2,这里用主题方式实现。需要先阅读: esp32与ros2的欢乐启程 https://blog.csdn.net/ZhangRelay/article/detail
zhangrelay
2021/12/02
3610
esp32与ros2的开关灯
MircoPython接入巴法云,esp8266和esp32开发环境
下载后解压,首先双击打开 uPyCraft 软件,刷入固件,首先点击 tools-->BurnFirmware ,再选择esp8266或者esp32,选择开发板端口,选择需要刷入的固件,固件在下载的环境包中,点击ok即可刷入,如下图所示:
巴法
2022/01/13
1.8K0
MircoPython接入巴法云,esp8266和esp32开发环境
MicroPython 玩转硬件系列5:WIFI实验
我先用手机开了一个WIFI热点,名字是Honor 8,密码是12345678。通过以下语句去连接手机WIFI热点。
用户2366192
2021/05/31
9850
【Arduino】ESP8266获取NTP时间及连接MQTT实现远程控制示例
ESP8266 是一款低成本、低功耗的 Wi-Fi 微控制器芯片,广泛应用于物联网 (IoT) 和嵌入式系统中。它具有集成 Wi-Fi 功能,支持通过无线网络与其他设备进行通信,并且相对易于使用,非常适合开发者和工程师进行快速原型设计和小型应用开发。
DevFrank
2024/12/12
6961
【Arduino】ESP8266获取NTP时间及连接MQTT实现远程控制示例
ESP8266配网思路(不使用SmartConfig)
1、设备让ESP8266进入AP模式设备MCU通过串口给ESP8266发送AT+CWMODE=2,让ESP8266进入AP模式。如果进入AP模式成功,用手机可以搜索到ESP8266模块的热点信息。
杨源鑫
2019/07/04
9.8K1
ESP8266配网思路(不使用SmartConfig)
ESP8266WIFI连网播放视频
本篇介绍ESP8266在OLED上播放视频: 电脑端Python程序作为视频数据的服务器,借助OpenCV实时读取视频帧,并进行二值图像转换,尺寸调整,再将二值图像转为数组,并以二进制形式的数据通过socket方式无线发送给ESP8266。 ESP8266采用Arduino IDE编程,借助U8g2库,将图像数据实时显示到OLED屏幕中。 1 ESP8266端视频帧接收与播放程序 ESP8266作为socket客户端,接收服务端发送的图像帧数据,进行显示。 ESP8266使用Arduino IDE环境进
xxpcb
2022/10/04
6630
ESP8266WIFI连网播放视频
29-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(Lwip RAW模式,非RTOS版,精简入门)
https://www.cnblogs.com/yangfengwu/p/11456667.html
杨奉武
2019/09/05
1.4K0
29-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(Lwip RAW模式,非RTOS版,精简入门)
基于STM32设计的智能家居系统(采用ESP8266+OneNet云平台)
上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。
DS小龙哥
2022/01/12
4.6K0
基于STM32设计的智能家居系统(采用ESP8266+OneNet云平台)
腾讯云物联网平台使用报告
上面的client id 、mqtt usernme、mqtt password都是我们需要用到的。
ManInRoad
2020/09/27
3.9K0
腾讯云物联网平台使用报告
ESP8266上的MicroPython入门(3)
MicroPython REPL位于UART0(GPIO1 = TX,GPIO3 = RX)上,波特率为115200。制表符补全有助于找出对象具有哪些方法。粘贴模式(Ctrl-E)可用于将大量Python代码粘贴到REPL中。
云深无际
2021/04/14
1.2K0
ESP8266上的MicroPython入门(3)
203-ESP32_SDK开发-softAP+station共存模式
说明 这节测试一下模组softAP+station共存模式 代码文件 #define event_handler_c_ #include <stdio.h> #include <string.h> #include "event_handler.h" //----------------------------------------- static const char *TAG = "event_handler"; /*重新连接热点*/ void WIFI_EVENT_STA_DISCONNE
杨奉武
2021/12/01
9760
203-ESP32_SDK开发-softAP+station共存模式
26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网
按下固件按钮(GPIO0)大约3S, 让GPIO2那个灯快闪,进入配网模式,然后60S超时检测.还有就是不让WIFI打印官方内部写的东西(打印的东西太多了...)
杨奉武
2019/08/30
2K1
26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网
推荐阅读
相关推荐
[esp32]ESP8266使用micropython连接MQTT控制家电
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验