Go Down

Topic: Sensor analógico de sonido (Read 789 times) previous topic - next topic

JaumeBonetM

Muy buenas a todos y un saludo.
Llevo ya varios dias peleandome con un sensor analógico de sonido que he adquirido recientemente.
Es un sensor con cuatro pines, uno de ellos para salida analógica y el otro para salida digital.
Logicamente conectado a la señal analógica, pin del sensor A0.
Lo leo con la tipica sentencia: Var=analogRead(pin) con un delay de 300. El sensor detecta el sonido pero de una manera inesperada.(Ya  me he peleado con el potenciómetro y no consigo mejorar nada). Al simular una sirena ascendente hasta un tope y luego descendiente (Con un silbido),
cabria esperar una onda tipo campana de gauss. Pero la lectura obtenida es esta. (disculpar por no colgar la imagen pero desde este ordenador no puedo acceder a paginas para subir imagenes.
87
87
87
87
79
101
79
84
84
90
85
86
86
89
88
88
88
Me he peleado con  san Google hasta la saciedad y siempre obtengo que mi programa es correcto.
Alguien sabe que me esta ocurriendo. La aplicación se trata de monitorizar el nivel de sonido ambiente.
Graficamente es como la lectura de un sismografo y no la tipica grafica obtenida con por ejemplo una LDR. Alguien sabria decirme que estoy haciendo mal. Muchas gracias de antemano.

surbyte

Y tu código? Una muestra y luego delay de 300 mseg?

JaumeBonetM

#2
Dec 12, 2015, 05:33 am Last Edit: Jan 15, 2016, 06:05 pm by JaumeBonetM

}
Code: [Select]

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

int Mov_X = 0; // Accelerometer value(X)
int LDR = 0;
int SO = 0;

void setup() {
//************************************************************
//RTC
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Comentar una vez establecida la hora)
//************************************************************
 Serial.begin(9600);
 pinMode(A0,INPUT); //LDR Pin
 pinMode(A1,INPUT); //Accelerometer Pin, (Mov_X)
 //pinMode(A2,INPUT); // Sound
}
void loop() {
 DateTime now = RTC.now(); // RTC Time
 LDR = analogRead(A0);
 Mov_X = analogRead(A1);
 SO = analogRead(A2);
 Serial.print(now.day(),DEC);
 Serial.print(",");
 Serial.print(now.month(),DEC);
 Serial.print(",");
 Serial.print(now.year(),DEC);
 Serial.print(",");
 Serial.print(now.hour(),DEC);
 Serial.print(":");
 Serial.print(now.minute(),DEC);
 Serial.print(":");
 Serial.print(now.second(),DEC);
 Serial.print(",");
 Serial.print("Mov=");
 Serial.print(Mov_X);
 Serial.print(",");
 Serial.print("LDR=");
 Serial.print(LDR);
 Serial.print(",");
 Serial.print("SO=");
 Serial.println(SO);
 delay(300);

JaumeBonetM

lectura del RTC, mas la lectura de un LDR mas la lectura del sensor de sonido... Intento monitorizar el movimiento,(conseguido), la luz ambienta(LDR), (Conseguido) + el sonido ambiental,(No conseguido)

surbyte

#4
Dec 12, 2015, 05:40 am Last Edit: Dec 12, 2015, 05:41 am by surbyte
Lee las Normas del foro y edita ese post usando Tags (</>)

Tu código dice
Code: [Select]
pinMode(A0,INPUT); //LDR Pin  
 pinMode(A1,INPUT); //Accelerometer Pin, (Mov_X)  
//pinMode(A2,INPUT); // Sound

aca no hay sonido
dice LDR, dice Acelerómetro y sonido esta comentado

JaumeBonetM

#5
Dec 12, 2015, 05:48 am Last Edit: Jan 15, 2016, 06:05 pm by JaumeBonetM
Code: [Select]

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

int Mov_X = 0; // Accelerometer value(X)
int LDR = 0;
int SO = 0;

void setup() {
//************************************************************
//RTC
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Comentar una vez establecida la hora)
//************************************************************
 Serial.begin(9600);
 pinMode(A0,INPUT); //LDR Pin
 pinMode(A1,INPUT); //Accelerometer Pin, (Mov_X)
 //pinMode(A2,INPUT); // Sound
}
void loop() {
 DateTime now = RTC.now(); // RTC Time
 LDR = analogRead(A0);
 Mov_X = analogRead(A1);
 SO = analogRead(A2);
 Serial.print(now.day(),DEC);
 Serial.print(",");
 Serial.print(now.month(),DEC);
 Serial.print(",");
 Serial.print(now.year(),DEC);
 Serial.print(",");
 Serial.print(now.hour(),DEC);
 Serial.print(":");
 Serial.print(now.minute(),DEC);
 Serial.print(":");
 Serial.print(now.second(),DEC);
 Serial.print(",");
 Serial.print("Mov=");
 Serial.print(Mov_X);
 Serial.print(",");
 Serial.print("LDR=");
 Serial.print(LDR);
 Serial.print(",");
 Serial.print("SO=");
 Serial.println(SO);
 delay(300);
}

JaumeBonetM

#6
Dec 12, 2015, 06:02 am Last Edit: Jan 15, 2016, 06:06 pm by JaumeBonetM
Ahora si.... La libreria SD es para guardar los datos en un SD, Mil disculpas por mi ignorancia. Mil gracias!
Code: [Select]


#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

int Mov_X = 0; // Accelerometer value(X)
int LDR = 0;
int SO = 0;

void setup() {
//************************************************************
//RTC
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Comentar una vez establecida la hora)
//************************************************************
 Serial.begin(9600);
 pinMode(A0,INPUT); //LDR Pin
 pinMode(A1,INPUT); //Accelerometer Pin, (Mov_X)
 pinMode(A2,INPUT); // Sound
}
void loop() {
 DateTime now = RTC.now(); // RTC Time
 LDR = analogRead(A0);
 Mov_X = analogRead(A1);
 SO = analogRead(A2);
 Serial.print(now.day(),DEC);
 Serial.print(",");
 Serial.print(now.month(),DEC);
 Serial.print(",");
 Serial.print(now.year(),DEC);
 Serial.print(",");
 Serial.print(now.hour(),DEC);
 Serial.print(":");
 Serial.print(now.minute(),DEC);
 Serial.print(":");
 Serial.print(now.second(),DEC);
 Serial.print(",");
 Serial.print("Mov=");
 Serial.print(Mov_X);
 Serial.print(",");
 Serial.print("LDR=");
 Serial.print(LDR);
 Serial.print(",");
 Serial.print("SO=");
 Serial.println(SO);
 delay(300);
}

JaumeBonetM


JaumeBonetM

Pero sigo sin poder monitorizar el sonido...

surbyte

vas como el 4to código sin usar tags. lee las normas del foro y mira como se insertan códigos. 
Este es mi último aporte hasta que edites tus códigos anteriores. Es muy fácil.
Code: [Select]
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

int Mov_X = 0; // Accelerometer value(X)
int LDR = 0;
int SO = 0;
unsigned long sumaMov = 0;
unsigned long sumaLDR = 0;
unsigned long sumaSO  = 0;

void setup() {
//************************************************************
//RTC
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
//RTC.adjust(DateTime(__DATE__, __TIME__));
// Establece la fecha y hora (Comentar una vez establecida la hora)
//************************************************************
  Serial.begin(9600);
  pinMode(A0,INPUT); //LDR Pin
  pinMode(A1,INPUT); //Accelerometer Pin, (Mov_X)
  pinMode(A2,INPUT); // Sound
}
void loop() {
  char buffer[60];

  DateTime now = RTC.now(); // RTC Time
  sumaMov = sumaLDR = sumaSO = 0;
  for (byte i=0; i<300; i++) {
    sumaMov += analogRead(A0);
    sumaLDR += analogRead(A1);
    sumaSO  += analogRead(A2);
    delay(1); 
  }
  Mov_X = (int) sumaMov/300;
  LDR   = (int) sumaLDR/300;
  SO    = (int) sumaSO/300;
 

  sprintf(buffer, "%02d,%02d,%02d,%02d:%02d:%02d,Mov=%4d, LDR=%4d, SO=%4d", now.day(), now.month(), now.year(), now.hour(),
                 now.minute(), now.second(), Mov_X, LDR, SO);
  Serial.println(buffer);

}

JaumeBonetM

Ok! Muchas gracias, disculpa por las etiquetas, no se repetirá!

JaumeBonetM

Por cierto el delay de 300 es por que se guardan los datos en una sd.
Necesitaba monitorizar el ambiente durante unas 12 horas.  Y queria minimizar la cantidad de datos obtenida, puesto que luego los grafíco con Excel.
Esta aplicación se usará solo durante unos días y una vez obtenidos los datos ya no se usara. Por esto uso Excel.
Muchisimas gracias de nuevo!

surbyte

El delay de 300 te lo estoy manteniendo porque ahora hago 300 muestras con 1 mseg de demora, o sea 300 mseg x muestra promedio y por lo tanto mas estable.
Asi que tienes lo mismo y guardas eso en tu SD.

Go Up