当前位置:   article > 正文

【ESP8266 MicroPython】烧录固件、开发环境、点亮LED、RGB呼吸灯、TCP、HTTP、MQTT一篇文章全学会_esp8266python固件

esp8266python固件

摘要

这篇文章介基于安信可 NodeMCU 绍了ESP8266 MicroPython固件的烧录,开发环境的使用,给出了LED,RGB呼吸灯,TCP 客户端,TCP 服务器,HTTP获取网页,MQTT通信等示例程序。
硬件设备如下图:
NodeMCU

固件烧录

要在8266上运行Python程序,就必须先烧录MicroPython固件,最新版的MicroPython固件可以从如下网站下载:https://micropython.org/download/esp8266/

只不过MicroPython下载的固件可能会启动失败,提示如下错误:

  1. load 0x3ffe8400, len 1080, room 0
  2. tail 8
  3. chksum 0xc4
  4. csum 0xc4
  5. rf_cal[0] !=0x05,is 0xFF

你们可以使用我合成的完整的固件,下载地址:MicroPython_4MB.bin

烧录方式如下:

① 打开烧录工具
②选择MicroPython固件
③勾选DoNotChgBin
④设置串口及波特率
⑤点击START开始烧录
在这里插入图片描述

开发环境

理论上我们刚才烧录完MicroPython的固件,就可以运行Python代码了,但是为了写代码更加开心,强力建议大家使用如下开发环境:uPyCraft IDE

下载后直接双击打开就可,如果提示安装字体请点击OK暗转安装,不安装的话代码很难看。
在这里插入图片描述
软件运行的界面如下图所示:

第一步,连接我们的8266开发板,操作如下:

在这里插入图片描述

第二步,下载代码并运行

① 依次点击File >> Examples >> Basic >> blink.py
② 点击右侧的 运行按钮,运行示例代码
③运行成功开发板上的灯开始闪烁
在这里插入图片描述

GPIO的应用

硬件原理图

在这里插入图片描述
从原理图上可以看出:

绿色灯 ---- GPIO2
红色灯 ---- GPIO4
蓝色灯 ---- GPIO5

按 键 ---- GPIO0

GPIO相关函数:

  1. from machine import Pin #导入Pin功能模块
  2. p0 = Pin(0, Pin.OUT) #将 GPIO0设为输出
  3. p0.on() # 将P0设为高电平
  4. p0.off() #将P0设为低电平
  5. p0.value(1) #将P0设为高电平
  6. p2 = Pin(2, Pin.IN) # 将GPIO2设为输入
  7. print(p2.value()) # 获取GPIO2的值(0或者1)

PWM 的应用

PWM相关函数:

  1. from machine import PWM #导入PWM模块
  2. pwm_r = PWM(Pin(2)) # 使用GPIO2创建一个PWM, 频率默认为500,占空比默认为0
  3. pwm_r = PWM(Pin(2),1000,500) # 使用GPIO2创建一个PWM, 并设置频率为1000, 占空比为500
  4. pwm_r.duty() # 获取pwm_r的占空比
  5. pwm_r.duty(500) # 设置占空比为500 (其范围是 0 ~ 1023)
  6. pwm_r.freq() # 获取pwm_r的频率
  7. pwm_r.freq() # 设置pwm_r的频率为1000(其范围是1 ~ 1000)

PWM实现颜色渐变

在这里插入图片描述
完整代码:

  1. from machine import Pin,PWM
  2. import time
  3. led_r =PWM(Pin(4),1000,0)
  4. led_g =PWM(Pin(2),1000,0)
  5. led_b =PWM(Pin(5),1000,0)
  6. stage = 1
  7. r = 1000 #RGB初值
  8. g = 0
  9. b = 0
  10. while True:
  11. if stage == 1: #第一阶段,红灯逐渐变暗,绿灯逐渐变亮
  12. r -= 10
  13. g += 10
  14. if r == 0: #红灯亮度变为零时,跳转到第二阶段
  15. stage = 2
  16. elif stage == 2: #第二阶段,绿灯逐渐变暗,蓝灯逐渐变亮
  17. g -= 10
  18. b += 10
  19. if g == 0: #绿灯亮度变为零时,跳转到第三阶段
  20. stage = 3
  21. elif stage == 3: #第三阶段,蓝灯逐渐变暗,红灯逐渐变亮
  22. b -= 10
  23. r += 10
  24. if b == 0: #蓝灯亮度变为零时,跳转到第一阶段
  25. stage = 1
  26. led_r.duty(r)
  27. led_g.duty(g)
  28. led_b.duty(b)
  29. time.sleep(0.01)

WiFi 连接

AP模式

  1. import network #导入Wlan相关功能
  2. wifi = network.WLAN(network.AP_IF) # 初始化WiFi为AP模式
  3. wifi.config(essid='ESP-AP123',password='12345678') # 设置热点的SSID
  4. wifi.active(True) # 开启WiFi
  5. wifi.isconnected() # 检查当前是否有设备连接

STA 模式

  1. import network
  2. wifi = network.WLAN(network.STA_IF) # 将模块设为STA模式
  3. wifi.active(True) # 开启WIFI
  4. if not wifi.isconnected(): # 如果wifi模块未连接到热点
  5. print('WiFi 连接中...')
  6. wifi.connect('ZTE-706', 'Qwer123456') #连接自己的手机热点
  7. while not wifi.isconnected(): #等待wifi连接
  8. pass
  9. print('WiFi 连接成功' , wifi.ifconfig()) #连接成功

TCP Client 通信

  1. import network
  2. wifi = network.WLAN(network.STA_IF) # 将模块设为STA模式
  3. wifi.active(True) # 开启WIFI
  4. if not wifi.isconnected(): # 如果wifi模块未连接到热点
  5. print('WiFi 连接中...')
  6. wifi.connect('ZTE-706', 'Qwer123456') #连接自己的手机热点
  7. while not wifi.isconnected(): #等待wifi连接
  8. pass
  9. print('WiFi 连接成功' , wifi.ifconfig()) #连接成功
  10. import socket #导入Socket功能模块
  11. try: # Socket连接可能会失败,所以使用try
  12. s = socket.socket() # 建立一个Socket
  13. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #设置socket参数
  14. s.connect('122.114.122.174',41791) #连接指定TCP服务器
  15. print('TCP Connected ok!!连接成功') # 连接成功
  16. except: # 连接失败
  17. print("TCP 连接失败")
  18. if (s):
  19. s.close()
  20. while True:
  21. data = s.recv(128) #接收到数据
  22. if(len(data) == 0): #数据为零表示Socket被关闭
  23. print("连接关闭")
  24. s.close()
  25. break
  26. print(data) #输出收到的数据
  27. ret=s.send(data) #数据原样发回

TCP Server

  1. import network
  2. wifi = network.WLAN(network.STA_IF) # 将模块设为STA模式
  3. wifi.active(True) # 开启WIFI
  4. if not wifi.isconnected(): # 如果wifi模块未连接到热点
  5. print('WiFi 连接中...')
  6. wifi.connect('ZTE', 'Qwe123456') #连接自己的手机热点
  7. while not wifi.isconnected(): #等待wifi连接
  8. pass
  9. print('WiFi 连接成功' , wifi.ifconfig()) #连接成功
  10. import socket
  11. addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
  12. s = socket.socket()
  13. s.bind(addr)
  14. s.listen(1)
  15. print('TCP开始监听', addr)
  16. while True:
  17. cl,addr = s.accept()
  18. print('client connected from', addr)
  19. while True:
  20. data = cl.recv(1024)
  21. if(len(data) == 0): #无数据关闭Socket
  22. print("Close socket")
  23. s.close()
  24. break
  25. print(data.decode('utf-8'))
  26. cl.send(data) #将数据原样发回

HTTP 请求

  1. import time
  2. import network
  3. from machine import Pin
  4. import network
  5. led_r=Pin(4,Pin.OUT) #create LED object from pin4,Set Pin4 to output
  6. led_r.value(0)
  7. wifi = network.WLAN(network.STA_IF)
  8. wifi.active(True)
  9. if not wifi.isconnected():
  10. print('WiFi 连接中 ...')
  11. wifi.connect('ZTE-706', 'a123456789') #连接你自己手机的热点
  12. while not wifi.isconnected(): #等待wifi连接
  13. pass
  14. print('WiFi 连接成功:', wifi.ifconfig())
  15. import urequests #导入urequests功能模块
  16. # 发起HTTP 请求
  17. r = urequests.get('http://www.weather.com.cn/data/cityinfo/101010100.html')
  18. print(r.status_code) #打印HTTP状态码
  19. print(r.reason) #打印HTTP状态
  20. print(r.content) #打印网页源代码(字节形式)
  21. print(r.text) #打印网页源代码(字符串形式)

MQTT 通信

本实验采用的是免费MQTT服务器: http://tools.emqx.io

8266模块下载simple.py程序

MQTT通信依赖simple.py文件,所以实验前必须下载该文件,步骤如下:

在这里插入图片描述
MQTT通信完整源代码:

  1. import time
  2. import network
  3. from machine import Pin
  4. import network
  5. led_r=Pin(4,Pin.OUT) #create LED object from pin4,Set Pin4 to output
  6. led_r.value(0)
  7. wifi = network.WLAN(network.STA_IF)
  8. wifi.active(True)
  9. if not wifi.isconnected():
  10. print('WiFi 连接中 ...')
  11. wifi.connect('ZTE-706', 'a123456789') #连接你自己手机的热点
  12. while not wifi.isconnected(): #等待wifi连接
  13. pass
  14. print('WiFi 连接成功:', wifi.ifconfig())
  15. from simple import MQTTClient # 从Simple 导入MQTT
  16. def mqtt_recv_cb(topic, msg): # MQTT收到消息回调函数
  17. global state
  18. print((topic, msg)) # 打印收到的消息
  19. try:
  20. c = MQTTClient('Client ID自己改', 'aligenie.xuhongv.com') #设置MQTT客户端
  21. c.set_callback(mqtt_recv_cb) #设置回填函数
  22. c.connect() # 连接MQTT服务器
  23. print('MQTT 连接成功')
  24. c.subscribe('xaiot') #订阅主题 xaiot
  25. c.publish('zhang',"dd", retain = True) # 向主题zhang 发送消息 dd
  26. while True: # 无限循环接收消息
  27. c.wait_msg()
  28. finally:
  29. if(c is not None):
  30. c.disconnect() # 断开MQTT的连接
  31. print('MQTT 已关闭')

扩展篇:HTTP 实现网页配网

在这里插入图片描述
源代码:

  1. import time
  2. import network
  3. wifi = network.WLAN(network.AP_IF)
  4. wifi.active(True) # 开启WiFi
  5. wifi.config(essid='ESP-AP123',password='12345678') # 设置热点的SSID
  6. html = """<!DOCTYPE html>
  7. <html>
  8. <head> <meta charset="utf-8"> <title>设置wifi密码</title> </head>
  9. <body>
  10. <form name="input" action="setwifi" method="get" text-align="center">
  11. 路由器账号: <input type="text" name="ssid"><br>
  12. 路由器密码: <input type="text" name="pwd"><br/>
  13. <input type="submit" value="提交">
  14. </form>
  15. </body>
  16. </html>
  17. """
  18. html_ok = """<!DOCTYPE html>
  19. <html>
  20. <head> <meta charset="utf-8"> <title>设置wifi密码</title> </head>
  21. <body><h1>设置成功</h1></body>
  22. </html>
  23. """
  24. ssid = '' # 用来存储WiFi账号和密码
  25. pwd = ''
  26. import socket
  27. addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
  28. s = socket.socket()
  29. try:
  30. s.bind(addr)
  31. except:
  32. print("HTTP Server 启动失败,请重启设备!!")
  33. while True:
  34. pass
  35. s.listen(1)
  36. print('listening on', addr)
  37. while True:
  38. cl,addr = s.accept()
  39. print('client connected from', addr)
  40. cl_file = cl.makefile('rwb', 0)
  41. while True:
  42. line = cl_file.readline()
  43. if line.decode('utf-8').find('T /setwifi') > 0:
  44. wifi_data = line.decode('utf-8')
  45. wifi_data = wifi_data.replace('GET /setwifi?ssid=','')
  46. wifi_data = wifi_data.replace('&pwd=',',')
  47. wifi_data = wifi_data.replace(' HTTP/1.1\r\n','')
  48. tmp = wifi_data.split(',')
  49. print(tmp[0],tmp[1])
  50. ssid = tmp[0]
  51. pwd = tmp[1]
  52. print("收到账号密码:",ssid,pwd)
  53. if not line or line == b'\r\n':
  54. break
  55. cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html; charset=UTF-8\r\n\r\n')
  56. if len(ssid) > 0: # 已收到WiFi密码
  57. cl.send(html_ok)
  58. cl.close()
  59. s.close()
  60. break
  61. else:
  62. cl.send(html)
  63. cl.close()
  64. sta = network.WLAN(network.STA_IF) # 将模块设为STA模式
  65. sta.active(True) # 开启WiFi
  66. print('WiFi 连接中...')
  67. sta.connect(ssid, pwd) #连接手机B的手机热点
  68. while not sta.isconnected(): #等待wifi连接
  69. pass
  70. print("WiFi 连接成功" , sta.ifconfig()) #连接成功

参考资料

https://micropython.nxez.com/2018/11/30/getting-started-with-micropython-on-esp32-and-esp8266.html

MicroPython 官网:https://micropython.org/download/esp8266/

MicroPython 文档:http://docs.micropython.org/en/latest/esp8266/quickref.html


---------------------
作者:我是鹏老师
来源:CSDN
原文:https://blog.csdn.net/weixin_48033504/article/details/111892955
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/718261
推荐阅读
相关标签
  

闽ICP备14008679号