如果你想要实现这样一个功能:当窗外开始下雨,窗户自动关闭
如果你想知道解决方案,可以直接跳到最后一部分。
我们仅看前半部分,那么你需要:检测窗外是否有雨水,并把这个信息传递给窗户控制器
这个过程中,你需要:
- 传感器:检测窗外是否有雨水/或者获取网络上的天气信息
- 单片机主控板:可以接收传感器的数据,并收发网络请求
- 执行器:窗户控制器,可以接收单片机的指令,控制窗户的开关
- 供电:保证传感器和主控板的正常工作
这个过程你需要知道以下内容:单片机如何烧录程序、传感器如何连接、如何获取传感器数据、如何发送网络数据、如何制作外壳(例如 3D 打印)。
传感器基础知识
- 负极表示符号: - / G / Gnd / 黑色
- 正极表示符号:+ / V / Vcc / 红色
- 信号管脚: S 可以表示信号,根据传感器的不同,参数范围是 0-1023 或 0 1
- 模拟量信号管脚表示符号: A 参数范围在 0-1023
- 数字量信号管脚表示符号:D 参数为 0 或 1
如 果标识与颜色发生冲突,一般以标识为准:例如接口上写着 V,但连接线颜色为黑,一般当作正极处理。
当单片机通电时,所有的引脚都带电,但是只有信号管脚的电压会随着传感器的变化而变化。
因此传感器的正负极理论上
可以任意连接,只需保证信号管脚连接指定的即可。
A 口的功能比 D 口更加强大,因为 A 口可以接收模拟信号,而 D 口只能接收数字信号。因此部分传感器 D 接 A 也可以正常读数。
两管脚
常见的有扬声器、电机(俗称马达)。
这类设备因为较为特殊,一般有专门的接口,或者占用 2 个信号端口,通过信号的变化来工作。
马达往往需要更大的工作电压,如果没有专门的连接口,有可能需要在板上使用跳针切换工作电压。
三管脚
这类传感器数量最多,往往由 GVA 或者 GVD 组成。
使用时,正负极与单片机正负极连接,信号线与板上标注的 A 或 D 进行连接。
四管脚
四管脚传感器分为很多类
特殊接口的,譬如:人体温度传感器
正负极与信号口一般都专门对应的位置供连接。
双信号接口的,譬如:超声波
一般有四个接口:GVTE,其中 GV 正常连接,T 和 E 都接在信号管脚上。
同时接收 AD 的,譬如:烟雾传感器
一般有四个接口:GVAD,其中 GV 正常连接,D 表示有没有烟雾,A 表示烟雾浓度。分别接在对应的信号管脚即可。
五管脚
譬如:摇杆传感器
一般五个接口为:GVXYB,其中 GV 正常连接,X 表示 X 轴(是模拟量接 A)、Y 表示 Y 轴(是模拟量接 A)、B 表示按钮(是数字量接 D)
其他特殊类
其他特殊的传感器一般有特殊接口,譬如:摄像头、屏幕等。
根据说明接入即可。
与单片机通信
单片机(Microcontroller Unit,简称 MCU)是指一个微型计算机集成在一个单独的微型芯片中,它包括处理器(CPU)、内存(通常包括 RAM 和 ROM)、以及各种输入/输出(I/O)接口等在内的完整计算设备。
单片机设计用于嵌入式应用,通常在硬件设备中执行特定任务。例如,你的电视遥控器可能就是由一个单片机控制的,它可以接收你的输入,然后发送相应的信号到电视上。其他常见的单片机应用包括玩具、家用电器、医疗设备、汽车等。
有的单片机可以使用完整的 Python,譬如华硕的 thinker edge R、部分树莓派,有的 Arduino 板子、ESP32 等只能使用简化的 MicroPython。
当我们希望通过 windows 计算机的 USB 接口和单片机设备进行串口通信时,需要将 USB 接口转换为标准的串行接口,这个过程需要一个介于 USB 和串口之间的翻译,我下面的驱动就是这个翻译。
在搜索引擎中搜 CH341SER 驱动
过程中所有弹窗有下一步点下一步,有确认点确认
在编程软件中识别单片机
常用的编程软件有:Scratch、Mixly、Mixly2、MaixPy 等。
有的支持图形化编程与代码编程,有的需要仅支持代码编程。
下载对应的编程软件后,打开软件。
选择主控这个环节,不同软件的选择方式不同。
-
Vegeta 这样基于 Scratch 的编程软件,需要从左下角选择添加对应的主控型号。
-
Mixly 从右下角,串口旁的下拉菜单选择对应的主控型号。
-
Mixly2 从登录菜单中主控型号后,进入代码编辑页,右上角选择串口旁可以选择更加详细的主控型号。
-
MaixPy 从上方的工具页面中选择开发板型号。
通过连接线连接电脑与单片机。此时可能会有多种情况:
- 会提示:有串口连接,并弹出且仅弹出 1 个串口。
- 识别计算机上的所有串口,需要自己选择(可以通过反复插拔确认新增的端口号)。
- 不弹出任何串口,需要主控通电启动后才识别串口。
- 也有的串口时有时无,此时可以考虑:连接线接触不良(更换连接线),或者是主控/USB 电压不稳定——常见于学校机房(主控或电脑独立供电)
- 还有的默认的波特率需要调整,否则无法识别传输信号。
连接成功后记得初始化固件,使其恢复到软件对应的固件版本。类似 Android 手机的刷机/恢复出厂设置。
单片机编程
这里的传感器特指狭义的通过半导体检测物理量的传感器,如温度传感器、湿度传感器、光敏传感器等。这些传感器的特点是:输出信号是数字/模拟信号。
数字量传感器的输出信号是数字 信号,他的特点是只 返回/发出 两种状态:高电平和低电平。对应在代码中是 1 和 0 。
-
如声音传感器如果是数字量传感器,当检测到声音时输出高电平,否则输出低电平。
-
如小灯,输出高电平表示亮,输出低电平表示灭。
模拟量传感器的输出信号是模拟信号,他的特点是输出的电压值是连续变化的。对应在代码中是 0-1023(通常如此,并非绝对) 。
-
还是以声音传感器为例,如果是模拟量传感器,当检测到声音时输出的电压值会随着声音的大小而变化。
-
还是以小灯为例,输出最大值表示最亮,输出最小值表示最暗,亮度会随输出的电压值变化。
有的传感器同时支持数字量和模拟量输出,有的不是。
因此,对于不确认
的传感器,我们一般先假设传感器是模拟量传感器,如果不是,再当作数据量处理。
模拟量传感器读取
下面以 32 接口为例
import machine
adc32 = machine.ADC(machine.Pin(32))
while True:
print(adc32.read_u16())
模拟量传感器输出
下面以 0 接口为例
import machine
pwm0 = machine.PWM(machine.Pin(0))
pwm0.duty_u16(0)
pwm0.duty_u16(255)
然而,有些动力类传感器需要设置占空比:占空比主要与脉冲宽度调制(Pulse Width Modulation,PWM)相关,它是一种模拟信号的数字化表示方法。在 PWM 中,一个周期内的高电平时间占总周期时间的比例就是占空比。
传感器的输出类型可以有多种,包括模拟电压、模拟电流、数字信号(如 I2C、SPI、UART 等)、频率、PWM 等。只有在使用 PWM 输出的传感器时,才需要设置占空比。例如,一些伺服电机会使用 PWM 信号来控制其位置,这时就需要设置占空比。
对于其他类型的传感器,如模拟电压输出的传感器、数字信号输出的传感器等,就不需要设置占空比。这些传感器的输出通常是连续的或者是特定的数字信号,不涉及到占空比的概念。
from machine import Pin, PWM
import time
# 创建一个PWM对象
pwm = PWM(Pin(2))
# 设置PWM信号的频率为50Hz
# 每秒50个周期,所以每个周期的时间是1秒/50,即20ms。
pwm.freq(50)
# 一般来说,当PWM信号的高电平时间为1ms时,舵机转到0度;
# 当高电平时间为2ms时,舵机转到最大角度。
# 这个范围内的其他高电平时间对应的是0到180度之间的其他角度。
# 转到0度()
pwm.duty(52) # 1ms / 20ms * 1024 = 51.2 取不低于最小值的整:52
time.sleep(1) # 等待一段时间让舵机转到指定位置
# 转到180度
pwm.duty(102) # 2ms / 20ms * 1024 = 102.4 取不高于最大值的整:102
time.sleep(1) # 等待一段时间让舵机转到指定位置
# 关闭PWM
pwm.deinit()
数字量传 感器读取
import machine
pin0 = machine.Pin(0, machine.Pin.IN)
while True:
print(pin0.value())
数字量传感器输出
import machine
import time
pin13 = machine.Pin(13, machine.Pin.OUT)
while True:
pin13.value(0)
time.sleep_ms(50)
pin13.value(1)
time.sleep_ms(50)