Arduino bluetooth HC 06
- Войдите на сайт для отправки комментариев
Вс, 27/12/2020 - 10:44
Доброго времени суток.
Не смог реализовать повторный 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)Зажигаем указанный светодиод на указанный цвет.
Доброго времени суток.
Не смог реализовать повторный 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); }Что значит "Не смог реализовать повторный Serial.available() внутри условия Serial.available."?
Да
Неправильно понял.
Мне с андроид устройства через 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');}В строке №22 Вы очистили Serial - там точно ничего нет. И тут же в строке №23 проверяете есть ли там что-то. Вы и впрямь ожидаете, что там что-то окажется? Нет, ну, возможно, конечно, что именно в эту микросекунду (после очистки, но до проверки) туда что-то прилетит, но какова вероятность этого? Так что условие в строке №23 практически всегда будет ложным. А Вы чего-то другого ожидали?
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. Можно завести отдельный флаг/счетчик по которому будет видно какой именно параметр ждем в текущий момент.
Неправильно понял.
Мне с андроид устройства через 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');}Ну, сделали. Работает оно именно так, как Вы написали. Что еще нужно?
Точно, не подумал.
А как подсчитать время выполнения Serial.raed(); и Serial.begin(9600); чтобы поставить задержку перед отправкой на смартфоне?
Нужно буфер очистить. Потому что Serial.parseInt принимает и предыдущие значения.
Не нужна задержка. Забудьте о ней. Serial.available() для того и нужна, чтобы не использовать никаких задержек.
А буфер как очистить?
Зачем Вам буфер чистить?
Решайте свою задачу и не выдумывайте лишних действий, которые не ведут к решению Вашей задачи.
Если не очищать буфер при втором Serial.parseInt(); у меня получится каша с предыдущими и новыми данными
Ну так а кто делает эту кашу?
Kaisarali Kadyrzhan, открою Вам страшную тайну: в подавляющем большинстве случаев наилучшим образом работает правило "контроллер должен делать то, что бы делал человек на его месте".
Представьте себя на месте контроллера. Пусть это к Вам приходят данные. Чтобы соблюсти масштаб времени, представьте, что 1 байт приходит раз в одну или несколько минут.
Подробно опишите словами по-русски, что бы лично Вы стали делать, чтобы принять нужную информацию.
Могу ли я вам позвонить или ЛС написать?
Могу ли я вам позвонить или ЛС написать?
ЛС тут нет, а телефон вам андриано вряд ли даст. Я бы на его месте не дал :)
Учитесь выражать мысли письменно. Это крайне важно для программиста.