目录
按键初识
使用Pin-27
from machine import Pin
import time
key1 = Pin(27,Pin.IN,Pin.PULL_UP)
led1 = Pin(2,Pin.OUT)
led1.value(0)
i=0
while 1:
if key1.value() == 0:
time.sleep_ms(30)
if key1.value() == 0:
i+=1
if(i%2!=0):
led1.value(1)
print('ok')
else:
led1.value(0)
print('on')
外部中断
与stm32的相似
def handle(self):
led1.value(1)
key1 = Pin(27,Pin.IN,Pin.PULL_UP)
key1.irq(handle,Pin.IRQ_FALLING) #handle为回调函数,写在key.irq前面
led1 = Pin(2,Pin.OUT)
led1.value(0)
while 1:
handle()
#导入Pin模块
from machine import Pin
import time
#定义按键控制对象
key1=Pin(14,Pin.IN,Pin.PULL_UP)
key2=Pin(27,Pin.IN,Pin.PULL_UP)
key3=Pin(26,Pin.IN,Pin.PULL_UP)
key4=Pin(25,Pin.IN,Pin.PULL_UP)
#定义LED控制对象
led1=Pin(15,Pin.OUT)
led2=Pin(2,Pin.OUT)
led3=Pin(0,Pin.OUT)
led4=Pin(4,Pin.OUT)
#定义LED状态
led1_state,led2_state,led3_state,led4_state=0,0,0,0
#KEY1外部中断函数
def key1_irq(key1):
global led1_state
time.sleep_ms(10)
if key1.value()==0:
led1_state=not led1_state
led1.value(led1_state)
#KEY2外部中断函数
def key2_irq(key2):
global led2_state
time.sleep_ms(10)
if key2.value()==0:
led2_state=not led2_state
led2.value(led2_state)
#KEY3外部中断函数
def key3_irq(key3):
global led3_state
time.sleep_ms(10)
if key3.value()==0:
led3_state=not led3_state
led3.value(led3_state)
#KEY4外部中断函数
def key4_irq(key4):
global led4_state
time.sleep_ms(10)
if key4.value()==0:
led4_state=not led4_state
led4.value(led4_state)
#程序入口
if __name__=="__main__":
led1.value(led1_state) #初始化LED,熄灭状态
led2.value(led2_state)
led3.value(led3_state)
led4.value(led4_state)
key1.irq(key1_irq,Pin.IRQ_FALLING) #配置key1外部中断,下降沿触发
key2.irq(key2_irq,Pin.IRQ_FALLING) #配置key2外部中断,下降沿触发
key3.irq(key3_irq,Pin.IRQ_FALLING) #配置key3外部中断,下降沿触发
key4.irq(key4_irq,Pin.IRQ_FALLING) #配置key4外部中断,下降沿触发
while True:
pass
定时器中断实验-扫描按键
#导入Pin模块
from machine import Pin
from machine import Timer
#定义LED控制对象
led1=Pin(2,Pin.OUT)
key1 = Pin(27,Pin.IN,Pin.PULL_UP)
#定义LED状态
led1_state=0
flag = 0
t1 = 0
t2 = 0
t3 = 0
KeyPress = 0
KeyNum = 0
#定时器扫描函数
def Key_scan():
if key1.value() == 1:
return 1
else:
return -1
def Task_Keypad():
global t1,t2,t3,KeyPress,KeyNum
t3 = t2;
t2 = t1;
t1 = Key_scan()
if (t2 == t1):
if t3 == -1 and t1 != -1:
KeyPress = 1
KeyNum = t1
#定时器0中断函数 函数只能访问全局变量,无法修改全局变量,如果需要修改的话,需要使用global
def time0_irq(sel):
global flag
flag = 1 #不加global,flag能变成1,但是不知道为什么它不执行下面的语句
#程序入口
if __name__=="__main__":
led1.value(0) #初始化LED,熄灭状态
led1_state = 0
time0=Timer(0) #创建time0定时器对象
time0.init(period=10,mode=Timer.PERIODIC,callback=time0_irq)
while True:
if flag == 1:
Task_Keypad()
flag = 0
if ( KeyPress == 1 and KeyNum == 1):
KeyPress = 0
led1_state = not led1_state
led1.value(led1_state)
串口
串口0和1都被使用,因此使用串口2
使用USB-TTL模块连接串口和电脑--使用3.3v--并且共地
ADC
ESP32默认配置是采集0-1.0V电压,因此我们需要配置ADC采集电压使其变成0-3.3V
#导入Pin模块
from machine import Pin
from machine import ADC
from machine import Timer
#定义ADC控制对象
adc=ADC(Pin(34))
adc.atten(ADC.ATTN_11DB) #开启衰减,量程增大到3.3V
#定时器0中断函数
def time0_irq(time0):
adc_vol=3.3*adc.read()/4095
print("ADC检测电压:%.2fV" %adc_vol)
#程序入口
if __name__=="__main__":
time0=Timer(0) #创建time0定时器对象
time0.init(period=500,mode=Timer.PERIODIC,callback=time0_irq)
while True:
pass
RTC
ESP32通过Mircopython学习是一个很简单的事情
#导入Pin模块
from machine import Pin
from machine import RTC
import time
#定义RTC控制对象
rtc=RTC()
#定义星期
week=("星期一","星期二","星期三","星期四","星期五","星期六","星期天")
#程序入口
if __name__=="__main__":
#rtc.datetime((2023,3,10,1,7,58,0,0)) #设置时间,从年月日、星期、时、分、秒开始,也可以不需要设置,直接使用rtc.datetime()获取当前时间
while True:
date_time=rtc.datetime()
print("%d-%d-%d \t %02d:%02d:%02d \t %s" %(date_time[0],date_time[1],date_time[2],
date_time[4],date_time[5],date_time[6],
week[date_time[3]]))
time.sleep(1)
DS1302
ESP32开发的好处就是,传感器的库已经有人写好了,而我们的任务就是直接使用即可
#导入Pin模块
from machine import Pin
import time
import DS1302
#定义DS1302控制对象
ds1302=DS1302.DS1302(clk=Pin(18),dio=Pin(19),cs=Pin(23))
#定义星期
week=("星期一","星期二","星期三","星期四","星期五","星期六","星期天")
#程序入口
if __name__=="__main__":
if ds1302.DateTime()[0]!=2023:
ds1302.DateTime([2023,2,20,0,8,14,0])
while True:
date_time=ds1302.DateTime()
print("%d-%d-%d \t %02d:%02d:%02d \t %s" %(date_time[0],date_time[1],date_time[2],
date_time[4],date_time[5],date_time[6],
week[date_time[3]]))
time.sleep(1)
from machine import *
DS1302_REG_SECOND = (0x80)
DS1302_REG_MINUTE = (0x82)
DS1302_REG_HOUR = (0x84)
DS1302_REG_DAY = (0x86)
DS1302_REG_MONTH = (0x88)
DS1302_REG_WEEKDAY= (0x8A)
DS1302_REG_YEAR = (0x8C)
DS1302_REG_WP = (0x8E)
DS1302_REG_CTRL = (0x90)
DS1302_REG_RAM = (0xC0)
class DS1302:
def __init__(self, clk, dio, cs):
self.clk = clk
self.dio = dio
self.cs = cs
self.clk.init(Pin.OUT)
self.cs.init(Pin.OUT)
def DecToHex(self, dat):
return (dat//10) * 16 + (dat%10)
def HexToDec(self, dat):
return (dat//16) * 10 + (dat%16)
def write_byte(self, dat):
self.dio.init(Pin.OUT)
for i in range(8):
self.dio.value((dat >> i) & 1)
self.clk.value(1)
self.clk.value(0)
def read_byte(self):
d = 0
self.dio.init(Pin.IN)
for i in range(8):
d = d | (self.dio.value()<<i)
self.clk.value(1)
self.clk.value(0)
return d
def getReg(self, reg):
self.cs.value(1)
self.write_byte(reg)
t = self.read_byte()
self.cs.value(0)
return t
def setReg(self, reg, dat):
self.cs.value(1)
self.write_byte(reg)
self.write_byte(dat)
self.cs.value(0)
def wr(self, reg, dat):
self.setReg(DS1302_REG_WP, 0)
self.setReg(reg, dat)
self.setReg(DS1302_REG_WP, 0x80)
def start(self):
t = self.getReg(DS1302_REG_SECOND + 1)
self.wr(DS1302_REG_SECOND, t & 0x7f)
def stop(self):
t = self.getReg(DS1302_REG_SECOND + 1)
self.wr(DS1302_REG_SECOND, t | 0x80)
def Second(self, second = None):
if second == None:
return self.HexToDec(self.getReg(DS1302_REG_SECOND+1))%60
else:
self.wr(DS1302_REG_SECOND, self.DecToHex(second%60))
def Minute(self, minute = None):
if minute == None:
return self.HexToDec(self.getReg(DS1302_REG_MINUTE+1))
else:
self.wr(DS1302_REG_MINUTE, self.DecToHex(minute%60))
def Hour(self, hour = None):
if hour == None:
return self.HexToDec(self.getReg(DS1302_REG_HOUR+1))
else:
self.wr(DS1302_REG_HOUR, self.DecToHex(hour%24))
def Weekday(self, weekday = None):
if weekday == None:
return self.HexToDec(self.getReg(DS1302_REG_WEEKDAY+1))
else:
self.wr(DS1302_REG_WEEKDAY, self.DecToHex(weekday%8))
def Day(self, day = None):
if day == None:
return self.HexToDec(self.getReg(DS1302_REG_DAY+1))
else:
self.wr(DS1302_REG_DAY, self.DecToHex(day%32))
def Month(self, month = None):
if month == None:
return self.HexToDec(self.getReg(DS1302_REG_MONTH+1))
else:
self.wr(DS1302_REG_MONTH, self.DecToHex(month%13))
def Year(self, year = None):
if year == None:
return self.HexToDec(self.getReg(DS1302_REG_YEAR+1)) + 2000
else:
self.wr(DS1302_REG_YEAR, self.DecToHex(year%100))
def DateTime(self, dat = None):
if dat == None:
return [self.Year(), self.Month(), self.Day(), self.Weekday(), self.Hour(), self.Minute(), self.Second()]
else:
self.Year(dat[0])
self.Month(dat[1])
self.Day(dat[2])
self.Weekday(dat[3])
self.Hour(dat[4])
self.Minute(dat[5])
self.Second(dat[6])
def ram(self, reg, dat = None):
if dat == None:
return self.getReg(DS1302_REG_RAM + 1 + (reg%31)*2)
else:
self.wr(DS1302_REG_RAM + (reg%31)*2, dat)
总结
ESP32与Mircopython一起开发,其存在着许多现成的库,因此直接调用即可,开发更快,考察的更多的是Mircopython的语法使用以及逻辑思维(如何实现我们想要的功能)