Go Down

Topic: Codigo sensor (Read 68 times) previous topic - next topic

manuelanomechilles

Hola,

Me gustaria saber si estoy en la dirección correcta? Estoy realizando un código que ha de realizar las siguientes funciones:

Leer una entrada de un sensor de flujo y si esta activa durante 30 min active una salida y espere a ser reseteado para volver a comenzar a traves de un pulsador.

He realizado el siguiente cdigo,haber que os parece?

int electrovalvula = 13;
int sensor = 2;
long tempo = 5000;
long previousMillis = 0;
int estadosensor = LOW;

void setup()
{

pinMode(electrovalvula,OUTPUT);
pinMode(sensor, INPUT);
digitalWrite(sensor, HIGH);
estadosensor = digitalRead(sensor);
}

void loop()
{
 
unsigned long currentMillis = millis();


if (currentMillis - previousMillis > tempo);
{
  if digitalRead(estadosensor == HIGH);
  {
    digitalWrite(electrovalvula,LOW);
   previousMillis = currentMillis;
  }
}
}

noter

Hola.
Primeramente decirte que eches un vistazo a las normas del foro y aprendas a utilizar los tags (iconos de la parte superior del editor del foro). Si vas a pegar un código, queda mejor, evita ciertos errores con determinados caracteres y permite además seleccionar todo el código de una vez para copiarlo al editor (pinchando en code: [select]) si pones tu código de esta manera:
Code: [Select]

int electrovalvula = 13;
int sensor = 2;
unsigned long tempo = 5000;
unsigned long millisInicioHigh = 0;
int estadosensor = LOW;

void setup()
{
 pinMode(electrovalvula,OUTPUT);  
 pinMode(sensor, INPUT);
 digitalWrite(electrovalvula, HIGH);
}

void loop()
{

 unsigned long currentMillis = millis(); // tomamos millis
 estadosensor = digitalRead(sensor); // y estado del sensor
 if (estadosensor == LOW) { // si el sensor no está activo
 millisInicioHigh=currentMillis; // llevamos cero milisegundos transcurridos en high (reseteamos contador)
 } else { // si por el contrario el sensor está activo
 if ((currentMillis - millisInicioHigh) >= tempo) { // vemos cuánto tiempo lleva activo, y si es superior a tempo
 digitalWrite(electrovalvula, LOW); //apagamos electroválvula
 for (;;); // y bucle infinito hasta reset
 }
 }
}


Echa un vistazo al código propuesto a ver si entiendes por dónde van los tiros.

manuelanomechilles

Muchas gracias por la respuesta, y gracias por el código.

 Me he dado cuenta físicamente que el sensor al ser de flujo puede ser que se quede en posición ON sin que este pasando agua y entonces me activa la salida. Como podría discriminar eso?

surbyte

Mas allá que lo que @noter te indica esta perfecto yo te voy a explicar porqué tu código esta mal o que has hecho mal (impiicito en la respuesta de noter)

Code: [Select]
void loop()
{
 unsigned long currentMillis = millis();   // ERROR: por cada iteracción currenMillis toma el valor de millis()

 if (currentMillis - previousMillis > tempo); // ERROR has puesto un ; lo que hace que esta parte
                                                            // diga 1 o 0 pero no haga nada
{
  if digitalRead(estadosensor == HIGH);  // ERROR: Mismo error, va sin ;
  {
    digitalWrite(electrovalvula,LOW);
   previousMillis = currentMillis;
  }
}
}


En dos oportunidades tus if terminan en ; lo que los termina ahi. Eso esta mal. Si luego de un if abres llaves se supone que no debe terminar en ;
Y lo que defines al comienzo del loop
debiste hacerlo como una variable global
unsigned long currentMillis;
y luego en el setup() si definias

currentMillis = millis();
entonces al comenzar el loop vienes con un valor y tu condición se cumpliría.
Con alguna variante es lo que te sugiere Noter.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy