Contador programable

Hola amigos.
soy nuevo en el foro, estoy encarando un proyecto y necesito un poco de ayuda

estoy haciendo una maquina enrolladora,
la idea es usar el lcd shield solo para mostrar el nombre de la empresa y configurar mediante 2 botones la cantidad de metros a enrrollar, ascendente y descendente.
La cantidad de metros, osea el numero que muestra el shield tiene que controlar el corte de un contador el cual va a ir contando por una entrada digital y una rueda dentada la cantidad de pulsos.
Ahora mi consulta es como controlo un contador desde el shield???

Hola Maxpower_, bienvenido al foro de Arduino.

Intentaré traducir tu pedido a un formato mas o menos comprensible.

Deseas controlar una máquina enrolladora usando un RELE.
La configuración la haras con dos pulsadores que fijen el valor.
Uno para aumentar y el otro para disminuir los metros a enrollar.
Se usará un LCD Shield (cosa que no quedó muy clara).
Al arrancar debe mostrar el nombre de la empresa.

Si es como supongo que usasarás el Shield LCD, el mismo cuenta con varios botones que permiten hacer gran parte de lo que quieres.
Solo basta con agregar un RELE con un transistor conectado a una salida del Arduino.
Falta establecer que sensor usarás para leer la rueda dentada. Un sensor magnético?

En ese caso tendras un pin para la entrada de pulsos. Supongamos pin2
Si usas el shield ya tienes los botones conectados a la entrada analógica A0
Y al pin3 puedes conectar el relé a través de un transistor.

Espero confirmación de lo que acabo de expresar.

NOTA: por favor, lee las normas del foro y mira el punto 3 referido al título de los hilos. No puedes usar un título como el que tienes en este momento porque AYUDAR es lo que todo forero hace.
Asi que mira como se hace y edítalo

surbyte:
Hola Maxpower_, bienvenido al foro de Arduino.

Intentaré traducir tu pedido a un formato mas o menos comprensible.

Deseas controlar una máquina enrolladora usando un RELE.
La configuración la haras con dos pulsadores que fijen el valor.
Uno para aumentar y el otro para disminuir los metros a enrollar.
Se usará un LCD Shield (cosa que no quedó muy clara).
Al arrancar debe mostrar el nombre de la empresa.

Si es como supongo que usasarás el Shield LCD, el mismo cuenta con varios botones que permiten hacer gran parte de lo que quieres.
Solo basta con agregar un RELE con un transistor conectado a una salida del Arduino.
Falta establecer que sensor usarás para leer la rueda dentada. Un sensor magnético?

En ese caso tendras un pin para la entrada de pulsos. Supongamos pin2
Si usas el shield ya tienes los botones conectados a la entrada analógica A0
Y al pin3 puedes conectar el relé a través de un transistor.

Espero confirmación de lo que acabo de expresar.

NOTA: por favor, lee las normas del foro y mira el punto 3 referido al título de los hilos. No puedes usar un título como el que tienes en este momento porque AYUDAR es lo que todo forero hace.
Asi que mira como se hace y edítalo

Gracias por tu respuesta, ya edite el titulo para no generar confusion.
En realidad con lo que tengo problemas es con el codigo, el hardware lo tengo bien definido, pero no tengo idea como hacer un contador el cual le pueda variar el valor de "corte" desde los pulsadores y que me lo muestre en el lcd

Te hice preguntas que no respondiste.
Tienes un LCD Shield?

surbyte:
Te hice preguntas que no respondiste.
Tienes un LCD Shield?

asi es amigo, el clasico de la pantalla y los 6 botones

estoy usando un encoder para leer la posicion, ya logre que me aparesca en pantalla el dato del giro del encoder y una cantidad de metros a llegar definida en el programa , pero solo es un print con el numero solamente, me falta poder variar la cantidad de metros a elejir con los botones y que el programa corte al llegar a ese valor leido desde el encoder,este es mi codigo hasta ahora,

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
int Contador=0;
int metros=10;


void setup ()
{
 
 attachInterrupt(2, interrupcion, FALLING); 
 lcd.begin(16, 2);
 lcd.setCursor(0,0);
 lcd.print("MECATRONIC");
 delay (2000);


}
void loop()
{
 
}
void interrupcion()
{
 Contador++;
 lcd.setCursor (0,1);
 lcd.print("Mts:");
 lcd.println (metros);
   lcd.setCursor(8,1);
 lcd.print("Cont:");
 lcd.println(Contador*0.2);
}

Tienes un error conceptual.
Si usas una interrupción no puedes dentro de la interrupcion involucrar procesos lentos.
Todo lo que implica un LCD o un puerto serie, son procesos lentos.
La interrupción se ejectua, actualiza contador y puede hacer alguna otra cosa pero debes liberarla rápidamente y no muchos mseg despues. Asi que todo lo que veo del LCD out/fuera.

Levanta un flag que le diga al loop que muestre información del LCD y listo

Además lee las normas del foro y usa tags/etiquetas para insertar códigos (</> esta en particular)

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
int Contador=0;
int metros=10;
bool flag = false;

void setup () {
  
  attachInterrupt(2, interrupcion, FALLING); 
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("MECATRONIC");
  delay (2000);
}
void loop()
{
  if (flag) {
     lcd.setCursor (0,1);
     lcd.print("Mts:");
     lcd.println (metros);
     lcd.setCursor(8,1);
     lcd.print("Cont:");
     lcd.println(Contador*0.2);
     flag = false;
  }
}

void interrupcion() {
  Contador++;
  flag = true;
}

Existen librerías de menúes como MENWIZ u otras.

Si mal recuerdo hay un tutorial hecho por max_saeta en Documentación al respecto.
Busca en google: Arduino menu lcd shield o Arduino memwiz

Justo entraba a editar el codigo...
Gracias por el concepto no tenia bien en claro el tiempo de los procesos, ahora el resto del programa como el temporizador y la variable que tengo q manejar con los botones irian en el loop?? y todo el muestreo de lo que se muestra en el lcd uso el mismo flag?

No necesito menues, solo con lo que se muestra en una sola pantalla me sobra.

Acá un ejemplo, te puse uno en el enlace pero no lo leíste

Los valores que estan en este vector tal vez requieran ajuste.

int adc_key_val[5] ={50, 200, 400, 600, 800 };

Ellos determinan el umbral de detección de un botón respecto de otro.

#include <LiquidCrystal.h>
#include <LCDKeypad.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
char msgs[5][16] = {"Right Key OK ",
                    "Up Key OK    ",               
                    "Down Key OK  ",
                    "Left Key OK  ",
                    "Select Key OK" };
int adc_key_val[5] ={50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
 
void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("     helle! ");
  lcd.print("      welcome!");
  lcd.setCursor(0,1);
  lcd.print("   LinkSprite");
  lcd.print("    LCD Shield");
  delay(1000);
 
  lcd.setCursor(0,0);
  for (char k=0;k<26;k++)
  {
    lcd.scrollDisplayLeft();
    delay(400);
  }
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("ADC key testing"); 
}
void loop()
{
   adc_key_in = analogRead(0);    // read the value from the sensor 
   key = get_key(adc_key_in);  // convert into key press
   if (key != oldkey)   // if keypress is detected
   {
     delay(50);  // wait for debounce time
     adc_key_in = analogRead(0);    // read the value from the sensor 
     key = get_key(adc_key_in);    // convert into key press
     if (key != oldkey)    
     {   
       lcd.setCursor(0, 1);
       oldkey = key;
       if (key >=0)
       {
           lcd.print(msgs[key]);              
       }
     }
   }
   delay(100);
}
// Convert ADC value to key number
int get_key(unsigned int input)
{
    int k;
    for (k = 0; k < NUM_KEYS; k++)
    {
      if (input < adc_key_val[k])
      {
        return k;
      }
    }   
    if (k >= NUM_KEYS)k = -1;  // No valid key pressed
    return k;
}

Este es otro ejemplo similar

//Sample using LiquidCrystal library
#include <LiquidCrystal.h>

/*******************************************************

This program will test the LCD panel and the buttons
Mark Bramwell, July 2010

********************************************************/

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;  

 // For V1.0 comment the other threshold and use the one below:
/*
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
*/


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

void setup()
{
 lcd.begin(16, 2);              // start the library
 lcd.setCursor(0,0);
 lcd.print("Push the buttons"); // print a simple message
}
 
void loop()
{
 lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
 lcd.print(millis()/1000);      // display seconds elapsed since power-up


 lcd.setCursor(0,1);            // move to the begining of the second line
 lcd_key = read_LCD_buttons();  // read the buttons

 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT:
     {
     lcd.print("RIGHT ");
     break;
     }
   case btnLEFT:
     {
     lcd.print("LEFT   ");
     break;
     }
   case btnUP:
     {
     lcd.print("UP    ");
     break;
     }
   case btnDOWN:
     {
     lcd.print("DOWN  ");
     break;
     }
   case btnSELECT:
     {
     lcd.print("SELECT");
     break;
     }
     case btnNONE:
     {
     lcd.print("NONE  ");
     break;
     }
 }

}

Tal vez mas cómodo porque te permitirá con las dos teclas UP o DOWN controlar el umbral de comparación del contador Ascendente/Descendente.

Ahora que tienes las herramientas a trabajar.

Muchisimas gracias por el interes en ayudar, voy a intentar con todo lo que me pasaste aver si me sale

Mira.. no te abrumes. Prueba el esquema que maneja las teclas, hazlo funcionar. Luego concéntrate en dos teclas UP y DOWN por ejemplo y adjunta una variable a la que subirás con cada presion de UP y bajarás al presionar DOWN. Ya tienes resuelto gran parte del problema
Sumas la interrupción, haces una comparación de la variable controlada por UP y DOWN que ahora establecerá el umbral de comparación y lo tienes resuelto.