Medir señal de audio para iniciar elevacion caseta cortacesped

Hola, estoy empezando en la programacion de arduino, y solicito ayuda de quien pueda.
Mi proyecto es una caseta para el cortacesped automatico , ya he conseguido que baje y lo oculte mientras no trabaja y suba a superficie cuando empieza a moverse, detecto el movimiento y le mando subir ,hasta ahi es sencillo, el problema es que se mueve y choca con todo mientras sube,
He observado que 15 segundos antes de moverse emite 10 pitidos cortos en 1.5 segundos aproximadamente , y es aqui donde estoy atascado.
he descargado codigos para escuchar ese sonido consigo que los oiga de muy cerca donde no puedo poner el micro.

La señal son 10 bips en 1.5 segundos con un ciclo de 75 ms activo y 75 inactivo y el sonido es de una frecuencia de 266HZ aproximadamente, la amplitud varia segun la distancia.

el circuito es ; arduino nano con un modulo MAX9814 en ganancia maxima 60 db.
Y el codigo que he modificado con mas exito es:

No se como mejorar el alcance para poner el micro en su sitio.

¿Podeis ayudarme?

He probado modificando un codigo pero no se como subirlo aqui , me dice el foro que los nuevos solo podemos poner dos enlaces

Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Este es un mensaje que ya tengo armado, no tienes que editar o podrias practicar de paso, porque en tu primer post dices el código es? y te quedas sin hacerlo.
Pues es muy simple.
Copias y el codigo, click en </> y luego pegas el código, no lo hagas al revés.

Hola Surbyte, gracias por la ayuda

adjunto codigo probado

#include <LiquidCrystal.h>
int input=A0;
int contador=0;
long previomillis=0;
long intervalo=2000;
int high_time;
int low_time;
float time_period;
float frequency;
//LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup()
{
pinMode(input,INPUT);
//lcd.begin(16, 2);
  Serial.begin(9600);

  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);  
}
void loop()
{
//lcd.clear();
//lcd.setCursor(0,0);
//lcd.print("Frequency Meter");

 if(millis()>=previomillis+intervalo)if (contador>=1){{Serial.print("fin");
                                    contador=0;}}

high_time=pulseIn(input,HIGH);
low_time=pulseIn(input,LOW);

 
time_period=high_time+low_time;
time_period=time_period/1000;
frequency=1000/time_period;
//lcd.setCursor(0,1);
//lcd.print(frequency);
//lcd.print(" Hz");
//delay(500);

  //Serial.println(frequency);

  if (frequency <=3900){if (frequency>=3400){
                          contador++;
                          previomillis=millis ();
                          Serial.print("frecuencia ");
                           Serial.println(frequency);
                          Serial.print(contador);
                                      if(contador>=40){Serial.print ("Corre sube ");
                                                      digitalWrite(LED_BUILTIN, HIGH); 
                                                       Serial.print("previomillis ");
                                                        Serial.print(previomillis);
                                           contador=0;}}}
 



// Serial.print("contador");
// Serial.println(contador);
 //Serial.println(millis());
 
}

Puedes ilustrar con una foto mas o menos indicativa de donde esta el sensor debajo de la cortadora de cesped. Algo que nos permita entender mejor todo el contexto?

Hola, el micro quiero ponerlo en la caja de conexiones amarilla para que detecte el aviso sonoroque hace antes de iniciar la marcha.
He intentado subir un video pero pesa mucho y no me deja





Los videos los subes a Youtube en tu canal y compartes el link aquí y entonces se verá sin problemas.
Las fotos son complicadas de entender.
Porque la cortadora esta dentro de una caja y bajo el nivel del supuesto cesped?
Es como que quieres llevarla a ese nivel?

Hola Surbyte, así es el cortacesped se oculta bajo el nivel del suelo y el techo queda a ras del suelo cuando esta cerrado, luego sube antes de que comience a trabajar ,esto lo hago cuando empieza a moverse estando debajo, y lo que quiero mejorar es que como da los diez pitidos antes de moverse ,intento detectarlos y subir ya que pasan 15 segundos desde los pitidos hasta que se empieza a mover.
He empezado a probar con un modulo de reconocimiento de voz de ELECHOUSE V3, lo recibí ayer.

En cuanto al video lo intentaré luego

Desde mi punto de vista no necesitabas algo tan sofisticado. Con algo que escuchara 10 pitidos respetando frecuencia, tiempos, etc sería factible hacerlo. O sea un mic.
Tal vez como no te hemos dicho nada intentaste por el lado del Elechouse V3. No se si es posible con el, detectar sonidos de frecuencias determinadas, debería serlo, pero que tan flexible es su código para adaptarlo a esta necesidad no lo se.

No creo que siquiera le sirva, difícilmente acepte pitidos como comandos de voz.

Saludos

Por lo que he visto no los acepta.
Hay que probar pero creo que tendras un buen shield para otro proyecto.

@chano1418 Estuve viendo la hoja de datos del módulo basado en MAX9814 y hay varios puntos a tener en cuenta.

Primero la señal tiene un offset de 1.25V, o sea, lo que sería el cruce por cero está a 1.25V.

La señal tiene una amplitud de 2Vpp, por lo que fluctúa entre 0.25V y 2.25V.

Si bien el nivel bajo (LOW) está dentro de las especificaciones, hay un problema: el nivel mínimo para que un Arduino a 5V detecte un nivel alto (HIGH) es 3V.

Entonces, sin amplificar la salida del MAX9814, la señal no es lo suficientemente amplia como para ser detectada por el Arduino de la forma en que la estás usando (como pulsos), deberías leerla con el ADC.

Si la lees analógicamente vas a tener que usar un filtro paso banda (por software como este Filtro de paso banda y stop banda exponencial en Arduino o uno harware) para filtrar y obtener solo los 266 Hz.

Olvídate de tratar de detectar los pulsos con pulseIn(), no te serviría ni aunque la señal fuese adecuada.

Probablemente necesites amplificar más la señal (hay módulos basados en LM386 que pueden cumplir muy bien su cometido).

Saludos

Hola, lo primero es daros las gracias por vuestras respuestas
Es cierto que tiendo a complicarme, pero el problema sigue siendo el mismo la amplitud de la señal de audio, hay que acercarse demasiado al cortacesped para garantizar que lo detecta.
Funcionan tanto con pulsein como con el modulo de reconocimiento de voz elechouse v3 pero hay que acercar el micrófono mucho.
Para seguir en mi línea me vuelvo a complicar , he abierto el cortacesped para localizar el altavoz/ zumbador dentro, bien para cambiarlo de sitio y suene más fuerte o leer directamente la señal del altavoz con un arduino nano que se comunique de forma inalámbrica con el otro arduino que controla la subida de la caseta ,
Así pues detectar la señal analógica del altavoz no es complicado, es en la comunicación inalámbrica donde no he entrado aún.
Estoy viendo algo de comunicación bluetooth o wifi
Los dos arduinos estarían a menos de tres metros cuando haga falta que se comuniquen.
Que me recomendáis? Bluetooth o wifi?

Y si intervienes la máquina (hablo de abrirla y llegar hasta donde esta el zumbador) y colocar un optoacoplador en paralelo con el zumbador si fuera esto posible? Te proveería pulsos limpios y ausentes de otros ruidos (motor, ambiente).

Respecto de la comunicación si me das para elegir nunca usaría BT a menos que este pegado siempre a la cortadora y por pegado hablo de menos de 10 mts.

Hola , he conseguido subir un video a YouTube.
Os lo comparto

Así es , ya está abierto y solo queda medir la señal y acondicionar la detectarla con un arduino nano que alimentare con la batería del cortacesped.
En cuanto a la distancia de comunicación, va a ser muy corta ya que solo me interesa leer la señal cuando esta aparcado en la caseta y eso está a menos de 3 metros.
Además el cortacesped tiene wifi para comunicarse con la app del movil que lo controla y no si por otra cominicacion wifi en los arduinos va a dar problemas.

Gracias por los comentarios
Ahora toca ponerse al día con el sistema de comunicación, acepto sugerencias....

Ah he descartado poner el altavoz más al exterior ya que aunque suena más fuerte y mejora , también va a estar más expuesto y va a estropearse enseguida

Lo que te propongo no es fácil, y depende de la potencia del micro que uses, pero haciendo FFT puedes identificar las frecuencias fundamentales de los pitidos.
http://wiki.openmusiclabs.com/wiki/ArduinoFFT
Vamos a suponer porque soy optimista que fuesen pitidos de 1000 Hz entonces tendrás luego de la FFT una salida que te dirá que hay una componente predominante den 1000 Hz con ampliltud X.
Con eso cuentas (lo digo fácilmente) y cuando obtienes digamos 5 coincidencias porque puedes perder las primeras 5 solo para confirmar que estas en el camino de detectar y luego las ultimas 5 para verificar.
Es una idea que requiere trabajo pero tambien cierta dedicación del Arduino a la tarea.
No se que te parece?

Supongo que es buena idea la FFT y seria lo mejor , algo he leído, pero llevo poco tiempo con Arduino y no se si podré llegar a eso, de todos modos ya lo he abierto y creo que leer directamente la señal del cable del altavoz va a ser más seguro , otra cosa será que consiga que se comuniquen los dos arduinos, que serían los más baratos como arduino nano con el que ya he hecho varias cosas
Os pongo fotos del cortacesped abierto y del zumbador




Hay muchos enfoques posibles.
Supongo que ese zumbador tiene una pata a GND y otra a la salida de un oscilador. Si conectas una interfaz desacoplada con un capacitor y luego algo que limite tensión del lado de arduino tendras los pulsos enviados al zumbador. Eso es mucho mas fácil para determinar los pitidos.

Algo asi
image
Te dejo la nota
https://itectec.com/electrical/electronic-arduino-detect-sound-from-google-chromecast-audio/