esptool.py --port com20 erase_flash
(com20是端口号,记得改了) 如果没有esptool或者pyserial都要用pip安装一个esptool.py --port com20 --baud 460800 write_flash --flash_size=detect 0 esp8266-20170108-v1.8.7.bin
esptool.py --port com20 --baud 460800 write_flash --flash_size=detect -fm dio 0 esp8266-20170108-v1.8.7.bin
端口号
和最后那部分固件路径
坑三:烧写模式
烧写的时候要保证GPIO0一直处于下拉的状态再重启才能进入烧写模式,在中断输入并启动烧写命令后会等待模块重启,这时要保持gpio0下拉的同时下拉一下RST引脚,才能执行烧写命令。
几年前买了这个,按说是个专业烧写模块,结果。。。。。。。。这个设计的没有复位也没有0引脚下拉于是接个保持按钮下拉0引脚,镊子充当复位开关。。。。
###########################
#引入模块
############################
try:
import usocket as socket
except:
import socket
import network
import machine,time
from machine import Pin
###########################
#登录HTML,支持所有的INPUT标签,其他标签慎用,可用中文,由浏览器自行解析
##########################
login_html = """
登录平台
登录服务器
"""
##########################################
#跳转到的HTML
#########################################
html="""
服务平台
欢迎,欢迎
"""
###################################
#设置AP模式同时输入热点名字和密码
####################################
def CreatNetwork(ssid,pwd):
ap_if = network.WLAN(network.AP_IF)#AP 模式
ap_if.active(True)
ap_if.config(essid=ssid,password=pwd)
return ap_if.ifconfig()[0]
def main(ip):
############################
#设置TCP套接字,保持监听数量5
############################
s = socket.socket()
ai = socket.getaddrinfo(ip, 80)
addr = ai[0][-1]
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(5)
print("Listening, connect your browser to http://",ip,":80/")
###########################
#默认的登录用户,密码之类,简单服务器写死就行
###########################
username='v202'
userpwd='123456k'
userpwd1='123456g'
while True:
##########################
#循环有链接传入则提供初始化握手服务
########################
res = s.accept()
client_s = res[0]
client_addr = res[1]
req =client_s.readline()
while True:
################
#循环接收,判断结束后跳出
##################
h = client_s.readline()
if h == b"" or h == b"\r\n":
break
req+=(h.decode('utf-8').lower())
print("Request:")
s_data=login_html#默认页面为登录页面
req=req.decode('utf-8').lower().split('\r\n')
#http header 解析
req_data=req[0].lstrip().rstrip().replace(' ','')
print(req_data)
if req_data.find('favicon.ico')>-1:
client_s.send(s_data)
client_s.close()
continue
else:
####################
#如果存在GET数据,则查找位置
####################
if len(req_data)>12:
print('-----',req_data)
req_data=req_data.replace('get/?','').replace('http/1.1','')
_name=req_data.find('name')
_pwd=req_data.find('pwd')
print('++++++++',_name,_pwd,req_data)
if _name>-1 and _pwd>-1:# 查找位置,关键字都找到了进入
###############################################
#判断是否是用户登录,以下为业务逻辑过程,可按需修改
###############################################
if req_data.find(username)>-1 and req_data.find(userpwd)>-1: #和预留的账号密码查找,找到了则执行
s_data=html
p0=Pin(0,Pin.OUT)
p0.value (0)
print('Login Success!')
if req_data.find(username)>-1 and req_data.find(userpwd1)>-1:
s_data=html
p0=Pin(0,Pin.OUT)
p0.value (1)
print('Login Success!')
client_s.send(s_data)
client_s.close()
myip=CreatNetwork('TPYBoard v202','tpyboard')#建立一个AP
main(myip)#搭建web服务器
##########################
#模块引入
######################
import network
import time
from machine import Pin,Signal
import machine
from umqtt.simple import MQTTClient
###################
#启动延时10秒避免连接不上死锁
####################
time.sleep(10)
####################
#继电器引脚定义并反转信号
#################
led_ctrl = Pin(0,Pin.OUT)
led_ctrl= Signal(led_ctrl, invert=True)
led_ctrl.value(0)
##########################
#wifi 联网的类
########################
class Sta(): #传入账号密码
wlan = None
def __init__(self, wifi_ssid, wifi_pwd):
self.wifi_ssid = wifi_ssid
self.wifi_pwd = wifi_pwd
def connect(self): #连接动作
network.WLAN(network.AP_IF).active(False) # disable access point
self.wlan = network.WLAN(network.STA_IF)
self.wlan.active(True)
self.wlan.disconnect()
if not self.wlan.isconnected():
self.wlan.connect(self.wifi_ssid, self.wifi_pwd)
def status(self): #网络存活指示
if self.wlan.isconnected():
return self.wlan.ifconfig()
else:
return ()
def wait(self): #连接后判断是否成功的等待
cnt = 40
while cnt > 0:
print("Waiting ..." )
# con(self.wifi_ssid, self.wifi_pwd) # Connect to an WIFI_SSID
if self.wlan.isconnected():
print("Connected to %s" % self.wifi_ssid)
print('network config:', self.wlan.ifconfig())
cnt = 0
else:
time.sleep(5)
cnt -= 5
return
def scan(self): #扫描
return self.wlan.scan() # Scan for available access points
def CreatNetwork(self): #AP模式
cnt = 40
ap_if = network.WLAN(network.AP_IF)#AP 模式
ap_if.active(True)
ap_if.config(essid=self.wifi_ssid,password=self.wifi_pwd,authmode=2)
while cnt > 0:
print("Waiting ..." )
# con(self.wifi_ssid, self.wifi_pwd) # Connect to an WIFI_SSID
if ap_if.ifconfig()[0]!='0.0.0.0':
print("start %s" % self.wifi_ssid)
print('network config:',ap_if.ifconfig()[0])
cnt = 0
return ap_if.ifconfig()[0]
else:
sleep(5)
cnt -= 5
# if __name__=='__main__': #以上网络的具体用法实例
# #####联网调用
# #热点模式
# a=Sta('201king','13704677369')
# ip=a.CreatNetwork()
# port = 9999 #端口号
# WiFi接入模式
# a=Sta('300king','13704677369')
# a.connect()
# a.wait()
#################################
#物联网的类
#############################
class Mqtt_run():
def __init__(self,dev_name,ip,name_id,password,list_sub):# 设备名 , 服务器地址,端口 , 账号, 密码,订阅列表
self.mqtt_mast=MQTTClient(dev_name,ip,1883,name_id,password)
self.mqtt_mast.connect()
self.mqtt_mast.set_callback(self.recdate1)# 绑定回调函数,名字别错
for i in list_sub:
self.mqtt_mast.subscribe(i)#设置订阅的主体,这里是123
def recdate1(self,t,m):#这是回调函数,有信息并触发后都在这里执行
###############我就是填充业务逻辑的地方###############
print("我在这里运行",t,m)
if t==b'led':
if m == b'1':
led_ctrl.value(1)
else:
led_ctrl.value(0)
###################################################
######主程########
try:
print('开始')
########################
#务必先联网
########################
w=Sta('300king','13704677369')
w.connect()
w.wait()
if w.status():
pass
else:
w.connect()
w.wait()
a=Mqtt_run('led','47.105.72.112','esp32','esp32',['led']) #设备名 , 服务器地址,端口 , 账号, 密码,订阅列表
print('配置完毕')
while 1:
if w.status() :
a.mqtt_mast.check_msg() #轮询消息,主函数中周期越快越好,没这个就听不叫了
a.mqtt_mast.publish('ledtopc','ok') # *****前边是发往哪个主题,后面是内容 发送数据*****************************
time.sleep(5) #延时,别刷屏
print(led_ctrl.value())
pass
else:
w.connect()
w.wait()
except:
############################
#用看门狗充当复位指令
###########################
machine.WDT()
import sys,time
print('启动等待2秒')
time.sleep(5)# 延时防卡死
####################################
#如何取消掉RELP交互:
##################################
import uos
print('取消调试串口输出5秒后开始成为普通串口')
uos.dupterm(None, 1) #核心命令,前面表示取消,后面是固定的号
time.sleep(5)
############################
#下面是对串口进行了重新定义和使用,现在他是一个普通串口了
###########################
from machine import UART
uart = UART(0, baudrate=9600)
for i in range(10):
uart.write('hello')
time.sleep(1)
uart.read(5) # 读5个字节
#######################################
#如果使用完毕,还要变回调试串口? 注意:8266波特率是115200的
#######################################
import uos, machine
uart = machine.UART(0, 115200)
uos.dupterm(uart, 1)
import sys,time
print('启动等待2秒')
time.sleep(5)# 延时防卡死
#sys.stdin.read() #这玩意可以卡住输入,CTRL+D结束输入,但是和THONNY编辑器热键冲突,也没啥用,放着得了
####################################
#如何取消掉RELP交互:
##################################
import uos
print('取消调试串口输出10秒后开始成为普通串口')
uos.dupterm(None, 1) #核心命令,前面表示取消,后面是号
time.sleep(5)
############################
#下面是对串口进行了重新定义和使用,现在他是一个普通串口了
###########################
# from machine import UART
# uart = UART(0, baudrate=9600)
# for i in range(10):
# uart.write('hello')
# time.sleep(1)
# uart.read(5) # 读5个字节
from machine import Pin
tx =Pin(1,Pin.OUT)
rx =Pin(3,Pin.OUT)
io0 =Pin(0,Pin.OUT)
io2 =Pin(2,Pin.OUT)
while 1:
tx.value(1)
io0.value(1)
io2.value(1)
rx.value(1)
time.sleep(1)
tx.value(0)
io0.value(0)
io2.value(0)
rx.value(0)
time.sleep(1)
#######################################
#如果使用完毕,还要变回调试串口? 注意:8266波特率是115200的
#######################################
import uos, machine
uart = machine.UART(0, 115200)
uos.dupterm(uart, 1)
import machine
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
# set RTC.ALARM0 to fire after 60 seconds (waking the device)
rtc.alarm(rtc.ALARM0, 10000)
# put the device to sleep
machine.deepsleep()
import network
sta_if = network.WLAN(network.STA_IF)
s = sta_if.config('mac')
mymac = ('%02x%02x%02x%02x%02x%02x') %(s[0],s[1],s[2],s[3],s[4],s[5])