普中科技手把手教你学ESP32--基于MicroPython-03

目录

 按键初识

外部中断

定时器中断实验-扫描按键

串口

ADC

 RTC

DS1302

总结

 按键初识

 使用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的语法使用以及逻辑思维(如何实现我们想要的功能)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 习DSP(数字信号处理)是一个复杂又有趣的过程,有许多资源可供选择。而其中一种资源是基于TMS320C55x的光盘资料,可以帮助你逐步习和掌握DSP的技能。下面是我对使用这种资料进行习的建议: 首先,确保你具备一定的数基础,特别是在信号处理和算法方面。这将帮助你更好地理解DSP的原理和算法。 光盘资料通常提供了一个系统的习路径,从基础知识开始逐步深入。按照这样的顺序进行习可以确保你不会遗漏任何重要的概念。 光盘通常提供了一些示例代码以及对应的解释。通过仔细阅读和理解这些代码,你可以习到如何使用TMS320C55x的指令集和工具来实现各种信号处理算法。 尝试自己编写一些简单的代码来实现光盘资料中的示例算法。通过自己动手实践,你能更好地掌握这些概念和技能。 如果你遇到困难或者有任何疑问,不要犹豫,寻求帮助。你可以通过光盘资料提供的论坛或者社区向其他习者和专业人士请。此外,还可以参考其他书籍、程和在线资源,进一步加深理解。 最后,保持耐心和坚持。习DSP需要时间和努力,不要轻易放弃。通过光盘资料和其他习资源,你会逐渐掌握TMS320C55x的使用和DSP的核心概念。 总之,通过使用基于TMS320C55x的光盘资料,你可以以系统和有序的方式习DSP。遵循资料提供的习路径,尝试编写代码,寻求帮助,并保持耐心和坚持,你将能够掌握这一令人激动的技能。 ### 回答2: 习DSP (数字信号处理) 需要具备一定的理论基础和实践经验。借助光盘资料上提供的基于TMS320C55x的内容,我将简要介绍手把手习DSP的步骤和过程。 首先,根据光盘资料提供的介绍,了解TMS320C55x的基本原理和架构。该芯片是一种高性能的DSP处理器,具有出色的运算能力和多媒体处理功能。理解其体系结构以及寄存器结构是习的第一步。 接下来,光盘资料上会提供一些示例代码和实验项目。这些代码和项目是基于TMS320C55x的典型应用案例,可以帮助我们更好地理解和巩固所知识。通过仔细分析这些代码和项目,我们可以习如何设计和实现DSP算法。 然后,我们可以开始手动编写程序。光盘资料上应该会提供编程工具和开发环境。使用这些工具和环境,我们可以编写和调试自己的DSP程序。在此过程中,需要逐步习DSP算法和优化技巧,以提高程序的性能和效率。 此外,光盘资料上可能还包含一些实验指导。通过这些实验,我们可以通过实际操作来加深对DSP原理和应用的理解。在实验过程中,要注意记录和分析实验结果,从而不断优化和改进自己的程序。 最后,持续习和实践是掌握DSP的关键。光盘资料可能不会涵盖所有的内容,因此我们需要通过阅读材、参考资料和在线资源来持续习。同时,通过自己的实践和项目经验,我们可以掌握更深入的DSP知识和技能。 总之,习DSP是一个逐步深入的过程,只有通过理论习和实践经验的结合,才能真正掌握这一领域的知识和技能。光盘资料提供了一个全面而系统的习框架,但我们自身的努力和坚持才是习成功的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值