#encoding=utf-8
# Данный пример демонстрирует защиту от зависания шины или Arduino     # * Строки со звёздочкой являются необязательными.
                                                                       #
from pyiArduinoI2Crelay import *                                       #   Подключаем библиотеку для работы с реле и силовыми ключами.
from time import sleep                                                 #   Подключаем метод sleep библиотеки time
relay = pyiArduinoI2Crelay(0x09)                                       #   Объявляем объект relay для работы с функциями и методами библиотеки iarduino_I2C_Relay, указывая адрес модуля на шине I2C.
                                                                       #   Если объявить объект без указания адреса (iarduino_I2C_Relay relay;), то адрес будет найден автоматически.
relay.enableWDT(5)                                                     #   Разрешаем работу сторожевого таймера модуля, задав время до перезагрузки 5 сек.
                                                                       #   Отключить работу сторожевого таймера модуля можно функцией disableWDT().
while True:                                                            #
#   Переключаем 1 и 2 каналы модуля:                                   #
    relay.digitalWrite(1,HIGH), relay.digitalWrite(2,LOW), sleep(.5)   #   Включаем 1 канал, выключаем 2 канал и ждём 500 мс.
    relay.digitalWrite(2,HIGH); relay.digitalWrite(1,LOW); sleep(.5)   #   Включаем 2 канал, выключаем 1 канал и ждём 500 мс.
#   Сбрасываем (перезапускаем) сторожевой таймер модуля:               #
    relay.resetWDT();                                                  #   Теперь таймер модуля начнёт заново отсчитывать 5 секунд до перезагрузки.
#   Сообщаем, что сработал сторожевой таймер:                          # * 
    if relay.getStateWDT() == False: print("ERROR")                    # * Если таймер отключился, значит он досчитал до 0 и перезагрузил модуль отключив все его каналы.
                                                                       #   Если модуль не отвечает (отключилась шина I2C), то функция getStateWDT() так же вернёт false.
#   ********************************************************************
#   ПРИМЕЧАНИЕ:
#   Время назначенное сторожевому таймеру функцией enableWDT(),            (в примере назначено 5 секунд)
#   должно быть больше чем время между вызовами функции resetWDT().        (в примере функция resetWDT вызывается один раз в секунду)
#
#   ПРОВЕРКА:
#   Если во время работы отключить вывод SDA или SCL шины I2C, то реле
#   перестанут переключаться, но одно из реле останется включённым.
#   Подождав от 4 до 5 секунд, сработает таймер и все реле отключатся.     (время ожидания зависит от того, в каком месте выполнения кода был отключён вывод)
