Hola, Soy novato en esto de Arduino. Estoy desarrollando un circuito que se encarga de realizar medidas de humedad en un huerto y en función de esta dispara el riego y mide el caudal de riego. Todos esto datos los envía a través de la red sig fox y los puedo ver en el movil.
Hasta ahora he conseguido realizar las lecturas y disparar el riego, pero cuando implemento las lecturas del caudalimetro a través de una interrupción, se queda colgado.
Necesito de vuestra ayuda ya que estoy estancado.
los datos del caudalimetro solo los quiero para saber si se esta regando o no.
El Arduino se duerme y despierta cada 15 min para enviar el mensaje.
Los componentes que estoy utilizando son:
TB6612 para disparar la electrovalvula de 9v latching
Arduino mk1200 fox
conversor de nivel 3,3 a 5v sparkfun
caudalimetro de 1 pulgada
sensores de humedad de pino-tech 3v
regulador de 3,3v pololu con desconexión
regulador 9v pololu con desconexión
regulador 5v pololu con desconexión
todo el sistema va ha estar alimentado con una batería 18650.
algunos cambios, tal vez este sea exagerado pero cambia
volatile int Pulsos;
por
volatile unsigned int Pulsos;
razón int va de 0 a 32767 y unsigned int va de 0 a 65535
Respecto de la interrupción, muy simple.
Copia todo el programa, elimina todo lo superfluo, quedate con la lectura de RPM
Verifica que se comporta bien. Si no lo hace entonces tienes una falla en el código de lectura de interrupciones.
Si lo hace, ve habilitando partes del resto para ver donde falla.
He probado el código de lectura del caudalímetro aislado y funciona correctamente, cuando lo integro con las demás lecturas se queda Arduino colgado.
Lo que necesito es realizar una sola lectura para ver si el riego esta en marcha o parado.
No se si lo estoy integrando bien.
volatile int Pulsos; //Variable que acumula los pulsos recibidos
int LxM; //Variable que acumula el calculo de Litros por Minuto
int SenCaudal = 1; //Numero de pin donde conectamos el sensor
float FacConv = 4.8; //Factor de Conversion para calcular caudal
void rpm () { //Función que se ejecuta durante la interrupción
Pulsos++; //Incrementa el contador de pulsos
}
void setup() {
pinMode(SenCaudal, INPUT); //inicializa el pin digital 2 como entrada
Serial.begin(9600); //inicializa el puerto serie
attachInterrupt(digitalPinToInterrupt(SenCaudal), rpm, RISING); //(Interrupcion 0(Pin2),funcion rpm,Flanco de subida, cuando pasa de LOW a HIGH)
}
void loop () {
Pulsos = 0; //Pone en 0 el contador de pulsos
interrupts(); //Habilitamos las interrupciones, equivalente a sei();
delay (1000); //Esperamos un segundo
noInterrupts(); //Deshabilitamos las interrupciones, equivalente a cli();
LxM = (Pulsos / FacConv); //Calcula los Litros por Minuto
Serial.print (LxM, DEC); //Imprime la cantidad de litros por minuto
Serial.print (" L/min\r\n"); //Imprime "L/min" y salta a una nueva linea
}
Si el código del caudalímetro funciona yluego no simple, ve incorporando rutinas como te he dicho antes pero no has comprendido hasta que des con aquella que te genera el problema.