Go Down

Topic: Código para controlar la temperatura con keypad. (Read 681 times) previous topic - next topic

osvaldo147

Oct 31, 2017, 04:06 am Last Edit: Oct 31, 2017, 09:42 pm by surbyte
No puedo enviar datos del keypad al arduino Mega, tengo tres problemas el primero es cuando escribo un numero solo aparece el primer digito que escribí en la pantalla lcd y no me funciona la tecla que hace la función de enter, y el ultimo problema es cuando escribo el primer digito se vuelve a escribir lo ya antes imprimido en la pantalla lcd  :smiley-confuse: .


Code: [Select]

#include <LiquidCrystal.h>
LiquidCrystal lcd(29, 28, 27, 26, 25, 24);
const int sensor = 0;
const int ledazul = 3;
const int ledrojo = 4;
int brillo;
long milivolts;
long temperatura;
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
};

byte rowPins[ROWS] = {53, 52, 51, 50};//filas
byte colPins[COLS] = {49, 48, 47}; //columnas

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

char tecla;
String numero;
int temperatura_deseada;



int ventilador = 30;
void setup() {
lcd.begin(16,2);//iniciamos el lcd
pinMode(ledrojo, OUTPUT);
pinMode(ledazul, OUTPUT);
pinMode(ventilador, OUTPUT);
}

void loop() {

milivolts = (analogRead(sensor) * 5000L) / 1023;
temperatura = milivolts / 10;
brillo = map(temperatura, 0, 41, 0, 255);
brillo = constrain(brillo, 0, 255);
analogWrite(ledrojo, brillo);
analogWrite(ledazul,255 - brillo);
lcd.print("temp. ");
lcd.print(temperatura);
lcd.print(" grados");
lcd.noAutoscroll();
lcd.home();
 tecla = keypad.getKey();

if(tecla!=NO_KEY && (tecla=='1'||tecla=='2'||tecla=='3'||tecla=='4'||tecla=='5'||tecla=='6'||tecla=='7'||tecla=='8'||tecla=='9'||tecla=='0'))
{
numero=  - 48 +tecla;
lcd.setCursor(5,1); //la posicion en que se va a mostrar en el lcd
lcd.print(numero);
}

else if(tecla!=NO_KEY && tecla=='*') //aquí pones el que tu desees ya sea * o #
{
temperatura_deseada=numero.toInt();//convertimos la cadena de caracteres en enteros

if(temperatura>temperatura_deseada)
{
digitalWrite(ventilador,HIGH);
}

else
{
digitalWrite(ventilador,LOW);
}

}
}

surbyte

El problema es que esto
Code: [Select]
temperatura_deseada = numero.toInt();

requiere que exista una cadena de numeros y termina cuando ingresa algo que no lo es

Quote
Converts a valid String to an integer. The input string should start with an integer number. If the string contains non-integer numbers, the function will stop performing the conversion.
Tu solo le agregas números permitidos entonces jamás terminará.

No lo he probado pero verifica si ahora trabaja mejor

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(29, 28, 27, 26, 25, 24);
const int sensor = 0;
const int ledazul = 3;
const int ledrojo = 4;
int brillo;
long milivolts;
long temperatura;
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
};

byte rowPins[ROWS] = {53, 52, 51, 50};//filas
byte colPins[COLS] = {49, 48, 47}; //columnas

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

char tecla;
String numero = "";
int temperatura_deseada;



int ventilador = 30;
void setup() {
    lcd.begin(16,2);//iniciamos el lcd
    pinMode(ledrojo, OUTPUT);
    pinMode(ledazul, OUTPUT);
    pinMode(ventilador, OUTPUT);
}

void loop() {

  milivolts = (analogRead(sensor) * 5000L) / 1023;
  temperatura = milivolts / 10;
  brillo = map(temperatura, 0, 41, 0, 255);
  brillo = constrain(brillo, 0, 255);
  analogWrite(ledrojo, brillo);
  analogWrite(ledazul,255 - brillo);
 
  lcd.print("temp. ");
  lcd.print(temperatura);
  lcd.print(" grados");
  lcd.noAutoscroll();
  lcd.home();
 
  tecla = keypad.getKey();
  if (tecla!=NO_KEY) {
     switch(tecla){
      case '0'.. '9' :  int tmp = tecla - 48;
                        numero++ = tmp;
                        lcd.setCursor(5,1); //la posicion en que se va a mostrar en el lcd
                        lcd.print(numero);
                        break;
      case '*'       :  numero = tecla;
                        temperatura_deseada = numero.toInt();//convertimos la cadena de caracteres en enteros
                        if (temperatura>temperatura_deseada)
                            digitalWrite(ventilador,HIGH);
                        else
                            digitalWrite(ventilador,LOW);
     }
  }
}

Go Up