правильная смена режимов мигания светодиодов
- Войдите на сайт для отправки комментариев
Пнд, 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 наружу, но видимо всё равно что-то не так делаю - не горят лампы с новым кодом. Наверное я неправильно записал условие?
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(){ int porty; int mode; if (Serial.available() > 0) { int mode = porty;} switch (mode){ 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);}дык а порт-то читать кто будет? Serial.read() потеряли
void loop() { static int mode = '0'; if ( Serial.available() > 0 ) { mode = Serial.read(); } switch( mode ) ..... .....Попробовал добавить Serial.read() - но не работает.
void loop(){ int porty; int mode; if (Serial.available() > 0) { int porty = Serial.read(); int mode = porty;}Может подскажете как правильно Serial.read() записать в данном случае? Чую что mode писать было необязательно, я же и так на porty ссылаюсь в switch.
void loop() { static int mode = '0'; if ( Serial.available() > 0 ) { mode = Serial.read(); } switch( mode ) ..... .....Класс! Всё работает, спасибо за помощь!
А вот ещё вопрос возник - сделал одну анимацию диодов, циклический перебор (лампочки поочерёдно загораются, а потом гаснут)
Но возникает задержка при переключении именно с этого режима мигания по bluetooth.
Остальные мои режимы быстро переключаются между собой.
Вот мой код:
int myLeds[] ={5,6,9,10,11}; ...... ...... ...... ....... void simpleAni2(){ for(int i = 0; i <= myLeds[i]; i++) {digitalWrite(myLeds[i],HIGH); delay(100);} for(int i = myLeds[i]; i >= 0; i--) {digitalWrite(myLeds[i],LOW); delay(100);}}Это из-за неправильного диапазона значений выходит?
Хотя вроде исправил -указал точное число ламп:
void simpleAni2(){ for(int i = 0; i <= 4; i++) {digitalWrite(myLeds[i],HIGH); delay(100);} for(int i = 4; i > 0; i--) {digitalWrite(myLeds[i],LOW); delay(100);}}Сама функция simpleAni2() выполняется достаточно долго, потому что в ней используется delay, да ещё в цикле, то есть много раз. А переключение, при такой структуре программы, происходит только между вызовами функций-режимов.
Значит, надо что-то менять в программе. Проще всего - научить функции режимов прерываться "досрочно", при необходимости. Например, вставить в циклы строку
или
Сама функция simpleAni2() выполняется достаточно долго, потому что в ней используется delay, да ещё в цикле, то есть много раз. А переключение, при такой структуре программы, происходит только между вызовами функций-режимов.
Значит, надо что-то менять в программе. Проще всего - научить функции режимов прерываться "досрочно", при необходимости. Например, вставить в циклы строку
или
Попробую, спасибо!