Go Down

Topic: Mejor metodo crear botonadura DIY proyecto (Read 835 times) previous topic - next topic

aestrada

Hola, quiero crear una botonadura de tres botones para un proyecto de Arduino. el caso es que he visto una muy simple con varias resistencias en serie (de 3K Ohm en mi caso) conectadas a tres pulsadores, con el terminal comun de todos los pulsadores al Pin analógico 0 y el comun de todas las resistencias conectado a GND. Es muy sencillo de hacer y con el scketch de prueba que adjunto funciona perfectamente con un proyecto que usa un LCD1602, un modulo SD y un modulo serie, sin estar activados por software. Pero el problema viene al intentar integrarlo en un sketch mucho más complejo, donde se activan todos los módulos anteriores en dicho sketch, entonces la botonadura se vuelve muy variable en resultados al pulsarla, los valores del pin analógico 0 se vuelven muy erráticos. La botonadura es esta:


El scketch de testeo que uso es este:

Code: [Select]

//Botonadura hecha con 3 resistencias de 3k en serie uniendo
//cada pata de cada boton y terminando en GND. La otra pata
// de todos los botones a Pin A0
// Example 25.3

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int a=0;
int b,c = 0;
void setup()
{
  lcd.begin(16, 2);
  pinMode(A0, INPUT_PULLUP); // sets analog pin for input

}

int readButtons(int pin)
// returns the button number pressed, or zero for none pressed
// int pin is the analog pin number to read
{
  //int b,c = 0;
  c=analogRead(pin); // get the analog value 
  if (c>1000)
  {
    b=0; // buttons have not been pressed
  }   
    else
      if (c>200 && c<230)//204-219
      {
        b=1; // button 1 pressed
      }         
      else
        if (c>150 && c<180)//157-161
        {
          b=2; // button 2 pressed
        }           
        else
          if (c<140)//92-95
          {
            b=3; // button 5 pressed
          }
return b;
}

void loop()
{
  a=readButtons(0);
  lcd.clear();
  if (a==0) // no buttons pressed
  {
    lcd.setCursor(0,0);
    lcd.print("Press a button");
    lcd.setCursor(0,1);
    lcd.print(c);
  }   
  else
    if (a>0) // someone pressed a button!
    {
      lcd.setCursor(0,0);
      lcd.print("Pressed button ");
      lcd.print(a);
      lcd.setCursor(0,1);
      lcd.print(c);
    }
  delay(1000); // give the human time to read LCD
}


He visto esquemas de botonaduras mas complejos que usan la alimentación de 5v y resistencias de varios valores para hacerlos. El caso es que usando la que tiene mi keypadshield 1602 genérico de 5 botones, funciona perfectamente el sketch, pero claro, usando otro código más complejo. Me gustaría usar una botonadura simple de 3 botones con mi LCD1602, que a la vez es un conjunto mucho más fácil de encapsular en una caja. El sistema es un discriminador de llamadas telefónicas que tengo casi terminado.

carmeloco

¿Has probado a poner un resistencia PULL UP física, en vez de la configurada?

maxid

El valor a leer debe estar en un rango porque al variar la tension de fuente cambia la lectura.
Segundo, pon un capacitor de 100nf en la entrada de a0, para hacer estable la lectura.
Tercero, lee almenos 3 veces el conversor y promedia para tener un valor mas exacto
El que pregunta aprende, el que responde aprende a responder.

aestrada

Gracias a todos. mi botonadura funciona ya perfectamente. sin sin tener que realizar ningún cambio. La parte que la controla es la que os escribo abajo. Además ya he solucionado unos problemas con el manejo de una tarjeta SD que exigía mi proyecto de discriminador de llamadas y ya perece que funciona a la perfección.

Code: [Select]

int read_LCD_buttons()
{
adc_key_in = analogRead(0);      // read the value from the sensor

//Valores para botonadura simple de 3 resistencias de 3k Ohm en serie

if (adc_key_in > 1000) return btnNONE; // Ningun boton pulsado

if (adc_key_in < 95 && adc_key_in > 90)   return btnRIGHT; 
//if (adc_key_in < 250)  return btnUP;
if (adc_key_in < 200 && adc_key_in > 100)  return btnDOWN;
//if (adc_key_in < 650)  return btnLEFT;
if (adc_key_in > 200 && adc_key_in < 300)  return btnSELECT; 

return btnNONE;  // when all others fail, return this...
}
// FIN READ BUTTONS

Go Up