### 第13课 摩斯密码

#### 13.1 项目介绍

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

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

#### 13.2 摩斯密码的相关资料

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

![](media/morse-code.png)

#### 13.3 实验组件

|![](media/esp32.png)|![](media/button.png)|![](media/servo.png)|![](media/3p.png)|
|-|-|-|-|
|ESP32 Plus主板 *1|按键 *2|180度舵机 *1|3P线 *2|
|![](media/lcd2.png)|![](media/4p.png)|![](media/usb.png)| |
|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模块拆下来又重新组装和接线，这里再次提供接线图，是为了方便您编写代码！**

![](media/pjt13.png)

#### 13.5 代码流程图

![](media/project13.png)

#### 13.6 实验代码 

简单的使用![](media/morse-code1.png)作为正确密码。

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

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


```python
# 作者 : 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数据线与计算机相连供电，外接电源供电，然后单击按钮![](media/1305.png)，示例代码开始执行。

![](media/AB1.png)

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

![](media/WHAB1.png)

![Img](../../media/image-13.gif)

单击![](media/1311.png)“停止/启动后端进程”退出程序。