#1 2019-01-16 23:27:00

artm
Учасник
Зареєстрований: 2019-01-15
Повідомлень: 12

Управление яркостью LED-матрицы по Bluetooth с помощью GUI

[Решено, см. последнее сообщение]
Здравствуйте.
Есть небольшой проект. Заключается он в том, что-бы управлять  яркостью 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)

Неактивний

#2 2019-01-17 10:02:59

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

Вопрос:
Вы думаете, что все кинутся устанавливать App Inventor чтобы посмотреть, что вы там на программировали ?

А вот судя по приведенному скетчу он так и должен работать как вы и описали.

совет - используйте readStringUntil() ...

Остання редакція renoshnik (2019-01-17 10:04:09)

Неактивний

#3 2019-01-17 11:17:02

artm
Учасник
Зареєстрований: 2019-01-15
Повідомлень: 12

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

renoshnik пише:

Вопрос:
Вы думаете, что все кинутся устанавливать App Inventor чтобы посмотреть, что вы там на программировали ?

Его необязательно скачивать, достаточно залогиниться на сайте под аккаунтом Гугла и импортировать проект. Я просто закинул исходники того приложения.
Если нет возможности посмотреть-кидаю ссылку на скриншот кода: https://drive.google.com/file/d/1fi6RRU … p=drivesdk

renoshnik пише:

  совет - используйте readStringUntil() ...

Прочитав документацию, я так понял, что функция считывает значение, пока я не получу нужное.
Но мне нужно ждать значения от 0 до 255, а не ожидать какое-то определенное. Как в этом случае сделать?

Неактивний

#4 2019-01-17 11:44:05

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

artm пише:
renoshnik пише:

  совет - используйте readStringUntil() ...

Прочитав документацию, я так понял, что функция считывает значение, пока я не получу нужное.
Но мне нужно ждать значения от 0 до 255, а не ожидать какое-то определенное. Как в этом случае сделать?

вы после каждого значения ставьте "маркер" тогда значения будут читаться раздельно и сохранится только последнее значение.

Неактивний

#5 2019-01-17 13:28:51

artm
Учасник
Зареєстрований: 2019-01-15
Повідомлень: 12

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

Простите, ко мне не доходит. Что  имеется ввиду под маркером? Как именно его делать?

Неактивний

#6 2019-01-17 14:48:29

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

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)

Неактивний

#7 2019-01-17 21:13:10

artm
Учасник
Зареєстрований: 2019-01-15
Повідомлень: 12

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

renoshnik пише:
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)

Неактивний

#8 2019-01-17 21:55:24

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

если у вас отправляется последовательность значений, то в цикле чтения должно оставаться последнее.

Неактивний

#9 2019-01-19 12:11:04

artm
Учасник
Зареєстрований: 2019-01-15
Повідомлень: 12

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

Вот запись с вывода:

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 в скетче теряются и остаётся первое. Разделить строку в коде приложения я не могу, т.к. при смещении ползунка значения должны отправляться по очереди, но они склеиваются в выше приведённую кашу.
Походу, здесь единственное решение-обрезка текста после предпоследней точки с запятой. Как провести эту обрезку в скетче?

Здесь блок, отвечающий за смену ползунка и отправки значений. Возможно есть, что подправить:
sshot-2019-01-19-11-04-40.jpg

Неактивний

#10 2019-01-19 14:19:09

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

Serial.readStringUntil('\n');
я привык так делать  hmm

Остання редакція renoshnik (2019-01-19 14:20:51)

Неактивний

#11 2019-01-19 18:35:40

artm
Учасник
Зареєстрований: 2019-01-15
Повідомлень: 12

Re: Управление яркостью LED-матрицы по Bluetooth с помощью GUI

Спасибо большое, решение отличное, помогло!
Перевод на новую строку каждого значения спас от склеивания значений, и теперь добился плавного изменения яркости.

Итак, вот сам скетч:

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); //меняем яркость в соответствии с значением ползцнка

  }
}

Код приложения:
final.jpg

Файл проекта, вдруг кому понадобится:
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)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму