You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Sense Hat写入CSV的数据同步至Google Sheets并实现手机查看

需求与解决方案

核心需求

  • 已拥有Sense Hat采集数据并写入CSV的完整代码,需实现两个功能:
    1. 用最简方式在手机上查看CSV文件中的数据
    2. 每60秒将CSV数据同步至Google Sheets,此前尝试Flask觉得难度较高,寻求替代可行方案

用户提供的采集代码(已修正注释翻译及代码错误)

from sense_hat import SenseHat
from datetime import datetime
from time import sleep
from threading import Thread

FILENAME = ""
# 累计N条数据后写入文件
WRITE_FREQUENCY = 2
TEMP = True  # 是否采集温度
HUMIDITY = True  # 是否采集湿度
PRESSURE = True  # 是否采集气压
# 每次采集的间隔时间(秒)
DELAY=10

# 初始化CSV文件头
def file_setup(filename):
    header = []
    if TEMP:
        header.append("温度")
    if HUMIDITY:
        header.append("湿度")
    if PRESSURE:
        header.append("气压")
    header.append("时间戳")
    
    with open(filename, "w") as f:
        f.write(",".join(str(value) for value in header)+ "\n")
        
# 将采集数据存入待写入队列
def log_data():
    output_string = ",".join(str(value) for value in sense_data)
    batch_data.append(output_string)
    
# 从Sense Hat获取传感器数据
def get_sense_data():
    sense_data=[]
    
    if TEMP:
        sense_data.append(sense.get_temperature())
        
    if HUMIDITY:
        sense_data.append(sense.get_humidity())  # 原代码此处错误调用了get_pressure(),已修正
    
    if PRESSURE:
        sense_data.append(sense.get_pressure())
        
    sense_data.append(datetime.now())
    
    return sense_data

# 定时采集数据的线程函数
def timed_log():
    while True:
        log_data()
        sleep(DELAY)
        
sense = SenseHat()
batch_data= []

# 生成CSV文件名
if FILENAME == "":
    filename = "SenseLog-"+str(datetime.now())+".csv"
else:
    filename = FILENAME+"-"+str(datetime.now())+".csv"
    
file_setup(filename)

# 启动定时采集线程
if DELAY > 0:
    sense_data = get_sense_data()
    Thread(target= timed_log).start()
    
# 主循环:处理数据写入
while True:
    sense_data = get_sense_data()
    
    if DELAY == 0:
        log_data()
        
    if len(batch_data) >= WRITE_FREQUENCY:
        print("正在写入文件..")
        with open(filename,"a") as f:
            for line in batch_data:
                f.write(line + "\n")
            batch_data = []

注意:原代码中get_sense_data函数的湿度采集分支存在错误,已修正为调用sense.get_humidity()


一、手机查看CSV的最简方案

方案1:Samba本地共享(同一WiFi下无需额外软件)

  1. 树莓派安装Samba服务:
    sudo apt update && sudo apt install samba samba-common-bin
    
  2. 编辑Samba配置文件:sudo nano /etc/samba/smb.conf,在文件末尾添加:
    [SenseHat日志]
       path = /home/pi/你的日志存储目录
       writeable = yes
       create mask = 0777
       directory mask = 0777
       public = yes
    
  3. 设置Samba访问密码:sudo smbpasswd -a pi,输入树莓派用户密码
  4. 重启Samba服务:sudo systemctl restart smbd
  5. 手机连接同一WiFi,打开自带文件管理器(或ES文件浏览器),搜索树莓派IP地址,进入共享文件夹即可查看CSV

方案2:FTP服务(轻量稳定)

  1. 安装FTP服务:sudo apt install vsftpd
  2. 编辑配置文件:sudo nano /etc/vsftpd.conf,确保以下选项开启:
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    
  3. 重启服务:sudo systemctl restart vsftpd
  4. 手机用FTP客户端(如FTPManager)连接树莓派IP、用户名pi及对应密码,即可查看文件

方案3:直接物理传输

  • 用USB数据线连接树莓派与手机(树莓派开启USB网络共享),或取出SD卡通过读卡器插入手机,直接复制CSV文件查看

二、CSV同步至Google Sheets的方案(无需Flask)

基于Google Sheets API + 定时任务

步骤1:准备Google API凭证

  1. 登录Google云平台,创建新项目,启用Google Sheets API
  2. 创建服务账号,下载JSON格式密钥文件,重命名为credentials.json,放到树莓派代码目录
  3. 打开目标Google Sheets表格,共享给服务账号的邮箱(密钥文件中client_email字段的值),权限设为「编辑」

步骤2:安装依赖

pip install gspread oauth2client

步骤3:整合同步代码到现有程序

在原代码中添加同步逻辑,修改主循环如下:

# 新增:导入同步所需库
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from time import time

# 新增:初始化Google Sheets连接
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name("credentials.json", scope)
client = gspread.authorize(creds)
sheet = client.open("你的表格名称").sheet1  # 替换为你的Google Sheets表格名

# 新增:同步CSV到Sheets的函数
def sync_to_sheets(csv_filename):
    try:
        # 读取CSV所有内容
        with open(csv_filename, "r") as f:
            rows = [line.strip().split(",") for line in f]
        # 清空表格并写入完整数据(若需追加新数据,可改为记录上次同步行数,用sheet.append_rows())
        sheet.clear()
        sheet.insert_rows(rows)
        print("数据同步到Google Sheets成功")
    except Exception as e:
        print(f"同步失败:{str(e)}")

# 新增:同步间隔设置(60秒)
SYNC_INTERVAL = 60
last_sync_time = time()

# 修改原主循环,添加同步逻辑
while True:
    sense_data = get_sense_data()
    
    if DELAY == 0:
        log_data()
        
    if len(batch_data) >= WRITE_FREQUENCY:
        print("正在写入文件..")
        with open(filename,"a") as f:
            for line in batch_data:
                f.write(line + "\n")
            batch_data = []
    
    # 新增:定时同步逻辑
    current_time = time()
    if current_time - last_sync_time >= SYNC_INTERVAL:
        sync_to_sheets(filename)
        last_sync_time = current_time
    
    sleep(1)  # 降低循环资源占用

优化提示

  • 若只需追加新数据而非覆盖全表,可在代码中记录上次同步的行数,读取CSV对应行后用sheet.append_rows()方法写入
  • 确保树莓派可正常访问Google服务器,若有网络限制需配置代理

内容的提问来源于stack exchange,提问作者speedee_doge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:42:45