Задать вопрос
alekseyruzov
@alekseyruzov
UI

Почему реле активно (горит зеленый) при низком уровне выхода и наоборот?

Всю голову сломал, не могу понять, почему так происходит. Делаю реле времени, задал условия включения и отключения реле по времени, на дисплей вывожу состояние выхода для контроля и вижу, что при активном выходе (ON) реле как бы работает в обратном режиме — светодиод не горит. При нуле на выходе реле активно. Как так?
Я делаю скетч в FLProg. Конечно, можно просто инвертировать выход на реле и тогда все работает как нужно. Но мне хочется разобраться, почему происходит такая ситуация.

Схема FLProg:
5c596d5556710705135015.png

Cкетч, скомпилированный из этой схемы:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1 = 0;
boolean _isNeedClearDisp1;

int _disp2oldLength = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
void setup()
{
  Wire.begin();
  delay(10);
  pinMode(2, OUTPUT);

  _lcd1.init();
  _lcd1.backlight();
}
void loop()
{ if (_isNeedClearDisp1) {
    _lcd1.clear();
    _isNeedClearDisp1 = 0;
  }





  //Плата:1
  if (1) {
    if (! _gen1I) {
      _gen1I = 1;
      _gen1O = 1;
      _gen1P = millis();
    }
  } else {
    _gen1I = 0 ;
    _gen1O = 0;
  }
  if (_gen1I) {
    if ( _isTimer ( _gen1P , 1000 )) {
      _gen1P = millis();
      _gen1O = ! _gen1O;
    }
  }
  digitalWrite(2, _gen1O);
  if (_gen1O) {
    _dispTempLength1 = (String("ON")).length();
    if (_disp2oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp2oldLength = _dispTempLength1;
    _lcd1.setCursor(6, 1);
    _lcd1.print(String("ON"));
  } else {
    if (_disp2oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp2oldLength = 0;
    }
  }




}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long currentTime;
  currentTime = millis();
  if (currentTime >= startTime) {
    return (currentTime >= (startTime + period));
  } else {
    return (currentTime >= (4294967295 - startTime + period));
  }
}
  • Вопрос задан
  • 617 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@lonelymyp
Хочу вылезти из минуса по карме.
Обычно у реле имеется перекидной контакт, пока он замкнут с одним контактом, он разомкнут с другим, при подаче напряжения на реле, срабатывает реле, перекидной контакт размыкается с первым но замыкается со вторым.
Поэтому важно выбрать правильные контакты управляемые реле.

Второй момент это схема управления реле, если один контакт катушки управления реле подсоединён к плюсу то реле будет срабатывать при подаче 0 на реле.

Вобщем стоит обратиться к документации и разобраться по схеме что куда подключено.
Возможно есть несколько вариантов работы реле которые задаются перемычками и выбором нужных контактов.
В худшем случае это китайская плата с реле и там всё работает так как решил сумрачный китайский гений, тогда придётся исправить программу.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
NeiroNx
@NeiroNx
Программист
Потому что китайцы так сделали.
Ответ написан
Комментировать
NikitOS_MV
@NikitOS_MV
Король шутов
Все нормально, такое бывает.
А что, включать на 1 и выключать на 0 обязательно?
Ответ написан
@polus
У вас реле нормально замкнутое, а скетч и ожидание результата как от нормально разомкнутого. Китайцы любят в платах нормально замкнутые ставить.
Ответ написан
Комментировать
alekseyruzov
@alekseyruzov Автор вопроса
UI
решил не ломать голову и инвертировал выход на реле. ну вот нравится мне, чтобы при высоком уровне на реле горел зеленый светодиод, а не наоборот. так логичнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы