• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

AYUDA Problema con proyecto de Anemometro

feryomiju

Nuevo
Registrado
19 Abr 2020
Mensajes
38
Puntos
8
[FONT=&quot]Buenas, tengo en mente un proyecto pero soy bastante nuevo con arduino y no se como hacerlo exactamente.[/FONT]

[FONT=&quot]La idea es la siguiente: Quiero usar un [/FONT]anemometro [FONT=&quot]y medir el viento constantemente. Según las especificaciones del producto tiene un imán que al dar una vuelta completa las aspas manda una señal digital. Una vuelta en un segundo equivale a una velocidad de viento de 2.4 km/h.[/FONT]

[FONT=&quot]Lo que no se es como hacer esto ultimo, que me lea en un segundo cuantas veces ha recibido ese 1 digital para poder hacer el calculo del viento. Os pongo el código que he escrito que seguramente no tenga sentido pero como ya he dicho soy un noob.

[/FONT][FONT=&quot]float vueltas;[/FONT]
[FONT=&quot]#define anemometro 3[/FONT]
[FONT=&quot]int lectura;[/FONT]
[FONT=&quot]float velocidadViento;[/FONT]
[FONT=&quot]int suma;[/FONT]
[FONT=&quot]unsigned long tiempo;[/FONT]
[FONT=&quot]void setup() {[/FONT]
[FONT=&quot] pinMode(anemometro, INPUT);[/FONT]
[FONT=&quot] Serial.begin(9600);[/FONT]
[FONT=&quot]}[/FONT]

[FONT=&quot]void loop() {[/FONT]
[FONT=&quot] //una vuelta al segundo son 2.4kmh[/FONT]
[FONT=&quot] lectura = digitalRead(anemometro);[/FONT]
[FONT=&quot] while (lectura == 0) {[/FONT]
[FONT=&quot] lectura = digitalRead(anemometro);[/FONT]
[FONT=&quot] }[/FONT]
[FONT=&quot] if(lectura==1){[/FONT]
[FONT=&quot] tiempo=millis();[/FONT]
[FONT=&quot] if(millis()-tiempo<1000){[/FONT]
[FONT=&quot] lectura = digitalRead(anemometro);[/FONT]
[FONT=&quot] while(lectura==0){[/FONT]
[FONT=&quot] lectura=digitalRead(anemometro);[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] }[/FONT]
[FONT=&quot] if(lectura==1){[/FONT]
[FONT=&quot] suma+=lectura;[/FONT]
[FONT=&quot] Serial.print("hola");[/FONT]
[FONT=&quot] }[/FONT]
[FONT=&quot] }[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] }[/FONT]
[FONT=&quot] /*velocidadViento = lectura * 2.4;[/FONT]

[FONT=&quot] if (velocidadViento > 40 && velocidadViento < 87) {[/FONT]
[FONT=&quot] Serial.print("El viento es fuerte, de: ");[/FONT]
[FONT=&quot] Serial.print(velocidadViento);[/FONT]
[FONT=&quot] Serial.println("km/h");[/FONT]
[FONT=&quot] }[/FONT]
[FONT=&quot] else if (velocidadViento > 87) {[/FONT]
[FONT=&quot] Serial.print("El viento es extremo, de: ");[/FONT]
[FONT=&quot] Serial.print(velocidadViento);[/FONT]
[FONT=&quot] Serial.println("km/h");[/FONT]
[FONT=&quot] }[/FONT]
[FONT=&quot] else {[/FONT]
[FONT=&quot] Serial.print("El viento es normal, de: ");[/FONT]
[FONT=&quot] Serial.print(velocidadViento);[/FONT]
[FONT=&quot] Serial.println("km/h");[/FONT]
[FONT=&quot] }*/[/FONT]

[FONT=&quot]}[/FONT]
 
No se como va Arduino pero te voy a escribir un código rudimentario que creo debería funcionar asimilando lo que has puesto en tu código.

Código:
contadorVueltas = 0;
tiempoInicial = millis();

while (True) {

[COLOR=#333333]   lectura = digitalRead(anemometro);
[/COLOR]   if (lectura == 1){
      contadorVueltas = contadorVueltas + 1;
   }

   if (millis()-tiempoInicial > 1000){
      tiempoInicial = millis();
      Serial.print("El anemometro dió ");
      Serial.print(contadorVueltas);
      Serial.print(" en un segundo");

      contadorVueltas = 0;
   }
}

Varios apuntes sobre mi código:

Es bastante básico y puede contener errores dado que no he trabajado nunca con Arduino.

Estoy asumiendo que lectura es igual a 1 cada vez que el sensor detecta una vuelta.

No se como funcionara la lectura de datos del sensor, y si el flag solo desaparece cuando lo lees o que, pero al trabajar todo en un mismo hilo puedes estar perdiéndote vueltas. Lo ideal creo que sería trabajar con varios hilos, uno con un bucle que cuenta cuantas vueltas da, otro que mida el tiempo y un tercero que los dirija a los dos y haga el procesamiento de datos para su salida.

También decir que esta implementación no sirve si da menos de 1 vuelta por segundo, dado que te daría periodos con velocidad de 0 km/h y eso no sería asi. Deberías quizás hacer la media sobre varios segundos o mirar si el sensor tiene funciones más útiles.


Por cierto, eso que has puesto de:

lectura = digitalRead(anemometro);
while (lectura == 0) {
lectura = digitalRead(anemometro);
}

Te llevaría a un bucle infinito si en lectura tienes un 0 inicialmente, dado que dentro del while solo estás consultando el valor de lectura, no llamando a la función digitalRead.

Espero haberte ayudado un poco, juega un rato con ello y ve solucionando los errores que haya.
 
No se como va Arduino pero te voy a escribir un código rudimentario que creo debería funcionar asimilando lo que has puesto en tu código.

Código:
contadorVueltas = 0;
tiempoInicial = millis();

while (True) {

[COLOR=#333333]   lectura = digitalRead(anemometro);
[/COLOR]   if (lectura == 1){
      contadorVueltas = contadorVueltas + 1;
   }

   if (millis()-tiempoInicial > 1000){
      tiempoInicial = millis();
      Serial.print("El anemometro dió ");
      Serial.print(contadorVueltas);
      Serial.print(" en un segundo");

      contadorVueltas = 0;
   }
}

Varios apuntes sobre mi código:

Es bastante básico y puede contener errores dado que no he trabajado nunca con Arduino.

Estoy asumiendo que lectura es igual a 1 cada vez que el sensor detecta una vuelta.

No se como funcionara la lectura de datos del sensor, y si el flag solo desaparece cuando lo lees o que, pero al trabajar todo en un mismo hilo puedes estar perdiéndote vueltas. Lo ideal creo que sería trabajar con varios hilos, uno con un bucle que cuenta cuantas vueltas da, otro que mida el tiempo y un tercero que los dirija a los dos y haga el procesamiento de datos para su salida.

También decir que esta implementación no sirve si da menos de 1 vuelta por segundo, dado que te daría periodos con velocidad de 0 km/h y eso no sería asi. Deberías quizás hacer la media sobre varios segundos o mirar si el sensor tiene funciones más útiles.


Por cierto, eso que has puesto de:

lectura = digitalRead(anemometro);
while (lectura == 0) {
lectura = digitalRead(anemometro);
}

Te llevaría a un bucle infinito si en lectura tienes un 0 inicialmente, dado que dentro del while solo estás consultando el valor de lectura, no llamando a la función digitalRead.

Espero haberte ayudado un poco, juega un rato con ello y ve solucionando los errores que haya.

No entiendo muy bien el "while(True)" que tienes ahi puesto, a que hace referencia?
 
Eso es un bucle que se va a estar evaluando todo el rato, para que no pare el programa.
 
No me funciona, me da error al compilar el programa en arduino
 
Arriba