Diferencia entre revisiones de «Tip 4»

De ArduWiki
Saltar a: navegación, buscar
(Página creada con «== Descripción == Como detectar el falco de subida (RISSING) de un pulsador, rele o dispositivo mecánico. == Código 1 == Con este código detectamos el flanco de subida...»)
 
(Código 2)
 
(No se muestran 3 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
Como detectar el falco de subida (RISSING) de un pulsador, rele o dispositivo mecánico.
+
Como detectar el flanco de subida (RISSING) de un pulsador, rele o dispositivo con contacto mecánico.
 +
 
 +
{{Tip|Este método soluciona el efecto de rebote.}}
  
 
== Código 1 ==
 
== Código 1 ==
Línea 22: Línea 24:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
{{Nota|Veras que el valor de n se incrementa cada 1 segundo.}}
+
{{Nota|Veras que solo aparece una vez el mensaje de deteccion por cada pulsacion sin importar e tiempo que dure dicha pulsacion.}}
  
 
== Código 2 ==
 
== Código 2 ==
Línea 44: Línea 46:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
{{Nota|Veras que el valor de n se incrementa muy rápidamente en cada ciclo de loop().}}
+
{{Nota|El unico cambio es en la condicion del if().}}
 +
 
 +
== Código 3 ==
 +
En este ejemplo tenemos que detectar el numero de pulsaciones de un boton durante medio seg y de acuerdo a eso prender un LED distinto durante 3 seg adicionales.
 +
 
 +
<syntaxhighlight lang="c++">
 +
bool valor,anterior,LED;
 +
unsigned long t1;
 +
byte n;
 +
 
 +
void setup(){
 +
  pinMode(2, OUTPUT);
 +
  pinMode(3, OUTPUT);
 +
  pinMode(4, OUTPUT);
 +
  ...
 +
  pinMode(12, INPUT_PULLUP);
 +
}
 +
 
 +
void loop(){
 +
  valor = digitalRead(12);
 +
  if (!valor && anterior && !LED){
 +
      if (n == 0){
 +
        t1 = millis();
 +
      }
 +
      n++;
 +
  }
 +
  anterior = valor;
 +
  //Detiene lectura en medio seg
 +
  if (millis() - t1 > 500 && n > 0 && !LED){
 +
      LED = true;
 +
  } 
 +
  //Acciona LED
 +
  if (LED){
 +
      digitalWrite(n+1, HIGH);
 +
  }
 +
  //Apagar todo luego de 3 seg
 +
  if (millis() - t1 > 3500 && LED){
 +
      LED = false;
 +
      digitalWrite(n+1, LOW);
 +
      n = 0;
 +
  }
 +
}
 +
</syntaxhighlight>
  
 
== Vea también ==
 
== Vea también ==

Revisión actual del 19:22 16 dic 2019

Descripción

Como detectar el flanco de subida (RISSING) de un pulsador, rele o dispositivo con contacto mecánico.

Tip: Este método soluciona el efecto de rebote.


Código 1

Con este código detectamos el flanco de subida (RISSING) de un contacto mecánico con una conexión en pulldown.

bool actual,anterior;

void setup(){
   Serial.begin(9600);
   pinMode(2, INPUT);
}

void loop(){
   actual = digitalRead(2);
   if (actual && !anterior){
      Serial.println("Flanco de subida detectado");
   }
   anterior = actual;
}

Nota: Veras que solo aparece una vez el mensaje de deteccion por cada pulsacion sin importar e tiempo que dure dicha pulsacion.


Código 2

Con este código detectamos el flanco de bajada (FALING) de un contacto mecánico con una conexión en pullup.

bool actual,anterior;

void setup(){
   Serial.begin(9600);
   pinMode(2, INPUT_PULLUP);
}

void loop(){
   actual = digitalRead(2);
   if (!actual && anterior){
      Serial.println("Flanco de bajada detectado");
   }
   anterior = actual;
}

Nota: El unico cambio es en la condicion del if().


Código 3

En este ejemplo tenemos que detectar el numero de pulsaciones de un boton durante medio seg y de acuerdo a eso prender un LED distinto durante 3 seg adicionales.

bool valor,anterior,LED;
unsigned long t1;
byte n;

void setup(){
   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);
   pinMode(4, OUTPUT);
   ...
   pinMode(12, INPUT_PULLUP);
}

void loop(){
   valor = digitalRead(12);
   if (!valor && anterior && !LED){
      if (n == 0){
         t1 = millis();
      }
      n++;
   }
   anterior = valor;
   //Detiene lectura en medio seg
   if (millis() - t1 > 500 && n > 0 && !LED){
      LED = true;
   }   
   //Acciona LED
   if (LED){
      digitalWrite(n+1, HIGH);
   }
   //Apagar todo luego de 3 seg
   if (millis() - t1 > 3500 && LED){
      LED = false;
      digitalWrite(n+1, LOW);
      n = 0;
   }
}

Vea también

Tips


Referencias externas