Ви не увійшли.
Вы в сетапе переводите пин в UOTPUT? Вот перед этим действием, пропишите туда HIGH, если Вам там HIGH нужен.
1. Пины притянуть резисторами "куда надо".
2. Перед тем, как переключать пин в OUTUP, записать в него то, что в нём должно быть (HIGH, например).
Не совсем понял по второму пункту. Скажите конкретнее, куда и что вписать.
1. Пины притянуть резисторами "куда надо".
2. Перед тем, как переключать пин в OUTUP, записать в него то, что в нём должно быть (HIGH, например).
Добры день! Есть скетч для устройства защиты от протечек. Кран хочу подключить через 4-Канальный Релейный Модуль. Но дело в том, что по скетчу при срабатывании на нужный пин (3-открытие и 12-закрытие) подается HIGH, а 4-Канальный Релейный Модуль работает наоборот - для его включения нужно подать LOW. Пробовал в счетче менять местами HIGH и LOW (при срабатывании подается LOW, в противном случае HIGH). Но не могу решить проблему - при первом включении одновременно срабатывает реле на открытие и закрытие. Я так понимаю, что при первом включении на оба пина подается LOW. Как сделать, чтобы при первом включении на оба пина (3 и 12) подавалось HIGH? Спасибо.
#define alarmLed 6 // индикатор "протечка/уборка"
#define openLed 4 // индикатор состояния "открыто"
#define closeLed 5 // индикатор состояния "закрыто"
#define openRele 3 // реле закрытия крана
#define closeRele 12 // реле открытия крана
#define openButton 10 // кнопка "Открыть" кран
#define closeButton 11 // кнопка "Закрыть" кран
#define resetButton 2 // кнопка "Сброс/Уборка"
#define leaksensor 8 // датчик протечки,при срабатывание на входе LOW
bool leakState = 0;
bool lastleakState = 0;
bool openState=0;
bool lastopenState=0;
bool closeState=0;
bool lastcloseState=0;
bool resetState=0;
bool lastresetState=0;
boolean opS = 0;
boolean clS =0;
boolean leak=0;
boolean wait=0;
int ledStateLeak = LOW;
int ledStateWait = LOW;
boolean new_button_state1 = false;
boolean new_button_state2 = false;
boolean new_button_state3 = false;
boolean old_button_state1 = false;
boolean old_button_state2 = false;
boolean old_button_state3 = false;
unsigned long previousMillis = 0;
unsigned long previousMillisOpen = 0;
unsigned long previousMillisClose = 0;
unsigned long previousMillisWait = 0;
unsigned long previousMillisWaitLed = 0;
unsigned long intervalLeak =500;
unsigned long intervalWaitLed =3000;
unsigned long intervalRele =4000;
unsigned long intervalWait=3600000;
void setup() {
pinMode(alarmLed,OUTPUT);
pinMode(openLed,OUTPUT);
pinMode(closeLed,OUTPUT);
pinMode(openRele,OUTPUT);
pinMode(closeRele,OUTPUT);
pinMode(openButton, INPUT);
pinMode(closeButton, INPUT);
pinMode(resetButton, INPUT);
pinMode(leaksensor, INPUT);
Serial.begin(9600);
}
void loop(){
//**************Анализ состояния входов ***************************
leakState=digitalRead(leaksensor);
leakState=!leakState;
if (leakState != lastleakState) {
if ((leakState == HIGH)&&(wait==0)) {
leak=1; // если сработал датчик протечки устанавливаем статус "протечка"
Serial.println("LEAK");
}
lastleakState = leakState;
}
if (leak==1){
clS=1;
opS=0;
}
openState = digitalRead(openButton);
if (openState != lastopenState) {
if ((openState == HIGH)&&(leak==0)) {
opS=1; // если нажата кнопка "открыть" устанавливаем статус "открыто"
clS=0;
Serial.println("OPEN");
}
lastopenState = openState;
}
closeState = digitalRead(closeButton);
if (closeState != lastcloseState) {
if ((closeState == HIGH) ||(leak==1)) {
opS=0;
clS=1; // если нажата кнопка "закрыть" или статус "протечка" устанавливаем статус "закрыть"
Serial.println("CLOSE");
}
lastcloseState = closeState;
}
resetState = digitalRead(resetButton);
if (resetState != lastresetState) {
if (resetState == HIGH) {
leak=0; // если нажата кнопка "сброс/уборка" сбрасываем статус "протечка" и устанавливаем статус "уборка" и блокируем датчик протечки
wait=1;
previousMillisWait = millis();
Serial.println("RESET");
Serial.println("WAIT");
}
lastresetState = resetState;
}
if((previousMillisWait>0) && (millis()-previousMillisWait >= intervalWait))
{
wait=0; // если прошло 60 минут убираем статус "уборка" и разблокируем датчик протечки
previousMillisWait = 0;
Serial.println("END WAIT");
}
//*************** Управление реле закрытия кранов**************************
new_button_state1 = opS;
if ( (new_button_state1 != old_button_state1) && new_button_state1 )
{
digitalWrite(openRele, HIGH); // если установлен статус "открыто" включаем реле открытия кранов на 4 секунды
previousMillisOpen = millis();
}
old_button_state1 = new_button_state1; // сохраняем изменения
if((previousMillisOpen>0) && (millis()-previousMillisOpen >= intervalRele))
{
digitalWrite(openRele, LOW);
previousMillisOpen = 0;
}
new_button_state2 = clS;
if ( (new_button_state2 != old_button_state2) && new_button_state2 )
{
digitalWrite(closeRele, HIGH); // если установлен статус "закрыто" включаем реле закрытия кранов на 4 секунды
previousMillisClose = millis();
}
old_button_state2 = new_button_state2; // сохраняем изменения
if((previousMillisClose>0) && (millis()-previousMillisClose >= intervalRele))
{
digitalWrite(closeRele, LOW);
previousMillisClose = 0;
}
//*************** управление светодиодами индикации состояния *****************
if (opS==1){
digitalWrite(openLed, HIGH); // если установлен статус "открыто" включаем индикатор состояния "открыто"
}
else {
digitalWrite(openLed, LOW); //иначе выключаем
}
if (clS==1){
digitalWrite(closeLed, HIGH); // если установлен статус "закрыто" включаем индикатор состояния "закрыто"
}
else {
digitalWrite(closeLed, LOW); //иначе выключаем
}
if ((leak==1)&&(wait==0)){
digitalWrite(alarmLed, ledStateLeak); // если "протечка" ,то моргаем индикатор "протечка/уборка" с интервалом равным intervalLeak
}
if ((leak==0)&&(wait==1)){
digitalWrite(alarmLed, ledStateWait); // если "уборка" ,то моргаем индикатор "протечка/уборка" с интервалом равным intervalWaitLed
}
if ((leak==0)&&(wait==0)){
digitalWrite(alarmLed, LOW); // иначе выключаем
}
//********** управление бузером ********
if ( leak==1) // если "протечка" включаем бузер
{
tone(9, 600, 150);
delay(300);
}
//********* задание частоты мигания светодиода *******
unsigned long currentMillis = millis(); // частота моргания для режима "протечка"
if(currentMillis - previousMillis > intervalLeak) {
previousMillis = currentMillis;
if (ledStateLeak == LOW)
ledStateLeak = HIGH;
else
ledStateLeak = LOW;
}
unsigned long currentMillisWaitLed = millis(); // частота моргания для режима "уборка"
if(currentMillisWaitLed - previousMillisWaitLed> intervalWaitLed) {
previousMillisWaitLed = currentMillisWaitLed;
if (ledStateWait == LOW)
ledStateWait = HIGH;
else
ledStateWait = LOW;
}
}