Esempio n. 1
0
class ArduinoAPI(object):
    """Control the camera sunshader, water sprinkler and more.

    Args:
        com (str, optional): Com port of the arduino.
        sunshader_pin (int, optional): Pin number of the sunshader servo.
        servo_range (tuple, optional): (min, max) angles of the sunshader servo.
        sprinkler_ping (int, optional): Pin number of the sprinkler relay.

    """
    def __init__(self,
                 com='/dev/ttyACM0',
                 sunshader_pin=5,
                 servo_range=(0, 180),
                 sprinkler_pin=6):

        try:
            self.board = ArduinoDue(com)
        except Exception as e:
            self.board = None
            return

        #
        #
        # Setup the sunshader pin.
        #
        self.board.digital[sunshader_pin].mode = pyfirmata.SERVO
        self.sunshader_pin = sunshader_pin
        self.servo_range = servo_range
        self._angle = 0

        #
        # Setup the sprinkler pin.
        #
        self.board.digital[sprinkler_pin].mode = pyfirmata.DIGITAL
        self.sprinkler_pin = sprinkler_pin

        #
        # Initialize to center (not to load the servo).
        #
        self.setAngle(90)

    def __del__(self):
        if self.board is not None:
            self.board.exit()

    def setAngle(self, angle):
        """Set the angle of the sunshader.

        Args:
            angle (int): Requested angle of the sunshader.

        """

        if self.board is None:
            raise Exception('No Arduino board available.')

        #
        # Round the angle
        #
        angle = int(angle + 0.5)

        if angle < self.servo_range[0] or angle > self.servo_range[1]:
            raise Exception('Angle out of range: angle={} range={}.'.format(
                angle, self.servo_range))

        self._angle = angle
        self.board.digital[self.sunshader_pin].write(angle)

    def getAngle(self):
        """Get the last set angle of the sunshader.

        Returns:
            The last set angle of the sunshader.

        """

        return self._angle

    def setSprinkler(self, state):
        """Set the state of the sprinkler.

        Args:
            state (bool): True to turn on the sprinkler, otherwise turn off.

        """

        self.board.digital[self.sprinkler_pin].write(1 if state else 0)