Go Down

Topic: Como crear una cuenta atras y actualizar un lcd (Read 85 times) previous topic - next topic

Topor2016

Hola amigos. Estoy haciendo un proyecto para cargar baterias con un alternador de coche utilizando un motor de gasolina, algo parecido a esto:



Entonces mi idea es introducir con un teclado matricial los amperios que tiene la bateria y que muestre en el lcd los minutos restantes y que a cada minuto se actualice el lcd, para finalmente cuando se termine la cuenta atras, se active un rele para cortar la corriente del motor y este se detenga.

Ya tengo el codigo en arduino bastante avanzado, pero me falta hacer la funcion de cuenta atras y que se actualize el lcd a cada minuto.

Hasta aqui he llegado:



Ahora habria que pasar esos 40 minutos a segundos (eso no es problema ya que solo hay que multiplicarlo por 60) y con la funcion millis internamente hacer una funcion de cuenta atras, pero el lcd solo muestre los minutos restantes y se actualice a cada minuto.

Este es el codigo que tengo de momento:

Code: [Select]
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define I2C_ADDR    0x27

const byte filas = 4;
const byte columnas = 4;
byte pinesF[filas] = {9,8,7,6};
byte pinesC[columnas] = {5,4,3,2};
 
char teclas[filas][columnas] = {
 
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
 
Keypad teclado = Keypad(makeKeymap(teclas), pinesF, pinesC, filas, columnas);

char tecla;
int v1 = 0;
int v2 = 0;
int v3 = 0;

LiquidCrystal_I2C             lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);

void setup()
   {
       lcd.begin (16,2);
       lcd.setBacklightPin(3,POSITIVE);
       lcd.setBacklight(HIGH);

       lcd.home ();
       lcd.print("Amp. bateria:");
   }

void loop() {

   v1 = GetNumber();
   v2 = GetNumber();
   v3 = GetNumber();

}

int GetNumber()
{
   int num = 0;
   char key = teclado.getKey();
   while(key != 'D')
   {
      switch (key)
      {
         case NO_KEY:
            break;

         case '0': case '1': case '2': case '3': case '4':     //Muestra en el lcd los digitos pulsados
         case '5': case '6': case '7': case '8': case '9':
            lcd.print(key);
            num = num * 10 + (key - '0');
            break;

         case '*':                            //Valida los amperios introducidos y hace el calculo de los minutos restantes
            lcd.setCursor (0,2);
            num = num /2.5;           //El alternador que utilizo es de 150 amperios/hora, asi que 150/60=2.5
            lcd.print(String("Restante: ") + int(num) + String("min."));
            break;

         case '#':                          //Resetea el lcd como al principio por si nos hemos equivocado al introducir los amperios
            num = 0;
            lcd.clear();
            lcd.print("Amp. bateria:");
            break;
      }

      key = teclado.getKey();
   }

   return num;
}


Cualquier ayuda sera bien recibida. Un saludo.

surbyte

#1
Nov 16, 2017, 05:02 pm Last Edit: Nov 16, 2017, 08:41 pm by surbyte
Bueno hemos estado un buen tiempo hasta encontrarle la vuelta a cada detalle con Ramon.
Finalmente esta es la versión que hace todo lo que el quería.


Code: [Select]
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define I2C_ADDR    0x27

const byte filas = 4;
const byte columnas = 4;
byte pinesF[filas] = {9,8,7,6};
byte pinesC[columnas] = {5,4,3,2};
 
char teclas[filas][columnas] = {
 
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
 
Keypad teclado = Keypad(makeKeymap(teclas), pinesF, pinesC, filas, columnas);

char tecla;
unsigned long start;
unsigned long num;
unsigned long TiempoCarga;
const byte pinCarga  = 10;
bool cargar   = false;
bool cargaAnt = false;
bool startlcd = false;

LiquidCrystal_I2C             lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);

void setup()
   {
    lcd.begin (16,2);
    lcd.setBacklightPin(3,POSITIVE);
    lcd.setBacklight(HIGH);
    pinMode(pinCarga, OUTPUT);
    digitalWrite(pinCarga, LOW);   // rele apagado
    lcd.home ();
    lcd.print("Amp. bateria:");
    num = 0;
    Serial.begin(9600);
   }

void loop() {

  char key = teclado.getKey();
   while(key != NO_KEY)
   {
      switch (key)
      {
         case NO_KEY:
            break;

         case '0': case '1': case '2': case '3': case '4':     //Muestra en el lcd los digitos pulsados
         case '5': case '6': case '7': case '8': case '9':
            lcd.print(key);
            num = num * 10 + (key - '0');
            break;

         case '*':                            //Valida los amperios introducidos y hace el calculo de los minutos restantes
                  lcd.setCursor (0,2);
                  num = num /2.5;           //El alternador que utilizo es de 150 amperios/hora, asi que 150/60=2.5
                  lcd.print(String("Restante: ") + int(num) + String("min."));
                  cargar = true;
                  TiempoCarga = num; // paso a seg y milisegundos
                  break;
        case '#':                          //Resetea el lcd como al principio por si nos hemos equivocado al introducir los amperios
                  cargar = false;
                  TiempoCarga =0;
                  start = 0;
                  num = 0;
                  lcd.clear();
                  lcd.print("Amp. bateria:");
                  digitalWrite(pinCarga, LOW);
                  break;
      }

      key = teclado.getKey();
   }

   if (cargar && !cargaAnt) {
        start = millis();
        digitalWrite(pinCarga, LOW);      // supongo rele que se acciona
        startlcd = true;
//        Serial.println("Inicia carga");
    }
    if (!cargar && cargaAnt){
        digitalWrite(pinCarga, HIGH); // supongo rele desenergizado
        startlcd = false;
//        Serial.println("Detiene carga");
    } 
    cargaAnt = cargar;
    if (startlcd) {
        //Serial.println(String("Restante:")+long(TiempoCarga - millis() + start));
        unsigned long resta = (millis() - start) / 60000;
        num = TiempoCarga - resta;
        Serial.println(String("Restante:")+long(num));
        lcd.setCursor (0,2);
        char buffer[20];
        sprintf(buffer, "Restante %02dmin.", num); 
        lcd.print(buffer);
       
        if (num == 0) {
            cargar = false;
            TiempoCarga =0;
            start = 0;
            num = 0;
            lcd.clear();
            lcd.print("Bateria cargada!");
        }
    }

}

Topor2016

Muchas gracias!! me funciono perfectamente a la primera xDDDD

Go Up