arduino uno , LCD keypad shield + Relay shield(4)

Hola,

Mi nombre es Mauricio y soy algo nuevo aprendiendo de arduino , espero con algo de ayuda poder aprender mas de esto y eventualmente poder realizar aportes propios a la comunidad.

En esta oportunidad quisiera partir pidiendo una ayuda o el codigo que es mas bien simple (creo)

Tengo un arduino uno + lcd keypad shield + 4 relay base shield y necesito hacer un menu donde pueda navegar con los botones del lcd keypad shield para prender y apagar cada uno de los relays con determinada funcion.

Aun no soy capaz de generar mi propio codigo y en internet solo he podido encontrar o codigos para los relays (pero sin uso del lcd y sus botones) o menus para el lcd keypad shield donde puedo navegar pero no tengo control sobre los relays.

Lo que estoy intentando hacer es copiar la idea de "jeeputer" que es basicamente prender y apagar cosas con los relays del arduino

JEEPUTER

Estoy atascado con esto , ojala me puedan ayudar con el codigo.

Saludos!!

A ver.. deja de buscar en internet y ve a Documentación y lee todo lo que puedas.
Lo mejor es tener un buen libro y aprender.

Puedes usar los ejemplos del IDE para cada caso.
El LCD tiene ejemplos para probar..
Cualquier cosa que accione un LED como Blink.ino puedes usarlo para accionar un RELE.
Asi que ya ves lo fácil que puede ser.

Gracias Surbyte!!

Si he estado jugando con eso , pero lo mas que logro hasta ahora es que con cada boton que aprieto prenden los relays...todos.... y solo mientras tenga presionado el boton, comenzare a revisar los ejemplos de IDE como me dices, de todas maneras si pueden ayudarme con una base mas solida les agradeceria un monton.

Gracias de nuevo!

Entonces pasemos a la lección 2, como usar una variable para controla el estado de un relé.

Primero si usas una variable para prender/apagar es lo mismo que 1/0 o true/false.
Esa variable se llama boolean o simplemente bool
definamos una variable bool de nombre estado asi

bool estado;

Definamos tambien variables para ver el estado de los pulsadores

bool boton1, boton1Ant;
bool boton2, boton2Ant;
bool boton3, boton3Ant;
bool boton4, boton4Ant;

defino una variable botonX y otra botonXAnt porque quiero guardar el estado que tenia al boton antes de ser pulsado para compararlo.
imagina que nadie pulsó.. entonces boton1Ant = false o 0 (CERO)
si ahora alguien pulsa boton1 toma el valor de 1 o true
o sea hubo un cambio de 0 a 1
ese cambio de 0 a 1 será mi comando de accionamiento para que otra variable llamado estado cambie de valor, de modo que cada vez que uno presione el pulsador estado valga alternativamente 0/1/0/1/0/1 o sea bascula pero con cada presión del boton. Espero lo entiendas porque cuando pase al código lucirá mas complicado o no.
Hagamos un programita para comandar 4 RELES usando 4 botones de este modo.
Tendre que asignar pines a esos botones y a los reles
los botones estarán en 2,3,4,5 y los relés en 8,9,10,11 pero elige lo que gustes
No te voy a complicar pero podriamos usar arrays para comodidad pero no lo haré.

const byte btn1  = 2;
const byte btn1  = 3;
const byte btn1  = 4;
const byte btn1  = 5;

const byte rele1 =  8;
const byte rele1 =  9;
const byte rele1 = 10;
const byte rele1 = 11;

bool boton1, boton1Ant, estado1;
bool boton2, boton2Ant, estado2;
bool boton3, boton3Ant, estado3;
bool boton4, boton4Ant, estado4;

void setup(){
    pinMode(boton1, INPUT_PULLUP);
    pinMode(boton2, INPUT_PULLUP);
    pinMode(boton3, INPUT_PULLUP);
    pinMode(boton4, INPUT_PULLUP);
    pinMode(rele1, OUTPUT);
    pinMode(rele2, OUTPUT);
    pinMode(rele3, OUTPUT);
    pinMode(rele4, OUTPUT);
}

void loop() {

    boton1 = digitalRead(btn1);
    boton2 = digitalRead(btn2);
    boton3 = digitalRead(btn3);
    boton4 = digitalRead(btn4);

    if (boton1 && !boton1Ant) {
        estado1 = !estado1;       // ! invierte el valor de estado
    }
    boton1Ant = boton1;
    
    if (boton2 && !boton2Ant) {
        estado2 = !estado2;       // ! invierte el valor de estado
    }
    boton2Ant = boton2;

    if (boton3 && !boton3Ant) {
        estado3 = !estado3;       // ! invierte el valor de estado
    }
    boton3Ant = boton3;

    if (boton4 && !boton4Ant) {
        estado4 = !estado4;       // ! invierte el valor de estado
    }
    boton4Ant = boton4;

    if (estado1)
        digtalWrite(rele1, HIGH);  // enciendo el rele1
    else
        digtalWrite(rele1, LOW);   // apago el rele1
    
    if (estado2)
        digtalWrite(rele2, HIGH);  // enciendo el rele1
    else
        digtalWrite(rele2, LOW);   // apago el rele1

    if (estado3)
        digtalWrite(rele3, HIGH);  // enciendo el rele1
    else
        digtalWrite(rele3, LOW);   // apago el rele1

    if (estado4)
        digtalWrite(rele4, HIGH);  // enciendo el rele1
    else
        digtalWrite(rele4, LOW);   // apago el rele1

}

Conecta los botones entre GND y el pin directamente.
Ahora que me acuerdo puede que funcione al revés porque los relés trabajan invertidos. No se porque lo hicieron asi.
Asi que donde diga HIGH pon LOW y vice verza

ok , entiendo, pero para poder asignar el pin que prendera o apagara el relay , lo mismo con el boton primero entonces tendre que identificar que pines son los asignados en la placa

recuerda que estoy usando todo shield , entonces sobre el arduino esta mondado el relay shield y sobre el relay shield esta montado el lcd display shield que ya cuenta con 5 botones mas un reset "mecanico"

probare como dices a ver que tanto avanzo

gracias!

El shield tiene 5 botones pero estan conectados al A0 en un arreglo analogico. Necesitas otro código para usarlos.
Si quieres usarlos debes cambiar lo que te escribi, pero eso esta hecho por todos lados.
Busca: Arduino LCD Shield y verás cosas como estas link

//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;
     }
 }

}

Ahora usa cada tecla para que cambie el estado1 a estado4 peroooo como hice yo cuando detectaba el 0 a 1, recuerdas?
o sea..
si detectas LEFT usas lo que esta dentro