亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Bark Back:物联网宠物监测器,智能声音管理

随时随地实时洞察宠物行为。Bark Back 系统利用物联网记录家庭环境噪音,上传云端,当声音超过用户设定阈值时自动播放自定义音频文件。

基于树莓派构建,项目通过 MCP3002 ADC 读取 SparkFun MEMS 麦克风,经 MQTT 将音量数据流式传输到 CloudMQTT,触发 OMXPlayer 播放预选的“回吠”片段。

你将学到

前置条件

教程需要树莓派 3 (或更新) 跑 Raspbian、Wi-Fi 连接、基础 Python 知识。熟悉 GPIO、MQTT、模拟信号转换有帮助但非必需。

MQTT 通信协议

MQTT (Message Queuing Telemetry Transport) 是轻量级物联网消息协议。本指南使用 Eclipse Paho Python 客户端和 CloudMQTT 作为代理。

  1. 理解物联网通信协议。
  2. 注册 CloudMQTT 账号(免费 “Cute Cat” 套餐足矣)。
  3. 安装并使用 Paho MQTT Python 库。

MEMS 麦克风扩展板

SparkFun MEMS 麦克风为模拟传感器;MCP3002 ADC 将其输出转为树莓派可读的数字信号。

  1. SparkFun MEMS 麦克风扩展板入门。
  2. 查阅 MEMS 麦克风数据手册。
  3. 查阅 MCP3002 ADC 数据手册。

材料清单

下列为项目所需完整组件,均可从 SparkFun 等零售商购买。

额外外设:

硬件连接

连接树莓派与麦克风和 ADC。点击接线图查看详情。

参考树莓派 2/3 Model B 引脚图。

1. 将 MCP3002 连接到树莓派

MCP3002 使用四个 SPI 引脚:SCLK、MISO、MOSI、CS。对应树莓派 GPIO 11 (SCLK)、9 (MISO)、10 (MOSI)、8 (CE0)。

引脚连接:

2. 接线 MEMS 麦克风扩展板

树莓派配置

确保树莓派完全更新并启用 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

  1. 创建 CloudMQTT 账号(免费 “Cute Cat” 套餐)。
  2. 实例化新的 MyCloud 实例。
  3. 在控制台添加 ACL 规则允许发布/订阅。
  4. 用 WebSocket UI 监控消息。
  5. 安装 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 凭据。

可自由定制脚本——如调整音量阈值、添加日志、集成更多传感器。

后续扩展

探索进一步增强:

更多资源请查阅 SparkFun MEMS 麦克风数据手册、MCP3002 ADC 数据手册、Eclipse Paho MQTT 客户端文档。

祝黑客愉快,愿你的狗狗享受更安静、更快乐的环境!

制造工艺

  1. 树莓派打造空气质量与气象站:InfluxDB+Grafana可视化
  2. 树莓派温湿度网络监测站DIY全指南
  3. 树莓派家庭温湿度监测系统:Web仪表盘实时远程追踪
  4. 树莓派专业温度监测:基于 DS18B20 传感器的完整指南
  5. 树莓派 2 搭建户外气象站:接入 ADS‑WS1 串口气象站
  6. 树莓派精准监测机柜温度:DS18B20 多点部署实战
  7. 树莓派 OpenCV 乒乓球追踪进阶教程
  8. 树莓派 LIRC 通用红外遥控器专业构建指南
  9. 树莓派 PIR 运动传感器控制 LED 实战指南
  10. 树莓派射频转直流:包络检波器构建与故障排查
  11. Cycle Chaser:树莓派让自行车变身夜间光影秀
  12. 树莓派与 BrickPi 构建 ThingSpeak 温度监测系统