Сигналка
- Войдите на сайт для отправки комментариев
Пт, 09/07/2021 - 22:32
Всем привет! Прошу помощи со скетчем. Уже давно им занимаюсь , но не могу дать ладу. Итак:
При подаче питания на ардуино и нажатия кнопки на пульте on/off, микроконтроллер опрашивает порты с 12 по 19 и сохраняет их состояние в массив arr(напримет 12, 14, 16 высокий уровень сигнала, остальные низкий). После чего запускается цикл loop который который снова опрашивает эти же порты(т.е. постоянно следит за их состоянием и сравнивает с эталонным, что записано в setup в массив arr.)и если оно отличается, что срабатывает тревога и на пин 3 подается высокий уровень.
Вот выстраданный скетч, который прошу Вас помочь привести в нормальное состояние:
#include "IRremote.h" //библиотека работы с ик приёмником IRrecv irrecv(2); // на этом пине висит ИК приёмник decode_results results; // декодирование сигнала с ИК приемника int led1=0; // Включает и выключает сигнализацию //int led2=0; // пока в резерве int vhod0 = A0; //присваиваю переменным пины для удобства int vhod1 = A1; int vhod2 = A2; int vhod3 = A3; int vhod4 = A4; int vhod5 = A5; int vhod6 = 13; int vhod7 = 12; //исходящие сигналы с пинов ардуино на микросхему ULN2803 int signal0 = 3; int signal1 = 4; int signal2 = 5; int signal3 = 6; int signal4 = 7; int signal5 = 8; int signal6 = 9; int signal7 = 10; int arr [8]; //определяем массив на 8 элементов void setup() { Serial.begin(9600); for (int i = 12; i <= 19; i++) // тут я опрашиваю с помощью цикла пины и сохраняю их состояние(коллекцию) в массив { pinMode(i, INPUT); // назначаю i как вход и опрашиваю пины arr[i - 12] = digitalRead(i); // с 12го пина по 19 записую в массив их состояние } } void loop() { if ( irrecv.decode( &results )) { Serial.println(results.value, HEX); //вывожу на монитор код нажатой кнопки пульта } //************************** if (results.value==0xFF30CF&&led1==0){ for (int i = 13; i <= 19; i++) { if (arr[i - 13] != digitalRead(i)) // тут я снова с помощью цикла сравниваю состояние пинов с сохранённым в массиве { digitalWrite( signal0, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ digitalWrite( signal1, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ digitalWrite( signal2, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ digitalWrite( signal3, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ digitalWrite( signal4, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ digitalWrite( signal5, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ digitalWrite( signal6, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ digitalWrite( signal7, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ } } } if (results.value==0xFF30CF&&led1==1){ digitalWrite( signal0, LOW );led1=0;results.value=0; //выключаем сирену digitalWrite( signal1, LOW );led1=0;results.value=0; //выключаем сирену digitalWrite( signal2, LOW );led1=0;results.value=0; //выключаем сирену digitalWrite( signal3, LOW );led1=0;results.value=0; //выключаем сирену digitalWrite( signal4, LOW );led1=0;results.value=0; //выключаем сирену digitalWrite( signal5, LOW );led1=0;results.value=0; //выключаем сирену digitalWrite( signal6, LOW );led1=0;results.value=0; //выключаем сирену digitalWrite( signal7, LOW );led1=0;results.value=0; //выключаем сирену } }
Какая помощь требуется? Что работает не так? Задавайте конкретные вопросы, просто так тратить время на переписывание вашего кода никто не будет.
Каковы критерии «нормального состояния»?
"Каковы критерии «нормального состояния»?" Что вы имеете ввиду?
Я не пойму почему , но не работает скетч!
Каждый раз по разному вылезают косяки.
Должно быть так:
8 входов. Их опрашивает цикл и сохраняет в массив состояние каждого входа {0, 0, 0, 1, 1, 0,1, 1} - например
вторым циклом в loop он сравнивает состоян7ие датчиков с коллекцией в массиве и если они отличаются, то срабатывает сигнализация.
У меня же или постоянно "0" все коллекции или же "1" и не реагирует никак на изменение напряжения на вход ардуино. Вообщем не работает !(.
Я не прошу Вас написать за меня скетч, прошу помочь объяснить где ошибка! Делаю тоже самое на C# в visualstudio (в качестве датчиков использую ввод с консоли - все работает) тут гад не хочет.
Может быть это потому, что вы хрен знает что считываете и хрен знает с чем сравниваете? Посмотрите внимательно на это и скажите, в каком конкретно месте вы считываете, например, состояние пина А4?
Ну и в догонку - а подтяжку пинов не забыли сделать?
ssipk, почему у Вас в строке 35 [i-12], а в строке 51 [i-13]?
ssipk, почему у Вас в строке 35 [i-12], а в строке 51 [i-13]?
Сережа С выучил так, что советы давать решил? Малацца. Пока - неуд. Циклы разные
Всем привет! Прошу помощи со скетчем. Уже давно им занимаюсь , но не могу дать ладу. Итак:
При подаче питания на ардуино и нажатия кнопки на пульте on/off, микроконтроллер опрашивает порты с 12 по 19 и сохраняет их состояние в массив arr(напримет 12, 14, 16 высокий уровень сигнала, остальные низкий). После чего запускается цикл loop который который снова опрашивает эти же порты(т.е. постоянно следит за их состоянием и сравнивает с эталонным, что записано в setup в массив arr.)и если оно отличается, что срабатывает тревога и на пин 3 подается высокий уровень.
Вот выстраданный скетч, который прошу Вас помочь привести в нормальное состояние:
это я тупанул когда сюда писал ИСПРАВИЛ
Вы так и не написали - подтяжка имеется внешняя или нет?
подтяжка через резистор 10К на землю
Почему решили, что не срабатывает? Может быть срабатывает, но очень быстро?
В каждую ветку операторов if() вставьте отладочный Serial.println() и проверьте...
Мельком глянул скетч, как недоучка заметил, что у вас 64 строка своим условием сразу отсекает предыдущее. То есть если что то сработало, то тут же и выключилось, а вы ничего не почувствовали :-)
Мельком глянул скетч, как недоучка заметил, что у вас 64 строка своим условием сразу отсекает предыдущее. То есть если что то сработало, то тут же и выключилось, а вы ничего не почувствовали :-)
int
led1=0;
// Включает и выключает сигнализацию
Для повторного отлова не хватает
irrecv.resume()
After receiving, this must be called to reset the receiver and prepare it to receive another code.
Ssipk
Ничего подобного. Между строчками 48 и 64 вы код с приемника не читаете, поэтому используется прежний. У вас на включение и выключение код одинаковый, поэтому стоит в 48стр что-то включить, как оно в 64 тут же выключится, буквально через миллисекунду
И еще - если вы сами не можете разобраться и пришли с проблемой на форум - не надо спорить с теми, кто хочет помочь.. По коду очевидно, что в программировании вы ноль, так что слушайте что вам говорят
Мельком глянул скетч, как недоучка заметил, что у вас 64 строка своим условием сразу отсекает предыдущее. То есть если что то сработало, то тут же и выключилось, а вы ничего не почувствовали :-)
int
led1=0;
// Включает и выключает сигнализацию
Может и ошибаюсь :-)
Просто на другом форуме мне давно заметили на недопустимость писания подряд if без else. Пару раз наколовшись я разобрался когда можно, а когда нет. Вы тоже разберётесь.
Lilik, в if без else ничего страшного нет, если правильно расставить скобки. Насколько я вижу, у ТС в этом проблемы нет.
Ничего подобного. Между строчками 48 и 64 вы код с приемника не читаете, поэтому используется прежний. У вас на включение и выключение код одинаковый, поэтому стоит в 48стр что-то включить, как оно в 64 тут же выключится, буквально через миллисекунду
Ну, он там обнуляет value, однако подход к построению кода такой, что объяснить что там глючит, примерно то же самое, что объяснять, почему иногда, если бить по ноге палкой, она ломается, а иногда нет.
Точно, обнуляет, тогда 64 строка должна не срабатывать сразу после 63 :-(
А зачем он обнуляет value? ТС попробуйте не обнулять, добавить "элсе" перед 64-чисто для проверки гипотезы.
И скобку из 46 переставить в 76.
Т.е. то что опрос идёт только если с пульта пришла команда, это нормально ?
Зачем столько раз повторять одни и те же команды ?
ssipk, почему у Вас в строке 35 [i-12], а в строке 51 [i-13]?
Кто о чем, а вшивый о бане!
Влад, ты первый в теме, кто заинтересовался именно Си.
Не нужно быть специалистом по Си, чтобы понять, что 35 строке значение прочитанное с пина i заносится в [i-12]-ю ячейку массива, а в строке 51 значение с того же самого пина сравнивается уже с [i-13]-й ячейкой.
Вот я и поинтересовался, почему такой разнобой.
Если ты в состоянии ответить на мой вопрос, я внимательно слушаю, а если нет, к чему было влезать в тему с не относящимися к ней замечаниями?