如何将Sense Hat写入CSV的数据同步至Google Sheets并实现手机查看
需求与解决方案
核心需求
- 已拥有Sense Hat采集数据并写入CSV的完整代码,需实现两个功能:
- 用最简方式在手机上查看CSV文件中的数据
- 每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下无需额外软件)
- 树莓派安装Samba服务:
sudo apt update && sudo apt install samba samba-common-bin - 编辑Samba配置文件:
sudo nano /etc/samba/smb.conf,在文件末尾添加:[SenseHat日志] path = /home/pi/你的日志存储目录 writeable = yes create mask = 0777 directory mask = 0777 public = yes - 设置Samba访问密码:
sudo smbpasswd -a pi,输入树莓派用户密码 - 重启Samba服务:
sudo systemctl restart smbd - 手机连接同一WiFi,打开自带文件管理器(或ES文件浏览器),搜索树莓派IP地址,进入共享文件夹即可查看CSV
方案2:FTP服务(轻量稳定)
- 安装FTP服务:
sudo apt install vsftpd - 编辑配置文件:
sudo nano /etc/vsftpd.conf,确保以下选项开启:anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 - 重启服务:
sudo systemctl restart vsftpd - 手机用FTP客户端(如FTPManager)连接树莓派IP、用户名
pi及对应密码,即可查看文件
方案3:直接物理传输
- 用USB数据线连接树莓派与手机(树莓派开启USB网络共享),或取出SD卡通过读卡器插入手机,直接复制CSV文件查看
二、CSV同步至Google Sheets的方案(无需Flask)
基于Google Sheets API + 定时任务
步骤1:准备Google API凭证
- 登录Google云平台,创建新项目,启用Google Sheets API
- 创建服务账号,下载JSON格式密钥文件,重命名为
credentials.json,放到树莓派代码目录 - 打开目标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
相关产品推荐
相关产品推荐

