Помогите с кодом для дискретного входа
- Войдите на сайт для отправки комментариев
Вс, 02/12/2012 - 17:53
Доброго времени суток.
Помогите с кусочком программы:
Цель: выводить в потр или через Enthernet sheld команду при замыкании дискретного входа
**/ int pirPin = 7; // присваеваем 7 ноге название pirPin ... ... ... // Настройка портов на вывод pinMode (pirPin, INPUT); // Настройка порта как вход digitalWrite(pirPin, LOW); // Установить на 7 ноге низкий уровень ... ... ... void CheckMotion() { motionDetected = 0; if(digitalRead(pirPin) == HIGH){ Serial.println("yes"); motionDetected = 1; }else{ Serial.println("no"); motionDetected = 0;} }
Вот кусок кода ...
В у меня получается что если на входе LOW в порт постоянно передает "no"
Когда на входе HIGH в порт постоянно передает "yes"
А нужно, чтобы команда выходила один раз только когда меняется значение.
Вот в этом не получается разобратся (мало опыту по программированию)
Недавно написал довольно объемную статью о кнопках. Там есть то что вам нужно.
Вот http://forumdvrobot.ru/forum/3-21-1 Шестой пример кода.
Для этого нужно объявить переменную, которая будет хранить последнее состояние кнопки и когда текущее состояние отлично от последнего, то в этот момент и выводить данные в сериал и текущее состояние кнопки сохранить как последнее.
Эти строки можете удалить, они бессмысленны
если находятся в setup и используются только в начале при настройке.
nestandart: спачибо огромное за ссылку. Очень хорошо описано.
Я немного подкорректировал код под себя:
подскажите как можно сделать опрос только для нескольких портов разом:
Опрос нужных пинов можно сделать, например, записав номера пинов в массив (особенно, если они расположены не друг за другом):
Массив также можно использовать для инициализации этих пинов в setup()
UPD: исходник немного поправил, const забыл
а как быть со старым значанием pin с которым сравниваем и выполняем действие если значание изменилось относительно предыдущего именно этого порта???
Добавьте еще один массив, он будет хранить предыдущие значения. Сравниваете текущие значения со значениями из массива и знаете где что изменилось. После сравнения изменившиеся значения пишите в массив для сравнения в следующем цикле.
Массив для моего примера можно описать так: byte val_array[MAX_PINS] ={ 0, 0, 0, 0 };
как-то не получается?
16 строка, слово byte уберите и в конце точку с запятой не забудьте поставить, т.е.
Вообще конструкция "забавная", такого я еще не видел, чтобы сожрал компилятор, хотя были приколы похлеще. Фактически это объявление локальной переменной, а не запись в существующий массив, потому у Вас "не работает", остальной текст в норме, во всяком случае с первого взгляда.
UPD: Да, еще, помните, что начальные значения в val_array у Вас нули, т.е. LOW. Как вариант, можно туда забить любое значение, не совпадающее с HIGH, LOW, тогда сработают сразу все 4 пина. А если на входах нули, то сработает при первом изменении, а при старте программы - нет.
UPD2: Да, еще в строке 15 замените print на ptintln, будет приятнее выводиться.
мало что понял ещё и запутался в конец
Для начала замените строку 16, на мой вариант, дальше проще
Заменил и в потр сыпится 11=11=11 и т.д.
Исходник приложите, только отформатируйте его нормально (Ctrl-T, если не ошибаюсь). Предполагаю, что Вы там не только это изменили, либо некорректно изменили, всё должно работать.
Насколько я понимаю, Вы пока при отладке меняете состояние только пин 1?
Если 15 строку замените print на println, то будет выводить построчно, а не в одну строку. Надеюсь это несложно найти в строке 15 фрагмент print и заменить его на println?
Большой СПС "kisoft" за помощь
Сел, собрался, и получил:
Ещё сделал сохранение последнего значения порта в EEPROM вдруг напруга пропадёт
А как можно вывести вместо 1 или 0 строку формата "GET /objects/?object=D8&op=m&m=statusChanged&status=%i" для вебсервера на компе.
использую W5100 шилд
К сожалению не подскажу, поскольку даже близко не пользовался библиотеками Ethernet.
А строка у Вас почти готова, вместо %i нужно подставить l_pin_state. Вариантов море, отчасти зависят от возможностей бибилиотеки, которая отправляет строку.
Тупой вариант, что называется, в лоб, это завести буфер, в котором будет отправляться строка, формировать в ней эту строку, потом этот буфер передавать функции, которая отправит её в сеть. Например:
Другой вариант, расположить строку в объекте типа String.
Есть и более сложные варианты.
Вот, еще тупой вариант, возможно и самый простой:
В общем, каждый выбирает себе сам, что ему ближе, а также от ситуации.
Еще, строки большой длины лучше хранить где нибудь в EEPROM или во флешке (PROGMEM), но в этом случае будет несколько сложнее добавить в эту строку состояние пина.