Go Down

Topic: ayuda con IF (Read 204 times) previous topic - next topic

criss_aw

Hola amigos, soy nuevo en esto y estoy haciendo un programa que consiste en 3 pulsadores (arriba, abajo y ok) para subir o bajar el valor de una variable, mientras tanto, poder verla en el visualizador led si es que mi comparación de IF está bien hecha, el tema es que la prenda llegó al valor antes de dar, OK, espero que haya explicado bien y pueda ayudarme.
adjunto mi programa


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
LiquidCrystal_I2C lcd(0x27,20,4);

int conta= 50;

void setup() {
  lcd.begin(20,4); //indico lcd 20*4
lcd.backlight(); //activo luz
lcd.init(); // activo pantalla
lcd.clear();
Serial.begin(9600);
pinMode(6,INPUT);
//sensors.begin(); 
}

void loop () {
primera();
elok ();
// aca antes de setear se me dispara solo el led al pasar conta= 55 :/
if(conta> 55){
  digitalWrite(3, HIGH);
}
if(conta< 55){
    digitalWrite(3, LOW);
  }
}


void primera(){
 lcd.setCursor(0,0);
lcd.print("Valor");
    lcd.setCursor(5,1);
 lcd.print(conta);
if( digitalRead(6)== HIGH){
  delay(10);
  if (digitalRead(6)==LOW){
 
   conta= 1+conta;  }
}
if( digitalRead(7)== HIGH){
  delay(10);
  if (digitalRead(7)==LOW){
 
   conta--;  }
}
  }
//---------------------------------//
  void elok (){
    if (digitalRead(8)==HIGH){
  delay(10);
  if (digitalRead(8)==LOW){
   lcd.setCursor(5,2);
lcd.print("ACEPTADA");
  }
}
  }

ArduMyth

#1
Mar 15, 2018, 03:04 pm Last Edit: Mar 15, 2018, 03:08 pm by ArduMyth Reason: añadir enlace
  • El código que incluyas debe estar entre tags [ code ] [ /code ] Ver normas del foro.
  • Una correcta sangría de los cierres mejora la lectura del código tanto para ti cómo para terceros.
  • Es recomendable que los pines que uses estén en variables constantes o #define para saber qué son
  • Te faltan pinMode en algunos botones y del pin led.
  • lcd se inicia con begin() no con init() que una variable privada de la clase (ignoro que versión tienes de la librería).
  • Hacer los debounces con delay es un desastre, por razones obvias (tu contador en parte no funciona correctamente por eso). Ver timers con millis().
  • Las funciones tienen su por qué, no son separadores de código.

En ti está aprender y reitero la importancia de tener el código bien estructurado. Yo no estoy en contra de líneas largas por usar operadores ternarios pero sí cuando los cierres no sabes de donde vienen o las tabulaciones (sangrías) dificultan la lectura.

Esto es una guía, está sin testar pero te vale para entender tanto los debounce cómo un par de cositas más ;).
Code: [Select]

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
LiquidCrystal_I2C lcd(0x27,20,4);

const byte
pinLed    = 3,
pinUp     = 6,
pinDown   = 7,
pinOk     = 8,
limitCont = 100,
debounce  = 80;

byte
cont = 50;

bool
stateOkButton = false;

unsigned long
debounce_lcd     = 0,
debounce_btnOk   = 0,
debounce_btnUp   = 0,
debounce_btnDown = 0;

void setup() {
  Serial.begin(9600);
  lcd.begin(20,4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,0);
  
  pinMode(pinLed, OUTPUT);
  ////////////////////////////////////////////////////////
  pinMode(pinUp,  INPUT_PULLUP); //añadir resistencia 10K
  pinMode(pinDown,INPUT_PULLUP); //añadir resistencia 10K
  //Debounce por hardware y Software
  ////////////////////////////////////////////////////////
}

void loop () {
  //Estado led según contador
  digitalWrite(pinLed, ((cont> 55) ? true : false) );

  //Debounce del botón Incrementar variable
  if(millis() >= debounce_btnUp && digitalRead(pinUp) && !stateOkButton ){
    cont = (cont + 1 > limitCont) ? limitCont : cont + 1;
    debounce_btnUp = millis() + debounce;
  }
  //Debounce del botón Disminuir variable
  if(millis() >= debounce_btnDown && digitalRead(pinDown) && !stateOkButton ){
    cont = (cont - 1 < 0) ? 0 : cont - 1;
    debounce_btnDown = millis() + debounce;
  }
  //Debounce del botón OK
  if(millis() >= debounce_btnOk && digitalRead(pinOk) ){
    stateOkButton = !stateOkButton;
    cont = (!stateOkButton) ? 0 : cont; //reiniciar el contador si vuelve a false
    debounce_btnOk = millis() + debounce;
  }
  //Refrescar y mostrar en LCD
  if(millis() >= debounce_lcd){
    lcd.clear();
    if(!stateOkButton){
      lcd.setCursor(0,0);
      lcd.print("VALOR");
      lcd.setCursor(5,1);
      lcd.print(cont);
    }
    else{
      lcd.setCursor(5,2);
      lcd.print("ACEPTADA");
    }
    debounce_lcd = millis() + debounce;
  }  
}


Saludos.

edito: Tutorial de millis en pdf

Go Up