Buenas,
A ver si logro explicar lo quiero hacer para que me deis un idea de como podría hacerlo.
Resulta que tengo varios sensores que toman datos cada 30minutos y los mete en una base de datos mysql, gracias a un servidor web montado en un NAS.
En la misma placa arduino, tengo un sensor de movimiento, que me interesaría que hiciera algo cada vez que detectara movimiento.
Cómo tengo que poner dentro void loop(){ } para que el delay que utilizo para los datos de los sensores, no me afecte a la detección de movimiento del otro sensor?
la respuesta correcta es interrupciones. Programas para que ejecute cada tanto tiempo y lees los sensores.
Tambien por cambio des estado de pin puedes leer la activacion del sensor de movimiento o la interrupcion externa del pin 2.
Como ya he comentado en más de una ocasión, hay que huir de los delay para realizar períodos de espera, estamos programando un dispositivo que permite realizar operaciones en quasi-tiempo-real y mantener en modo de espera con un delay el proceso con una espera larga es como darle una puñalada en el pecho.
Usar interrupciones es lo más idóneo, pero requiere un conocimiento bastante profundo del lenguaje y visto que te resulta complicado ver como hacer lo que quieres, yo, de momento, no iría por esa vía, las interrupciones te pueden volver loco, como empieces a utilizarlas y te hagan llamadas solapadas.
La solución más sencilla de aplicar para solucionar tu caso es utilizar variables testigo, donde almacenas el momento de la última ejecución realizada y con eso controlas que el proceso que gestiona se ejecute cuando tú lo necesitas, tras la ejecución, recargas su valor a cero y reactivas la espera.
Te pongo un esbozo de como sería esto.
#define TIEMPO_ESPERA_SENSORES 1800000
#define PIN_SENSOR_MOVIMIENTO 1
unsigned long tiempoInicial;
void setup() {
tiempoInicial = 0;
}
void loop() {
int estadoSensorMovimiento;
if ( tiempoInicial == 0 ) {
tiempoInicial = millis();
// Código lectura de los sensores (llamada a función o lo que sea)
}
estadoSensorMovimiento = analogRead( PIN_SENSOR_MOVIMIENTO );
if( estadoSensorMovimiento ..... ) { // Comparar la lectura si es igual, mayor, menor que un valor de referencia
// Código asociado a sensor de movimiento (llamada a función o lo que sea)
}
if( millis() < tiempoInicial ) tiempoInicial -= 4294967295; // Ajuste de la variable testigo si millis() se ha reseteado
if( millis() - tiempoInicial > TIEMPO_ESPERA_SENSORES ) tiempoInicial = 0;
}