开发者
香橙派进阶:3 个外设组合小项目 + 3 个实用基础技能
香橙派进阶:3 个外设组合小项目 + 3 个实用基础技能
发表于2025/10/14
1450

掌握了单个外设的连接后,最有意思的其实是 “组合应用”—— 比如用按键控制摄像头拍照,再在 LCD 上显示照片;或是用传感器采集数据,用 LED 提示状态。今天就带大家做 3 个简单又实用的组合项目,同时补充 3 个能大幅提升效率的基础技能,新手也能跟着一步步实现!

一、3 个外设组合小项目:从 “单设备” 到 “小装置”

这 3 个项目都用之前讲过的外设(LED、按键、LCD、USB 摄像头),再加一个常用的 DHT11 温湿度传感器(性价比高,十几块钱就能买到),组合起来解决实际问题。

项目 1:一键拍照 + LCD 预览(按键 + 摄像头 + LCD)

用途:按下按键就能拍照,照片直接在 LCD 屏幕上显示,不用连电脑也能看(比如户外拍风景、记录实验画面)。

需要的外设:USB 摄像头、1.8 寸 SPI LCD(ST7735S 芯片)、按键模块、杜邦线。

1. 连接步骤(重点看 “多设备引脚分配”)

外设引脚功能香橙派引脚备注
按键模块VCC3.3V(1)所有外设尽量用同一组 3.3V 供电
按键模块GNDGND(6)所有外设共地,避免信号干扰
按键模块SIGGPIO2(13)控制拍照触发
LCD 模块VCC3.3V(17)单独用一个 3.3V 引脚,避免供电不足
LCD 模块GNDGND(20)与按键共地
LCD 模块SCLKGPIO11(23)SPI 时钟引脚
LCD 模块MOSIGPIO10(19)SPI 数据引脚
LCD 模块CSGPIO8(24)片选引脚
LCD 模块DCGPIO25(22)数据 / 命令引脚
USB 摄像头USB 接口任意 USB 口直接插,无需杜邦线

2. 代码实现(核心逻辑:按键触发拍照→保存照片→LCD 显示)

先安装依赖库(若没装过):

# 安装摄像头处理库和LCD驱动库
sudo apt install python3-pillow  # 处理图片
git clone https://github.com/waveshare/e-Paper.git  # LCD驱动
cd e-Paper/RaspberryPi_JetsonNano/python
sudo python3 setup.py install  # 安装LCD驱动

新建代码文件 key_cam_lcd.py

import RPi.GPIO as GPIO
import time
import os
from PIL import Image  # 处理图片
from waveshare_epd import epd1in8  # 1.8寸LCD驱动
# 引脚定义
KEY_PIN = 13  # 按键引脚
epd = epd1in8.EPD()  # 初始化LCD
def init():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(KEY_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # 按键上拉输入
    epd.init(epd.lut_full_update)  # LCD初始化
    epd.Clear(0xFF)  # LCD清屏(白色)
def take_photo():
    # 拍照并保存(文件名用时间,避免重复)
    photo_name = f"photo_{time.strftime('%Y%m%d%H%M%S')}.jpg"
    os.system(f"fswebcam -r 1280x720 -q {photo_name}")  # 静默拍照
    print(f"照片已保存:{photo_name}")
    return photo_name
def show_on_lcd(photo_path):
    # 调整图片尺寸(适配1.8寸LCD:128x160像素)
    image = Image.open(photo_path)
    image = image.resize((128, 160), Image.ANTIALIAS)
    # 转为LCD支持的格式
    image = image.convert('L')  # 灰度图
    epd.display(epd.getbuffer(image))  # 显示图片
    time.sleep(2)  # 显示2秒
if __name__ == "__main__":
    init()
    try:
        print("按下按键拍照,按Ctrl+C退出...")
        while True:
            if GPIO.input(KEY_PIN) == GPIO.LOW:  # 按键按下
                photo = take_photo()
                show_on_lcd(photo)
                time.sleep(0.5)  # 防抖,避免连续拍照
    except KeyboardInterrupt:
        epd.Clear(0xFF)  # 清屏
        epd.sleep()  # LCD休眠
        GPIO.cleanup()
        print("程序退出")

3. 测试与问题排查

  • 运行代码 python3 key_cam_lcd.py,按下按键,若 LCD 显示照片,说明成功;
  • 若拍照失败:检查 USB 摄像头是否插好,或运行 ls /dev/video0 看是否识别(有 video0 说明正常);
  • 若 LCD 不显示:检查 SPI 功能是否开启(参考上一篇的 SPI 开启步骤),或杜邦线是否接错。

项目 2:温湿度监测 + LED 报警(DHT11+LED+LCD)

用途:实时监测环境温湿度,在 LCD 上显示;当温度超过 30℃时,LED 闪烁报警(比如监测鱼缸、温室温度)。

需要的外设:DHT11 温湿度传感器、LED 模块、1.8 寸 LCD、杜邦线。

1. 连接步骤

外设引脚功能香橙派引脚
DHT11VCC3.3V(1)
DHT11GNDGND(6)
DHT11DATAGPIO4(7)
LEDVCC3.3V(17)
LEDGNDGND(20)
LEDDINGPIO1(11)
LCD同项目 1 的 LCD 连接同上

2. 代码实现(核心逻辑:读取温湿度→LCD 显示→判断温度触发 LED)

安装 DHT11 库:

pip3 install Adafruit_DHT

新建代码文件 dht11_led_lcd.py

import RPi.GPIO as GPIO
import time
import Adafruit_DHT
from waveshare_epd import epd1in8
# 引脚定义
DHT11_PIN = 7  # DHT11数据引脚
LED_PIN = 11   # LED引脚
epd = epd1in8.EPD()
def init():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(LED_PIN, GPIO.OUT)
    epd.init(epd.lut_full_update)
    epd.Clear(0xFF)
def read_dht11():
    # 读取温湿度(DHT11有时会读错,重试3次)
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, DHT11_PIN)
    if humidity is not None and temperature is not None:
        return round(temperature, 1), round(humidity, 1)
    else:
        print("读取温湿度失败,重试...")
        return None, None
def show_temp_humid(t, h):
    # 在LCD上显示温湿度(用文字绘制)
    from PIL import ImageDraw, ImageFont
    image = Image.new('1', (epd.width, epd.height), 255)  # 白色背景
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 16)
    draw.text((10, 30), f"Temp: {t}℃", font=font, fill=0)  # 温度
    draw.text((10, 80), f"Humid: {h}%", font=font, fill=0)  # 湿度
    epd.display(epd.getbuffer(image))
def led_alert(trigger):
    # 温度超过30℃时LED闪烁,否则熄灭
    if trigger:
        GPIO.output(LED_PIN, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(LED_PIN, GPIO.LOW)
        time.sleep(0.5)
    else:
        GPIO.output(LED_PIN, GPIO.LOW)
if __name__ == "__main__":
    init()
    try:
        while True:
            temp, humid = read_dht11()
            if temp and humid:
                print(f"温度:{temp}℃,湿度:{humid}%")
                show_temp_humid(temp, humid)
                led_alert(temp > 30)  # 温度>30℃触发报警
            time.sleep(2)  # 每2秒读一次
    except KeyboardInterrupt:
        epd.Clear(0xFF)
        epd.sleep()
        GPIO.cleanup()
        print("程序退出")

3. 测试与问题排查

  • 运行后若 LCD 显示温湿度,温度超 30℃时 LED 闪烁,说明成功;
  • 若读不到数据:检查 DHT11 的 DATA 引脚是否接对,或传感器是否插反(VCC 和 GND 别接反);
  • 若 LCD 文字模糊:调整字体路径(可通过 find / -name "*.ttf" 找系统自带字体)。

项目 3:按键控制 LED 模式(按键 + LED+LCD)

用途:按一次按键切换一种 LED 模式(常亮→慢闪→快闪→熄灭),LCD 显示当前模式(适合新手练手 “状态切换” 逻辑)。

需要的外设:按键模块、LED 模块、1.8 寸 LCD、杜邦线(连接参考前两个项目,引脚可复用)。

代码核心逻辑

用变量 mode 记录当前模式(0 = 熄灭,1 = 常亮,2 = 慢闪,3 = 快闪),每次按键按下时 mode+1 并循环,LCD 显示对应模式名称,LED 执行对应动作。代码可参考前两个项目的结构,重点练习 “状态切换” 和 “LCD 文字更新”,这里就不贴完整代码了,大家可以自己尝试写~

二、3 个实用基础技能:提升效率,避免踩坑

做组合项目时,这 3 个技能能帮你少走很多弯路,比反复重装系统、手动传文件高效多了:

1. 图形化文件传输:不用记 scp 命令

之前用 scp 传文件需要输命令,新手容易出错,用图形化工具 FileZilla 更简单:

  • 电脑端安装 FileZilla(免费,官网可下);
  • 打开后点击 “文件 - 站点管理器”,选择 “SFTP” 协议,输入香橙派的 IP、用户名(orangepi)、密码,点击 “连接”;
  • 连接成功后,左边是电脑文件,右边是香橙派文件,直接拖放就能传文件,还能在线编辑代码(比如修改 Python 文件)。

✅ 小技巧:连接后把常用文件夹(比如 /home/orangepi/projects)添加到 “书签”,下次不用再输 IP。

2. 系统备份:配置好的系统不怕丢

花几小时调好软件源、装完驱动,万一 SD 卡坏了就白忙了,提前备份很重要:

  • 把香橙派的 SD 卡插回电脑,用 Win32 Disk Imager(Windows)或 BalenaEtcher(Mac/Linux)备份:
    • 打开软件,选择 “读取”(Read);
    • 选择 SD 卡对应的磁盘(别选错,会覆盖文件);
    • 选择备份文件保存路径(比如 orange_pi_backup.img),点击 “读取”,等待 10-20 分钟(看 SD 卡大小)。
  • 恢复时选择 “写入”(Write),选择备份的 .img 文件,就能还原到新 SD 卡上。

3. GPIO 引脚复用:一个引脚多种用途

香橙派的 GPIO 引脚支持 “复用功能”(比如同一引脚既可以当普通 GPIO,也能当 I2C、UART 接口),比如想用 I2C 传感器(如 OLED 屏幕),需要先配置引脚复用:

  • 运行 sudo orangepi-config,进入 “System”→“Hardware”;
  • 找到 “I2C” 选项,设为 “Enable”(比如 I2C1 对应引脚 3 和 5);
  • 重启后,运行 i2cdetect -y 1,若能看到传感器的地址(比如 48),说明复用成功。

✅ 注意:复用后,该引脚就不能再当普通 GPIO 用了,若要改回,需在 orangepi-config 中设为 “Disable”。

三、组合项目避坑总结

  • 供电优先:多个外设同时工作时,一定要用官方 12V/2A 电源,或外接 5V 电源模块,否则会因供电不足导致 LCD 花屏、摄像头拍不了照;
  • 引脚规划:先列一张 “引脚分配表”(像项目 1 那样),避免不同外设的引脚冲突(比如别让两个外设都用 GPIO11);
  • 代码分步测:组合项目别直接跑完整代码,先分步测试:比如先测按键是否能触发拍照,再测照片能否显示在 LCD,最后整合;
  • 传感器防干扰:DHT11 这类模拟传感器,尽量远离 LED、电机等强干扰设备,杜邦线别太长(建议用 10cm 以内的)。

这 3 个组合项目虽然简单,但能帮你理解 “硬件联动” 的逻辑 —— 比如按键是 “输入”,LED 和 LCD 是 “输出”,传感器是 “数据采集”。接下来你可以尝试扩展:比如给温湿度项目加个蜂鸣器,温度超限时同时报警;或给拍照项目加个 SD 卡,存更多照片。如果在扩展时遇到问题,比如某个外设不兼容,欢迎在评论区分享,咱们一起解决!

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞