Всю голову сломал, не могу понять, почему так происходит. Делаю реле времени, задал условия включения и отключения реле по времени, на дисплей вывожу состояние выхода для контроля и вижу, что при активном выходе (ON) реле как бы работает в обратном режиме — светодиод не горит. При нуле на выходе реле активно. Как так?
Я делаю скетч в FLProg. Конечно, можно просто инвертировать выход на реле и тогда все работает как нужно. Но мне хочется разобраться, почему происходит такая ситуация.
Схема FLProg:
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));
}
}