Отправка значения кнопки в порт
- Войдите на сайт для отправки комментариев
Вс, 23/02/2014 - 18:08
Здравствуйте. Имеется следующий скетч. Если кнопка нажата - загорается светодиод. Нажимаем еще раз и светодиод гаснет. Код проверил-работает. Проблема в том, что не получается отправить данные состояния кнопки в порт. Как только не правлю код - в итоге переходит из состояния 0 в состояние 1 только один раз, а дальше сколько не нажимаю-значение в сериал порту не меняется. Целый день туплю - подскажите как можете.
int flag=0; void setup() { pinMode(13, OUTPUT); } void loop() { if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата // и перемення flag равна 0 , то ... { digitalWrite(13,!digitalRead(13)); flag=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { flag=0;//обнуляем переменную flag } }
Вы не тот код выложили.
Вот код. С 98 по 109 строку искомый код. В 131 строке попытка отправить значение состояния канала.
(еше обратил внимание, что при нажатии кнопки происходит изменение данных, считанных с аналоговых портов с 500-510 до 520-530 единиц - тоже не пойму с чем связано)
wenom86, посмотрите свежим взглядом на строчки 102-103 и 107-108. Если кнопка нажата, вы поднимаете флаг, и присваиваете его значение переменной , т.е. каналкн = 1. Как только отпустили кнопку флаг вы сбрасываете, а каналкн присваиваете значение инвертированного флага, т.е. опять он становится единицей.
Сделал
KanalKn1=flag1;
но теперь при нажатии отправляется 1, а при отпускании кнопки -сразу 0.
(Также не пойму в чем дело-при нажатии кнопки происходит изменение данных, считанных с аналоговых портов с 500-510 до 520-530 единиц.)
wenom86, правильно, вы же считали состояние кнопки, а она в единице только в момент нажатия. Если нужно не состояние кнопки, а состояние того выхода, которым ей управляете -то переменную каналкн можно вообще убрать, пишите в блоке вывода сразу состояние выхода, и всё. Serial.println (digitalRead(13)); А по поводу изменения показаний analogRead -судя по всему это наводка. Провода до аналогового входа нужно укоротить или экранировать, или изменить схему включения, что бы резистор "на землю" был прямо на входе контроллера.
спасибо, буду пробовать.
Такой вопрос, у меня переменники, подключенные к analogRead, находятся на расстоянии 2 метров от ардуины, в общем пульте с кнопками. А кнопки подключены не к +, а к земле, и подтяжка включена в виде встроенного резистора 20ком в ардуину.
Есть-ли нюансы в подключении кнопки на питание или на землю, может правильнее к питанию?
Встречал в интернете информацию о желательно воздержаться использовать встроенные резисторы подтяжки - как считаете?
wenom86, по поводу внутренней подтяжки - не вижу никакой разницы, хотите внутреннюю, хотите внешнюю, хотите к земле , хотите к плюсу, -дело личных предпочтений. С наводкой на аналоговый вход можно попробывать бороться RC цепочкой, не факт правда, но может помочь. Непосредственно перед контроллером поставить вот такую цепь, резистор примерно 1 ком, а конденсатор на 10 мкф.