Про уровни срабатывания реле

Тема в разделе "Arduino & Shields", создана пользователем DIYMan, 19 июл 2016.

  1. DIYMan

    DIYMan Guest

    Приветствую!

    Считаю, что на данном форуме не хватает "пришпиленных" тем с ответами на самые простые вопросы. Например: часто встречаю советы одних новичков другим по включению/выключению реле. Код при этом выдаётся примерно такой, даже, бывает, с комментариями:

    Код (C++):
    digitalWrite(RELAY_PIN,HIGH); // включили реле
    delay(1000); // подождали секунду
    digitalWrite(RELAY_PIN,LOW); // выключили реле
     
    Всё бы хорошо, если бы не одно но: этот код - неправильный, от слова "совсем"! И дело тут не в пресловутом использовании delay, кое (использование) совершенно разумно не нравится продвинутым юзерам, реализующим свои проекты на МК. Дело, всего лишь, в понимании уровней, по которым срабатывает реле.

    Собственно, уровней этих, как можно догадаться, два: высокий (HIGH), и низкий (LOW). Так вот - в природе встречаются два типа модулей реле: одни из них срабатывают по высокому уровню, другие - по низкому, причём вторых, во-первых, больше, и, во-вторых - срабатывание по низкому уровню считается более правильным с точки зрения схемотехники.

    В результате вышеприведённый код вместо того, чтобы в первой строчке включать реле - выключает его, а в третьей, вместо того, чтобы выключить - включает. При условии, конечно, что к МК подцеплен модуль реле, включающийся по низкому уровню.

    Именно поэтому я настоятельно советую всем новичкам СРАЗУ отказываться от прямого прописывания уровней для реле в коде скетча - таких мест может быть не один десяток, и править всё это добро под новый модуль, срабатывающий не по тому уровню - задача порой адова. Вместо этого - достаточно воспользоваться простым и эффективным инструментом, например - директивами препроцессора:

    Код (C++):
    #define RELAY_ON LOW // уровень для включения реле
    #define RELAY_OFF HIGH // уровень для выключения реле
    И потом везде писать, уже совершенно безопасно:

    Код (C++):
    digitalWrite(RELAY_PIN,RELAY_ON); // включили реле
    delay(1000); // подождали секунду
    digitalWrite(RELAY_PIN,RELAY_OFF); // выключили реле
     
    Заранее извиняюсь, если впустую потратил столько букв, разъясняя очевидное, просто с завидной регулярностью сталкиваюсь с непониманием сего маааахонького нюанса.
     
    lepidot, FlameWind, Radius и ещё 1-му нравится это.
  2. ostrov

    ostrov Гуру

    Хочу добавить забавный факт. Самый, пожалуй, распространенный релейный модуль, вот такой:
    [​IMG]
    работает по такому принципу: нормальнозамкнутые контакты (обозначенные на схеме) замкнуты при отсутствии питания модуля. А при наличии питания они замкнуты при подаче на соответствующую управляющую ножку уровня HIGH, при подачи LOW контакты перекидываются. То есть при включении питания на Ардуину по умолчанию все релейки автоматически встают во состояние обратное дефлотному, то есть включаются! Поэтому первое, что нужно приписать в программе чтобы все осталось как было, это:
    Код (C++):
      digitalWrite(C1, HIGH);
      digitalWrite(C2, HIGH);
    ...
    Точнее, по рекомендации автора поста так:
    Код (C++):
     
    #define  RELAY_OFF HIGH
    ...
    digitalWrite(C1, RELAY_OFF);
    digitalWrite(C2, RELAY_OFF);
    ...
    Логика, на мой взгляд, странная, но факт остается фактом.
     
    Последнее редактирование: 19 июл 2016
    Andrei brest, obuhanoe и DIYMan нравится это.
  3. AlexU

    AlexU Гуру

    Что касается завершающей части -- объявление через '#define' типов управляющих сигналов и использование этих определений -- полностью согласен (код станет более читаемым).
    А вот что касается начала поста, есть путаница в понятиях "реле" и "релейный модуль". Что касается "реле", то количество видов реле можно считать ограниченным -- моностабильные, бистабильные, твердотельные, герконовые и т.п. А вот видов "релейных модулей" может быть бесчисленное множество (нет предела полёта инженерной мысли) и Вам следовало бы указать для каких видов релейных модулей применимы Ваши рекомендации.
     
    DIYMan нравится это.
  4. DIYMan

    DIYMan Guest

    Согласен, я писал про релейные модули, как самые распространённые в домашних поделках. Спасибо за поправку.
     
  5. ostrov

    ostrov Гуру

    Речь про релейный модуль с оптопарой.
     
  6. ИгорьК

    ИгорьК Гуру

    Добавлю, что релейный модуль со срабатыванием по нулю есть лучший друг владельцев ESP8266 ESP-1, поскольку одна из двух (хуже - четырех) доступных ног в модуле требует быть пристегнутой к единице при старте.