树莓派上基于Python控制GPIO
树莓派上基于Python控制GPIO
有以下几点:
- 控制GPIO的拉高/拉低,并保持一段时间间隔
- 加锁,避免重复
- 有日志记录具体情况
控制GPIO电平后,外接驱动板来带动一个小型抽水机,并把水分给不同的盆栽,希望做到可以自动给阳台的花儿浇水~
虽然树莓派拿来做这个真的是大材小用哇
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import RPi.GPIO as GPIO
import time
import fcntl
import logging
import sys
class Servant(object):
    def __init__(self, name):
        self.fobj = open(name, 'w')
        self.fd = self.fobj.fileno()
    def lock(self):
        try:
            fcntl.lockf(self.fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
            logging.debug("Lock Success")
            return True
        except:
            logging.warning("Lock Fail, Seems another process is watering, exit...")
            return False
    def unlock(self):
        self.fobj.close()
        logging.debug("Unlock Success")
    def watering(self, inverval):
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        VCC = 20
        GND = 21
        GPIO.setup(VCC, GPIO.OUT)
        GPIO.setup(GND, GPIO.OUT)
        GPIO.output(GND, GPIO.LOW)
        GPIO.output(VCC, GPIO.HIGH)
        time.sleep(inverval)
        GPIO.output(VCC, GPIO.LOW)
        GPIO.cleanup()
def main():
    Adam = Servant("/tmp/watering.lock")
    logging.basicConfig(filename='/tmp/log_watering.txt',
                     format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s-%(funcName)s',
                     level=logging.INFO)
    if Adam.lock():
        argc = len(sys.argv)
        interval = 60
        if argc >= 1:
            try:
                _interval = int(sys.argv[1])
                if _interval > 10 and _interval < 300:
                    interval = _interval
            except:
                logging.info("no valid interval")
        logging.info("Watering for {} seconds.".format(interval))
        Adam.watering(interval)
        Adam.unlock()
        logging.info("Stop Watering...")
    else:
        logging.debug("Exit...")
if __name__ == '__main__':
    main()
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号