第13课 摩斯密码#

13.1 项目介绍#

摩尔斯电码也被称作摩斯密码,是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。

现在我们使用它来作为我们的密码门。

13.2 摩斯密码的相关资料#

摩斯密码对应的字符如下:

13.3 实验组件#

ESP32 Plus主板 *1

按键 *2

180度舵机 *1

3P线 *2

I2C LCD1602模块 *1

4P线 *1

USB线 *1

13.4 模块接线图#

木板房子⑦处(左侧)按键1,木板房子⑨处(右侧)按键2,门舵机和I2C 1602 LCD模块的控制引脚:

木板房子⑦处(左侧)按键1(S引脚)

io4

木板房子⑨处(右侧)按键2(S引脚)

io32

门舵机(橙黄色线引脚)

io13

I2C 1602 LCD模块(SDA引脚)

SDA

I2C 1602 LCD模块(SCL引脚)

SCL

⚠️ 特别注意:智能家居已经组装好了,这里不需要把按键、舵机和I2C 1602 LCD模块拆下来又重新组装和接线,这里再次提供接线图,是为了方便您编写代码!

13.5 代码流程图#

13.6 实验代码#

简单的使用作为正确密码。

非常简单的实现按键的点击、双击、长按等功能。对应摩斯密码,点击为“.”,长按再松开为“-”。(“.”的意思是点击按钮,“-”的意思是长按按钮2秒以上)

打开“Thonny”软件,点击“此电脑” → “D:” → “MicroPython资料” → “MicroPython_代码”。然后鼠标左键双击“Project_13_MorseCode.py”。

# 作者 : www.keyes-robot.com

# 导入 machine, time and LCD 模块. 
from machine import Pin, PWM
from time import sleep_ms, ticks_ms 
from machine import I2C, Pin 
from i2c_lcd import I2cLcd 

DEFAULT_I2C_ADDR = 0x27

i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000) 
lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)

button1 = Pin(4, Pin.IN, Pin.PULL_UP)
button2 = Pin(32, Pin.IN, Pin.PULL_UP)
count = 0
time_count = 0
password = ""   #输入密码
correct_password = "-.-"  #正确密码
lcd.move_to(0, 0)
lcd.putstr("Enter password")
pwm = PWM(Pin(13))  
pwm.freq(50)
pwm.duty(25)  #关门
sleep_ms(1000)

while True:
    btnVal1 = button1.value()  # 读取按钮的值 1
    if(btnVal1 == 0):
        sleep_ms(10)
        while(btnVal1 == 0):
            time_count = time_count + 1  #开始计算按键被按下的时间
            sleep_ms(200)                #时间为200ms累加
            btnVal1 = button1.value()
            if(btnVal1 == 1):
                count = count + 1
                print(count)
                print(time_count)
                if(time_count > 3):      #如果按键被按下的时间大于200*3ms,密码加"-"
                    lcd.clear()
                    lcd.move_to(0, 1)
                    password = password + "-"
                else:
                    lcd.clear()
                    lcd.move_to(0, 1)
                    password = password + "."  #否则加"."
                lcd.putstr('{}'.format(password)) 
                time_count = 0
                 
    btnVal2 = button2.value()
    if(btnVal2 == 0):
        if(password == correct_password):  #如果输入密码正确
            lcd.clear()
            lcd.putstr("open")
            pwm.duty(120)  #开门
            password = ""  #清除密码
            sleep_ms(1000)
        else:              #如果密码错误
            lcd.clear()
            lcd.putstr("close")
            pwm.duty(25)  #关门  
            sleep_ms(1000)
            lcd.clear()
            lcd.putstr("error")
            sleep_ms(1000)
            lcd.clear()
            lcd.putstr("enter again")
            password = ""  #清除密码

13.7 实验结果#

按照接线图接好线,将 ESP32 主控板通过Micro USB数据线与计算机相连供电,外接电源供电,然后单击按钮,示例代码开始执行。

示例代码开始执行之后,你会看到的现象是:开始LCD1602显示“Enter password”,点击或长按木板房子⑦处(左侧)按键1,来输入密码,如果输入正确密码是 “-.-” (“.”的意思是点击按钮,“-”的意思是长按按钮2秒以上);再点击按木板房子⑨处(右侧)按键2,门就转动打开,LCD1602显示“open”;然后,长按木板房子⑨处(右侧)按键2再松开,门再次转动关门。如果是输入了其它错误的密码,门不会动,LCD1602显示error,2秒后显示enter again。

Img

单击“停止/启动后端进程”退出程序。