постоянно выполняется 1 команда

Alex117
Offline
Зарегистрирован: 06.12.2018

Доброго дня!Не нашел на форуме своей проблемы,поэтому решил написать первое свое сообщение;)

Суть такова-не могу разобраться что глючит-ик приемник ли,зависает на 1 команде при подаче сигнала с ик пульта,иногда при перезапуске вообще не реагирует на ик команды,потом на 1 реагирует и крутит ее бесконечно...

void loop()  {


  if ( irrecv.decode( &results ))
    switch ( results.value ) {
      case 0xFFA25D:
        myStepper.step(stepsPerRevolution); // 32 шага в одном направлении
        delay(50);
        stopen();
        break;
      case 0xFF629D:
        digitalWrite (Laser_Pin, HIGH);
        delay (1000);
        // Задержка 1 секунду
        digitalWrite (Laser_Pin, LOW);  // Выключить лазер
        delay (1000);
        break;
      case 0xFFE21D:
        myStepper.step(-stepsPerRevolution);
        stopen();// 32 шага в обратную сторону
        delay(50);
        break;
      case 0xFF18E7:
        digitalWrite(is1, HIGH);
        digitalWrite(is2, LOW);
        analogWrite(enA, 110);           // устанавливаем скорость 200 из доступного диапазона 0~255
        // запуск двигателя B
        digitalWrite(is3, LOW);
        digitalWrite(is4, HIGH);
        analogWrite(enB, 110);
        break;
      case 0xFF4AB5:
        digitalWrite(is1, LOW);       //стоп машина
        digitalWrite(is2, LOW);
        digitalWrite(is3, LOW);
        digitalWrite(is4, LOW);
        break;
    
    }
  irrecv.resume(); // принимаем следующую команду
}

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alex117 пишет:

зависает на 1 команде при подаче сигнала с ик пульта,иногда при перезапуске вообще не реагирует на ик команды,потом на 1 реагирует и крутит ее бесконечно...

1 - это "первая" или "одна"? Какая именно? Вообще, потрудитесь изъсняться так, чтобы Вас мог понять тот, кто не сидел рядом с Вами и не видел все Ваши тесты. Опишите, что именно Вы посылаете, и что срабатывает.

Поставьте печать в монитор порта переменной results.value после строки №4, чтобы Вы хоть сами-то видели, что к Вам приходит и могли понять кто виноват - передатчик или приёмник. Вот и разберётесь " что глючит", это совсем нетрудно.

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

Alex117
Offline
Зарегистрирован: 06.12.2018

Спасибо,я новичек в этой теме,да попробую посмотреть и отпишусь

Alex117
Offline
Зарегистрирован: 06.12.2018

Проверил...Если вот так   

void loop() {
  if ( irrecv.decode( &results )) { 
    Serial.println( results.value, HEX );
 
    irrecv.resume(); // принимаем следующую команду
  }
}

Все команды принимаются и правильно распознаются

так тоже все работает



 
void loop() {
  if ( irrecv.decode( &results )) { 
    Serial.println( results.value, HEX );
   if (results.value == 0xFF629D){
   
        digitalWrite (Laser_Pin, HIGH);}
        if (results.value == 0xFFE21D){
          digitalWrite (Laser_Pin, LOW);
        }
    irrecv.resume(); // принимаем следующую команду
  }

однако вот так не работает...Команду принимает приемник,светится,но как будто все висит...Остальные переменные те же(setup и т.д.)

void loop()  {

  if ( irrecv.decode( &results ))
    switch ( results.value ) {
        break;
      case 0xFF629D:
        digitalWrite (Laser_Pin, HIGH);
        break;
      case 0xFFE21D:
        digitalWrite (Laser_Pin, LOW);
        break;
  

    }
  irrecv.resume(); // принимаем следующую команду
}

 

ВН
Offline
Зарегистрирован: 25.02.2016

о структуре switch почитайте см. справочник в программировании http://arduino.ru/Reference/SwitchCase

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alex117 пишет:

однако вот так не работает

А что делает пятая строка?

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Alex117 пишет:

однако вот так не работает

А что делает пятая строка?

Экономит progmem space.

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

sadman41 пишет:

ЕвгенийП пишет:

Alex117 пишет:

однако вот так не работает

А что делает пятая строка?

Экономит progmem space.

Ничего она не экономит. Убери её и не смеши комьюнити)

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

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

----------------

Иными словами, твой свич прекратил свою работу не успев начаться.

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

VaDoSiQ - смотрите, кому отвечаете :)

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

b707 пишет:

VaDoSiQ - смотрите, кому отвечаете :)

А как посмотреть и что это значит?)

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

VaDoSiQ - смотрите, кому отвечаете :)

Смотрите, кому советуете ;) Человек 220в ардуиной мерял...

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

sadman41 пишет:

b707 пишет:

VaDoSiQ - смотрите, кому отвечаете :)

Смотрите, кому советуете ;) Человек 220в ардуиной мерял...

Я сюда забегаю очень редко к сожалению, по этому не особо слежу за такими эксперементами. А так, по делу же написал:)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

VaDoSiQ пишет:

sadman41 пишет:

ЕвгенийП пишет:

А что делает пятая строка?

Экономит progmem space.

Ничего она не экономит. 

Как это не экономит? Ещё как экономит! Всё, что после неё до конца свитча идёт оптимизатор радостно выбросит. Разве это не экономия памяти?

Alex117
Offline
Зарегистрирован: 06.12.2018

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Ардуинка не сломалась, код сломался. Недоудаляли ветку свича. Подотрите то, на что ЕвгенийП указал.

Alex117
Offline
Зарегистрирован: 06.12.2018

Ахаха,точно)Вот я неряха,слона то и не заметил...Спасибо большое!

Alex117
Offline
Зарегистрирован: 06.12.2018

Эх,не помогло,даже в монитор порта ничего не выводит...

void loop()  {

  if ( irrecv.decode( &results ))
  Serial.println( results.value, HEX );
    switch ( results.value ) {
      case 0xFF629D:
        digitalWrite (Laser_Pin, HIGH);
        break;
      case 0xFFE21D:
        digitalWrite (Laser_Pin, LOW);
        break;
    }
  irrecv.resume(); // принимаем следующую команду
}

а так все выводит и работает

void loop() {
  if ( irrecv.decode( &results )) { 
    Serial.println( results.value, HEX );
   if (results.value == 0xFF629D){
   
        digitalWrite (Laser_Pin, HIGH);}
        if (results.value == 0xFFE21D){
          digitalWrite (Laser_Pin, LOW);
        }
    irrecv.resume(); // принимаем следующую команду
  }
}
   

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В первом фрагменте нет открывающей фигурной скобки в строке №3. Вы бы поаккуратнее. Программирование - оно такой вид деятельности.

Alex117
Offline
Зарегистрирован: 06.12.2018

Вот теперь все заработало,спасибо,буду все перепроверять(к сожалению все нюансы начинаещему запомнить тяжело)=)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А запоминать и не надо - надо только всегда отдавать себе отчет: что именно и с какой целью делаешь.