правильная смена режимов мигания светодиодов

funkypanky
Offline
Зарегистрирован: 02.02.2015

Добрый день!

Решил сделать переключение нескольких режимов мигания светодиодов посредством 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);}
}



 

com
Offline
Зарегистрирован: 06.09.2013

если porty - целое, то не надо сравнивать его с символами типа '1' или '2'

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Условие выполнения чего либо в loop находится в 24 строке. Что будет, если в сериале не будет ничего введено?

std
Offline
Зарегистрирован: 05.01.2012

Внутри if(Serial.available()) пишем int mode=porty;

свитч вытаскиваем из условия наружу, и пишем там вместо porty mode.

И будет щастье, и станет повторяться.

или без int mode, оставить porty но опрашивать внутри if(Serial), а мотать анимацию switchем снаружи if(Serial).

funkypanky
Offline
Зарегистрирован: 02.02.2015

std пишет:

Внутри 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);}


 

com
Offline
Зарегистрирован: 06.09.2013

дык а порт-то читать кто будет? Serial.read() потеряли

Datak
Offline
Зарегистрирован: 09.10.2014






void loop()
{
   static int mode = '0';

   if ( Serial.available() > 0 )
   {
      mode = Serial.read();
   }
   
   switch( mode )
   .....
   .....

 

funkypanky
Offline
Зарегистрирован: 02.02.2015

Попробовал добавить Serial.read() - но не работает. 

void loop(){
  int porty;
  int mode;
if (Serial.available() > 0) {
  int porty = Serial.read();
  
  int mode = porty;}

Может подскажете как правильно Serial.read() записать в данном случае? Чую что mode писать было необязательно, я же и так на porty ссылаюсь в switch.

 

funkypanky
Offline
Зарегистрирован: 02.02.2015

Datak пишет:







void loop()
{
   static int mode = '0';

   if ( Serial.available() > 0 )
   {
      mode = Serial.read();
   }
   
   switch( mode )
   .....
   .....

 

 

Класс! Всё работает, спасибо за помощь!

funkypanky
Offline
Зарегистрирован: 02.02.2015

А вот ещё вопрос возник - сделал одну анимацию диодов, циклический перебор (лампочки поочерёдно загораются, а потом гаснут)

Но возникает задержка при переключении именно с этого режима мигания по 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);}}

 

Datak
Offline
Зарегистрирован: 09.10.2014

Сама функция  simpleAni2()  выполняется достаточно долго, потому что в ней используется  delay,  да ещё в цикле, то есть много раз. А переключение, при такой структуре программы, происходит только между вызовами функций-режимов.

Значит, надо что-то менять в программе. Проще всего - научить функции режимов прерываться "досрочно", при необходимости. Например, вставить в циклы строку









if( Serial.available() > 0 ) break;


или









if( Serial.available() > 0 ) return;


funkypanky
Offline
Зарегистрирован: 02.02.2015

Datak пишет:

Сама функция  simpleAni2()  выполняется достаточно долго, потому что в ней используется  delay,  да ещё в цикле, то есть много раз. А переключение, при такой структуре программы, происходит только между вызовами функций-режимов.

Значит, надо что-то менять в программе. Проще всего - научить функции режимов прерываться "досрочно", при необходимости. Например, вставить в циклы строку









if( Serial.available() > 0 ) break;


или









if( Serial.available() > 0 ) return;


 

Попробую, спасибо!