Кнопка и одно действие

bit
Offline
Зарегистрирован: 07.05.2012

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

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

 

const int buttonPin = 11;     
const int ledPin =  13;      

int buttonState = 0;      
 
void setup() {
 
  pinMode(ledPin, OUTPUT);      
 
  pinMode(buttonPin, INPUT);    
}
 
void loop(){
 
  buttonState = digitalRead(buttonPin);
 
  
  
  if (buttonState == HIGH) {    
    
    digitalWrite(ledPin, HIGH);
  delay(1000);  
  digitalWrite(ledPin, LOW);
  delay(1000);
   digitalWrite(ledPin, HIGH);
  delay(1000);  
  digitalWrite(ledPin, LOW);
  delay(1000);
  }
  else {
    
   digitalWrite(ledPin, HIGH);
  delay(100);  
  digitalWrite(ledPin, LOW);
  delay(100);
   digitalWrite(ledPin, HIGH);
  delay(100);  
  digitalWrite(ledPin, LOW);
  delay(100);
   digitalWrite(ledPin, HIGH);
  delay(100);  
  digitalWrite(ledPin, LOW);
  delay(100);
  }
}

 

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

к примеру повесить на прерывание с флагом CHANGED повесив кнопку на порт 3


volatile int state = LOW;
 
void setup()
{

  attachInterrupt(1, blink, CHANGE);
}
 
void loop()
{

}
 
void blink()
{
if(state)
{
//do action1
}
else
{
//do action2
}
  state = !state;

}

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

без прерывания:

char state = 0;



void loop()
{
  char but = digitalRead(BUTT_PIN);
  if(but && !state)
  {
     //action on press
     state = 1;
  }
 else if(!but && state)
 {
    //action on release
    state = 0;
 }
}

 

bit
Offline
Зарегистрирован: 07.05.2012

Спасибо

maksim
Offline
Зарегистрирован: 12.02.2012

А вообще вы бы над своей темой прикрепленную посмотрели  Работа с кнопками. В помощь новичку.

bit
Offline
Зарегистрирован: 07.05.2012

maksim пишет:

А вообще вы бы над своей темой прикрепленную посмотрели  Работа с кнопками. В помощь новичку.

 

Я  эту тему смотрел видимо эту част проморгал

bit
Offline
Зарегистрирован: 07.05.2012

Привет всем подскажите пожалуйсто как сделать одно действие по аналоговому в ходу?

 

int sensePin =2;




void setup(){
  analogReference(DEFAULT);
  Serial.begin(9600);
  
 
}

void loop(){
  
  int val = analogRead(sensePin);
 
if ( val>500)
 { 
 Serial.println("ON");
}

if ( val<500)
 { 
 Serial.println("OFF");
}
delay(100);
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если правильно понял задачу, то, например, так:

int sensePin =2;
boolean senseIsOn = false;

void setup()
{
  analogReference(DEFAULT);
  Serial.begin(9600);
}

void loop()
{
  int val = analogRead(sensePin);
 
  if ( val>500)
  { 
    if( !senseIsOn )
    {
      Serial.println("ON");
      senseIsOn = true;
    }
  }
  else
  { 
    if( senseIsOn )
    {
      Serial.println("OFF");
      senseIsOn = false;
    }
  }
  delay(100);
}

Только здесь в районе 500 будет телепаться туда - сюда, нужно добавить гистерезис срабатывания, например, так ( +-20 зона нечувствительности):

  if ( val>520)
  { 
    if( !senseIsOn )
    {
      Serial.println("ON");
      senseIsOn = true;
    }
  }
  else if ( val < 480)
  { 
    if( senseIsOn )
    {
      Serial.println("OFF");
      senseIsOn = false;
    }
  }

Писал на коленке, компилятора нет под рукой, но смысл, я думаю, понятен

bit
Offline
Зарегистрирован: 07.05.2012

Спасибо

sp34
Offline
Зарегистрирован: 05.03.2013
01 if(sensor>=450&&sensor<=890&&key>85&&key<95)// - если нажата кнопка Up
02 {
03   val_Up++;// - прибавляем к переменной единицу при каждой смене цикла.
04 }
05 else// - если не нажата...
06 {
07   val_Up=0;// - приравниваем значение к нулю.
08 }
09 if(val_Up>=10&&sensor>=450&&sensor<=890) // - если достигаем значения 10 циклов или более то ...
10 {
11   flag_Auto_Up=0;// - выкл авто режима Up
12   flag_Auto_Down=0;// - выкл авто режима Down
13   digitalWrite(11,HIGH);// - двигатель UP
14   digitalWrite(12,LOW);
15   Serial.print(" Up ");
16   val_Up=0; // - присваиваем ноль для следующих нажатий
17 }
18  
19 // - лимит верхний
20 if(sensor>=891&&sensor<=1024&&key>85&&key<95)
21 {
22   digitalWrite(11,LOW);// - стоп
23   digitalWrite(12,LOW);// - стоп
24 }

Ребята ! подскажите , не нашел похожих примеров в поисковике и в теме про кнопки задавал вопрос , но тишина.

Имеем вот такой кусок кода , работает он так - при удержании аналоговой кнопки в течении 10 циклов LOOP включается двигатель и вращается пока не отпустим кноку.

Хотелось-бы добавить в этот код не используя delay  такую функцию как "микро шаг" данного двигателя при кратковременном нажатии на эту же кнопку ( до 10 циклолв LOOP ) и получить такой алгоритм:

Удерживаем кнопку более 2-х циклов но до 10-и - код отработает digitalWrite(11,HIGH) на периуд (микро шаг) который я ему задам - допустим 0.5сек и встанет до следующего нажатия кнопки но ожидая это нажатие не более 10 циклов , если удерживать более 10 циклов исполняется код указанный выше .

 

foxmvs
Offline
Зарегистрирован: 23.06.2013

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

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

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

Почитайте и на основе примеров сможете сами сделать

foxmvs
Offline
Зарегистрирован: 23.06.2013

Уже прочитал не раз. Ничего подходящего не увидел.

maksim
Offline
Зарегистрирован: 12.02.2012

Читайте до тех пор пока не увидите и эту тему тоже.

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

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

по поводу аналогово считывания кнопок, я бы делал так :

#define APIN        2

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

void setup()
{
        keyBut = 0;
        analogReference(DEFAULT);
}

void loop()
{
//////////////////////////////////// это можно вынести в функцию
int i1;
byte b1;

        i1 = analogRead(APIN);
        b1 = 0;
        i1 -= 100;
        while(i1 ^ 32768) {
                i1 -= 100; // 100 - это значение для примера 
                           // на самом деле это порог в зависимости от резисторов
                b1++;
        }
        if (b1 != (keyBut & 127)) keyBut = b1 + 128;
//////////////////////////////////////////////////////////////////
//////  далее в программе старший бит в keyBut содержит флаг изменения 
//////  остальное код нажатой клавиши или 0 если клавиша отпущена
//////  присчитывание не забываем сбросить флаг keyBut &= ~128;
}