(solucionado)Duda sobre función

Hola que tal, tengo una duda sobre hacer una alarma de cumplimiento de sentencias, estoy haciendo un encendido de un motor, quiero que prenda si se cumplen ciertas condiciones, lei que se puede usar el comando && (y) ||(o). La cosa es que no me da resultado. todo el tiempo, aunque haya un error para prender el motor.

Cree una sentencia int llamada alarma en alarma = 0 la cual, si esta 0 deberia prender el motor, sino cambia 1 porque hay un error

//alarma total
if( (estadoAceite == HIGH) || (estadoNivelAgua == HIGH) || (estadoCorteAgua == HIGH) || (0 > 110) || (servo == HIGH) ){
  (alarma = 0);}
if( (estadoAceite == LOW) || (estadoNivelAgua == LOW) || (estadoCorteAgua == LOW) || (0 < 110) || (servo == LOW) ){
  (alarma = 1);}

la cosa es que aunque este en falla o en condiciones, me lo prende igual.
Como puedo hacer para que se fije en las condiciones?

Ten cuidado, los dos if siguientes nunca se van a cumplir:

if((estadoBuzzer == HIGH) && (gamma = LOW)){
  ...

if(estadoBuzzer = LOW){
  ..

Porque estás usando el operador de asignación = en lugar del de comparación ==

El compilador no da error ya que el if evalúa si el valor de la expresión es distinta de cero (lo considera verdadero) o si es cero (lo considera falso). Y resulta que la expresión (gamma = LOW) lo que hace es asignarle el valor LOW a la variable gamma. Y el resultado es el valor que asignas, y en este caso LOW es una constante que vale cero, luego el valor de esa expresión es siempre cero, con lo que es false. Y false AND cualquier otra cosa es siempre false.

Por otro lado te está haciendo algo que tampoco creo que desees que haga y es que si gamma valía HIGH después del if pasa a valer LOW porque le estás asignando ese valor, no comparándolo.

Con el segundo if te está pasando otro tanto de lo mismo con la variable estadoBuzzer.

Prueba a cambiar los = por == en los if. No sé si es por eso que te da los fallos que comentas, pero aún no siendo esa la causa lo has de corregir.

Claro, recien me di cuenta, intente cambiar el valor haciendo que

int gamma = 0

lo que no puedo hacer es que tengo una salida de prendido de motor pero para activar esa salida tiene que verificar si no hay errores , ahora lo tengo asi:

int alarma = 0;
alarma = 0;
if( (estadoAceite == HIGH) || (estadoNivelAgua == HIGH) || (estadoCorteAgua == HIGH) || (0 < 110)||  (estadoServo == HIGH) ){
  (alarma = 0);}
if((estadoAceite == LOW) || (estadoNivelAgua == LOW) || (estadoCorteAgua == LOW) || (0 > 110)||  (estadoServo == LOW)){
  (alarma = 1);}

cualquier cosa dejo el programa.
El problema que tengo es que se ejecuta alarma = 0 aunque haya errores

Programa_Completo_prueba_4_final.ino (7.67 KB)

IgnoranteAbsoluto:
Ten cuidado, los dos if siguientes nunca se van a cumplir:

if((estadoBuzzer == HIGH) && (gamma = LOW)){

...

if(estadoBuzzer = LOW){
  ..

lo que hace estas variables es que tengo una alarma prendida (buzzer), la apaga aunque siga el error. O sino el buzzer queda prendido todo el dia jajajajaja.

Este trozo de programa:

//alarma total
alarma = 0;
if( (estadoAceite == HIGH) || (estadoNivelAgua == HIGH) || (estadoCorteAgua == HIGH) || (0 < 110)||  (estadoServo == HIGH) ){
  (alarma = 0);}
if((estadoAceite == LOW) || (estadoNivelAgua == LOW) || (estadoCorteAgua == LOW) || (0 > 110)||  (estadoServo == LOW)){
  (alarma = 1);}

… tiene el mismo efecto que este otro (sin el primer if)

//alarma total
alarma = 0;
if((estadoAceite == LOW) || (estadoNivelAgua == LOW) || (estadoCorteAgua == LOW) || (0 > 110)||  (estadoServo == LOW)){
  (alarma = 1);}

Porque si pones a cero la variable alarma, de nada sirve que después pongas un if que la vuelve a poner a cero si se cumple la condición. Ya la has puesto a cero sí o sí. El código, tal como está, asume que “por defecto” la pones a cero y si se cumple el último if entonces la pones a uno. Pero, como te he comentado, por defecto la estás poniendo a cero, el primer if no sirve para nada tal y como lo tienes ahora.

Y corrige todos los if donde estés usando un simple igual = pon un doble igual ==.

if((estadoBuzzer == HIGH) && (gamma = LOW)){   // Está mal
if((estadoBuzzer == HIGH) && (gamma == LOW)){  // Está bien


if(estadoBuzzer = LOW){   // Está mal
if(estadoBuzzer == LOW){  // Está bien


if((estadoCorteAgua = LOW) || (estadoNivelAgua = LOW)){  // Está mal
if((estadoCorteAgua = LOW) || (estadoNivelAgua == LOW)){ // Está bien
/code]

ya cambie las funciones del buzzer, gracias por el dato. Me quedo así:

gamma = 0;

if((estadoBuzzer == HIGH) && (gamma == 0)){
  (digitalWrite(buzzer,HIGH));}
if((estadoBuzzer == HIGH) && (estadoResetAlarmas == HIGH)){
  (digitalWrite(buzzer,LOW));
  (gamma=1);}
if(estadoBuzzer == LOW){
  (gamma=0);}

Ahora

//alarma total
alarma = 0;

//teoricamente si esta ||, si algunas de estas variables se cumple deberia poner el estado de alarma

if((estadoAceite == LOW) || (estadoNivelAgua == LOW) || (estadoCorteAgua == LOW) || (0 > 110)||  (estadoServo == LOW)){
  (alarma = 1);}

yo cambie el 0 por 2, osea que:

estadoPulsadorIniciarMotor = digitalRead(pulsadorIniciarMotor);  //lee el estado
estadoPrenderMotor = digitalRead(prenderMotor);

if((estadoPulsadorIniciarMotor == LOW) && (alarma == 1)){ //si el resultado es 1 deberia ejecutar esto
  (digitalWrite(prenderMotor,LOW));  
    if(estadoPrenderMotor = LOW){
    TV.print(0,85,"motor error");
  }
}
// si no hay problemas prende motor
if((estadoPulsadorIniciarMotor == LOW) && (alarma == 2)) { //si el resultado es 2 debería ejecutar esto
    (digitalWrite(prenderMotor,HIGH));{
        if(estadoPrenderMotor = HIGH){
           TV.print(60,85,"MOTOR ENCENDIENDO");}
  }
}

la mala noticia es que no me ejecuta ninguno de los 2, en la pantalla no me aparece el print de “motor encendido” ni “motor error”.
Disculpa si son errores tontos hace poco empece a programar y bueno jajaja algo sale

Programa_Completo_prueba_4_final.ino (7.68 KB)

IgnoranteAbsoluto:
Este trozo de programa:

//alarma total

alarma = 0;
if( (estadoAceite == HIGH) || (estadoNivelAgua == HIGH) || (estadoCorteAgua == HIGH) || (0 < 110)||  (estadoServo == HIGH) ){
 (alarma = 0);}
if((estadoAceite == LOW) || (estadoNivelAgua == LOW) || (estadoCorteAgua == LOW) || (0 > 110)||  (estadoServo == LOW)){
 (alarma = 1);}



... tiene el mismo efecto que este otro (sin el primer **if**)



//alarma total
alarma = 0;
if((estadoAceite == LOW) || (estadoNivelAgua == LOW) || (estadoCorteAgua == LOW) || (0 > 110)||  (estadoServo == LOW)){
 (alarma = 1);}




Porque si pones a cero la variable **alarma**, de nada sirve que después pongas un **if** que la vuelve a poner a cero si se cumple la condición. Ya la has puesto a cero sí o sí. El código, tal como está, asume que "por defecto" la pones a cero y si se cumple el último **if** entonces la pones a uno. Pero, como te he comentado, por defecto la estás poniendo a cero, el primer **if** no sirve para nada tal y como lo tienes ahora.

Y corrige todos los **if** donde estés usando un simple igual **=** pon un doble igual **==**.



if((estadoBuzzer == HIGH) && (gamma = LOW)){   // Está mal
if((estadoBuzzer == HIGH) && (gamma == LOW)){  // Está bien

if(estadoBuzzer = LOW){   // Está mal
if(estadoBuzzer == LOW){  // Está bien

if((estadoCorteAgua = LOW) || (estadoNivelAgua = LOW)){  // Está mal
if((estadoCorteAgua = LOW) || (estadoNivelAgua == LOW)){ // Está bien
/code]

Ya hice todo, solo me muestra un resultado, ahora falla, jajaja , es como si solo me tomara 1 que es error…
aunque tenga todo ok en el 2, no me pone como se ejecutaria el 2.

//sigue
if((estadoAceite == HIGH) || (estadoNivelAgua == HIGH) || (estadoCorteAgua == HIGH) || (0 < 110)||  (estadoServo == LOW)){
 (alarma = 2);}

//error 
if((estadoAceite == LOW) || (estadoNivelAgua == LOW) || (estadoCorteAgua == LOW) || (0 > 110) || (estadoServo == HIGH)){
  (alarma = 1);}

//encendido motor 
estadoPulsadorIniciarMotor = digitalRead(pulsadorIniciarMotor);
estadoPrenderMotor = digitalRead(prenderMotor);

if((estadoPulsadorIniciarMotor == LOW) && (alarma == 1)){
  (digitalWrite(prenderMotor,LOW));  
    if(estadoPrenderMotor == LOW){
    TV.print(0,85,"motor error");
  }
}
// si no hay problemas prende motor
if((estadoPulsadorIniciarMotor == LOW) && (alarma == 2)) {
    (digitalWrite(prenderMotor,HIGH));{
        if(estadoPrenderMotor == HIGH){
           TV.print(60,85,"MOTOR ENCENDIENDO");}
  }
}

debo sentenciar de otra manera “alarma”? la tengo como int alarma = 0; y no funciona de igual manera.

Programa_Completo_prueba_4_final.ino (7.7 KB)