Прерывание. Как заставить моргать диод?
- Войдите на сайт для отправки комментариев
Сб, 18/04/2015 - 13:11
int led = 13; char input; void setup() { // put your setup code here, to run once: pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { if (Serial.available()>0){ input = Serial.read(); if (input == 'a') { digitalWrite(led, LOW); } if (input == 'b') { digitalWrite(led, HIGH); } If (input == 'c') {*вот здесь необходим мешающий диод*} } }
Проблема в том, что диод должен моргать, но сама ардуино при этом продолжать принимать данные с порта. Как быть?
Lapiduss, "с" останавливает и запускает мигание:
Однако, мигание не прирывается...
Lapiduss, изъясняйтесь конкретнее, что должно было ещё прерывать мигание? Символ "с" прерывает.
Необходимо, чтобы ардуино продолжала принимать данные с порта и если что - менять действия диода.
С кодом, что вы скинули - диод просто моргает и всё.. Больше, что бы я не отправлял - всё бесполезно, ни отключения, ничего.
Lapiduss, а символ "с" разве не отключает?
В том-то и беда, что нет..
Lapiduss, сочувствую. Залил скетч, что я дал в сообщении #1, у меня символ "c" и включает и отключает, всё чётко. Значит что-то у вас не так.
Работает включение/выключение диода.(LOW/HIGH)
А вот такая тема
не робит :(
Lapiduss, фантастиш. Попробуйте в 3 строке (скетча в сообщение#1) boolean mig=0;
Безрезультатно.
Lapiduss, так мигать начинает даже без отправки "с" ? Или всё таки после нажатия ? И повторной остыкой "с" не останавливает?
Мигать начинает, но не останавливает.
Lapiduss, попробуйте поменять 14 строку на if (input == 'c') {mig? mig=0 : mig=1 ;}
О! Вот так заработало! Спасибо огромное!
А как собственно такую реализацию можно назвать? Хочу почитать, понять как оно работает. Понятно что булевая переменная, понятно что меняется, понятно что условие, но... НО хотелось бы подробнее.
Lapiduss, А мне интересно, почему у вас не работала команда инверсии mig=~mig. Я не спец по СИ, и всегда пользуюсь этим приёмом, и всегда это работает. Какая у вас версия программы ARDUINO IDE ? По поводу вашего вопроса посмотрите тут , параграф Оператор ?
ps: а попробуйте ещё как было, только вместо ~ это ! , т.е. mig=!mig;
.
Меня больше удивляет, почему она не мигает с самого начала :)
mig=~mig; может не работать как надо, потому что в начале не инициализировано.
boolean mig;
И там может находится мусор. операция "~" делает побитовую инверсию всех 8-ми битов, отведенных под тип boolean.
если содержимое ячейки памяти под mig содержит 00000001 (mig = 1), то ~mig будет содержать 11111110, что тоже логическая 1.
Для boolean переменных правильнее делать так:
Инициализировать
boolean mig = false;
Инвертировать
mig=!mig;
X-Dron, согласен. "!" больше подходит для работы с булами, но ~ тоже обязана работать, мы же её инитили нолём. Всё таки в чем-же причина.. Мне любопытно, но найти причину нет возможности, у меня то всё работает )
Посмотрите внимательно свой код во втором посте инициализации mig нет, только декларация.
Если делать с отключением питания, то действительно будет работать. Если раньше залили другой скетч, затем залили скетч из второго поста без выключения питания, то может и не работать.
X-Dron, не, точно не в этом дело в #9 добавляли =0, не помогло.
Lapiduss, А мне интересно, почему у вас не работала команда инверсии mig=~mig. Я не спец по СИ, и всегда пользуюсь этим приёмом, и всегда это работает. Какая у вас версия программы ARDUINO IDE ? По поводу вашего вопроса посмотрите тут , параграф Оператор ?
ps: а попробуйте ещё как было, только вместо ~ это ! , т.е. mig=!mig;
.
arduino ide 1.6.1
При замене ~ на !, в первом предложенном вами варианте - всё начинает работать должным образом :)