Система сигнализации протечек
- Войдите на сайт для отправки комментариев
Сб, 29/05/2021 - 18:13
Здравствуйте, имею проблему, ардуино нано, не могу заставить это реагировать на изменения логического сигнала на пинах, при включении в сериал порте сразу же сообщение о том что сработал пин 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); }
Вопрос №1. Радиоприемник имеете? Откуда там берется шум - думали?
Вопрос №2. Это зачем сделано в начале скетча?
1. про шум знаю, но только на аналоговых пинах про такое слышал, думал что цифровые этому если и подвержены то алгоритм всеравно не сработает без должных 5в или опорного напряжения как минимум (его же наводками не получить?)
Исправлять наводки пробовал и с помощью INPUT_PULLUP и с помощью своего резистора, но всеравно все работало только в одну сторону, то есть либо срабатывало и не отключалось при отсоединении пина, или просто не срабатывало
2. изначально переменные были объявлены с помощью #define, но тогда тоже что-то не срослось. я подумал что не совсем корректно будет объявлять их в цикле loop так как смысла проходить по ним постоянно я не видел.
я кажись понял зачем их объявлять в цикле loop)
1) Заблуждение. Влиянию помех подвержено всё, что торчит из микроконтроллера.
2) Т.е. система от протечек должна контролировать состояние окружающей среды только в момент старта МК. Ну, ОК, это Ваша идея и ноу-хау.
как избавиться от шумаа на цифровых пинах чтобы не было ложных срабатываний?
Так, как и делали ранее - через резисторные подтяжки.
https://www.arduino.cc/en/Tutorial/BuiltInExamples/Button
я думал только с кнопками работает, а через INPUT_PULLUP есть рабочие конфигурации, или нужно резистор на каждый пин вешать?
Резистор надежней. На столе и pullup подойдёт.
не могу заставить это реагировать на изменения логического сигнала на пинах
Не просто не можете, а даже не пытаетесь. Вы ведь нигде и никогда не читаете состояние пинов, кроме одного раза в самом начале (ещё до исполнения setup).
Попробуйте так:
или так:
Попробуйте так:
Вы пытались это скомпилировать, прежде, чем советовать человеку?
Или это просто троллинг?
Не пытался, это просто для размышления
Сомневаюсь я, что вы узнаете чему булевые переменные равны ВНЕ области своей видимости.
Да он и не скомпилируеться.