Удерживание кнопки, помогите чучуть

neospromiy
Offline
Зарегистрирован: 15.07.2013

Имеется ArduinoUNO к нему подключена резистивные кнопки автомобиля для управления музыкой и круизом по схеме

 

Вроде бы со всем разобрался но мне необходима одна функция, которая при удерживании кнопки у которой диапазон значений от 830 до 890 включала 7 и 8 пин по очереди т.е удерживаем сигнал появляется в 8 пину, в 7 пропадает, удерживаем сиигнал появляется в 7 пину, в 8 пропадает и так по  кругу. и при этом во время удерживания не появлялся сигнал на 9 пину так как она будет ставить музыку на паузу, она должна работать тока при кратковременных нажатиях.

 

вот скетч

int rulevieKnopki=0; 
int CruisControl=0;

 void setup()    
 {        
Serial.begin(9600); 
pinMode(4, OUTPUT);   
pinMode(5, OUTPUT);     
pinMode(6, OUTPUT); 
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);   
pinMode(9, OUTPUT);     
pinMode(10, OUTPUT); 
pinMode(11, OUTPUT);     
pinMode(12, OUTPUT); 

       
 } 

 void loop()    
 { 
        
     rulevieKnopki=analogRead(14);//считываем сигнал с пина АЦП
     CruisControl=analogRead(15);//считываем сигнал с пина АЦП 
      
      
      //переключатель
      if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(7, HIGH);
     else digitalWrite (7, LOW);
      if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(8, HIGH);
     else digitalWrite (8, LOW);
                
        
     
        //управление магнитолой
        
     if(rulevieKnopki>500&&rulevieKnopki<650)digitalWrite(8, HIGH);
     else digitalWrite (8, LOW);
     
      if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(9, HIGH);
     else digitalWrite (9, LOW);
     
      if(rulevieKnopki>895&&rulevieKnopki<950)digitalWrite(10, HIGH);
     else digitalWrite (10, LOW);
     
      if(rulevieKnopki>952&&rulevieKnopki<1000)digitalWrite(11, HIGH);
     else digitalWrite (11, LOW);
     
     if(rulevieKnopki>1001&&rulevieKnopki<1024)digitalWrite(12, HIGH);
     else digitalWrite (12, LOW);
               
      
      
      
        //управление круиз контролем
      if(CruisControl>300&&CruisControl<420)digitalWrite(5, HIGH);
     else digitalWrite (5, LOW);
     
      if(CruisControl>450&&CruisControl<550)digitalWrite(4, HIGH);
     else digitalWrite (4, LOW);
     
     if(CruisControl>900&&CruisControl<1024)digitalWrite(3, HIGH);
     else digitalWrite (3, LOW);
     
    Serial.println(analogRead(14));
   // Serial.println(analogRead(15));
     
 } 
 

 

vvadim
Offline
Зарегистрирован: 23.05.2012
Pavel_
Offline
Зарегистрирован: 19.03.2012

neospromiy пишет:

Имеется ArduinoUNO к нему подключена резистивные кнопки автомобиля для управления музыкой и круизом по схеме

 

...мне необходима одна функция, которая при удерживании кнопки...

Вы схему наверное взяли из темы "Работа с кнопками. В помощь новичку.",

в ней же есть примеры кода при удержании кнопки...

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

long previousMillis = 0; 
int val=0; 

 void setup()    
 {        
............ 
 } 

 void loop()    
 { 
   ..........................

	if(rulevieKnopki>830&&rulevieKnopki<890)
 	{ 
         	if (millis() -previousMillis >500)    
     		{ 
        	previousMillis = millis();     
        	val++; 
    		} 
     	} 
     	else 
     	{ 
       	val=0; 
     	} 
        
     	if(val>=10) 
     	{ 
       	  digitalWrite(7,!digitalRead(7)); //инвертируем состояние пина 7
       	  {
		if(digitalRead(7)==HIGH)
		{		
		digitalWrite(8, LOW);
		}		
     		else
     		{
 		digitalWrite(8, HIGH);
		}
       	  val=0; 
     	  }
        }

        else if(val>=1)
        {
        digitalWrite(9,!digitalRead(9)); //инвертируем состояние пина 9
         val=0;
        }

 

neospromiy
Offline
Зарегистрирован: 15.07.2013

Спсибо что откликнулись!!!

 

Life23
Offline
Зарегистрирован: 10.08.2013

Порадовало выражение "Нагрузки там никакой нет это просто кнопка" ))

Не понятно что именно он у вас переключает.. Питание? или на пине OUT логика какая-то с управления идет?

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

Как Вы хотите отсчитывать время нажатия ? можно одним из аппаратных таймеров, можно просто счетом вызовов loop(). В виду того что точность длительности удержания сводить к микросекундам нет необходимости, я бы просто в loop() добавил счетчик и в глобальные переменные - переменную счета. При нажатии выставляется переменная счета в 65535 и каждый вызов loop() вычитать по 1 до 0. При отпуске кнопки останавливать счет, усли разница между исходным значением и конечным достаточно велика - выставить флаг. При чтении состояния флага, флаг сбрасывается.

neospromiy
Offline
Зарегистрирован: 15.07.2013

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

int rulevieKnopki=0; 
int cruisecontrol = 0;

boolean nexus =LOW;
boolean ledOn= false;

 void setup()    
 {        
Serial.begin(9600); 



pinMode(3, OUTPUT);  // >>> для (pioner и android)
pinMode(4, OUTPUT);  // <<< для (pioner и android)   
pinMode(5, OUTPUT);  //Mute (для Pioner), play psuse (для nexus7)
 
pinMode(11, OUTPUT);  //увеличеное громкости pioner   
pinMode(12, OUTPUT);  //уменьшение громкости pioner

//переключатель рулевых кнопок, андроид или пионер, 
//кнопки (<<<, >>>, play pause для nexus7) (<<<,>>>, mute для pioner)
pinMode(6, OUTPUT);  // включение кнопок на nexus 7
pinMode(7, OUTPUT);  // включение кнопок на pioner

//кнопки круиз контроля
pinMode(8, OUTPUT); //UP
pinMode(9, OUTPUT); //reset    
pinMode(10, OUTPUT); //auto
       
 } 

 void loop()    
 { 
        
     rulevieKnopki=analogRead(14);//считываем значение резитивных кнопок мультимедия, 5-ть кнопок
     cruisecontrol=analogRead(15); // считываем значение резистивных кнопок круиз контроля, 3-и кнопки  
     
     ////////////////////////////
     //ПЕРЕКЛЮЧАТЕЛЬ УПРАВЛЕНИЯ//
     ////////////////////////////
     
     ///Переключатель Андроид или pioner (т.е один всегда включен, при удержании один тухнет другой включаеться) 
    // при удерживании кнопки в диапазоне от 830 до 890 в течении 2х сек
      if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(6, HIGH);
     else digitalWrite (6, LOW);
     
       if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(6, LOW);
     else digitalWrite (7, HIGH);
     
     
     //////////////////////////////
     //УПРАВЛЕНИЕ PIONER И NEXUS7//
     //////////////////////////////  
     
     
     
        //  >>> для (pioner и android)
     if(rulevieKnopki>500&&rulevieKnopki<600)digitalWrite(3, HIGH);
     else digitalWrite (3, LOW);
     
        //  <<< для (pioner и android)
     if(rulevieKnopki>895&&rulevieKnopki<950)digitalWrite(4, HIGH);
     else digitalWrite (4, LOW);
     
       // (Mute (для Pioner), play psuse (для nexus7))
       //
      if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(5, HIGH);
     else digitalWrite (5, LOW);
     
      //увеличеное громкости pioner  
      if(rulevieKnopki>950&&rulevieKnopki<1012)digitalWrite(11, HIGH);
     else digitalWrite (11, LOW);
     
       //уменьшение громкости pioner
     if(rulevieKnopki>1013&&rulevieKnopki<1024)digitalWrite(12, HIGH);
     else digitalWrite (12, LOW);
      
            
      
      
      //////////////////////
      //Управление круизом//
      //////////////////////
      
      
      
        //кнопка AUTO круиз контроль
      if(cruisecontrol>250&&cruisecontrol<420)digitalWrite(10, HIGH);
     else digitalWrite (10, LOW);
     
       //Кнопка reset круиз контроль
     if(cruisecontrol>440&&cruisecontrol<650)digitalWrite(9, HIGH);
     else digitalWrite (9, LOW);
    
      //Кнопка UP круиз контроль
     if(cruisecontrol>750&&cruisecontrol<1024)digitalWrite(8, HIGH);
     else digitalWrite (8, LOW);
     
     
          
 } 
 

 

sva1509
Offline
Зарегистрирован: 07.12.2012

Вот код считывания кнопок :

unsigned char keyBut;        // нажатая кнопка или 0 старший бит - флаг нажатия
unsigned int count,stopCount;

void setup()
{
        ///// это добавь в свой setup
        keyBut = 0;
        count = stopCount = 0;
        analogReference(DEFAULT);
}

void readAnalogKey(ain)
{
int i1;
byte b1;

        if (keyBut & 127) if (count) count--;
        i1 = analogRead(ain);
        b1 = 0;
        i1 -= 250;  // стартовое значение
        while(i1 ^ 32768) {
                i1 -= 200; // 200 - интервал каждой кнопки  
                           // подбери резисторы или нужные значения
                b1++;
        }
        if (b1 != (keyBut & 127)) {
                keyBut = b1 + 128; 
                if (keyBut & 127) count = 65535; else stopCount = count;
        }
}

ain - аналоговый ввод

в keyBut код нажатой клавиши и флаг нажатия.

stopCount = длительности нажатия.

PS: отвлеченный вопрос а автомобиль случайно не субару ?

 

neospromiy
Offline
Зарегистрирован: 15.07.2013

Нет шевроле, но подойдёт такая схема для любой тачилы))) единственное значение сопротивлений поменять и всё.

 int rulevieKnopki=0; 
int cruisecontrol = 0;

boolean nexus =LOW;
boolean pioner =HIGH;
boolean play=false;
boolean first=true;

long previousMillis = 0;
int val=0;




 void setup()    
 {        
Serial.begin(9600); 



pinMode(3, OUTPUT);  // >>> для (pioner и android)
pinMode(4, OUTPUT);  // <<< для (pioner и android)   
pinMode(5, OUTPUT);  //Mute (для Pioner), play psuse (для nexus7)
 
pinMode(11, OUTPUT);  //увеличеное громкости pioner   
pinMode(12, OUTPUT);  //уменьшение громкости pioner

//переключатель рулевых кнопок, андроид или пионер, 
//кнопки (<<<, >>>, play pause для nexus7) (<<<,>>>, mute для pioner)
pinMode(6, OUTPUT);  // включение кнопок на nexus 7
pinMode(7, OUTPUT);  // включение кнопок на pioner

//кнопки круиз контроля
pinMode(8, OUTPUT); //UP
pinMode(9, OUTPUT); //reset    
pinMode(10, OUTPUT); //auto
       
 } 

 void loop()    
 { 
        
     rulevieKnopki=analogRead(14);//считываем значение резитивных кнопок мультимедия, 5-ть кнопок
     cruisecontrol=analogRead(15); // считываем значение резистивных кнопок круиз контроля, 3-и кнопки  
     
     ////////////////////////////
     //ПЕРЕКЛЮЧАТЕЛЬ УПРАВЛЕНИЯ//
     ////////////////////////////
     
     ///Переключатель Андроид или pioner (т.е один всегда включен, при удержании один тухнет другой включаеться) 
    // при удерживании кнопки в диапазоне от 830 до 890 в течении 2х сек
      
       digitalWrite(6,nexus);
       digitalWrite(7,pioner);
    
    
     if(rulevieKnopki>830&&rulevieKnopki<890)
     {
        
        if (millis() - previousMillis >500)    
        { 
           previousMillis = millis();     
           val++;
        }
       
     } 
     else 
     {
       
     val=0;
      
     } 
      if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(5, HIGH);
     else digitalWrite (5, LOW);
     
     
    
    if(val>=5)
     {
      nexus=!nexus;
      pioner=!pioner;
      val=0;
     
     }
        
      
     
     
     
     
     //////////////////////////////
     //УПРАВЛЕНИЕ PIONER И NEXUS7//
     //////////////////////////////  
     
     
     
        //  >>> для (pioner и android)
     if(rulevieKnopki>500&&rulevieKnopki<600)digitalWrite(3, HIGH);
     else digitalWrite (3, LOW);
     
        //  <<< для (pioner и android)
     if(rulevieKnopki>895&&rulevieKnopki<950)digitalWrite(4, HIGH);
     else digitalWrite (4, LOW);
     
       // (Mute (для Pioner), play psuse (для nexus7))
       //
      
     
      //увеличеное громкости pioner  
      if(rulevieKnopki>950&&rulevieKnopki<1012)digitalWrite(11, HIGH);
     else digitalWrite (11, LOW);
     
       //уменьшение громкости pioner
     if(rulevieKnopki>1013&&rulevieKnopki<1024)digitalWrite(12, HIGH);
     else digitalWrite (12, LOW);
      
            
      
      
      //////////////////////
      //Управление круизом//
      //////////////////////
      
      
      
        //кнопка AUTO круиз контроль
      if(cruisecontrol>250&&cruisecontrol<420)digitalWrite(10, HIGH);
     else digitalWrite (10, LOW);
     
       //Кнопка reset круиз контроль
     if(cruisecontrol>440&&cruisecontrol<650)digitalWrite(9, HIGH);
     else digitalWrite (9, LOW);
    
      //Кнопка UP круиз контроль
     if(cruisecontrol>750&&cruisecontrol<1024)digitalWrite(8, HIGH);
     else digitalWrite (8, LOW);
     
     
          
 } 
 

Переключатель сделал, теперь надо сделать так чтобы 5-й пин не включался при удерживании кнопки.