物联网MicroPython课程作业
一、要求
采用光敏传感器(红外传感器)、声敏传感器、LED 灯、步进电机、0LED 显示模块、蓝牙模块,完成智能楼道控制系统,基本功能要求:
- 有人靠近,楼道门自动打开(用步进电机模拟)。
- 用手机通过蓝牙控制门的开和关。
- 晚上有人的时候灯自动点亮,其他时间灯不亮。
- OLED显示完成人名字。
强烈建议使用优质杜邦线!接线一定要牢固!
对于本程序容易出现的问题一下罗列:
- OSError: [Errno 5]EIO,主要为OLED显示屏通信连线,即IIC接口接线不稳导致。
- 对于蓝牙模块不亮检查供电,模块VCC应当接板子上的VIN端口,即5V供电
- OLED字库报错,可能为显示的字符没有在font.py文件中定义。
- (其他暂时没有出现过,等待后续问题添加)
二、代码实现逻辑
对于本项目采用到的OLED显示屏,需要导入所用到的font.py与ssd1306_lib.py文件。
所用到的文件下载地址如下
font.py文件
https://download.youkuaiyun.com/download/StorkRed/90048921ssd1306_lib.py文件
https://download.youkuaiyun.com/download/StorkRed/90048918
1、首先导入本项目所用到库文件
import pyb
import font
from pyb import Pin
from pyb import UART
from ssd1306_lib import SSD1306
2、端口引脚初始化
| 声敏传感器-DO | Y3 |
| 光敏传感器-DO | Y1 |
| 蓝牙模块-TX | X4 |
| 蓝牙模块-RX | X3 |
| 步进电机驱动模块 IN1、IN2、IN3、IN4 | X9、Y8、Y7、Y6 |
| OLED模块-SDA | Y10 |
| OLED模块-SCL | Y9 |
蓝牙模块连接如下:

(1)引脚代码
voice = Pin('Y3',Pin.IN)
light = Pin('Y1',Pin.IN)
led = pyb.LED(1)
MM2 = Pin('X3', Pin.IN)
MM3 = Pin('X4', Pin.IN) #采用板子上的LED
Pin_All=[Pin(p,Pin.OUT_PP) for p in ['X9','Y8','Y7','Y6']]
display=SSD1306(pinout={'sda':'Y10','scl':'Y9'},
height=64,
external_vcc=False)
(2)蓝牙模块初始化
tim = 100
blue = UART(2, 9600, timeout=100)
(3)OLED模块初始化
st="XXX" #填入的名字
display.poweron()
display.init_display()
display.draw_chinese(str(st),1,3)
display.display()
对于汉字的取模过程可以看我的上一篇文章
(4)步进电机驱动初始化
speed=2 #旋转速度
STEPER_ROUND=512 #一圈步数
ANGLE_PER_ROUND=STEPER_ROUND/360 #每步角度
本程序中采用的是双相整步驱动
“双相”指每一拍有两相同时导通,且在数字信号驱动下,两相线圈通电产生的磁场大小相等。四拍的导电顺序为A B → B C → C D → D A → A B → . . . ,与单相整步驱动相比,双相整步驱动拥有更大的转动力矩(是单相整步驱动力矩的倍)。
步进电机正、反转与停止代码,实现如下
def SteperWriteData(data): #步进电机驱动
count=0
for i in data:
Pin_All[count].value(i)
count+=1
def SteperFrontTurn(): #正转
global speed
SteperWriteData([1,1,0,0])
pyb.delay(speed)
SteperWriteData([0,1,1,0])
pyb.delay(speed)
SteperWriteData([0,0,1,1])
pyb.delay(speed)
SteperWriteData([1,0,0,1])
pyb.delay(speed)
def SteperBackTurn(): #反转
global speed
SteperWriteData([1,1,0,0])
pyb.delay(speed)
SteperWriteData([1,0,0,1])
pyb.delay(speed)
SteperWriteData([0,0,1,1])
pyb.delay(speed)
SteperWriteData([0,1,1,0])
pyb.delay(speed)
def SteperStop(): #停转
SteperWriteData([0,0,0,0])
实现的步进电机转动角度控制如下
def SteperRun(angle): #步进电机旋转角度
global ANGLE_PER_ROUND
val = ANGLE_PER_ROUND * abs(angle)
if angle > 0:
for i in range(0, val):
SteperFrontTurn()
else:
for i in range(0, val):
SteperBackTurn()
SteperStop()
3、while循环中实现的业务逻辑
(1)有人靠近,楼道门自动打开(用步进电机模拟)。
if voice.value()==0:
SteperRun(150)
(2)晚上有人的时候灯自动点亮,其他时间灯不亮。
if voice.value()==0 and light.value()==1:
led.on()
else:
led.off()
(3)用手机通过蓝牙控制门的开和关。
发送1步进电机正转模拟开门,发送2反转模拟关门
if blue.any() > 0:
data = blue.read().decode()
if data.find('1') > -1:
SteperRun(150)
elif data.find('2') > -1:
SteperRun(-150)
pyb.delay(tim)
(4)对于名字的显示在初始化中已经实现
即将名字打入st="XXX"中即可
以下为main文件的整体
main文件
https://download.youkuaiyun.com/download/StorkRed/90052287
3028

被折叠的 条评论
为什么被折叠?



