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

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

вот это я вообще не понял 

b707 пишет:

Drew20 пишет:

да мигает

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

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

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

Попробуйте скетч вернуть к нормальному состоянию без изменений и залейте. Включите монитор и первой командой отправьте R200 - должен сразу замигать красный.

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

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

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

vk007 пишет:

Попробуйте скетч вернуть к нормальному состоянию без изменений и залейте. Включите монитор и первой командой отправьте R200 - должен сразу замигать красный.

vk007 - если не заработает - обьясните ему про как сделать отправку принятых символов назад. Это самый простой путь диагностики.

А я спать пошел.

Удачи.

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

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

 

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

Допишите после 22 строчки (т.е.после incoming_byte = Serial.peek();) строку Serial.println(char(incoming_byte));

И попробуте в мониторе отправлять по одному символу и только R, G или B. Другие не пробуйте - зависнет. В мониторе должны печататься эти же буквы.

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

Ладно, вижу, все уже ушли. Утро вечера мудренее. Может завтра заработает. Отпишитесь в любом случае.

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

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

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

А на другом форуме срачик помасштабней развели :)

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

Пока разбираетесь с портом я немного переделал скетч, чтобы он не подвисал при неправильно переданной комманде:

const byte rPin = 3;
const byte gPin = 5;
const byte bPin = 6;
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 >= '0' && incoming_byte <= '9')
    {
      val = Serial.parseInt();
    }
    else
    {
      incoming_byte = Serial.read();
      switch(incoming_byte)
      {
      case 'R':
        chosed_color = rPin;
        break;
      case 'G':
        chosed_color = gPin;
        break;
      case 'B':              
        chosed_color = bPin;
        break;
      }
    }
  }
  if(val >= 0 && chosed_color != 0)
  {
    digitalWrite(chosed_color, HIGH);
    delay(val);       
    digitalWrite(chosed_color, LOW);  
    delay(val); 
  }
}

Я думаю, разберетесь. swith case использовал просто для наглядности. Теперь комманды, содержащие неправильные буквы будут игнорироваться. Как и прежде можно отсылать отдельно цвет, отдельно задержку, а можно и все в одной строке.

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

откуда инфа??? я вроде не сильно палился)))

vk007 пишет:

А на другом форуме срачик помасштабней развели :)

Drew20
Offline
Зарегистрирован: 09.02.2018
может кто знает что за проблема вроде такого раньше не было
Arduino: 1.8.2 (Windows 10), Плата:"Arduino/Genuino Uno"
avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch
 
         System wide configuration file is "C:\Users\Andrew\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino9/etc/avrdude.conf"
 
         Using Port                    : COM3
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x9d
vk007
Offline
Зарегистрирован: 16.06.2015

Возможно подключенный синий зуб мешает. Кстати, вы этот модуль вчера отключали, когда передавали данные через монитор порта? Может это он жить помогает?

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

так раньше не мешал 

vk007 пишет:

Возможно подключенный синий зуб мешает. Кстати, вы этот модуль вчера отключали, когда передавали данные через монитор порта? Может это он жить помогает?

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

а что значит отключал, типа rx/tx???

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

Что значит раньше? Отключите и попробуйте, чего гадать. И второе, Serial.println(char(incoming_byte)); добавляли?

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

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

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

Drew20 пишет:

а что значит отключал, типа rx/tx???

Да, чтобы эти провода не были подключены к ардуине.

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

Используйте новый скетч. Строку добавляйте между 20 и 21 строками.

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

ну да я читал что там что там тогда запись не идет

 

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

да сейчас попробую, посмотрю как работает и сразу отпишусь 

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

так ну я могу только сказать БОЛЬШОЕ СПАСИБО, скетч вроде нормально работает я с телефона пробовал управлять, у меня еще есть вопрос по поводу скетчу я сейчас изменю так как мне кажеться он может работать вы сможете глянуть???

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

Сначала скажите, чего вы от него хотите еще добиться, а там посмотрим.

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

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

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

Не понимаю ваших проблем. Данные можно отправлять и вместе, и по отдельности.

Если нужно вместе, то делайте так: если программу только запустили и еще ничего не нажималось - юзер жмет кнопку выбора цвета; если ползунок задержки еще не двигали, значит ждем пока подвинут. Как только подвигали, формируем комманду цвет_задержка (например G100) и отправляем ее. Как только юзер снова что-то нажал, опять формируем комманду (смотрим какой цвет активный и какая выставлена задержка) и отсылаем. И так постоянно - следим, отсылаем.
Подвинул юзер первым ползунок, а цвет еще не выбирал - ждем пока выберет и цвет тоже, потом отсылаем комманду...
Кнопки выбора цвета - красить при нажатии в соответствующие им цвета. Изначально, пока они не нажимались делать их нейтрального цвета (т.е.все выкл). Нажал юзер какую-то - закрасили ее. Нажал другую - это обесцветили, нажатую подсветили соответствующим цветом.

Нужно отдельно, делайте отдельно: нажал юзер кнопку выбора цвета - отправили только цвет, подвинул юзер ползунок - отправили только задержку.

Где тут гемморой?

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

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

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

Drew20 пишет:

в целом я насколько понял мы на ардуино отправляем поток байтов и там он уже сортируется по категориям

На ардуино мы отсылаем не просто поток байтов, а упорядоченный по правилам поток байтов. Я не знаю на чем вы там пишете программу на андроиде, но не верю, что там все так бедно, что нельзя управлять этим потоком.

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

Может вам так понятней будет. Например, для отправки комманды R125 необходимо передать 4 байта: 82, 49, 50, 53 (это в десятичном виде). Где, 82 - код буквы 'R'; 49, 50 и 53 - коды цифр '1', '2' и '5' соответственно.

Кстати, в какой программе вы пишете свое приложение на андроиде?

И что это вообще за девайс должен получиться? Что-то ума не приложу, зачем мигать диодами по коммандам со смартфона?

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

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

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

Где это устройство применяется? Для чего оно?

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

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

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

добрый вечер, у меня вопрос vk007 у вас когда вы тестировали скетч на своей плате у вас при отсылке новой частоты на мигающий светодиод, светодиод выключался на мгновение, а потом уже мигал с новой частотой. Например у вы отправили R100 светодиод начинал мигать вы отпраляли новую частоту например 20 и он выключался и потом уже мигал с 20???

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

Такое происходит из-за особенностей работы функции Serial.parseInt(). Данные через Serial передаются один за другим (последовательно) и "складируются" в буфере, вычитываем данные оттуда тоже по одному, т.е. Serial.parseInt() достает из буфера по одному байту и собирает из них число. Но поскольку может возникнуть ситуация, когда фунция уже вычитала из буфера все байты, а передающее устройство передало их еще не все, то ввели некое время ожидания (таймаут), в течение которого функция ждет "а вдруг это не все и еще что-то поступит". Это время ожидания по умолчанию задано равным 1000 мс, но его можно изменить через Serial.setTimeout().

Если для вас критична эта пауза, то можете поэкспериментировать и найти тот минимум, при котором данные еще будут приниматься стабильно, задавая меньший таймаут через Serial.setTimeout() и увеличивая скорость работы порта в Serial.begin().

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

а вообще какая максимальная скорость порта?? потому-что я читал что вроде почти 200 мбит может тянуть?

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

Читайте описание http://arduino.ru/Serial/Begin

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

я понял, спасибо большое

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

а вот вопрос по железу есть такой https://megashara.biz/p405289619-modul-016-rgb.html светодиод на ардуину можно прицепить или же все равно нужно будет проводками соединять что то с чем-то

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

И еще, максимальная теоретическая скорость, и максимальная практически реализуемая в определенных условиях - это немного разные вещи. Даже по проводам все зависит от расстояния, а по воздуху (как в вашем случае) и подавно.

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

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

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

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

Отвечая на вопрос о его подключении, то он не имеет никакого радиомодуля и к ардуине его надо подключать тоже проводами (а как еще то?).

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

Drew20 пишет:

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

А вы паять совсем не умеете?

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

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

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

Можно все оформить в виде шилда, который вы будете цеплять на свою uno.

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

типа сверху? на шилд нужно будет все таки паять я так думаю 

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

Без пайки то можно, соединив все на проводах с разъемами на концах, но это все так ненадежно...

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

ладно я понял буду дальше ковыряться с программой, спасибо всем за помощь