Arduino, interruptor del empuje, Debouncing + interrupciones

ya que he empezado a usar el Arduino he encantó. Aunque encontré una cosa muy complicando con el Arduino que no pude averiguar por qué estaba pasando hasta hoy, literalmente hoy. ¿Qué es? Ha conectado un pulsador con un pin de interrupción de Arduino para hacerlo cambiar ciertas variables.

Requiere de la aplicación que estoy trabajando en el uso de 2 botones, cada uno vinculará en un Arduino (como una interrupción) y control de la posición actual del motor. Tengo 6 posiciones que quiero que el motor de.

Originalmente configurar mi circuito así:

El problema con esta configuración fue cuando presionó el botón de que la interrupción era llamado varias veces e incluso alternar otros botones. ¿Por qué estaba ocurriendo? Es causada de un interruptor que despide retroalimentación. Para solucionar este problema, debe modificar su circuito alrededor de esta manera a continuación:

Lo que esto hizo fue cuando el botón estaba en (= 1) el pasador era alta y sólo a la altura. Nunca rebota alrededor como antes.

-----

El proyecto que estaba trabajando tenía el siguiente esquema (creado con PSpice 9.1 de estudiante).

La configuración de pines es la siguiente:

  • PIN 2 - botón 1 (aumentar la posición de motor)

    • interrupción 0
  • PIN 3 - pulsador 2 (disminuye la posición de motor)
    • interrupción 1
  • PIN 22 - LED 1 (posición 1)
  • PIN 24 - LED 2 (posición 2)
  • PIN 26 - LED 3 (posición 3)
  • PIN 28 - 4 LED (posición 4)
  • PIN 30 - 5 LED (posición 5)
  • PIN 32 - LED 6 (posición 6)

Lo que esta aplicación va hacer es inicio apagado en la posición 1 entonces como le botón 1, el LED cambiará basado en la nueva posición. Llamo a estos engranajes de posiciones. Aquí está el Arudino código... es realmente sencillo.

const int led6 = 32;
const int led5 = 30;
const int led4 = 28;
const int led3 = 26;
const int led2 = 24;
const int led1 = 22;
volatile unsigned int current_gear = 1;

espera larga volátil = 3000; 3 segundos
volátil last_change_time largo largo = 0;

void loop()
{
Switch(current_gear)
{
caso 1:
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
rotura;
caso 2:
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
rotura;
caso 3:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
rotura;
caso 4:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,HIGH);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
rotura;
caso 5:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,HIGH);
digitalWrite(led6,LOW);
rotura;
caso 6:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,HIGH);
rotura;
}
}
void setup()
{
Serial.Begin(9600);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
pinMode(led6,OUTPUT);
attachInterrupt(0,up,RISING); pin digital 2 / / hasta
attachInterrupt(1,down,RISING); pin digital 3 / / abajo
}

up() vacío
{
Serial.println ("---ir---");
Serial.Print ("hora actual -");
Serial.println(Millis());
Serial.Print ("último cambiar el tiempo -");
Serial.println((Long) last_change_time);
int diferencia = millis ()-last_change_time;
Serial.Print ("diferencia -");
Diferencia de serial.println((Long));
¿Serial.Print ("en el umbral? - ");
Si (diferencia > tiempo de espera de || last_change_time == 0)
{
Serial.println("Yes");
}
otra cosa
{
Serial.println("no");
}
Serial.Print ("engranaje anterior =");
Serial.println(current_gear);
Si ((current_gear > 0 & & ((millis()-last_change_time)>timeout)) || last_change_time == 0)
{
Si (current_gear < = 5 & & current_gear! = 6)
{
current_gear ++;
last_change_time = millis();
}
}
Serial.Print ("engranaje nuevo =");
Serial.println(current_gear);
Delay(150);
}
void down()
{
Serial.println ("---ir---");
Serial.Print ("hora actual -");
Serial.println(Millis());
Serial.Print ("último cambiar el tiempo -");
Serial.println((Long) last_change_time);
int diferencia = millis ()-last_change_time;
Serial.Print ("diferencia -");
Diferencia de serial.println((Long));
¿Serial.Print ("en el umbral? - ");
if(Difference > timeout)
{
Serial.println("Yes");
}
otra cosa
{
Serial.println("no");
}
Serial.Print ("engranaje anterior =");
Serial.println(current_gear);
Si (current_gear > 0 & & ((millis()-last_change_time)>timeout))
{
int tempGear = current_gear - 1;
Si (tempGear! = 0)
{
current_gear--;
last_change_time = millis();
}
}
Serial.Print ("engranaje nuevo =");
Serial.println(current_gear);
Delay(150);
}

Ahí lo tienen, un interruptor debouncer que funcionará en cualquier caso. Este tutorial fue modificado para requisitos particulares específicamente para el Arduino! ¡ Disfrute!

Artículos Relacionados

Arduino - interruptor del sensor de tacto con la KY-036

Arduino - interruptor del sensor de tacto con la KY-036

¡Hola mundo! Aquí vamos otra vez!... Hice otro ejemplo en uno de los sensores que tiene.Esta vez hice un ejemplo para el sensor táctil de KY-036.Siga el siguiente paso para el esquema y el código.Paso 1: Código de esquema y lista de piezas.Solo alamb
Temporizador de cocina de Arduino con una introducción interrupciones de contador de tiempo

Temporizador de cocina de Arduino con una introducción interrupciones de contador de tiempo

Bienvenidos a mi primer instructivo,Decidí hacer un proyecto bastante simple para entrar al mundo instructable. Este proyecto trata de hacer un temporizador de cocina simple con un Arduino Uno. Así le dará una pequeña introducción a la pantalla tft d
Usando el interruptor del pulsador de chip

Usando el interruptor del pulsador de chip

estoy trabajando en un proyecto (Instructable pronto a ser publicado) que requiere el controlador Arduino a apagado una vez que un programa había sido ejecutar y reiniciar en el empuje de un botón. El interruptor del pulsador de Pololu encajan perfec
Interruptor del obturador de cámara automática

Interruptor del obturador de cámara automática

La mayor parte de casas encantadas y los paseos del parque de atracciones es llegar a ver fotos de tus amigos gritando de terror. Para obtener este tipo de fotografías requiere sincronización perfecta. La mejor manera de conseguirlo es con un circuit
¿Cómo cambiar el interruptor del baño?

¿Cómo cambiar el interruptor del baño?

Usted puede comprar interruptor de baño que tiene ya todas las piezas necesarias o usted puede comprar diferentes componentes que pones juntos.Ambos tipos de conmutadores tienen cubierta de plástico y caja de ensambladura que tiene interruptor todo e
Interruptor de empuje su dormitorio luces con un Simple DIY de control

Interruptor de empuje su dormitorio luces con un Simple DIY de control

OK, solo diremos apenas haya terminado de ver una película de miedo por decir, el rencor o algo. Cuando veo una película de miedo que entro en mi habitación, encender la luz a pie de mi cama a su vez mi lámpara de noche de ir a la puerta a mi habitac
Un módulo de relé DIY kit interruptor del aplauso popular

Un módulo de relé DIY kit interruptor del aplauso popular

Se dispone de un kit de conmutador de clap bricolaje popular en ebay.Es un kit de conmutador de clap muy básico que enciende un LED en el circuito. Muchos aficionados están interesados en saber cómo podemos conectar un relé en este kit y operar apara
110V interruptor del relevador de ventilador de perro

110V interruptor del relevador de ventilador de perro

utilizar un relé de 110v y una alfombra para crear interruptor de su perro puede utilizar para encender un ventilador encendido/apagado en su propia desire/need.Esta raza de perro de preferencia es el Alaskan Malamute. Cuando vivíamos en Seattle nues
Interruptor del pomo de

Interruptor del pomo de

En la fabricación de un proyecto con pintura conductora, no estaba totalmente contento con el interruptor paperfold usé. El interruptor de plegado de papel es simple, robusto y fácil de hacer, pero es un interruptor momentáneo. Para algunos proyectos
Cómo hacer el interruptor del capó encienda sus luces bajo el cofre (Dodge Charger)

Cómo hacer el interruptor del capó encienda sus luces bajo el cofre (Dodge Charger)

En este instructable mostrará usted cómo su interruptor del capó puede activar sus luces bajo el cofre. Instalación de LED para mi nuevo KillerGlass. Este mod se hace en un cargador de Dodge 2009 R/T, pero debería funcionar para desafíos, Maggies y t
Intel® Edison día práctica 4: Interruptor del tacto

Intel® Edison día práctica 4: Interruptor del tacto

Usando el botón para controlar la luz no parece lo suficientemente fría. En esta sección vamos a tratar un sensor táctil y un relé para controlar el LED. Vamos a hacerlo!Componentes requeridos1 x Sensor táctil capacitiva1 x módulo de relé V3.11 × pro
Monitor de flujo de agua - Arduino Powered del Laser del CO2 / Windows con control

Monitor de flujo de agua - Arduino Powered del Laser del CO2 / Windows con control

Alarma y Monitor de flujo de agua de láser de CO2Accionado por un Arduino y controlados por software a la medida de un PC con WindowsPara alargar la vida de un CO2 tubo del laser es necesario bomba de enfriamiento de agua a través de él mientras está
Utilizando Linkit un interruptor del tacto

Utilizando Linkit un interruptor del tacto

En este instructables voy a mostrar cómo crear un interruptor de contacto usando el tablero de Linkit uno. Se trata de una función táctil y no táctil, así que podría utilizar para fines de seguridad o diseñarlo al encender las luces cuando se pulse u
CORDÓN en el interruptor del amortiguador del

CORDÓN en el interruptor del amortiguador del

Pequeños problemas en la casa me molestan. Éste sólo toma aproximadamente una hora y es una gran mejora.El circuito para el interruptor de la luz en el techo sobre los gabinetes fue modificado más adelante agregando 4 latas empotradas con bulbos BR40