Arduino bluetooth HC 06

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

Доброго времени суток.

Не смог реализовать повторный Serial.available() внутри условия Serial.available.

Может кто-то уже сталкивался с этим.

Задача состоит в том, что нужно зажечь светодиодные ленты WS2812b. 

Алгоритм действий:

1)  Ожидаем появления данных на входе serial с

#include <FastLED.h>
#define LED_PIN     6
#define NUM_LEDS    123
CRGB leds[NUM_LEDS];
const unsigned int DIM1 = 123;
const unsigned int DIM2 = 1;
const unsigned int DIM3 = 3;
int ary[DIM1][DIM2][DIM3];
void setup() {

  Serial.begin(9600);
   FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}

void loop() {
if(Serial.available()){
int  val=Serial.parseInt();
    int chess=val;
    Serial.println(chess);
    delay(1);
    Serial.println('n');
    clear_serail();
  if(Serial.available()){int color=Serial.parseInt(); Serial.println(color);
  if(color>0){
    if(color==124){ ary[chess][1][1]=0;    ary[chess][1][2]=255; ary[chess][1][3]=0; Serial.println(ary[chess][1][1]); Serial.println(ary[chess][1][2]); Serial.println(ary[chess][1][3]);
    
          leds[chess]=CRGB(ary[chess][1][1],ary[chess][1][2],ary[chess][1][3]);
          FastLED.show();
       Serial.println('l');
    clear_serail();
  }
    if(color==125){ ary[chess][1][1]=255;  ary[chess][1][2]=0;   ary[chess][1][3]=0;
    
     
          leds[chess]=CRGB(ary[chess][1][1],ary[chess][1][2],ary[chess][1][3]);
          FastLED.show();
       Serial.println('l');
    clear_serail();
  }}}
  
  
 }
 
}
void clear_serail(){
  Serial.end();    
  Serial.begin(9600);  }

помощью if (Serial.available()){}

2) Принимаем значения int val=Serial.paresInt();

3)Условие сравнивания if(val>123){chess=val;} esle if(val<124){color=val;} т.е номер светодиода это chess, цвет это color

4) На смартфон отправляем 'n', для разрешения отправки следующих данных

5)Ждем уже цвет светодиода на входе serial далее по предыдущему алгоритму 

6)Зажигаем указанный светодиод на указанный цвет. 

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

Kaisarali Kadyrzhan пишет:

Доброго времени суток.

Не смог реализовать повторный Serial.available() внутри условия Serial.available.

Может кто-то уже сталкивался с этим.

Задача состоит в том, что нужно зажечь светодиодные ленты WS2812b. 

Алгоритм действий:

1)  Ожидаем появления данных на входе serial с помощью if (Serial.available()){}

2) Принимаем значения int val=Serial.paresInt();

3)Условие сравнивания if(val>123){chess=val;} esle if(val<124){color=val;} т.е номер светодиода это chess, цвет это color

4) На смартфон отправляем 'n', для разрешения отправки следующих данных

5)Ждем уже цвет светодиода на входе serial далее по предыдущему алгоритму 

6)Зажигаем указанный светодиод на указанный цвет. 

#include <FastLED.h>
#define LED_PIN     6
#define NUM_LEDS    123
CRGB leds[NUM_LEDS];
const unsigned int DIM1 = 123;
const unsigned int DIM2 = 1;
const unsigned int DIM3 = 3;
int ary[DIM1][DIM2][DIM3];
void setup() {

  Serial.begin(9600);
   FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}

void loop() {
if(Serial.available()){
int  val=Serial.parseInt();
    int chess=val;
    Serial.println(chess);
    delay(1);
    Serial.println('n');
    clear_serail();
  if(Serial.available()){int color=Serial.parseInt(); Serial.println(color);
  if(color>0){
    if(color==124){ ary[chess][1][1]=0;    ary[chess][1][2]=255; ary[chess][1][3]=0; Serial.println(ary[chess][1][1]); Serial.println(ary[chess][1][2]); Serial.println(ary[chess][1][3]);
    
          leds[chess]=CRGB(ary[chess][1][1],ary[chess][1][2],ary[chess][1][3]);
          FastLED.show();
       Serial.println('l');
    clear_serail();
  }
    if(color==125){ ary[chess][1][1]=255;  ary[chess][1][2]=0;   ary[chess][1][3]=0;
    
     
          leds[chess]=CRGB(ary[chess][1][1],ary[chess][1][2],ary[chess][1][3]);
          FastLED.show();
       Serial.println('l');
    clear_serail();
  }}}
  
  
 }
 
}
void clear_serail(){
  Serial.end();    
  Serial.begin(9600);  }

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Что значит "Не смог реализовать повторный Serial.available() внутри условия Serial.available."?

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

Да

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

Неправильно понял.

Мне с андроид устройства через HC-06 приходят данные.

Первым делом мне нужно принять входящие данные и проверить все условия и записать принятую цифру в переменную chess, далее отправляю символ n на устройство. Посоле того как устройство получит символ n делает отправку следующих данных. И мне нужно провести условие Serial.available() не выходя из if(Serial.available).

Короткий пример: 

if(Serial.availabe){int val=Serial.parseInt;
Serial.write('n');
if(Serial.available){int val=Serial.parseInt();}
Serial.write('n');}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строке №22 Вы очистили Serial - там точно ничего нет. И тут же в строке №23 проверяете есть ли там что-то. Вы и впрямь ожидаете, что там что-то окажется? Нет, ну, возможно, конечно, что именно в эту микросекунду (после очистки, но до проверки) туда что-то прилетит, но какова вероятность этого? Так что условие в строке №23 практически всегда будет ложным. А Вы чего-то другого ожидали?

Morroc
Offline
Зарегистрирован: 24.10.2016

Kaisarali Kadyrzhan пишет:

  if(Serial.available()){int color=Serial.parseInt(); Serial.println(color);

Имхо где то тут косяк, не надо их вкладывать друг в друга. Если в эту долю секунды в сериале пусто оно у вас вываливается во внешний цикл и снова ждет chess. Чтобы все не переделывать сделайте одну проверку на if(Serial.available()), а внутри, считав значение, присваивайте его chess если chess = 0 или color если chess != 0, для сброса можно придумать типа color = 999 значит chess = 0 и color = 0. Можно завести отдельный флаг/счетчик по которому будет видно какой именно параметр ждем в текущий момент. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Kaisarali Kadyrzhan пишет:

Неправильно понял.

Мне с андроид устройства через HC-06 приходят данные.

Первым делом мне нужно принять входящие данные и проверить все условия и записать принятую цифру в переменную chess, далее отправляю символ n на устройство. Посоле того как устройство получит символ n делает отправку следующих данных.

Какое отношение имеет то, что написано выше, к тому, что написано ниже?

Цитата:

И мне нужно провести условие Serial.available() не выходя из if(Serial.available).

Короткий пример: 

if(Serial.availabe){int val=Serial.parseInt;
Serial.write('n');
if(Serial.available){int val=Serial.parseInt();}
Serial.write('n');}

Ну, сделали. Работает оно именно так, как Вы написали. Что еще нужно?

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

Точно, не подумал.

А как подсчитать время выполнения Serial.raed(); и Serial.begin(9600); чтобы поставить задержку перед отправкой на смартфоне? 

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

Нужно буфер очистить. Потому что Serial.parseInt принимает и предыдущие значения.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не нужна задержка. Забудьте о ней. Serial.available() для того и нужна, чтобы не использовать никаких задержек.

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

А буфер как очистить?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Зачем Вам буфер чистить?

Решайте свою задачу и не выдумывайте лишних действий, которые не ведут к решению Вашей задачи.

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

Если не очищать буфер при втором Serial.parseInt();  у меня получится каша с предыдущими и новыми данными

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну так а кто делает эту кашу?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Kaisarali Kadyrzhan, открою Вам страшную тайну: в подавляющем большинстве случаев наилучшим образом работает правило "контроллер должен делать то, что бы делал человек на его месте".

Представьте себя на месте контроллера. Пусть это к Вам приходят данные. Чтобы соблюсти масштаб времени, представьте, что 1 байт приходит раз в одну или несколько минут.

Подробно опишите словами по-русски, что бы лично Вы стали делать, чтобы принять нужную информацию.

Kaisarali Kadyrzhan
Offline
Зарегистрирован: 13.12.2020

Могу ли я вам позвонить или ЛС написать?

 

b707
Offline
Зарегистрирован: 26.05.2017

Kaisarali Kadyrzhan пишет:

Могу ли я вам позвонить или ЛС написать?

ЛС тут нет, а телефон вам андриано вряд ли даст. Я бы на его месте не дал :)

Учитесь выражать мысли письменно. Это крайне важно для программиста.