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-packagespython esptool.py
就会显示这样的界面
效仿上面
python esptool.py --port COM3 erase_flashpython 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 jsona={'12':'dd','13':'ee'}d=json.dumps(a)print(d)
urequests
发送网络请求
import urequestsresponse = urequests.get('http://jsonplaceholder.typicode.com/albums/1')print(response.text)print(response.status_code)
定时器
定时器相比较于延时函数,不占用CPU运行时间
timer.deinit()
解除定时器的功能
驱动屏幕(I2C)
from machine import Pin,I2C,RTCfrom ssd1306 import SSD1306_I2Ci2c = 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 LCD32from touch import XPT2046import time,gui,randomfrom machine import Timer,Pinfrom test_mqtt import WIFI_Connectfrom json import dumpsfrom 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 = 1883CLIENT_ID = '' # 客户端IDTOPIC = '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的锅