NodeMCU-MicroPython配置实录
NodeMCU-MicroPython配置实录
发现网络上的记录过于混杂,自己写一下笔记防止到时找不到资料
不会Python?百度搜索“菜鸟教程”,看看Python3就会了,人生苦短,我选Python
刷MicroPython包
去micropython的官网下载,选择正常版本(2Mib+)下载即可
(此处默认已经装完Python,并默认加入path,如果未安装自行百度)
下载完以后,本地的pip使用这个指令:
pip install esptool
找到设备所在的端口
控制面板->硬件和声音->设备管理器
得知我们的设备运行在COM3
在esp8266-20220117-v1.18.bin所在的目录,打开cmd输入以下命令
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
找到插件的安装位置
输入指令
cd C:\Users\Administrator\AppData\Local\Programs\Thonny\Lib\site-packages
python esptool.py
就会显示这样的界面
效仿上面
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
等待烧写完成,下图为烧写完成的图像
IDE配置
我个人喜欢Pycharm,但Thonny不需要装插件,简单轻巧,推荐这个
(怎么能没有万能的VScode呢?问就是插件配置有问题)
打开运行->设置解释器
配置正常应当是这种情况
顺利运行
跑个指令看看
上传文件
打开
选择MicroPython设备,默认只有boot.py
文件命名为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
import json
a={'12':'dd','13':'ee'}
d=json.dumps(a)
print(d)
urequests
发送网络请求
import urequests
response = urequests.get('http://jsonplaceholder.typicode.com/albums/1')
print(response.text)
print(response.status_code)
定时器
定时器相比较于延时函数,不占用CPU运行时间
timer.deinit()
解除定时器的功能
驱动屏幕(I2C)
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个像素点。我们点亮需要的像素点,就能成像出我们需要的图像
具体还得看手册
硬件管脚图:
全引脚展示
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没有函数重载,那为什么这个文件能运行?
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的锅