Помогите найти ошибку в алгоритме

Drew20
Offline
Зарегистрирован: 09.02.2018

а что не так??

vk007
Offline
Зарегистрирован: 16.06.2015

b707 пишет:

вы вчитайтесь - он в порт "строку с расширением byte" отправляет :))))))

да ладно :) если он так думает и пишет, еще не значит что так оно на самом деле :)

vk007
Offline
Зарегистрирован: 16.06.2015

Drew20, вы прочитали мое сообщение #49, там все понятно?

b707
Offline
Зарегистрирован: 26.05.2017

vk007 - дело ваше, хотите - возитесь. По мне - обьяснять ему сейчас принципы обработки строк в Сериал - это все равно что заставлять трехлетнего заучивать законы термодинамики. Повторить сможет,  понять -нет.

Удачи обоим :)

Drew20
Offline
Зарегистрирован: 09.02.2018

ну я вот сейчас пытаюсь сделать то что написано, с цветом вроде более менее понятно, но вот задержка вы указали разные цифры а мне их может можно как то как одну считать. Тоесть мне не понятно, как сделать что бы скетч понял где цифра

const byte rPin = 3;
const byte gPin = 5;
const byte bPin = 6;
byte pins[3] = {rPin, gPin, bPin};
byte chosed_color;
byte incoming_byte;
int val;  

void setup() 
{
  Serial.begin(9600);
  pinMode( rPin, OUTPUT );
  pinMode( gPin, OUTPUT );
  pinMode( bPin, OUTPUT );
  
}

void loop() 
{
    if(Serial.available()>0) 
    {
      incoming_byte = Serial.peek();
      if(incoming_byte == 'R')
      {
         chosed_color = rPin;
      }
      if(incoming_byte == 'G')
      {
         chosed_color = gPin;
      }
      if(incoming_byte == 'B')
      {
         chosed_color = bPin;
      }
      
     
      val = Serial.read();
    }
digitalWrite( chosed_color, HIGH );
  delay(val);       
  digitalWrite(chosed_color, LOW);  
  delay(val); 
  }

 

vk007
Offline
Зарегистрирован: 16.06.2015

Значит прочитали не до конца, а я писал:

Если же color == '0' (или '1', или '2', ..., или '9'), т.е. считали цифру, то значит в порт пришло число (т.е. данные для задержки) и читаем его val = Serial.parseInt();

Вот как раз Serial.parseInt() и вычитывает все байты из буфера (пока не упрется в не число или данные в буфере не закончатся), и преобразует эту кучку байтов в число. Т.е. отправили в порт в виде строки "100", прочитали его val = Serial.parseInt(); и в val оказалось число 100.

В мониторе порта если написать 100 и отправить, то в ардуину прийдет именно строка "100".

Drew20
Offline
Зарегистрирован: 09.02.2018

тоесть это то что необходимо сделать согласно вашему обьяснению

void loop() 
{
    if(Serial.available()>0) 
    {
      incoming_byte = Serial.peek();
      if(incoming_byte == 'R')
      {
         chosed_color = rPin;
      }
      if(incoming_byte == 'G')
      {
         chosed_color = gPin;
      }
      if(incoming_byte == 'B')
      {
         chosed_color = bPin;
      }
      if(incoming_byte == '0')
      {
        val = Serial.parseInt();
      }
    }
digitalWrite( chosed_color, HIGH );
  delay(val);       
  digitalWrite(chosed_color, LOW);  
  delay(val); 
  }

 

Drew20
Offline
Зарегистрирован: 09.02.2018

нет походу это не то что нужно, потому-что через монитор порта если отправить 100 или R значит что то не то я написал

vk007
Offline
Зарегистрирован: 16.06.2015

Не совсем. Вы сравниваете incoming_byte только с '0', а как же все остальные цифры?

if(incoming_byte >= '0' && incoming_byte <= '9')

 

Drew20
Offline
Зарегистрирован: 09.02.2018

тоесть мне нужно от 0 до например 1000?

vk007
Offline
Зарегистрирован: 16.06.2015

Я написал, как нужно.

Drew20
Offline
Зарегистрирован: 09.02.2018

так а как мне потом получить например 200??

vk007
Offline
Зарегистрирован: 16.06.2015

И еще, Вы не удаляете символ из буфера.

После строки chosed_color = rPin; и ей подобных добавьте еще по одной строке Serial.read(); (просто, без никаких присваиваний ее какой либо переменной).

vk007
Offline
Зарегистрирован: 16.06.2015

Drew20 пишет:

так а как мне потом получить например 200??

Ну я же писал уже не один раз - это все сделает Serial.parseInt() - она создана для этого, искать в строках, поступивших из порта, число и извлекать его из них. Почитали бы наконец ее описание что-ли.

Drew20
Offline
Зарегистрирован: 09.02.2018

та я вот уже прочитал))) но все равно не работает может я не то посылаю в монитор порта или в скетче ошибка опять

const byte rPin = 3;
const byte gPin = 5;
const byte bPin = 6;
byte pins[3] = {rPin, gPin, bPin};
byte chosed_color;
byte incoming_byte;
int val;  

void setup() 
{
  Serial.begin(9600);
  pinMode( rPin, OUTPUT );
  pinMode( gPin, OUTPUT );
  pinMode( bPin, OUTPUT );
  
}

void loop() 
{
    if(Serial.available()>0) 
    {
      incoming_byte = Serial.peek();
      if(incoming_byte == 'R')
      {
         chosed_color = rPin;
         Serial.read();
      }
      if(incoming_byte == 'G')
      {
         chosed_color = gPin;
         Serial.read();
      }
      if(incoming_byte == 'B')
      {
         chosed_color = bPin;
         Serial.read();
      }
      if(incoming_byte >= '0' && incoming_byte <= '9')
      {
        val = Serial.parseInt();
      }
    }
  digitalWrite( chosed_color, HIGH );
  delay(val);       
  digitalWrite(chosed_color, LOW);  
  delay(val); 
  }

 

vk007
Offline
Зарегистрирован: 16.06.2015

Вы кроме байтов, еще путаетесь в цифрах и числах. Цифры - это как буквы, а числа - слова. Цифр всего 10 (0, 1, 2, 3, 4, 5, 6, 7, 8 и 9) - их этих цифр строятся числа, как слова из букв.

vk007
Offline
Зарегистрирован: 16.06.2015

Ну пока оно и не будет работать как надо. Мы еще не доделали все. А, кстати, как оно работает сейчас?

Drew20
Offline
Зарегистрирован: 09.02.2018

никак, вообще глухо, пишу в монитор R а оно ничего не делает, вот я и подумал что опять где то затупил

vk007
Offline
Зарегистрирован: 16.06.2015

В седьмой строке переменную val инициализируйте как int val = -1;

А строки 43-46 заверните в условие:

if(val >= 0 && chosed_color != 0)

Т.е. пока не указан цвет и не указана задержка - со светодиодами не работаем.

Drew20
Offline
Зарегистрирован: 09.02.2018

а какой запрос послать через монитор порта?? пробовал R просто оно ничего не показало, 100 тоже глухо, R100 таже фигня

vk007
Offline
Зарегистрирован: 16.06.2015

Сначала R, потом 100. Итоговый скетч покажите.

Drew20
Offline
Зарегистрирован: 09.02.2018
const byte rPin = 3;
const byte gPin = 5;
const byte bPin = 6;
byte pins[3] = {rPin, gPin, bPin};
byte chosed_color;
byte incoming_byte;
int val = -1;  

void setup() 
{
  Serial.begin(9600);
  pinMode( rPin, OUTPUT );
  pinMode( gPin, OUTPUT );
  pinMode( bPin, OUTPUT );
  
}

void loop() 
{
    if(Serial.available()>0) 
    {
      incoming_byte = Serial.peek();
      if(incoming_byte == 'R')
      {
         chosed_color = rPin;
         Serial.read();
      }
      if(incoming_byte == 'G')
      {
         chosed_color = gPin;
         Serial.read();
      }
      if(incoming_byte == 'B')
      {
         chosed_color = bPin;
         Serial.read();
      }
      if(incoming_byte >= '0' && incoming_byte <= '9')
      {
        val = Serial.parseInt();
      }
    }
    if(val >= 0 && chosed_color != 0)
{
  digitalWrite( chosed_color, HIGH );
  delay(val);       
  digitalWrite(chosed_color, LOW);  
  delay(val); 
}
  }

 

vk007
Offline
Зарегистрирован: 16.06.2015

Монитор порта настроен на ту же скорость, что и в скетче? Светдиоды подключены (через соответствующие резисторы) к нужным пинам и так как надо?

Drew20
Offline
Зарегистрирован: 09.02.2018

да все да, но не работает

vk007
Offline
Зарегистрирован: 16.06.2015

Одну минуту, расчехлю ардуину и проверю, а то у меня к этому времени уже тоже в мыслях каша.

Drew20
Offline
Зарегистрирован: 09.02.2018

спасибо 

vk007
Offline
Зарегистрирован: 16.06.2015

Проверяйте схему, скорость порта. У меня работает как надо.

vk007
Offline
Зарегистрирован: 16.06.2015

Буквы R, G или B отправляете большие? Не r, g или b случайно?

Drew20
Offline
Зарегистрирован: 09.02.2018

а вы вводили в одну строку R 100 или последовательно?

 

vk007
Offline
Зарегистрирован: 16.06.2015

Последовательно

Drew20
Offline
Зарегистрирован: 09.02.2018

это не зависит от разновидности платы?

 

vk007
Offline
Зарегистрирован: 16.06.2015

Не должно. Пины вы же явно указали.

На будущее, желательно скетч оптимизировать, а также подправить на случай, если будут приходить некорректные команды (иначе может клинить). Также четвертая строка тут лишняя.

upd. Может диоды не так подключили? Катоды на землю, аноды через резисторы ом так на 180 - 330 к пинам (3, 5 и 6).

upd2. Между прочим, в данном скетче, например, комманда типа R200 (без пробелов подряд) тоже будет работать.

Drew20
Offline
Зарегистрирован: 09.02.2018

что означает оптимизировать, дело в том что все работало как нужно в том смысле что и светодиод работал нормально, и блютуз тоже, а вот с этим скетчем что то глухо, вы вообще на какой плате все проверяете?

vk007
Offline
Зарегистрирован: 16.06.2015

Плата Nano. Монитор порта стандартный (из Arduino IDE). На компьютере если что.

Я надеюсь вы тоже на компе все это делаете?

Drew20
Offline
Зарегистрирован: 09.02.2018

у меня uno, а скетч точно правильно написан? может я попробую сделать прогу на андроид и попытаться отправить с телефона?

b707
Offline
Зарегистрирован: 26.05.2017

Drew20

замените пятую строчку на

byte chosed_color = rPin;

и попробуйте ввести 100

Drew20
Offline
Зарегистрирован: 09.02.2018

опять ничего

значить проблема не в скетче походу(((

b707
Offline
Зарегистрирован: 26.05.2017

Drew20 пишет:

опять ничего

значить проблема не в скетче походу(((

тогда уж до кучи седьмую на

int val = 500;

vk007
Offline
Зарегистрирован: 16.06.2015

b707, у меня вот прямо сейчас этот скетч работает на настоящей ардуине с настоящими светодиодами. Мигают будь здоров. Тут что-то с подключениями, или неправильной скоростью порта, или еще какая-то невнимательность.

b707
Offline
Зарегистрирован: 26.05.2017

vk007 пишет:

b707, у меня вот прямо сейчас этот скетч работает на настоящей ардуине с настоящими светодиодами. Мигают будь здоров. Тут что-то с подключениями, или неправильной скоростью порта, или еще какая-то невнимательность.

Да я не сомневаюсь, не думайте.  Просто последовательно проверяю, какие части скетча работают, а какие нет. Методика отладки "Разделяй и влавствуй" :)

vk007
Offline
Зарегистрирован: 16.06.2015

Drew20, а скетч вообще прошивается? Попробуйте в сетапе в конце дописать какой-нибудь Serial.println("Привет, мир!");

Будет оно печататься в мониторе?

b707
Offline
Зарегистрирован: 26.05.2017

vk007 пишет:

Drew20, а скетч вообще прошивается? Попробуйте в сетапе в конце дописать какой-нибудь Serial.println("Привет, мир!");

Будет оно печататься в мониторе?

погодите, пусть седьмую строчку поменяет - это будет примерно то же самое, но информативнее.

Drew20
Offline
Зарегистрирован: 09.02.2018

да это работает нормально, вывело фразу

 

b707
Offline
Зарегистрирован: 26.05.2017

поменяйте седьмую и пятую строку, как я вам сказал - и напишите результат.

vk007
Offline
Зарегистрирован: 16.06.2015

Ну значит что-то со светодиодами. Мультиметр или осциллограф есть? Можете посмотреть, что на пинах 3, 5 и 6 творится?

Drew20
Offline
Зарегистрирован: 09.02.2018

да мигает

Drew20
Offline
Зарегистрирован: 09.02.2018

та не светодиод работает нормально

vk007
Offline
Зарегистрирован: 16.06.2015

Каким монитором порта вы пользуетесь? Стандартным ардуиновским на ПК?

Drew20
Offline
Зарегистрирован: 09.02.2018

да 

b707
Offline
Зарегистрирован: 26.05.2017

Drew20 пишет:

да мигает

значит, как минимум, красный светик  работает.

Тогда остается только монитор порта.  Добавьте диагностический вывод на каждый принятый символ - типа "эха" -  и посмотрите, что же там передается.