#c #arduino #led
#c #arduino #светодиодный
Вопрос:
Я пытаюсь управлять некоторыми светодиодными лентами с помощью своего мобильного устройства, используя bluetooth Adafruit NeoPixel. Я почти закончил эскиз, но обнаружил, что цифры для RGB отображаются не так, как я ожидал, и я не могу найти, что я делаю неправильно.
Представьте, что со своего мобильного я отправил следующий код RGB «0,19,255», когда я проверяю консоль, я вижу следующий результат:
Как вы можете видеть, первые две строки в порядке, но в третьей мы видим 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. Я последовал за идеей, которую вы дали, и она работает! Спасибо всем за ваши невероятные ответы!