Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在特定时间控制GPIO的python代码_Python_Raspberry Pi_Gpio - Fatal编程技术网

用于在特定时间控制GPIO的python代码

用于在特定时间控制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文件并根据二进制代码触发

我想建立一个基于树莓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秒的间隔连续循环一个代码,读取 .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上使用它。