правильная смена режимов мигания светодиодов
- Войдите на сайт для отправки комментариев
Пнд, 02/02/2015 - 06:23
Добрый день!
Решил сделать переключение нескольких режимов мигания светодиодов посредством Serial -соединения. Но возникла небольшая загвоздка - прописываю режим, но он проигрывается не циклично а всего раз. Не пойму в чём может быть ошибка. Подскажите пожалуйста. Режим с миганием у меня назван simpleAni();
Вот сам код:
int ledPin1 =5; int ledPin2 =6; int ledPin3 =9; int ledPin4 =10; int ledPin5 =11; void setup(){ pinMode(ledPin1,OUTPUT); pinMode(ledPin2,OUTPUT); pinMode(ledPin3,OUTPUT); pinMode(ledPin4,OUTPUT); pinMode(ledPin5,OUTPUT); digitalWrite(ledPin1,LOW); digitalWrite(ledPin2,LOW); digitalWrite(ledPin3,LOW); digitalWrite(ledPin4,LOW); digitalWrite(ledPin5,LOW); Serial.begin(9600); } void loop(){ if (Serial.available() > 0) { int porty = Serial.read(); switch (porty){ case '1': simpleBlinkHi(); break; case '2': simpleBlinkLow(); break; case '3': simple123(); break; case '4': simpleAni(); break; default: digitalWrite(ledPin1,LOW); digitalWrite(ledPin2,LOW); digitalWrite(ledPin3,LOW); digitalWrite(ledPin4,LOW); digitalWrite(ledPin5,LOW); } } } void simpleBlinkHi(){ digitalWrite(ledPin1,HIGH); digitalWrite(ledPin2,HIGH); digitalWrite(ledPin3,HIGH); digitalWrite(ledPin4,HIGH); digitalWrite(ledPin5,HIGH); } void simpleBlinkLow(){ digitalWrite(ledPin1,LOW); digitalWrite(ledPin2,LOW); digitalWrite(ledPin3,LOW); digitalWrite(ledPin4,LOW); digitalWrite(ledPin5,LOW); } void simple123(){ digitalWrite(ledPin1,LOW); digitalWrite(ledPin2,HIGH); digitalWrite(ledPin3,LOW); digitalWrite(ledPin4,HIGH); digitalWrite(ledPin5,LOW); } void simpleAni(){ digitalWrite(ledPin1,LOW); digitalWrite(ledPin2,HIGH); digitalWrite(ledPin3,LOW); digitalWrite(ledPin4,HIGH); digitalWrite(ledPin5,LOW); delay(200); digitalWrite(ledPin1,HIGH); digitalWrite(ledPin2,LOW); digitalWrite(ledPin3,HIGH); digitalWrite(ledPin4,LOW); digitalWrite(ledPin5,HIGH); delay(200);} }
если porty - целое, то не надо сравнивать его с символами типа '1' или '2'
Условие выполнения чего либо в loop находится в 24 строке. Что будет, если в сериале не будет ничего введено?
Внутри if(Serial.available()) пишем int mode=porty;
свитч вытаскиваем из условия наружу, и пишем там вместо porty mode.
И будет щастье, и станет повторяться.
или без int mode, оставить porty но опрашивать внутри if(Serial), а мотать анимацию switchем снаружи if(Serial).
Внутри if(Serial.available()) пишем int mode=porty;
свитч вытаскиваем из условия наружу, и пишем там вместо porty mode.
И будет щастье, и станет повторяться.
или без int mode, оставить porty но опрашивать внутри if(Serial), а мотать анимацию switchем снаружи if(Serial).
Попробовал вынести switch наружу, но видимо всё равно что-то не так делаю - не горят лампы с новым кодом. Наверное я неправильно записал условие?
дык а порт-то читать кто будет? Serial.read() потеряли
Попробовал добавить Serial.read() - но не работает.
Может подскажете как правильно Serial.read() записать в данном случае? Чую что mode писать было необязательно, я же и так на porty ссылаюсь в switch.
Класс! Всё работает, спасибо за помощь!
А вот ещё вопрос возник - сделал одну анимацию диодов, циклический перебор (лампочки поочерёдно загораются, а потом гаснут)
Но возникает задержка при переключении именно с этого режима мигания по bluetooth.
Остальные мои режимы быстро переключаются между собой.
Вот мой код:
Это из-за неправильного диапазона значений выходит?
Хотя вроде исправил -указал точное число ламп:
Сама функция simpleAni2() выполняется достаточно долго, потому что в ней используется delay, да ещё в цикле, то есть много раз. А переключение, при такой структуре программы, происходит только между вызовами функций-режимов.
Значит, надо что-то менять в программе. Проще всего - научить функции режимов прерываться "досрочно", при необходимости. Например, вставить в циклы строку
или
Сама функция simpleAni2() выполняется достаточно долго, потому что в ней используется delay, да ещё в цикле, то есть много раз. А переключение, при такой структуре программы, происходит только между вызовами функций-режимов.
Значит, надо что-то менять в программе. Проще всего - научить функции режимов прерываться "досрочно", при необходимости. Например, вставить в циклы строку
или
Попробую, спасибо!