Ви не увійшли.
Здравствуйте.
Относительно недавно я занимался реализацией управления яркостью 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-матрицу ). Всё остаётся на месте.
Как можно решить эту проблему с передачей значения?
Буду искренне благодарен за помощь.
Остання редакція artm (2019-01-30 17:38:17)
Неактивний
Вам же renoshnik уже объяснял. Ищите конец строки и начало новой, в линукс это символ "\n", после этого, считывете требуемые вам символы в пустую строку и делаете преобразование последней, в число. И повторяете все снова. А алгоритм в вашей программе неверен.
Неактивний
Ищите конец строки и начало новой, в линукс это символ "\n", после этого, считывете требуемые вам символы в пустую строку и делаете преобразование последней, в число.
Здесь проблема немного иначе. Значения не склеиваются , они вместо строки просто передаются в виде ASCII - кодов каждой цифры.
И ещё надо учитывать отсутствие методов readString/readStringUntil
А алгоритм в вашей программе неверен.
В чём именно неверен?
Неактивний
В чём именно неверен?
Метод read() считывает только один ASCII а не всю строку. А все остальное - следствие этого.
Неактивний
artm пише:В чём именно неверен?
Метод read() считывает только один ASCII а не всю строку. А все остальное - следствие этого.
А как тогда считать именно строку? Что использовать?
Остання редакція artm (2019-01-30 18:04:47)
Неактивний
Класс String и ту же read(). https://www.arduino.cc/reference/en/lan … ingobject/ Это удобнее всего.
Неактивний
Класс 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)
Неактивний
Вы можете попробовать схему, с которой я работал. Вмест Bluetooth, web interface.
https://www.hackster.io/madamliev/controlling-led-light-esp8266-d9872f
Вы можете попробовать схему, с которой я работал. Вмест Bluetooth, web interface.
https://www.hackster.io/madamliev/controlling-led-light-esp8266-d9872f
Да, с esp задача решается в разы проще, посмотрел по ценам на этот мелкий attiny85+блютуз явно дороже одного wemos, так там возможностей можно наворотить и все в одном.
Неактивний