Управление реле подключенного к GPIO или по UART

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
immortal
Сообщения: 1138
Зарегистрирован: Вт янв 29, 2013 9:16 am
Откуда: Белозерск
Благодарил (а): 16 раз
Поблагодарили: 400 раз
Контактная информация:

Управление реле подключенного к GPIO или по UART

Сообщение immortal » Вс апр 09, 2017 1:29 pm

Для управления реле в системе умного дома возможно использовать различные способы, это и ESP8266 и готовые блоки реле и управление с помощью Arduino по http через Ethernet шилд, но в данной статье речь пойдет об управлении реле непосредственно подключенных к GPIO OrangePi PC (Апельсинка) или через uart Апельсинки. Как работать с GPIO, UART и i2c можно прочитать в статье, данную статью рекомендуется изучить для включения портов UART и установки WiringOP, если же Вы используете мои готовые образы DietPi или Armbian то там все это уже настроено.
Видео управления реле из консоли Апельсинки и о муках выбора https://youtu.be/WdOBJn7erZU

Для управления реле в системе MajorDoMo предусмотрен класс Relays в котором необходимо создать объекты, каждый объект это одно реле, в системе по умолчанию уже имеется объект Switch1. У класса Relays имеются методы, которые наследуются объектам класса Relays, то есть методы Relays будут выполняться во всех объектах если в объекте данные метод не переопределен.

Методы класса Relays
Изображение
Методы объекта Switch1, наследуемые от класса Relays, то есть метод выполняется в классе Relays
Изображение
Преимущество использования методов в классе состоит в том, что не надо для каждого объекта использовать свой метод и прописывать в каждом методе объекта свой код, что упрощает разработку.
Вот так выглядят методы Объекта Switch1 если методы отличаются от аналогичных методов класса
Изображение
и в дереве Классов и Объектов
Изображение
Но для отправки команд на управление реле у разных объектов будут разные команды и по этому необходимо каждому объекту прописать свою команду, в статье Умный дом. клацкаем светом. я уже рассказывал как это делать, однако описанные варианты на мой взгляд неудобны. В случае если Вы решили использовать команды управления реле через методы объектов, то в методах turnOff И turnOn пишем команды управления реле.

Если у Вас реле подключены к GPIO или UART Апельсинки то код будет аналогичный коду из консоли описанный в статье OrangePi PC работаем с GPIO, UART и i2c, только необходимо добавить команду вызова exec, и получается следующий код для GPIO:

Код: Выделить всё

exec ("gpio -1 write 29 1");
и

Код: Выделить всё

exec ("gpio -1 write 29 0");
и для UART (команда на ардуино с прошитым универсальным скетчем из статьи )

Код: Выделить всё

exec ("echo 1103 > /dev/ttyS3");
и

Код: Выделить всё

exec ("echo 1003 > /dev/ttyS3");
для включения и выключения ,скорее всего реле у Вас инверсные и поэтому логический 0 включает реле, логическая 1 выключает реле.
Однако при большом количестве реле на мой взгляд не удобно прописывать данный код в методах объектов, по этому обработку мы будем делать в сценарии. Так же из-за того, что при работе с uart портом во время посылке данных в порт порт становиться занятым, то способ обработки в сценарии scene_switch описанный с статье Умный дом. клацкаем светом. не подходит, поскольку команды будут отсылаться на все реле не зависимо изменилось состояние реле или нет и соответственно после отсылки первой команды в UART порт вторая не может послать в UART порт поскольку он становиться ещё занятым. Я пробовал при стандартной скорости порта 9600, возможно при другой скорости порта такой проблемы не будет. Однако обработка описанная в статье по моему мнению неправильная поскольку повторно посылает состояние реле даже если оно не изменилось.
Для того, чтобы сценарий scene_switch обрабатывал только события конкретного объекта нам надо в этот сценарий передать имя этого объекта, для получения имени объекта используем команду $this->object_title и запуск скрипта с передачей параметра - имени объекта будет выглядеть следующим образом:

Код: Выделить всё

runScript("scene_switch",array("nameobj"=>$this->object_title))
эту строчку надо добавить в конец методов turnOff и turnOn класса Relays
Теперь создаем сценарий scene_switch

Код: Выделить всё

$n = $params['nameobj']; //получаем имя объекта

//нажата кнопка Switch1
if ($n == "Switch1") {
 if (getGlobal("Switch1.status")==1) {
        exec ("gpio -1 write 29 0");
    } else {
        exec ("gpio -1 write 29 1");
    }
}
//нажата кнопка Switch2
if ($n == "Switch2") {
 if (getGlobal("Switch2.status")==1) {
        exec ("echo 1003 > /dev/ttyS3");
    } else {
        exec ("echo 1103 > /dev/ttyS3");
    }
}
в данном примере 2 кнопки, первая включает и выключает реле на GPIO Апельсинки, вторая посылает через UART порт команду ардуине с залитым универсальным скетчем из статьи .
Как сделать кнопки в сценах или меню, а так же включать через различные пульты описано в статье Умный дом. Клацкаем светом.

Источник
За это сообщение автора immortal поблагодарили (всего 3):
lanket (Пн апр 10, 2017 8:47 am) • ledmax (Вс сен 17, 2017 7:19 pm) • ypiter2006 (Пн дек 11, 2017 9:51 pm)
Рейтинг: 3.49%
Lubuntu на cubieboard2 + ds9490R
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru
Ответить