Ayuda con monitorización se señal analógica sin loop (SOLUCIONADO)

Buenos días.

Soy bastante nuevo en Arduino y estoy realizando un proyecto, pero hay ciertas cosas que se me escapan. Tal vez alguien pueda ayudarme con lo siguiente.

Necesito monitorizar la señal analógica que le llega a Arduino. El tema es que no puedo inlcuir loops en mi sketch, ya que necesito lanzarlo un numero concreto de veces. Hasta ahora, todo lo que he leído sobre monitorización de señales analógicas inlcuye loops. Yo necesito hacerlo sólo durante un tiempo concreto (por ejemplo 600000 ms). Hasta ahora lo que tengo escrito es lo siguiente y me devuelve los valores que necesito constantemente.

int Senal;

void setup(){ Serial.begin(9600); }

void loop() {

Senal = analogRead(0) * 2; // este es un multiplicador que necesito

Serial.println(Senal, DEC);

delay(1000); // no necesito montorizar constantemente, cada 1000 ms está bien }

Sin embargo necesitaría incluir un paso que realice esto mismo en "void setup" para que no sea infinito. El proyecto en el que estoy trabajando ahora es parecido a lo que escribo a continuación, y necesitaría incluir la monitorización ahí.

int valve_1 = 12;

void setup() {

pinMode (valve_1, OUTPUT);

digitalWrite (valve_1, HIGH); delay (600000); // aqui necesito que se monitorice la señal mientras valve_1 es HIGH digitalWrite (valve_1, LOW);

}

void loop() {}

¿Alguien me puede ayudar con esto? Prometo que he buscado, ¡pero no he encontrado la manera!

Muchas gracias a todos por hacer sencillo este mundo tan fascinante. Disculpad si incumplo alguno regla, es mi primer post.

Saludos.

uno de los ultims post que contesté se hace igual .

utiliza la funcion millis()

toma un tiempo inicia. tiempoinicial=millis();

luego para tomar el valor que quieres cada 600000 milisegundos entonces haces esto

if ((millis()-tiempoinicial)>600000) { toma el valor; tiempo inicial=millis(); // reseteas el valor de referencia para contar otros 600000 milisegundos) } de esta manera el resto del programa sigue corriendo. leete uno de los recientes post que contesté, no recuerdo ahroa cual es.

Un saludo.

Muchas gracias por contestar tan rápido. Voy a probar lo que me dices y te comento!

Gracias.

Bufff! No encuentro la manera. Creo que ni siquiera entiendo bien tu respuesta (bueno, no tu respuesta, sino la función millis()

Vuelvo a escribir lo que necesito, por si acaso:

Encender, por ejemplo, el LED del pin 13 de Arduino durante 60000 ms. Que durante ese minuto se recojan los datos del pin analogico 0 cada 1000 ms. Apagar el LED del pin 13. FIN.

Muchas gracias de nuevo!

Y eso que quieres que lo haga ? solo una vez ? 60 lecturas y ya esta ?

Sí. Una lectura cada segundo durante el tiempo que esté encendido el LED.

Son tiempos que modificaré más adelante. Ahora me sirven para verlo claro y que funciona. :D

La gente del foro inglés me ha dado una solución. La posteo por si a alguien le resulta de ayuda también.

unsigned long start = 0;

void setup()
{
  pinMode (12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(115200);
  Serial.println("start");
}

void loop()
{
  if (start == 0)    // will be true only once ...
  {
    digitalWrite(13, HIGH);
    start = millis();
  }


  Serial.println(analogRead(A0), DEC);   // do something with x

  delay(1000);   // to be tuned

  if (millis() - start > 6000L)   // are there 60 seconds past after start has been set?
  {
    digitalWrite(13, LOW);
    for(;;);
  }
}

Han incluido lo que necesitaba en el loop y han añadido un "for" que realmente no entiendo para qué sirve...

Lo que necesitaría ahora es saber como repetir el loop un numero concreto de veces!!

Gracias por vuestra ayuda.

te estaba contestando :smiley:

ya lo dejo entonces :smiley:

espera que no lo aclara todo, como lo tengo pensado se pueden hacer mas cosas que "esperar" a que pase el tiempo para tomar valores. dame 5 minutos

Ok, aqui espero!

esto lo pones dentro del programa, cambia lo que veas necesario, es una manera de evaluar tiempos, unos dentro de otros, esto no lo he probado, no descarto errores, comento lo que quiero hacer y demás.

//para coger el inicio del tiempo, se establece cuando el pin, el led, la entrada, la condición que quieras.
If (digitalread(pinentrada)=HIGH)  // la entrada es un pulsador, los tiempos empezaran a contar desde que se suelta, si es otra variable hay que ponerla a 0 para que esto funcione.
{
inicio60seg=millis();
inicio1seg=millis();
}

// ahora las condiciones que se deben cumplir para que obtenga valores

if ((millis()- inicio60seg)<60000) // si está dentro de los 60 segundos
{
         if ((millis()-inicio1seg)>1000) // si se supera 1 segundo desde que se tomó el inicio
            {
              --aqui toma el valor analógico que quieras y lo metes en la variable que quieras;
               inicio1seg=millis(); // aqui reseteas el tiempo de inicio de 1 segundo para que vuelva a contar 1 segundo
             }
digitalWrite(LedPin, HIGH);
}
else
{
digitalWrite(LedPin, LOW);

Si no me equivoco esto hará, en el momento en que se deje de pulsar el botón , pone a “cero” los tiempos, y durante 60 segundos evaluará el segundo contador de tiempo, y cada segundo tomará un valor, mientras lucirá el led. cuando se acaben los 60 segundos no tomará más valores y apagará el pin.
Todo ello ademas sin parar el micro ni malgastar tiempo en esperas, el micro podrá hacer otras cosas mientras se pasan los segundos.

espero te funcione así, no lo he probado pero yo otras cosas las he hecho de la misma forma. Un saludo

mmm… No me toma valores… Y el LED está encendido menos tiempo de 1 minuto…

Pego aqui lo que he escrito, por si le quieres echar un vistazo.

Me han encargado a mi de esta parte del proyecto y algunas cosas se me quedan un poco grandes…

unsigned long start = 0;
int inicio60seg;
int inicio1seg;
int LED = 13;

void setup()
{
  pinMode (12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(115200);
  Serial.println("start");
  
 
}
void loop()
{
   //para coger el inicio del tiempo, se establece cuando el pin, el led, la entrada, la condición que quieras.
 

 if (digitalRead (LED) == HIGH) 
  {
  
  inicio60seg=millis();
  inicio1seg=millis();
  }

// ahora las condiciones que se deben cumplir para que obtenga valores

if ((millis()- inicio60seg)<60000) // si está dentro de los 60 segundos
{
         if ((millis()-inicio1seg)>1000) // si se supera 1 segundo desde que se tomó el inicio
            {
               Serial.println(analogRead(A0), DEC);
               inicio1seg=millis(); // aqui reseteas el tiempo de inicio de 1 segundo para que vuelva a contar 1 segundo
             }
digitalWrite(13, HIGH);
}
else
{
digitalWrite(13, LOW);
}
}

estas intentando leer una patilla que has declarado como output. no se si se puede hacer eso

aqui tienes el código ya funcionando, algunas modificaciones para lo que tengo yo montado con mis patillas y demás.

los datos de tiempo sin unsigned long como en la referencia pone, si es INT se sale de rango, es otro de los errores.

lo de boton pulsado en para que una vez que reinicie despues de un reset, el tiempo siempre será menor de 60 y se mete en el IF.

este si lo tengo probadom nmas que no se por qué solo toma 58 valores. depura tu mismo a ver por que es.

un saludo y espero haberlo solucionado, cambia el Subjet como SOLUCIONADO para que los demás puedan verlo.

Un saludo

que fuerte… despues de escribir el codigo resulta que no se te ha pegado …

intentaré hacerlo de nuevo como ayer, pense que se habia posteado bien, quita la solucion , por que no dices naa ? :smiley:

Vale, he vuelto...

Perdona, tengo un dia de locos hoy. No he parado por el ordenador hasta ahora. Cambié lo de solucionado pero ni siquiera lei tu repuesta. Asi que no me di cuenta de que no habia código!!!!!

ahora si ¡¡¡

unsigned long inicio60seg;
unsigned long inicio1seg;
int LED = 7;
int botonpulsado=0;
int numerovalor=0;

void setup()
{
  pinMode (12, INPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);
  Serial.println("start");
  
 
}
void loop()
{
   //para coger el inicio del tiempo, se establece cuando el pin, el led, la entrada, la condición que quieras.
 

 if (digitalRead (12) == HIGH) 
  {
  Serial.println("boton pulsado, comienzan 60 seg de toma de valores");
  delay(500);
  inicio60seg=millis();
  inicio1seg=millis();
  botonpulsado=1;
  numerovalor=0;
  
  }

// ahora las condiciones que se deben cumplir para que obtenga valores

if (((millis()- inicio60seg)<60000) && (botonpulsado==1)) // si está dentro de los 60 segundos y se ha pulsado el boton para tomar valores
{
         if ((millis()-inicio1seg)>1000) // si se supera 1 segundo desde que se tomó el inicio
            {
               numerovalor++;
               Serial.print("Valor numero ");
               Serial.print(numerovalor,DEC);
               Serial.print(" ");
               Serial.println(analogRead(A0), DEC);
               inicio1seg=millis(); // aqui reseteas el tiempo de inicio de 1 segundo para que vuelva a contar 1 segundo
             }
digitalWrite(7, HIGH);
}
else
{
digitalWrite(7, LOW);
botonpulsado=0;
}
}

Lo he tenido que hacer de nuevo , menos mal que lo tenia fresco, lo mismo, siigue contando 58 valores solo, quizas debas cambiar alguna cosa, las patillas estan conforme a lo que tengo montado yo.

un saludo

Muchas gracias de nuevo!

En cuanto tenga un momento libre lo pruebo y te comento los rsultados. Gracias! :D :D