用于在特定时间控制GPIO的python代码
我想建立一个基于树莓Pi的灌溉自动化系统。 我有一个脚本,它根据sprinking计划的输入参数(站点号、时间/站点、使用/不使用雨量传感器等)生成一个.CSV文件 .CSV文件如下所示:用于在特定时间控制GPIO的python代码,python,raspberry-pi,gpio,Python,Raspberry Pi,Gpio,我想建立一个基于树莓Pi的灌溉自动化系统。 我有一个脚本,它根据sprinking计划的输入参数(站点号、时间/站点、使用/不使用雨量传感器等)生成一个.CSV文件 .CSV文件如下所示: 1 00:00:00 00:29:59 110000 2 00:30:00 00:44:59 101000 3 00:45:00 01:14:59 100100 . . . . ,其中每行表示一个时间间隔,六位二进制数表示GPIO引脚状态(1=阀门打开,0=阀门关闭) 扫描此.CSV文件并根据二进制代码触发
1 00:00:00 00:29:59 110000
2 00:30:00 00:44:59 101000
3 00:45:00 01:14:59 100100
.
.
.
.
,其中每行表示一个时间间隔,六位二进制数表示GPIO引脚状态(1=阀门打开,0=阀门关闭)
扫描此.CSV文件并根据二进制代码触发阀门的最佳方式是什么
目前我有两个选择,但我相信一定有更好的选择:
- 以1秒的间隔连续循环一个代码,读取 .CSV文件,直到间隔与当前时间匹配,然后触发 通讯端口
- 读取.CSV文件并为每行生成一个cron作业
谢谢 此程序应该执行您希望它执行的操作。启动时,文件将被读入计划中。计划已排序,for循环将根据需要在计划中运行。计划完成后,您的程序将需要再次运行
import operator
import time
def main():
schedule = []
with open('example.csv') as file:
for line in file:
_, start, _, state = line.split()
data = time.strptime(start, '%H:%M:%S')
schedule.append((time_to_seconds(data), int(state, 2)))
schedule.sort(key=operator.itemgetter(0))
for start, state in schedule:
current_time = time_to_seconds(time.localtime())
difference = start - current_time
if difference >= 0:
time.sleep(difference)
set_gpio_pins(state)
def time_to_seconds(data):
return (data.tm_hour * 60 + data.tm_min) * 60 + data.tm_sec
def set_gpio_pins(state):
raise NotImplementedError()
if __name__ == '__main__':
main()
一个可能的想法是使用crontab运行一个程序,该程序扫描.CSV文件并触发阀门,以便只有在您真正需要时才能执行此操作。您可能希望尝试帮助设置喷水装置何时关闭:
#this is pseudocode
While True :
If *clocktime* == *target activation time*
*these sprinklers activate*
这可能也值得在raspberry pi网站或raspberry pi Stackexhage网站上的python论坛上发布。StackOverflow更能帮助您修复代码中的错误。谢谢。最后两行是什么意思?@user3254924,标准库已经包含
sched
模块,因此您可能正在重新设计轮子。:-)我在Windows中使用任务调度器的经验非常糟糕,它非常不可靠。crontab 100%可靠吗?@user3254924到目前为止,我从未遇到过crontab的任何问题,我每天都在我的Raspberry Pi上使用它。