Go Down

Topic: Problema con funcion (Read 119 times) previous topic - next topic

robertus98

Nov 22, 2017, 04:29 pm Last Edit: Nov 22, 2017, 04:38 pm by robertus98
Buenas, el caso es que he creado una funcion (para acortar el codigo de un menu) que simplemente se encarga de modificar una variable sumandole 1 o restandole 1 (dentro de unos limites) segun que tecla se ha pulsado...el caso es que el mismo codigo funciona bien si lo ejecuto directamente, pero si lo ejecuto como funcion solo me suma o resta una vez... Es decir, que si quiere modificar la "tempmax" solo me deja cambiarla a 27 o 25...No entiendo a que se debe.Si alguien me hiciera ver la luz le daria las gracias  :D

Code: [Select]

tempmax = 26;

    if(variable_menu == 0 && variable_submenu == 2 && variable_cursor == 0){
      registro("Fija Temp. Max.", tempmax, 12, 35, key);
          
    }
    if(variable_menu == 0 && variable_submenu == 2 && variable_cursor == 1){
      lcd.setCursor(0, 0);
      lcd.print("Fija Temp. Min.");
      alpha = 0; //desactiva la navegacion
      if(key == '2' && tempmin < 28){
        lcd.clear();
        lcd.setCursor(0, 1);
        tempmin = tempmin + 1;
        lcd.print(tempmin);
      }
      if(key == '0' && tempmin > 5){
        lcd.clear();
        lcd.setCursor(0, 1);
        tempmin = tempmin - 1;
        lcd.print(tempmin);
        }
        if(key == '3'){
          lcd.clear();
          alpha = 1;
          variable_submenu = 1;      
        }

  void registro(char *titulo, int variable, int mini, int maxi, char key){
      lcd.setCursor(0, 0);
      lcd.print(titulo);
      alpha = 0; //desactiva la navegacion
      if(key == '2' && variable < maxi){
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(titulo);
        lcd.setCursor(0, 1);
        variable++;
        lcd.print(variable);
      }
      if(key == '0' && variable > mini){
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(titulo);
        lcd.setCursor(0, 1);
        variable = variable - 1;
        lcd.print(variable);
        }
        if(key == '3'){
          lcd.clear();
          alpha = 1;
          variable_submenu = 1;
          return;
            
    }

surbyte

Tu crees que con lo que has posteado podemos entender como se modifica tempmax?

Yo no veo el resto del código po ende.. no se como funciona, si esta en el loop, si esta como global?

Por favor coloca todo el código para entender de que estas hablando.

robertus98

#2
Nov 22, 2017, 10:15 pm Last Edit: Nov 22, 2017, 10:35 pm by robertus98
Lo siento, pense que asi lo complicaria menos...El codigo esta incompleto porque pense en hacerlo con funciones ya que igual no me cabe el programa al completo...

Code: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>


LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display


const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns

byte rowPins[ROWS] ={ 2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 7, 8}; //connect to the column pinouts of the keypad

char numberKeys[ROWS][COLS] = {
    { '1','2','3' },
    { '4','5','6' },
    { '7','8','9' },
    { '*','0','#' }
};

boolean alpha = 1;   // Alterna entre teclado normal y el que se usa para moverse

int tempmax = 26;
int tempmin = 15;
int mini;
int maxi;

int variable_menu; //Para navegar entre las principañes opciones
int variable_submenu; //Para acceder a los diferentes niveles
int variable_cursor; //Para navegar en los niveles inferiores

// Create two new keypads, one is a number pad and the other is a letter pad.
Keypad numpad = Keypad( makeKeymap(numberKeys), rowPins, colPins, sizeof(rowPins), sizeof(colPins) );


void setup() {
  
    Serial.begin(9600);
    lcd.backlight();
    lcd.init();                      // initialize the lcd
    lcd.init();
    lcd.clear();
    int variable_menu = 0;
    int variable_submenu = 0;
    int variable_cursor = 0;
}



void loop() {
         char key = numpad.getKey();
         Serial.print(key);
        
         if ( key == '2' && variable_menu > 0 && variable_submenu == 0 && alpha == 1){
           variable_menu = variable_menu - 1;
           lcd.clear();
         }
         if( key == '2' && variable_cursor >= 1 && variable_submenu == 1 && alpha == 1){
          variable_cursor = variable_cursor - 1;          
         }
         if( key == '0' && variable_cursor < 1 && variable_submenu == 1 && alpha == 1){
          variable_cursor = variable_cursor + 1;          
         }
         if (key == '0' && variable_menu < 3 && variable_submenu == 0 && alpha == 1){ //3 son los estados de menu, ahora es un ejemplo
            variable_menu = variable_menu + 1;
            Serial.print(variable_menu);
            lcd.clear();
          }
         if (key == '5' && variable_submenu < 2 && alpha == 1){
           variable_submenu = variable_submenu + 1;
           lcd.clear();
          }
         if (key == '8' && variable_submenu == 1 && alpha == 1){
           variable_submenu = variable_submenu - 1;
           lcd.clear();
          }
    if (variable_menu == 0 && variable_submenu == 0 && variable_cursor == 0){
      lcd.setCursor(0, 0);
      lcd.print("-->Temperatura");
      lcd.setCursor(0, 1);
      lcd.print("Humedad");
    }
    if(variable_menu == 0 && variable_submenu == 1 && variable_cursor == 0){
      lcd.setCursor(0, 0);
      lcd.print("-->Temp. Max.   ");
      lcd.setCursor(0, 1);
      lcd.print("Temp. Min.  ");
    }
    if(variable_menu == 0 && variable_submenu == 2 && variable_cursor == 0){
      registro("Fija Temp. Max.", tempmax, 12, 35, key);   //***llamada a la funcion cabrona
          
    }          
    if(variable_menu == 0 && variable_submenu == 1 && variable_cursor == 1){
      lcd.setCursor(0, 0);
      lcd.print("-->Temp. Min.");
      lcd.setCursor(0, 1);
      lcd.print("Temp. Max.");
    }  
    if(variable_menu == 0 && variable_submenu == 2 && variable_cursor == 1){
      lcd.setCursor(0, 0);
      lcd.print("Fija Temp. Min.");
      alpha = 0; //desactiva la navegacion
      if(key == '2' && tempmin < 28){
        lcd.clear();
        lcd.setCursor(0, 1);
        tempmin = tempmin + 1;
        lcd.print(tempmin);
      }
      if(key == '0' && tempmin > 5){
        lcd.clear();
        lcd.setCursor(0, 1);
        tempmin = tempmin - 1;
        lcd.print(tempmin);
        }
        if(key == '3'){
          lcd.clear();
          alpha = 1;
          variable_submenu = 1;      
        }
    }    
   if (variable_menu == 1 && variable_submenu == 0 && variable_cursor == 0){  
      lcd.setCursor(0, 0);
      lcd.print("-->Humedad");
      lcd.setCursor(0, 1);
      lcd.print("Viento");    
    }
   if ( variable_menu == 2 && variable_submenu == 0 && variable_cursor == 0){  
      lcd.setCursor(0, 0);
      lcd.print("-->Viento");
      lcd.setCursor(0, 1);
      lcd.print("Humedad Tierra");    
    }
    }
    
    void registro(char *titulo, int variable, int mini, int maxi, char key){
      lcd.setCursor(0, 0);
      lcd.print(titulo);
      alpha = 0; //desactiva la navegacion
      if(key == '2' && variable < maxi){
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(titulo);
        lcd.setCursor(0, 1);
        variable++;
        lcd.print(variable);
      }
      if(key == '0' && variable > mini){
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(titulo);
        lcd.setCursor(0, 1);
        variable = variable - 1;
        lcd.print(variable);
        }
        if(key == '3'){
          lcd.clear();
          alpha = 1;
          variable_submenu = 1;
          return;
            
    }
    }




surbyte

Ahora si.
Bueno usas un puntero y los punteros suelen dar problemas cuando no se los limita.
Intenta esto

Code: [Select]
void registro(const char *titulo, int variable, int mini, int maxi, char key){
en lugar de char *
const char *

Tamb puedes intentar esto
Code: [Select]
void registro(String titulo, int variable, int mini, int maxi, char key){

IgnoranteAbsoluto

#4
Nov 24, 2017, 06:44 am Last Edit: Nov 24, 2017, 06:46 am by IgnoranteAbsoluto
El problema es que se le está pasando la variable tempmax por valor (una copia) al parámetro varible de la función registro, por lo que las modificaciónes no afetan a tempmax. Para solucionarlo se ha de pasar el parámetro por referencia, basta para ello con poner un & en la declaración del parámetro variable. La línea:
Code: [Select]
void registro(char *titulo, int variable, int mini, int maxi, char key){
ha de quedar así:
Code: [Select]
void registro(char *titulo, int &variable, int mini, int maxi, char key){
Con este cambio ha de funcionar.

robertus98


@surbyte
Gracias por el consejo, ya esta cambiado  :D


@IgnoranteAbsoluto
Muchas gracias, eso ha resuelto el problema...aun me queda mucho por aprender. De nuevo, muchas gracias por la ayuda a los dos.  ;D

Go Up