NodeMCU-MicroPython配置实录

发现网络上的记录过于混杂,自己写一下笔记防止到时找不到资料

不会Python?百度搜索“菜鸟教程”,看看Python3就会了,人生苦短,我选Python

刷MicroPython包

去micropython的官网下载,选择正常版本(2Mib+)下载即可

image.png

(此处默认已经装完Python,并默认加入path,如果未安装自行百度)

下载完以后,本地的pip使用这个指令:

1
pip install esptool

找到设备所在的端口

控制面板->硬件和声音->设备管理器

image.png

得知我们的设备运行在COM3

image-20220120190147742.png

在esp8266-20220117-v1.18.bin所在的目录,打开cmd输入以下命令

1
2
esptool.py --port COM3 erase_flash
esptool.py --port COM3 --baud 460800 write_flash --flash_size=detect 0 esp8266-20220117-v1.18.bin --verify

等待烧写成功

Thonny版本

纯傻瓜教学版+免安装esptool版

默认Thonny装在C盘默认目录

意外发现Thonny自带esptool,省掉安装麻烦

从这里进入shell

image.png

找到插件的安装位置

输入指令

1
2
cd C:\Users\Administrator\AppData\Local\Programs\Thonny\Lib\site-packages
python esptool.py

就会显示这样的界面

image-20220120185850811.png

效仿上面

1
2
python esptool.py --port COM3 erase_flash
python esptool.py --port COM3 --baud 460800 write_flash --flash_size=detect 0 esp8266-20220117-v1.18.bin --verify

image-20220120190550557.png

等待烧写完成,下图为烧写完成的图像

image-20220120190704552.png

IDE配置

我个人喜欢Pycharm,但Thonny不需要装插件,简单轻巧,推荐这个

(怎么能没有万能的VScode呢?问就是插件配置有问题)

打开运行->设置解释器

image.png

配置正常应当是这种情况

image.png

顺利运行

跑个指令看看

image.png

上传文件

打开

image-20220120191437877.png

选择MicroPython设备,默认只有boot.py

image.png

文件命名为main.py的话,NodeMCU开机就会运行main.py

重要的事情说三遍

不允许写死循环程序!死循环程序拔掉线后板子无法刷入任何程序!!

不允许写死循环程序!死循环程序拔掉线后板子无法刷入任何程序!!

不允许写死循环程序!死循环程序拔掉线后板子无法刷入任何程序!!

2022.2.26更新:找到解决方案了,连上thonny后,对着shell窗口狂按Ctrl+C就有概率使板子停止运行,板子停下来后,移除main.py或者输入其他非micropython固件即可摆脱循环

好用的库

ujson

http://micropython.circuitpython.com.cn/en/latet/library/ujson.html

1
2
3
4
import json
a={'12':'dd','13':'ee'}
d=json.dumps(a)
print(d)

urequests

发送网络请求

1
2
3
4
import urequests
response = urequests.get('http://jsonplaceholder.typicode.com/albums/1')
print(response.text)
print(response.status_code)

定时器

定时器相比较于延时函数,不占用CPU运行时间

timer.deinit()

解除定时器的功能

驱动屏幕(I2C)

1
2
3
4
5
6
7
8
9
from machine import Pin,I2C,RTC
from ssd1306 import SSD1306_I2C
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.show()
oled.text("Hello World!",0,0)
oled.text("Welcome",0,16) #第二行
oled.show()

注意

屏幕是12864分辨率,就是横向(X轴)有128个像素点,纵向(Y轴)有64个点,一共是12864=8192个像素点。我们点亮需要的像素点,就能成像出我们需要的图像

具体还得看手册

V)9Y7$%(12L9~77SODR8LXF.jpg

硬件管脚图:

4268f878dcb8a03ecdc14346a1cc4857.jpg

全引脚展示

image-20210205161507654.png

esp8266手册_ESP8266用Micropython点亮I2C接口Oled

参考资料

http://docs.micropython.org/en/latest/library/index.htm

官方资料

http://micropython.circuitpython.com.cn/en/latet/library/index.html

中文翻译资料

编译mpy字节码

https://www.cnblogs.com/yafengabc/p/8682910.html

ESP32有关蓝牙广播的案例

https://github.com/micropython/micropython/blob/master/examples/bluetooth/ble_advertising.py

Webrpl

要连接wifi的话,需要把wifi名称和写进boot.py里面,main.py不行

记录一个诡异事件

全局变量要放在最前面

函数的位置不能随意挪动

明明python没有函数重载,那为什么这个文件能运行?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from tftlcd import LCD32
from touch import XPT2046
import time,gui,random
from machine import Timer,Pin
from test_mqtt import WIFI_Connect
from json import dumps
from simple import MQTTClient #导入MQTT板块

#定义常用颜色
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
BLACK = (0,0,0)
WHITE = (255,255,255)

d = LCD32(portrait=1) #默认方向竖屏
t = XPT2046()#默认方向

#填充白色
d.fill(WHITE)

#MQTT配置
SERVER = ''
USERNAME = ''
PASSWORD = ''
PORT = 1883
CLIENT_ID = '' # 客户端ID
TOPIC = 'T87HBZV2AE/ESP32Board/event' # TOPIC名称

# MQTTsend函数("Bug")
def MQTT_Send(list2):
print("hello")

#屏幕刷新
def flash(list2):
d.printStr(str(list2[0]['x'])+","+str(list2[0]['y']), 90, 78, RED, size=2)
d.printStr(str(list2[1]), 90, 123, RED, size=2)
d.printStr(str(list2[2]), 90, 168, RED, size=2)
d.printStr(str(list2[3]), 90, 213, RED, size=2)

#按钮
def fun1(B1):
print("hello")

def fun2(B1):
print("hello 2")

# #############################
# #### 定时器用于扫描按钮触发事件 ##
#############################
tim_flag = 0

def count(tim):
global tim_flag
tim_flag = 1

def ll(tim):
c={'x': round(-3 + random.random() * 6,2),'y': round(-3 + random.random() * 6,2)}
list2=[c,37,round(random.random()*100,2),50 + round(random.random() * 40,2),time.mktime(time.localtime())]
flash(list2)
MQTT_Send(list2)

# MQTTsend函数("True")
def MQTT_Send(list2):
list1=["coordinate","temperature","blood_oxygen","heart_rate","timestamp"]
b=zip(list1,list2)
msg1=dumps(dict(b))
print(msg1)
client.publish(TOPIC, msg1,qos=1)

#主函数+定时器
if WIFI_Connect():
client = MQTTClient(CLIENT_ID, SERVER, PORT,USERNAME,PASSWORD,60)
client.connect()
d.Picture(0,0,"all.jpg")
B1 = gui.TouchButton(40,250,80,50,BLUE,'On',WHITE,fun1)
B2 = gui.TouchButton(140,250,80,50,RED,'Off',WHITE,fun2)

data = Timer(-1)
data.init(period=1000, mode=Timer.PERIODIC,callback=ll)

#构建软件定时器,编号1
tim = Timer(1)
tim.init(period=20, mode=Timer.PERIODIC,callback=count) #周期为20ms

while True:
#执行按钮触发的任务
if tim_flag == 1:
t.tick_inc()
gui.task_handler()
tim_flag = 0

就问,哪个MQTT_Send会被运行?

最终解决方案:把提供mqtt功能的python文件通过mpy_cross编译成字节码以后放到板子上,再也没有出现过这样的问题

踩坑

esp8266没有radint和random.choice()

只有random.``getrandbits(size)

还有个random.``seed**(*用于生成种子

5月4日把ESP8266的GPIO3给干坏了,花了三到四个小时才检测出来

感觉IIC的控制有问题,也有可能是MAX30205的锅

MAX30102使用