本文目录导读:

- Python 读取串口传感器数据
- 读取 I2C 传感器(使用 smbus2)
- 读取 GPIO 传感器(使用 RPi.GPIO)
- 使用 MQTT 接收传感器数据
- 从 Web API 读取传感器数据
- 使用 Redis 接收传感器数据
- 安装依赖
- 关键注意事项:
Python 读取串口传感器数据
import serial
import time
import json
# 连接串口(根据实际情况修改)
ser = serial.Serial(
port='COM3', # Windows
# port='/dev/ttyUSB0', # Linux/Mac
baudrate=9600,
timeout=1
)
try:
while True:
if ser.in_waiting:
# 读取一行数据
line = ser.readline().decode('utf-8').strip()
# 按逗号分隔解析数据
data = line.split(',')
# 示例:假设数据格式是 "温度,湿度,光照"
if len(data) >= 3:
temperature = float(data[0])
humidity = float(data[1])
light = float(data[2])
print(f"温度: {temperature}°C, 湿度: {humidity}%, 光照: {light} lux")
# 保存到文件
with open('sensor_data.csv', 'a') as f:
f.write(f"{time.time()},{temperature},{humidity},{light}\n")
time.sleep(0.1)
except KeyboardInterrupt:
print("程序退出")
ser.close()
读取 I2C 传感器(使用 smbus2)
from smbus2 import SMBus
import time
# 创建 I2C 总线对象(通常地址是 /dev/i2c-1)
bus = SMBus(1)
# 传感器地址
SENSOR_ADDR = 0x40 # 根据实际传感器修改
# 寄存器地址
TEMP_REG = 0x00
HUMI_REG = 0x01
def read_sensor_data():
"""读取 I2C 传感器数据"""
try:
# 读取温度寄存器的 2 字节数据
temp_raw = bus.read_word_data(SENSOR_ADDR, TEMP_REG)
# 转换字节序(小端到大端)
temp = (temp_raw & 0xFF) << 8 | (temp_raw >> 8)
# 转换为实际温度(根据传感器datasheet)
temperature = temp / 100.0
# 读取湿度
humi_raw = bus.read_word_data(SENSOR_ADDR, HUMI_REG)
humi = (humi_raw & 0xFF) << 8 | (humi_raw >> 8)
humidity = humi / 100.0
return temperature, humidity
except Exception as e:
print(f"读取失败: {e}")
return None, None
# 主循环
while True:
temp, humi = read_sensor_data()
if temp is not None:
print(f"温度: {temp:.1f}°C, 湿度: {humi:.1f}%")
time.sleep(1)
读取 GPIO 传感器(使用 RPi.GPIO)
import RPi.GPIO as GPIO
import time
import Adafruit_DHT
# 设置 GPIO 模式
GPIO.setmode(GPIO.BCM)
# 定义传感器类型和引脚
DHT_SENSOR = Adafruit_DHT.DHT11
DHT_PIN = 4 # GPIO引脚号
# 数字传感器读取(如按钮)
BUTTON_PIN = 17
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# 模拟传感器读取(ADC - 需要额外的ADC芯片)
# 这里使用 MCP3008 作为示例
# from gpiozero import MCP3008
# adc = MCP3008(channel=0)
def read_dht_sensor():
"""读取温湿度传感器"""
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
if humidity is not None and temperature is not None:
return temperature, humidity
else:
return None, None
def read_button():
"""读取按钮状态"""
if GPIO.input(BUTTON_PIN) == GPIO.LOW:
return True
return False
try:
while True:
# 读取温湿度
temp, humi = read_dht_sensor()
if temp is not None:
print(f"温度: {temp:.1f}°C, 湿度: {humi:.1f}%")
# 读取按钮
if read_button():
print("按钮被按下!")
time.sleep(1)
finally:
GPIO.cleanup()
使用 MQTT 接收传感器数据
import paho.mqtt.client as mqtt
import json
import time
# MQTT 服务器配置
BROKER = "127.0.0.1"
PORT = 1883
TOPIC = "sensors/room1"
def on_connect(client, userdata, flags, rc):
"""连接成功的回调"""
print(f"连接成功,返回码: {rc}")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
"""接收到消息的回调"""
try:
# 解析JSON数据
data = json.loads(msg.payload.decode())
# 处理传感器数据
print(f"收到数据: {data}")
# 可以在这里添加数据存储逻辑
with open('mqtt_sensor_data.log', 'a') as f:
f.write(f"{time.time()}: {data}\n")
except Exception as e:
print(f"解析错误: {e}")
# 创建客户端
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
# 连接服务器
client.connect(BROKER, PORT, 60)
# 持续监听
client.loop_forever()
从 Web API 读取传感器数据
import requests
import json
import time
def read_from_api(api_url, api_key=None):
"""从 REST API 读取传感器数据"""
headers = {}
if api_key:
headers['Authorization'] = f"Bearer {api_key}"
try:
response = requests.get(api_url, headers=headers)
response.raise_for_status() # 检查HTTP错误
data = response.json()
return data
except requests.exceptions.RequestException as e:
print(f"API请求失败: {e}")
return None
# 示例:读取天气API
def read_weather():
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": 31.2304,
"longitude": 121.4737,
"current_weather": True
}
try:
response = requests.get(url, params=params)
data = response.json()
if 'current_weather' in data:
weather = data['current_weather']
return {
'temperature': weather['temperature'],
'wind_speed': weather['windspeed']
}
except Exception as e:
print(f"读取天气失败: {e}")
return None
# 主程序
if __name__ == "__main__":
while True:
weather = read_weather()
if weather:
print(f"当前温度: {weather['temperature']}°C, 风速: {weather['wind_speed']} km/h")
time.sleep(10) # 每10秒读取一次
使用 Redis 接收传感器数据
import redis
import json
import time
# 连接 Redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
def subscribe_to_sensors():
"""订阅传感器主题"""
pubsub = r.pubsub()
pubsub.subscribe('sensor_data')
for message in pubsub.listen():
if message['type'] == 'message':
try:
data = json.loads(message['data'])
print(f"收到传感器数据: {data}")
# 将数据存储
r.lpush('sensor_history', json.dumps(data))
r.ltrim('sensor_history', 0, 999) # 保留最近1000条
except json.JSONDecodeError:
print(f"无效的JSON数据: {message['data']}")
def get_latest_data():
"""获取最新数据"""
data = r.lindex('sensor_history', 0)
if data:
return json.loads(data)
return None
if __name__ == "__main__":
# 订阅和持续监听
try:
subscribe_to_sensors()
except KeyboardInterrupt:
print("程序退出")
安装依赖
# 基础依赖 pip install pyserial smbus2 # GPIO 相关(树莓派) pip install RPi.GPIO Adafruit-DHT # MQTT 协议 pip install paho-mqtt # HTTP 请求 pip install requests # Redis pip install redis pip install aioredis # 异步版本
关键注意事项:
- 权限问题:访问GPIO或串口可能需要sudo权限
- 错误处理:传感器可能因各种原因读取失败
- 数据格式:确保理解传感器输出的数据格式
- 采样频率:不要过于频繁读取,根据传感器规格设置
- 日志记录:建议记录数据以备后续分析
- 线程安全:如果多线程读取,需要注意并发控制
请根据你的具体传感器类型和硬件环境,选择合适的方案进行修改。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播