【物联网】基于树莓派的物联网开发【22】——树莓派获取传感器数据实时存储实战

场景介绍

今天程序猫带领大家如何实时获取树莓派传感器温湿度数据,并自动存储到数据库中。确保数据的持续性。

实现过程

硬件连接

树莓派4b连接GPIO引脚与DHT11传感器;

硬件只涉及树莓派、DHT11传感器。

DHT11的信号引脚连接树莓派的GPIO17, DHT11的Vdd(+)和GND引脚(-)分别连接树莓派的电源正极和GND引脚。

启动MQTT服务

终端启动Mosquitto服务

bash 复制代码
sudo systemctl start mosquitto

读取传感器数据存储数据库

在数据采集模块中添加数据库写入的逻辑,编写脚本代码sensor_save.py

bash 复制代码
import time
import board
import adafruit_dht
from datetime import datetime
import paho.mqtt.client as mqtt
import json
import sqlite3
from pathlib import Path

# MQTT配置
broker = "192.168.137.31"
port = 1883
topic = "DHT11_message"

# 传感器引脚配置
SENSOR_PIN = board.D17  # 使用CircuitPython标准命名(物理引脚11)

# 数据库配置
DB_NAME = "sensor_data.db"
DB_TABLE = "environment_data"

# 初始化数据库
def init_db():
    # 检查数据库文件是否存在,不存在则创建
    db_file = Path(DB_NAME)
    if not db_file.exists():
        conn = sqlite3.connect(DB_NAME)
        cursor = conn.cursor()
        cursor.execute(f"""
        CREATE TABLE {DB_TABLE} (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            timestamp TEXT NOT NULL,
            temperature REAL NOT NULL,
            humidity REAL NOT NULL
        )
        """)
        conn.commit()
        conn.close()
        print(f"数据库 {DB_NAME} 和表 {DB_TABLE} 创建成功")
    else:
        print(f"使用现有数据库 {DB_NAME}")

# 写入数据到数据库
def write_to_db(timestamp, temperature, humidity):
    try:
        conn = sqlite3.connect(DB_NAME)
        cursor = conn.cursor()
        cursor.execute(f"""
        INSERT INTO {DB_TABLE} (timestamp, temperature, humidity)
        VALUES (?, ?, ?)
        """, (timestamp, temperature, humidity))
        conn.commit()
        conn.close()
        return True
    except sqlite3.Error as e:
        print(f"数据库写入错误: {e}")
        return False

# 初始化MQTT客户端
client = mqtt.Client()
client.connect(broker, port)

# 初始化数据库
init_db()

try:
    # 添加 use_pulseio=False 参数
    dhtDevice = adafruit_dht.DHT11(SENSOR_PIN, use_pulseio=False)
    print("传感器初始化成功,开始数据采集......")

    while True:
        try:
            # 读取温湿度数据
            temperature = dhtDevice.temperature
            humidity = dhtDevice.humidity

            # 检查有效读数
            if temperature is None or humidity is None:
                raise RuntimeError("读取到无效值")

            # 获取当前时间戳
            recDate = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

            # 1. 写入数据库
            if write_to_db(recDate, temperature, humidity):
                print(f"✓ [{recDate}] 数据库写入成功: 温度={temperature}°C, 湿度={humidity}%")
            else:
                print(f"✗ [{recDate}] 数据库写入失败")

            # 2. 准备MQTT消息并发送
            msg = json.dumps({
                'Tem': temperature,
                'Hum': humidity,
                'Date': recDate
            })

            result = client.publish(topic, msg)
            if result[0] == mqtt.MQTT_ERR_SUCCESS:
                print(f"✓ [{recDate}] MQTT发送成功: {msg}")
            else:
                print(f"✗ MQTT发送失败,错误码: {result[0]}")

        except RuntimeError as e:
            print(f"传感器读取错误: {e}")
        except Exception as e:
            print(f"意外错误: {e}")

        time.sleep(10.0)  # 采集间隔10s

except KeyboardInterrupt:
    print("程序被用户终止")
except RuntimeError as e:
    print(f"初始化失败: {e}")
    exit(1)
finally:
    # 清理资源
    if 'dhtDevice' in locals():
        dhtDevice.exit()
    client.disconnect()
    print("资源已释放")

进入虚拟环境

树莓派终端输入命令:

bash 复制代码
source adafruit_env/bin/activate

运行脚本

bash 复制代码
python3  sensor_save.py

可以看到传感器数据采集写入数据库

安装DB Browser for SQLite‌工具

适用于Raspbian/Debian系统:

控制台输入命令:

bash 复制代码
sudo apt install sqlitebrowser

打开可视化工具,并打开sensor_data.db,查看表数据environment_data写入成功。

相关推荐
HZZD_HZZD4 小时前
CSDN_批发市场水电漏损归因算法LAM的原理与落地
嵌入式硬件·物联网·算法
当下新鲜事6 小时前
车间实测记录:三菱电机MR-J5伺服与压力控制方案的场景适配
网络·物联网·业界资讯
门思科技6 小时前
开源网关有哪些:主流类型梳理
网络·python·物联网
远翔调光芯片^138287988726 小时前
Type-C接口统一了,但充电协议没统一,终端设备如何解决取电难题?
人工智能·科技·物联网·智能家居·能源
xhload3d8 小时前
图扑智慧工厂 | 继电器产线仿真态势管控平台
物联网·低代码·webgl·数字孪生·可视化·智慧工厂·工业互联网·hightopo
TDengine (老段)10 小时前
TDengine 常见问题 TOP4
数据库·物联网·时序数据库·tdengine·涛思数据·升级·tdengine 问题
华普微HOPERF11 小时前
远距离、低功耗、大容量,RFM6601如何打造可靠的LoRaWAN网络
物联网·lora·智慧水表·智慧电表
Quanqiucard12 小时前
摄像头网络不稳定怎么办?商用监控物联网卡怎么选才靠谱
物联网·机器人
iNeuOS工业互联网12 小时前
大模型(DeepSeek)辅助 3D 实时建模 + 拖拽配置:业务可视化应用快速构建实践(标注、巡检与视角控制等)
人工智能·物联网·3d·语言模型·工业互联网
李永奉14 小时前
中科蓝讯SDK开发-耳机项目功耗问题排查教程
c语言·开发语言·嵌入式硬件·物联网·智能手机