Что изменить в скече для фиксации кнопки?

Lexan
Offline
Зарегистрирован: 12.02.2016

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

Например: нажал кнопку 1, и пока держу, есть 5в  на A1 , отпустил кнопку нет 5в.

Пульт у меня такойже т.е сначало у любой кнопки идёт код, например FF20DF а после удержания FFFFFF...

 

Вот тот скеч

#include <IRremote.h> // https://github.com/shirriff/Arduino-IRremote

#define RECV_PIN 11 // IR приемник
#define OUT1 9// выхода на мосфеты
#define OUT2 10
 

#define POWER_KEY 0x40BF30CF // коды пульта ДУ
#define KEY1 0x40BF7887 // v-
#define KEY2 0x40BFF807 // v+
#define KEY3 0xC03FC03F
#define KEY4 0xC03F40BF

byte analogData1, analogData2 = 0; // значения аналогово выхода
uint32_t val; 

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  irrecv.enableIRIn();  
//Serial.begin(9600);
}


void loop() {
  if (irrecv.decode(&results)) { // если пришел пакет  
    if (results.value != 0xFFFFFFFF){ // и этот пакет не FF
      val = results.value; // сохраняем правельный пакет в переменную     
    }                 // если пришел FF, соответственно пропускаем.
    
    /// сверяем значение из переменной val.. если пришла команда повтора (пакет с FF)
    /// в переменной останется прошлый, правельный, пакет и код выполнится повторно. 
    if (val == KEY1){      
       if (analogData1 != 0)analogData1--; // если шим не равно 0 отнимаем 1 
       analogWrite(OUT1, analogData1);    // устанавливаем значение в выход     
    }    
     if (val == KEY2){ // и это вторая кнопка     
       if (analogData1 < 255) analogData1++; // если шим меньше 255 прибовляем 1 
       analogWrite(OUT1, analogData1);  // устанавливаем значение 
    }
 
    if (val == KEY4){      
       if (analogData2 != 0)analogData2--;  
       analogWrite(OUT2, analogData2);      
    }    
     if (val == KEY3){      
       if (analogData2 < 255) analogData2++;  
       analogWrite(OUT2, analogData2);  
    }
      
     ///
    if (results.value == POWER_KEY) {  
      if (analogData1 != 0 && analogData2 != 0){ // если ШИМ неравно 0
        analogWrite(OUT1, 0); // выключаем
        analogWrite(OUT2, 0);
        analogData1 = 0;
        analogData2 = 0;
      }
      else {
        analogWrite(OUT1, 255); // включаем
        analogWrite(OUT2, 255); 
        analogData1 = 255;
        analogData2 = 255;
      }          
    }  
        
/*Serial.println(val, HEX); //// ТЕСТЫ!
Serial.println(results.value, HEX); 
Serial.println(analogData1); 
Serial.println(analogData2);
Serial.println();
*/  
  irrecv.resume(); 
  }
}

 

std
Offline
Зарегистрирован: 05.01.2012

вместо analogWrite(Ax,NNN); писать digitalWrite(Ax,0 или 1);

MacSim
Offline
Зарегистрирован: 28.11.2012

std пишет:

вместо analogWrite(Ax,NNN); писать digitalWrite(Ax,0 или 1);

вы его наверное совсем в тупик поставили, не найдет он в своем скоче эти строки, не найдет.

ТС помигай для начала светодиодиком на 13 ноге, разбери что каждая строка делает и для чего нужна, когда поймешь что каждая строка делает то и снизойдет разумение где-что менять. а так получается вопрос: напишите за меня. вопрос конечно простой, но удочку дали, наживку уже даже нацепили, дальше сам. или пиши в теме "ищу исполнителя"

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребят в принципе разобрался. 

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

if (results.value == POWER_KEY) {  
        
       if (relay3Enable == false)                // если до этого реле №3 было выключено 
             {
             Serial.println("Relay3 ON");
             relay3Enable = true;                 // разрешаем включение Реле №3
             } 
      
      else {
        
         relay3Enable = false;
         Serial.println("Relay3 OFF");
       
      }  
           
    }

 

 

Вот так вроде удаётся задействовать пока кнопка нажата.

if (val == KEY3){ 
      Serial.println("PLAY PAUSE");
       digitalWrite(OUT4, HIGH);  
    }

Но теперь появилась другая проблема. Дело в том, что я с помощью ИК пульта, пытаюсь управлять кнопками MP3 плеера, через оптопары. И всё бы нечего если бы не особенности самого плеера. Дело в том, что у него получается, на двух кнопках, по 3 разных функцыи.

т.е

Кнопка1 перемотка назад; переключение на предыдущий трек и Громкость Volum- 

Кнопка2 перемотка вперед; переключение на следующий трек и Громкость Volum+

И фсе эти фунцыи зависят от времени нажатия кнопок. т.е нажал и тутже отпустил переключил трек, нажал и держишь не более 0.4 секунды перематываеш трек, держиш более 0.5 секунды меняешь громкость.

Как быть прикручивать таймеры на микросикунды ? Или это безнодёжно?