Система сигнализации протечек

Nadeo
Offline
Зарегистрирован: 26.03.2021

Здравствуйте, имею проблему, ардуино нано, не могу заставить это реагировать на изменения логического сигнала на пинах, при включении в сериал порте сразу же сообщение о том что сработал пин 2, хотя ничего не подключено, измеряю тестером напряжение между землей и пином 2 вижу 0, причем при смене платы на аналогичную но купленную в другое время и в другом магазине замыкая любой пин из использующихся на пин 5В ничего не происходит, прошу помочь

вот такой код:


/*
  Система сигнализации протечек.
  Имеем 4 зоны контроля и 6 датчиков
  Кухня, под ванной, 3 под стиральной машиной, 2 в стояке с коммуникациями
  При срабатывании любого датчика включается сигнализация на 30 сек.
  В перспективе подключение к SIM800L для отправки СМС на телефон
  - Подключение датчиков: пины 2-8
  - Для сигнализации временно используем встроенный светодиод на пине 13
*/
byte kitchen = digitalRead(2);
byte bath = digitalRead(3);
byte washer1 = digitalRead(4);
byte washer2 = digitalRead(5);
byte washer3 = digitalRead(6);
byte sewerage1 = digitalRead(7);
byte sewerage2 = digitalRead(8);


void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (kitchen == HIGH) {
    alarmOn();
    Serial.println("сработал kitchen");
  }
  else Serial.println("Проверен kitchen");
  if (bath == HIGH) {
    alarmOn();
    Serial.println("сработал bath");
  }
  else Serial.println("Проверен bath");
  if (washer1 == HIGH) {
    alarmOn();
    Serial.println("сработал washer1");
  }
  else Serial.println("Проверен washer1");
  if (washer2 == HIGH) {
    alarmOn();
    Serial.println("сработал washer2");
  }
  else Serial.println("Проверен washer2");
  if (washer3 == HIGH) {
    alarmOn();
    Serial.println("сработал washer3");
  }
  else Serial.println("Проверен washer3");
  if (sewerage1 == HIGH) {
    alarmOn();
    Serial.println("сработал sewerage1");
  }
  else Serial.println("Проверен sewerage1");
  if (sewerage2  == HIGH) {
    alarmOn();
    Serial.println("сработал sewerage2");
  }
  else Serial.println("Проверен sewerage2");
  delay(1000);

}


void alarmOn() {
  Serial.println("ALARM");
  digitalWrite(13, 1);
}
sadman41
Offline
Зарегистрирован: 19.10.2016

Вопрос №1. Радиоприемник имеете? Откуда там берется шум - думали?

Вопрос №2. Это зачем сделано в начале скетча?

byte kitchen = digitalRead(2);
byte bath = digitalRead(3);
byte washer1 = digitalRead(4);
byte washer2 = digitalRead(5);
byte washer3 = digitalRead(6);
byte sewerage1 = digitalRead(7);
byte sewerage2 = digitalRead(8);
Nadeo
Offline
Зарегистрирован: 26.03.2021

1. про шум знаю, но только на аналоговых пинах про такое слышал, думал что цифровые этому если и подвержены то алгоритм всеравно не сработает без должных 5в или опорного напряжения как минимум (его же наводками не получить?)

Исправлять наводки пробовал и с помощью INPUT_PULLUP и с помощью своего резистора, но всеравно все работало только в одну сторону, то есть либо срабатывало и не отключалось при отсоединении пина, или просто не срабатывало

2. изначально переменные были объявлены с помощью #define, но тогда тоже что-то не срослось. я подумал что не совсем корректно будет объявлять их в цикле loop так как смысла проходить по ним постоянно я не видел.

я кажись понял зачем их объявлять в цикле loop)

sadman41
Offline
Зарегистрирован: 19.10.2016

1) Заблуждение. Влиянию помех подвержено всё, что торчит из микроконтроллера.

2) Т.е. система от протечек должна контролировать состояние окружающей среды только в момент старта МК. Ну, ОК, это Ваша идея и ноу-хау.

Nadeo
Offline
Зарегистрирован: 26.03.2021

как избавиться от шумаа на цифровых пинах чтобы не было ложных срабатываний?

sadman41
Offline
Зарегистрирован: 19.10.2016

Так, как и делали ранее - через резисторные подтяжки.

https://www.arduino.cc/en/Tutorial/BuiltInExamples/Button

Nadeo
Offline
Зарегистрирован: 26.03.2021

я думал только с кнопками работает, а через INPUT_PULLUP есть рабочие конфигурации, или нужно резистор на каждый пин вешать?

sadman41
Offline
Зарегистрирован: 19.10.2016

Резистор надежней. На столе и pullup подойдёт.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nadeo пишет:

не могу заставить это реагировать на изменения логического сигнала на пинах

Не просто не можете, а даже не пытаетесь. Вы ведь нигде и никогда не читаете состояние пинов, кроме одного раза в самом начале (ещё до исполнения setup).

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Попробуйте так:

/*
  Система сигнализации протечек.
  Имеем 4 зоны контроля и 6 датчиков
  Кухня, под ванной, 3 под стиральной машиной, 2 в стояке с коммуникациями
  При срабатывании любого датчика включается сигнализация на 30 сек.
  В перспективе подключение к SIM800L для отправки СМС на телефон
  - Подключение датчиков: пины 2-8
  - Для сигнализации временно используем встроенный светодиод на пине 13
*/
void sense_it()
{
boolean kitchen = digitalRead(2);
boolean bath = digitalRead(3);
boolean washer1 = digitalRead(4);
boolean washer2 = digitalRead(5);
boolean washer3 = digitalRead(6);
boolean sewerage1 = digitalRead(7);
boolean sewerage2 = digitalRead(8);
}

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
sense_it();
  if (kitchen) {
    alarmOn();
    Serial.println("сработал kitchen");
  }
  else Serial.println("Проверен kitchen");
  if (bath ) {
    alarmOn();
    Serial.println("сработал bath");
  }
  else Serial.println("Проверен bath");
  if (washer1 ) {
    alarmOn();
    Serial.println("сработал washer1");
  }
  else Serial.println("Проверен washer1");
  if (washer2 ) {
    alarmOn();
    Serial.println("сработал washer2");
  }
  else Serial.println("Проверен washer2");
  if (washer3 ) {
    alarmOn();
    Serial.println("сработал washer3");
  }
  else Serial.println("Проверен washer3");
  if (sewerage1 ) {
    alarmOn();
    Serial.println("сработал sewerage1");
  }
  else Serial.println("Проверен sewerage1");
  if (sewerage2  ) {
    alarmOn();
    Serial.println("сработал sewerage2");
  }
  else Serial.println("Проверен sewerage2");
  delay(1000);


}


void alarmOn() {
  Serial.println("ALARM");
  digitalWrite(13, 1);
}

или так:

/*
  Система сигнализации протечек.
  Имеем 4 зоны контроля и 6 датчиков
  Кухня, под ванной, 3 под стиральной машиной, 2 в стояке с коммуникациями
  При срабатывании любого датчика включается сигнализация на 30 сек.
  В перспективе подключение к SIM800L для отправки СМС на телефон
  - Подключение датчиков: пины 2-8
  - Для сигнализации временно используем встроенный светодиод на пине 13
*/


void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  if (digitalRead(нужный вывод)) {
    alarmOn();
    Serial.println("сработал kitchen");
  }
  else Serial.println("Проверен kitchen");
  if (bath ) {
    alarmOn();
    Serial.println("сработал bath");
  }
  else Serial.println("Проверен bath");
  if (digitalRead(нужный вывод) ) {
    alarmOn();
    Serial.println("сработал washer1");
  }
  else Serial.println("Проверен washer1");
  if (digitalRead(нужный вывод) ) {
    alarmOn();
    Serial.println("сработал washer2");
  }
  else Serial.println("Проверен washer2");
  if (digitalRead(нужный вывод) ) {
    alarmOn();
    Serial.println("сработал washer3");
  }
  else Serial.println("Проверен washer3");
  if (digitalRead(нужный вывод) ) {
    alarmOn();
    Serial.println("сработал sewerage1");
  }
  else Serial.println("Проверен sewerage1");
  if (digitalRead(нужный вывод) ) {
    alarmOn();
    Serial.println("сработал sewerage2");
  }
  else Serial.println("Проверен sewerage2");
  delay(1000);


}


void alarmOn() {
  Serial.println("ALARM");
  digitalWrite(13, 1);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alexey_Rem пишет:

Попробуйте так:

/*
  Система сигнализации протечек.
  Имеем 4 зоны контроля и 6 датчиков
  Кухня, под ванной, 3 под стиральной машиной, 2 в стояке с коммуникациями
  При срабатывании любого датчика включается сигнализация на 30 сек.
  В перспективе подключение к SIM800L для отправки СМС на телефон
  - Подключение датчиков: пины 2-8
  - Для сигнализации временно используем встроенный светодиод на пине 13
*/
void sense_it()
{
boolean kitchen = digitalRead(2);
boolean bath = digitalRead(3);
boolean washer1 = digitalRead(4);
boolean washer2 = digitalRead(5);
boolean washer3 = digitalRead(6);
boolean sewerage1 = digitalRead(7);
boolean sewerage2 = digitalRead(8);
}

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
sense_it();
  if (kitchen) {
    alarmOn();
    Serial.println("сработал kitchen");
  }
  else Serial.println("Проверен kitchen");
  if (bath ) {
    alarmOn();
    Serial.println("сработал bath");
  }
  else Serial.println("Проверен bath");
  if (washer1 ) {
    alarmOn();
    Serial.println("сработал washer1");
  }
  else Serial.println("Проверен washer1");
  if (washer2 ) {
    alarmOn();
    Serial.println("сработал washer2");
  }
  else Serial.println("Проверен washer2");
  if (washer3 ) {
    alarmOn();
    Serial.println("сработал washer3");
  }
  else Serial.println("Проверен washer3");
  if (sewerage1 ) {
    alarmOn();
    Serial.println("сработал sewerage1");
  }
  else Serial.println("Проверен sewerage1");
  if (sewerage2  ) {
    alarmOn();
    Serial.println("сработал sewerage2");
  }
  else Serial.println("Проверен sewerage2");
  delay(1000);


}


void alarmOn() {
  Serial.println("ALARM");
  digitalWrite(13, 1);
}

Вы пытались это скомпилировать, прежде, чем советовать человеку?

Или это просто троллинг?

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Не пытался, это просто для размышления 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Сомневаюсь я, что вы узнаете чему булевые переменные равны ВНЕ области своей видимости. 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Да он и не скомпилируеться.