Go Down

Topic: Codigo sensor (Read 93 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