Ви не увійшли.
[Решено, см. последнее сообщение]
Здравствуйте.
Есть небольшой проект. Заключается он в том, что-бы управлять яркостью LED-матрицы с помощью ШИМ по Bluetooth с телефона, используя небольшое приложение с ползунком для отправления значений от 0 до 255.
В качестве Bluetooth-модуля я использую HC-06, а плата - Arduino Uno.
Есть готовый скетч для управления яркостью:
int led = 11;
int brightness;
String fadeAmount;
void setup() {
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
delay(10);
}
void loop() {
if (Serial.available()) {
fadeAmount = Serial.readString();
if (fadeAmount != "-1")
{
Serial.print("In:");
Serial.println(fadeAmount);
brightness = fadeAmount.toInt();
Serial.print("Out:");
Serial.println(brightness);
analogWrite(led, brightness);
}
}
}
Приложение с GUI я делал на App Inventor. Состоит оно из
ListWidget для отображения сопряженных устройств
Кнопки для их поиска
Ползунка с диапазоном значений 0-255
Блоков горизонтального и вертикального расположения
Ссылка на файл проекта App Inventor: https://drive.google.com/file/d/1MaHsFE … sp=sharing
Теперь непосредственно к самой проблеме:
После успешного подключения я плавно меняю положение ползунка. При каждом его смещении, при этом не отпуская палец, значения отправляются мгновенно. Но вместо того, чтобы отослать значение, на котором я отпустил палец, они отправляются мгновенно и склеиваются в одно огромное значение, которое отсылается по Bluetoooth. В результате, Arduino обрабатывает значение, отсылает на пин 11 и после этого яркость стает совсем противоположной тому, что должно было придти.
Вопрос:
Как сделать отправку значений только после того, как я отпущу палец с ползунка?
Остання редакція artm (2019-01-22 22:42:03)
Неактивний
Вопрос:
Вы думаете, что все кинутся устанавливать App Inventor чтобы посмотреть, что вы там на программировали ?
А вот судя по приведенному скетчу он так и должен работать как вы и описали.
совет - используйте readStringUntil() ...
Остання редакція renoshnik (2019-01-17 10:04:09)
Неактивний
Вопрос:
Вы думаете, что все кинутся устанавливать App Inventor чтобы посмотреть, что вы там на программировали ?
Его необязательно скачивать, достаточно залогиниться на сайте под аккаунтом Гугла и импортировать проект. Я просто закинул исходники того приложения.
Если нет возможности посмотреть-кидаю ссылку на скриншот кода: https://drive.google.com/file/d/1fi6RRU … p=drivesdk
совет - используйте readStringUntil() ...
Прочитав документацию, я так понял, что функция считывает значение, пока я не получу нужное.
Но мне нужно ждать значения от 0 до 255, а не ожидать какое-то определенное. Как в этом случае сделать?
Неактивний
renoshnik пише:совет - используйте readStringUntil() ...
Прочитав документацию, я так понял, что функция считывает значение, пока я не получу нужное.
Но мне нужно ждать значения от 0 до 255, а не ожидать какое-то определенное. Как в этом случае сделать?
вы после каждого значения ставьте "маркер" тогда значения будут читаться раздельно и сохранится только последнее значение.
Неактивний
Простите, ко мне не доходит. Что имеется ввиду под маркером? Как именно его делать?
http://wikihandbk.com/wiki/Arduino:%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Arduino/%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/Serial/readStringUntil()
Завершает свою работу, если наткнется на терминальный символ или если выйдет время.
terminator — искомый символ (char)
Неактивний
artm пише:Простите, ко мне не доходит. Что имеется ввиду под маркером? Как именно его делать?
http://wikihandbk.com/wiki/Arduino:%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Arduino/%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/Serial/readStringUntil()
Завершает свою работу, если наткнется на терминальный символ или если выйдет время.
terminator — искомый символ (char)
Отредактировал скетч:
int led = 11;
int brightness;
String fadeAmount;
void setup() {
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
delay(10);
}
void loop() {
if (Serial.available()) {
fadeAmount = Serial.readStringUntil(";");
Serial.print("In:");
Serial.println(fadeAmount);
brightness = fadeAmount.toInt();
Serial.print("Out:");
Serial.println(brightness);
analogWrite(led, brightness);
}
}
В коде приложения добавил к значениям ползунка маркер ";" . Вроде-бы я понял суть работы функции, но , как бы ни было очевидно, отправляется первое значение, с которого я начал. Как считывать именно последнее?
(Сразу извиняюсь за большое количество вопросов)
Остання редакція artm (2019-01-19 11:40:01)
Неактивний
Вот запись с вывода:
In:5.1;12.75;20.4;28.05;35.7;43.35;51;56.1;
Out:5
In:61.2;66.3;68.85;71.4;73.95;76.5;79.05;84.15;89.25;96.9;102;109.65;117.3;130.05;145.35001;163.2;178.5;188.7;198.89999;209.10001;216.75;
Out:61
In - значение, которое отправляет приложение
Out - преобразовано уже на Ардуино
В приложении я добавил, что-бы каждое значение было с маркером ";".
Но я не могу с помощью этого маркера разделить значения. Они просто при преобразовании в int в скетче теряются и остаётся первое. Разделить строку в коде приложения я не могу, т.к. при смещении ползунка значения должны отправляться по очереди, но они склеиваются в выше приведённую кашу.
Походу, здесь единственное решение-обрезка текста после предпоследней точки с запятой. Как провести эту обрезку в скетче?
Здесь блок, отвечающий за смену ползунка и отправки значений. Возможно есть, что подправить:
Неактивний
Спасибо большое, решение отличное, помогло!
Перевод на новую строку каждого значения спас от склеивания значений, и теперь добился плавного изменения яркости.
Итак, вот сам скетч:
int led = 11;
int brightness; //переменная для преобразованного значения
String fadeAmount; //для входных данных
void setup() {
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
delay(10);
}
void loop() {
if (Serial.available()) { //если монитор порта доступен:
fadeAmount = Serial.readStringUntil('\n'); //считываем значение с монитора порта до новой строки (String).
Serial.print("In:");
Serial.println(fadeAmount); //вывод данных, которые отправило приложение
brightness = fadeAmount.toInt(); //преобразование данных в число
Serial.print("Out:");
Serial.println(brightness); //вывод преобразованных данных
analogWrite(led, brightness); //меняем яркость в соответствии с значением ползцнка
}
}
Файл проекта, вдруг кому понадобится:
https://drive.google.com/file/d/1lPc0lH … sp=sharing
APK-файл: https://drive.google.com/file/d/1arkKGJ … sp=sharing
Видео с показом работы управления:
https://www.youtube.com/watch?v=o4xs69bpzzo
Архив со всем вместе (скетч, файл проекта, APK, видео, картинка со схемой подключения HC-06 и README-файл с инструкциями):
https://drive.google.com/file/d/1MaiUuP … sp=sharing
Ещё раз благодарю за помощь.
Остання редакція artm (2019-01-22 20:17:32)
Неактивний