Странный вывод для RGB

#c #arduino #led

#c #arduino #светодиодный

Вопрос:

Я пытаюсь управлять некоторыми светодиодными лентами с помощью своего мобильного устройства, используя bluetooth Adafruit NeoPixel. Я почти закончил эскиз, но обнаружил, что цифры для RGB отображаются не так, как я ожидал, и я не могу найти, что я делаю неправильно.

Представьте, что со своего мобильного я отправил следующий код RGB «0,19,255», когда я проверяю консоль, я вижу следующий результат:

output.png

Как вы можете видеть, первые две строки в порядке, но в третьей мы видим 2550. 0 не должно быть там, и я не могу понять проблему.

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

 #include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>

SoftwareSerial BT (10, 11);

#define PIN        2
#define NUMPIXELS 144

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRBW   NEO_KHZ800);

int red = "";

void setup() {
  Serial.begin(9600);
  Serial.println("Ready");
  BT.begin(38400);
  pixels.begin();           
  pixels.show();           
  pixels.setBrightness(20);
}

void loop() {
    while (BT.available()>0){
        red = BT.parseInt();
        Serial.println(red);
  }
}
  

Комментарии:

1. String red = ""; red = BT.parseInt(); Если я не ошибаюсь, parseInt возвращает int не строку.

2. @kaylum Упс, ты прав. Я изменил его, но проблема сохраняется.

3. Возможно ли, что между получением «21» и «19» были получены два числа «255» и «0» и что они были проанализированы как «2550»? Не могли бы вы каким-то образом убедиться, что числа анализируются отдельно, например, отправляя что-то промежуточное, что arduino ожидает, но игнорирует. Например, отправить «0X», «21X», «255X», «0X», «19X», «255X». Это позволило бы синхронизировать слишком медленный arduino с тем, что отправляет мобильный телефон.

4. Похоже, что между 255 и 0 нет разделителя : 0,21,2550,19,255 .

5. @zdf Ты более внимательный наблюдатель / читатель, чем я. Я рекомендую сделать ответ.

Ответ №1:

Вы описываете, что для показанного вывода вы отправили через мобильный «0,19,255».
Тем не менее, в показанном выводе это, очевидно, только вторая часть более длинной последовательности отправленных чисел, которая начинается с «0,21».

Предполагая, что то, что вы отправляете, всегда имеет описанный вами формат, то есть три числа, разделенные двумя «,», показанный результат, скорее всего, является результатом того, что вы отправили сначала «0,21,255», а затем еще один триплет «0,19,255».

Эти два сообщения вместе окажутся во входном буфере «0,21,2550,19,255».

Теперь я должен сделать некоторые предположения. Большинство анализаторов, когда им говорят искать числа в буфере, будут искать цифры, за которыми следуют не цифры. В конечном итоге они выдадут «0,21,2550».

Не зная подробностей о работе анализаторов, трудно сказать, как решить вашу проблему.
Однако я бы определенно поэкспериментировал с отправкой триплетов, которые заканчиваются не цифрой.

Например:

«0,21,255»
, или
«0,21,255»
, или
«0,21,255;»

Если ни один из них не работает, вам может потребоваться явно ожидать, что не-цифра, то есть между тройками чисел, считывает символ и либо игнорирует его, либо сравнивает с «,», » » или «;» для дополнительных функций самоконтроля.

(При написании этого я полагаюсь на то, что пользователь zdf не собирается давать ответ, потому что, хотя я определил «2550» как «255» «0», zdf обнаружил только два «,» внутри тела вопроса в примере ввода, который я пропустил. Я, конечно, адаптирую свой ответ к ответу, созданному zdf, чтобы не использовать их вклад без их согласия.)

Комментарии:

1. @zdf Если / когда вы создадите ответ и захотите, чтобы я изменил свой, дайте мне знать.

2. Я в порядке с вашим ответом. : 0)

3. Я последовал за идеей, которую вы дали, и она работает! Спасибо всем за ваши невероятные ответы!