#1 2019-01-30 17:12:41

artm
Участник
Зарегистрирован: 2019-01-15
Сообщений: 12

Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

Здравствуйте.
Относительно недавно я занимался реализацией управления яркостью LED-матрицы по Bluetooth посредством GUI и создавал тему на форуме касательно проблемы получения значений в этом проекте. Проблему с этим я решил и всё заработало.

Вскоре для практики я решил перенести этот маленький проект на Digispark ATtiny85.
Задача заключается в том, чтобы по Bluetooth с телефона отправлять значения от 0 до 255 и в зависимости от значения менять яркость. На данный момент я использую в качестве приложения для управления Bluetooth Terminal.
Так как изначально у Тиньки отсутствует UART, класс Serial, через который я получал данные с HC-06 на Ардуинке, уходит в небытие, поэтому я воспользовался библиотекой Digispark SoftSerial в качестве альтернативы.

Написал вот такой скетч:

#include <SoftSerial.h> //Библиотека для программного UART 
#include <TinyPinChange.h> //зависимость библиотеки SoftSerial
#define RX 3 //P3 на Digispark в качестве RX 
#define TX 2 //P2 на Digispark в качестве TX
int led=4; //к P4 на Digispark подключен + транзистора, к которому подключена LED-матрица
SoftSerial bluetooth(TX, RX); //объявление 

int brightness; //переменная для преобразованного значения
String fadeAmount; //для входных данных

void setup() {
  pinMode(led, OUTPUT); //устанавливаем P4 как выход
  bluetooth.begin(9600);  //начинаем работу программного Serial на скорости 9600 бод
  digitalWrite(led, LOW); //выключаем LED-матрицу
  delay(10); 
}

void loop() {
  if(bluetooth.available()) //если программный Serial доступен
  { 
    fadeAmount = bluetooth.read(); //считываем отправленное по BT значение 
    bluetooth.println("In: "+ fadeAmount);  //Вывод входного значения. 
    brightness = fadeAmount.toInt();  //преобразование данных в число
    bluetooth.print("Out: "); 
    bluetooth.println(brightness); //вывод преобразованных данных
    if(brightness > 0) //если значение больше ноля:
      analogWrite(led, brightness);  //меняем яркость в соответствии с значением ползунка
  }
}

Пришлось отказаться от методов readString/readStringUntil , т.к. в SoftSerial они отсутствуют, и использовать read().
Впоследствии я столкнулся с проблемой, которую я и решал с помощью Serial.readString() на Arduino : значения передаются в формате ASCII-кода символа, который я отправил. Если больше одного символа- каждый отправляется по очереди.
Вот вывод при попытке менять яркость через терминал(Уточню, что комментарии в треугольных скобках я дописывал не при отправке значений, а в этом вопросе):

>: 0 <после ">:"  показано значение из моего ввода>
In: 48 <In - это значение, которое пришло и ещё не обработалось. Здесь вместо 0 получился 48>
Out: 48 <Out-Преобразованное в целое число и отправленное на LED-матрицу значение>
>:10 
In: 49 <Отправилась единица отдельно в коде 49(?)>
Out: 49
In: 48 <тут отправился 0, как 48. Каждое число разделяется и отправляется по очереди.>
Out:48
>:250 <здесь 2, 5 и 0 тоже отправляются по отдельности>
In: 50 <2>
Out: 50
In:53 <5>
Out: 53
In: 48
Out: 48 <0>

[Видео, в котором показано, как всё прорабатывает]

Самое странное, что при первом срабатывании яркость больше не меняется ( по-крайне мере, если смотреть на LED-матрицу ). Всё остаётся на месте. 


pwm.jpg
                                        Схема всей моей конструкции

Как можно решить эту проблему с передачей значения?
Буду искренне благодарен за помощь.

Редактировался artm (2019-01-30 17:38:17)

#2 2019-01-30 17:40:19

Вячеслав Азаров
Участник
Зарегистрирован: 2017-05-25
Сообщений: 1,732

Re: Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

Вам же renoshnik уже объяснял. Ищите конец строки и начало новой, в линукс это символ "\n", после этого, считывете требуемые вам символы в пустую строку и делаете преобразование последней, в число. И повторяете все снова. А алгоритм в вашей программе неверен.

#3 2019-01-30 17:51:12

artm
Участник
Зарегистрирован: 2019-01-15
Сообщений: 12

Re: Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

Вячеслав Азаров пишет:

Ищите конец строки и начало новой, в линукс это символ "\n", после этого, считывете требуемые вам символы в пустую строку и делаете преобразование последней, в число.

Здесь проблема немного иначе. Значения не склеиваются , они вместо строки просто передаются в виде ASCII - кодов каждой цифры.
И ещё надо учитывать отсутствие методов readString/readStringUntil

Вячеслав Азаров пишет:

А алгоритм в вашей программе неверен.

В чём именно неверен?

#4 2019-01-30 18:02:27

Вячеслав Азаров
Участник
Зарегистрирован: 2017-05-25
Сообщений: 1,732

Re: Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

artm пишет:

В чём именно неверен?

Метод read() считывает только один ASCII а не всю строку. А все остальное - следствие этого.

#5 2019-01-30 18:04:22

artm
Участник
Зарегистрирован: 2019-01-15
Сообщений: 12

Re: Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

Вячеслав Азаров пишет:
artm пишет:

В чём именно неверен?

Метод read() считывает только один ASCII а не всю строку. А все остальное - следствие этого.

А как тогда считать именно строку? Что использовать?

Редактировался artm (2019-01-30 18:04:47)

#6 2019-01-30 18:10:30

Вячеслав Азаров
Участник
Зарегистрирован: 2017-05-25
Сообщений: 1,732

Re: Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

Класс String и ту же read(). https://www.arduino.cc/reference/en/lan … ingobject/ Это удобнее всего.

#7 2019-01-30 18:45:09

artm
Участник
Зарегистрирован: 2019-01-15
Сообщений: 12

Re: Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

Вячеслав Азаров пишет:

Класс String и ту же read(). https://www.arduino.cc/reference/en/lan … ingobject/ Это удобнее всего.

Входное значения у меня лежит в String .
Проблема в том, что вместо ASCII-символа считывается ASCII-код, а мне нужно получать именно символ.
К примеру, я отправляю единицу, и на выходе она и должна придти, а не 48. Как в этом случае менять код, чтобы приняло так, как я хотел?

И , похоже, это не единственная проблема. Каждый символ отправится отдельно, даже если я исправлю проблему с кодами ASCII.
В этой статье , когда я делал под Arduino, рекомендовали для решения readString, который я в своей ситуации не могу использовать, мне доступен только read, который только один символ читать и будет. Есть альтернатива readString'у?

Редактировался artm (2019-01-31 14:37:06)

#8 2020-05-19 16:52:16

Димитър
Гость

Re: Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

Вы можете попробовать схему, с которой я работал. Вмест Bluetooth, web interface.
https://www.hackster.io/madamliev/controlling-led-light-esp8266-d9872f

#9 2020-05-20 09:44:30

pr200sd
Участник
Зарегистрирован: 2019-08-27
Сообщений: 8

Re: Диммирование LED-матрицы по Bluetooth на Digispark-ATTiny85

Димитър пишет:

Вы можете попробовать схему, с которой я работал. Вмест Bluetooth, web interface.
https://www.hackster.io/madamliev/controlling-led-light-esp8266-d9872f

Да, с esp задача решается в разы проще, посмотрел по ценам на этот мелкий attiny85+блютуз явно дороже одного wemos, так там возможностей можно наворотить и все в одном.

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела