Bark Back:物联网宠物监测器,智能声音管理
随时随地实时洞察宠物行为。Bark Back 系统利用物联网记录家庭环境噪音,上传云端,当声音超过用户设定阈值时自动播放自定义音频文件。
基于树莓派构建,项目通过 MCP3002 ADC 读取 SparkFun MEMS 麦克风,经 MQTT 将音量数据流式传输到 CloudMQTT,触发 OMXPlayer 播放预选的“回吠”片段。
你将学到
- 连接并读取 SparkFun MEMS 麦克风与树莓派 3。
- 实时音量数据发送到 CloudMQTT。
- 配置音量阈值自动播放自定义音频。
前置条件
教程需要树莓派 3 (或更新) 跑 Raspbian、Wi-Fi 连接、基础 Python 知识。熟悉 GPIO、MQTT、模拟信号转换有帮助但非必需。
MQTT 通信协议
MQTT (Message Queuing Telemetry Transport) 是轻量级物联网消息协议。本指南使用 Eclipse Paho Python 客户端和 CloudMQTT 作为代理。
- 理解物联网通信协议。
- 注册 CloudMQTT 账号(免费 “Cute Cat” 套餐足矣)。
- 安装并使用 Paho MQTT Python 库。
MEMS 麦克风扩展板
SparkFun MEMS 麦克风为模拟传感器;MCP3002 ADC 将其输出转为树莓派可读的数字信号。
- SparkFun MEMS 麦克风扩展板入门。
- 查阅 MEMS 麦克风数据手册。
- 查阅 MCP3002 ADC 数据手册。
材料清单
下列为项目所需完整组件,均可从 SparkFun 等零售商购买。
- Bark Back: Monitor & Interact with Pets! SparkFun Wish List
- 模数转换器 — MCP3002
- SparkFun MEMS 麦克风扩展板 — INMP401 (ADMP401)
- 面包板 — 自粘 (白)
- 跳线 — 6″ (公对公, 20 包)
- 墙式电源 — 5V DC 2A (USB Micro-B)
- 树莓派 GPIO 排线 — 40Pin, 6″ (兼容 Pi 3, Pi 2, B+)
- 树莓派 7″ 触摸屏 LCD
- 树莓派 3
- 树莓派™ — 16GB MicroSD NOOBS 卡
- 树莓派 3 + 相机外壳 — 透明
额外外设:
- MicroUSB 电源线
- HDMI 线
- USB 键盘
- USB 鼠标
- 带 3.5mm 耳机口的音箱
硬件连接
连接树莓派与麦克风和 ADC。点击接线图查看详情。
参考树莓派 2/3 Model B 引脚图。
1. 将 MCP3002 连接到树莓派
MCP3002 使用四个 SPI 引脚:SCLK、MISO、MOSI、CS。对应树莓派 GPIO 11 (SCLK)、9 (MISO)、10 (MOSI)、8 (CE0)。
引脚连接:
- Pin 1 → 树莓派 GPIO 8 (CE0)
- Pin 2 → MEMS 麦克风模拟输出
- Pin 4 → GND
- Pin 5 → 树莓派 GPIO 10 (MOSI)
- Pin 6 → 树莓派 GPIO 9 (MISO)
- Pin 7 → 树莓派 GPIO 11 (SCLK)
- Pin 8 → 树莓派 3.3V 输出
2. 接线 MEMS 麦克风扩展板
- Vcc → 树莓派 3.3V
- GND → 树莓派 GND
- AUD → MCP3002 Pin 2
树莓派配置
确保树莓派完全更新并启用 SPI 接口。
步骤 1:检查并安装更新
sudo apt-get update
sudo apt-get upgrade
sudo reboot
步骤 2:启用 SPI 并安装依赖
sudo apt-get install python-dev
mkdir py-spidev
cd py-spidev
git clone https://github.com/doceme/py-spidev
sudo python setup.py install
步骤 3:测试 OMXPlayer
OMXPlayer 预装于 Raspbian。验证播放:
omxplayer /home/pi/…/SongFilePath/SongFileName.mp3
# 必要时强制本地输出:
omxplayer -o local /home/pi/…/SongFilePath/SongFileName.mp3
步骤 4:配置 CloudMQTT
- 创建 CloudMQTT 账号(免费 “Cute Cat” 套餐)。
- 实例化新的 MyCloud 实例。
- 在控制台添加 ACL 规则允许发布/订阅。
- 用 WebSocket UI 监控消息。
- 安装 Paho MQTT 客户端:
pip install paho-mqtt
软件设置
Bark Back 系统两大核心功能:(1) 狗吠时触发音频播放,(2) 发送音量数据到云端。
编码前,录制或获取“回吠”音频片段并放入可访问目录(如桌面)。下方 Python 脚本开箱即用;也可从 GitHub 克隆完整仓库。
# Bark Back: Monitor & Interact with Pets!
# -----------------------------------------------------
# Author: jenfoxbot <[email protected]>
# License: Coffee/Beer-ware – keep this header if you use it.
# Libraries
import spidev
from threading import Thread
import subprocess
import paho.mqtt.client as paho
import random, time, os, urlparse
# Configurable lists and credentials
songList = [
"/home/pi/Desktop/SongFile1.mp3",
"/home/pi/Desktop/SongFile2.mp3",
"/home/pi/Desktop/SongFile3.mp3",
"/home/pi/Desktop/SongFile4.mp3"
]
creds = {
'CloudMQTT URL': 'https://m10.cloudmqtt.com',
'user': 'INSERT_CLOUDMQTT_USERNAME',
'password': 'INSERT_CLOUDMQTT_PASSWORD',
'host': 'INSERT_CLOUDMQTT_SERVER',
'port': 'INSERT_CLOUDMQTT_PORT',
'topic': 'INSERT_ACL_TOPIC'
}
# --- SPI / MEMS Microphone ----------------------------------------
spi = spidev.SpiDev()
spi.open(0,0) # CE0
def read_spi(channel):
spidata = spi.xfer2([96,0])
data = ((spidata[0] & 3) << 8) + spidata[1]
return data
def PTPAmp():
sampleTime = 0.05
startTime = time.time()
PTPAmp = 0
maxAmp = 0
minAmp = 1023
while(time.time() - startTime < sampleTime):
micOut = read_spi(0)
if micOut < 1023:
if micOut > maxAmp:
maxAmp = micOut
elif micOut < minAmp:
minAmp = micOut
PTPAmp = maxAmp - minAmp
return PTPAmp
def VolumeUnit(data, fromLow, fromHigh, toLow, toHigh):
return (data - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow
# --- OMXPlayer wrapper ---------------------------------------------
class OMXPlayer:
def __init__(self, file_path):
self.file_path = file_path
self.is_running = False
self.play_song()
def call_omxplayer(self):
print(f"Playing {self.file_path}\n")
subprocess.Popen(["omxplayer", "-o", "local", self.file_path],
stderr=subprocess.PIPE, stdout=subprocess.PIPE)
self.is_running = False
def play_song(self):
if not self.is_running:
self.song_thread = Thread(target=self.call_omxplayer)
self.song_thread.start()
self.is_running = True
def pickRandom(songList):
return random.choice(songList)
# --- MQTT callbacks -----------------------------------------------
def on_connect(mosq, obj, rc):
print(f"rc: {rc}")
def on_message(mosq, obj, msg):
print(f"{msg.topic} {msg.qos} {msg.payload}")
def on_publish(mosq, obj, mid):
print(f"mid: {mid}")
def on_subscribe(mosq, obj, mid, granted_qos):
print(f"Subscribed: {mid} {granted_qos}")
def on_log(mosq, obj, level, string):
print(string)
# --- Main loop ----------------------------------------------------
def main():
mqttc = paho.Client()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
# mqttc.on_log = on_log # 启用调试
url_str = os.environ.get(creds['CloudMQTT URL'], 'mqtt://localhost:1883')
url = urlparse.urlparse(url_str)
mqttc.username_pw_set(creds['user'], creds['password'])
mqttc.connect(creds['host'], creds['port'])
mqttc.subscribe(creds['topic'], 0)
while True:
PTPamp = PTPAmp()
PTPampV = round(((PTPamp * 3.3) / 1024), 2)
VolUnit = VolumeUnit(PTPamp, 0, 700, 0, 10)
print(PTPamp, VolUnit)
if VolUnit > 7:
playBack = pickRandom(songList)
OMXPlayer(playBack)
time.sleep(0.1)
mqttc.publish("Volume", str(VolUnit))
rc = True
while rc:
rc = mqttc.loop()
time.sleep(0.1)
print(f"rc: {rc}")
try:
while True:
pass
except KeyboardInterrupt:
pass
if __name__ == '__main__':
main()
请将 songList 和 creds 中的占位符替换为实际文件路径和 CloudMQTT 凭据。
可自由定制脚本——如调整音量阈值、添加日志、集成更多传感器。
后续扩展
探索进一步增强:
- 集成触摸屏显示实时音量电平。
- 添加摄像头画面直观监控宠物。
- 实现 Web 仪表盘远程监控。
更多资源请查阅 SparkFun MEMS 麦克风数据手册、MCP3002 ADC 数据手册、Eclipse Paho MQTT 客户端文档。
祝黑客愉快,愿你的狗狗享受更安静、更快乐的环境!
制造工艺
- 树莓派打造空气质量与气象站:InfluxDB+Grafana可视化
- 树莓派温湿度网络监测站DIY全指南
- 树莓派家庭温湿度监测系统:Web仪表盘实时远程追踪
- 树莓派专业温度监测:基于 DS18B20 传感器的完整指南
- 树莓派 2 搭建户外气象站:接入 ADS‑WS1 串口气象站
- 树莓派精准监测机柜温度:DS18B20 多点部署实战
- 树莓派 OpenCV 乒乓球追踪进阶教程
- 树莓派 LIRC 通用红外遥控器专业构建指南
- 树莓派 PIR 运动传感器控制 LED 实战指南
- 树莓派射频转直流:包络检波器构建与故障排查
- Cycle Chaser:树莓派让自行车变身夜间光影秀
- 树莓派与 BrickPi 构建 ThingSpeak 温度监测系统