Error en definición de función en .H

Hola a todos;

Este es mi primer proyecto con Arduino, un programa muy sencillo, pero me está dando un error que no acierto a comprender por qué.
El error es:

Arduino: 1.6.0 (Linux), Board: "Arduino Uno"
sensor_ruido_010315.cpp.o: In function `loop':
/home/alberto/ARDUINO/arduino-1.6.0/sensor_ruido_010315.ino:33: undefined reference to `read_noise_sensor(int, int, int, int)'
collect2: error: ld returned 1 exit status
Error compiling.

Y el código es el que sigue:
config.h

#ifndef __CONFIG_H__
#define __CONFIG_H__

const int PIN_LED_ALIVE=13;

//noise sensor
const int NOISE_SENSOR_INPUT=0;
const int SAMPLE_WINDOW_MS=50;
const int ANALOG_SIGNAL_MAX=1024;
const int ANALOG_SIGNAL_MIN=0;

#endif

main:

#include <JeeLib.h>
#include "config.h"
#include "noise_sensor.h"

ISR(WDT_vect) {Sleepy::watchdogEvent();}
//setup routine at boot
void setup() 
{
  pinMode(PIN_LED_ALIVE,OUTPUT);
}

void toggle_led_alive(void)
{
  static int status = LOW;
  if(status == LOW) status = HIGH;
  else status = LOW;
  digitalWrite(PIN_LED_ALIVE, status); 
}

//main loop
void loop() 
{
  int dB;

  Sleepy::loseSomeTime(1000);
  toggle_led_alive();
  dB = read_noise_sensor(NOISE_SENSOR_INPUT, SAMPLE_WINDOW_MS, ANALOG_SIGNAL_MAX, ANALOG_SIGNAL_MIN);
}

Y finalmente tengo el .h y el .c para el sensor, el .c no lo pongo a no ser que sea necesario porque es un poco largo...
noise_sensor.h:

#ifndef __NOISE_SENSOR__
#define __NOISE_SENSOR__

typedef struct CalTab
{
  double volts;
  int dB;
} noiseSensorCalTab;

#define NUM_STEPS_CALIBRATION 4

double read_noise_level_in_volts(int, int, int, int);
int calibrate_noise_level_in_dB(double);
int read_noise_sensor(int, int, int, int);

#endif

No consigo ver el error... alguien me puede dar una pista??
Muchisimas gracias !!!

Los.h y .c, son librerías. ¿los pones en la carpeta de librerías?

Estos dos

#include "config.h"
#include "noise_sensor.h"

Deben estar en la carpeta que tiene el sketch.

Y esta librería #include <JeeLib.h> de donde la obtuviste

Junta todo, arma un .zip y subelo como adjunto a ver si podemos reproducir el error y ayudarte.

NOTA: Felicitaciones por escribir tu 3r post y usar los tags perfectamente.

Hola;

Estan en la carpeta que tiene el sketch, que viene a ser como el main, no?
la librería la encontré buscando en internet, es para minimizar el consumo. En mi aplicaición es importante.
Ahora no tengo el link directo, pero está en GitHub. Si las buscas por ahí sale un enlace.

El Zip, cómo lo subo?

gracias !!

Para añadir el zip, usa el botón reply (en el quick reply no sale). Debajo te saldrá la opción "Attachments and other options", ahi añades el zip.

La librería, ¿es esta?

Pudiste correrlo carmeloco?

No lo he probado, si eso, en un rato lo pruebo.

Al compilarlo me da este error:

Arduino: 1.6.0 (Windows 8), Board: "Arduino Uno"

/Arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avr5/crtm328p.o:(.init9+0x0): undefined reference to `main'
collect2: error: ld returned 1 exit status
Error compiling.

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.

distinto.

Sí, solo me sale la parte final del error, ya que la primera, la del error de la librería, no me sale porque la he instalado en el sitio correcto.

Hola chicos,

La librería sí que es la que indicáis. a mi ni me da error, incluyéndola desde el IDE.
En cuanto a mi error en la definición de la función, mando el código, a ver si alguien me puede echar una mano.
tengo experiencia programando en C, pero no acierto a verlo... algo obvio se me está pasando por alto...

Gracias !!!

sensor_ruido_010315.zip (1.82 KB)

Primera prueba, compilado tal como lo descargué en una carpeta

C:\Users\Ricardo\Documents\Arduino_Build\sensor_ruido_010315\sensor_ruido_010315.ino.cpp.o: In function `loop':
C:\Users\Ricardo\Documents\Arduino_Build\sensor_ruido_010315/sensor_ruido_010315.ino.cpp:31: undefined reference to `read_noise_sensor(int, int, int, int)'

Estamos igual, ahora a ver que ocurre.

Primer cambio ya arrojó resultados prometedores. Cambié el archivo .c a .cpp
Los archivos en general deben ser .cpp.

:\Mis documentos\Dropbox\Arduino\Libraries\sensor_ruido_010315\sensor_ruido_010315\noise_sensor.cpp: In function 'double read_noise_level_in_volts(int, int, int, int)':
D:\Mis documentos\Dropbox\Arduino\Libraries\sensor_ruido_010315\sensor_ruido_010315\noise_sensor.cpp:16: error: 'millis' was not declared in this scope
D:\Mis documentos\Dropbox\Arduino\Libraries\sensor_ruido_010315\sensor_ruido_010315\noise_sensor.cpp:23: error: 'analogRead' was not declared in this scope
[Stino - Error 1]

Estos errores son mas faciles de resolver

Perfecto !!!
Esos errores ya no me preocupan...

Muchísimas gracias !!!!

No te preocupan pero no puedo resolverlos... no veo la solución aunque esta ahí.
cambié millis() de lugar, fuera de la asignación cuando defines la variable unsigned long startMillis; y tampoco.
Voy a preparar un proyecto con Atmel Studio 6.2 que entrega mas información de los errores.

Exacto, he hablado demasiado rápido :slight_smile:
El caso es que las funciones millis() y analogRead() funcionan bien si las utilizas dentro de la función loop(),dentro del fichero principal del sketch.
Pero si las sacas a funciones y a ficheros cpp distintos, no funcionan. Este es el error típico en C/CPP de no poner el include de una librería, pero es que en el loop(), funcionan sin include ninguno !!!

No tengo pistas, cualquier ayuda, la agradecería un monton, me suele gustar ordenar el código en base a ficheros, y si no se puede, sería una faena !!

Muchas gracias,

Alberto

¿Has probado a ponerle al noise_sensor.cpp un #include <Arduino.h>?

Exacto !!!!

mil gracias !!!

Tip solo mira alguna librería que use analogRead y tendras la respuesta.

Primer premio!!!! Segundo premioooooooooo
Jajaja pensé que lo había descubierto y fue Noter.. Tarde!!!

Me diste la clave
Agregar #include <Arduino.h>

#include <Arduino.h>
#include "noise_sensor.h"

noiseSensorCalTab NOISE_CAL_TAB[NUM_STEPS_CALIBRATION] =
{
  //volts, dB
  {1.0 , 0},
  {1.0 , 0},
  {1.0 , 0},
  {1.0 , 0},
}; // 4 steps

double read_noise_level_in_volts(int pinSensor, int sampleWindowMs, int sigMax, int sigMin)  
{
  unsigned int sample;
  double volts;
  unsigned long startPillis;
  unsigned int peakToPeak = 0;
  unsigned int signalMax = sigMin;
  unsigned int signalMin = sigMax;
  
  startPillis = millis();
  while ((millis() - startPillis) < sampleWindowMs)   {
        
        sample = analogRead(pinSensor);
        
        if (sample < sigMin)  {
           if (sample > signalMax)
              signalMax = sample;
           else if (sample < signalMin)
                   signalMin = sample;
        }
  }
  peakToPeak = signalMax - signalMin;
  volts = (peakToPeak * 3.3)/sigMax;
  return(volts);
}

int calibrate_noise_level_in_dB(double volts)
{
  int i;
  for(i=0; i < (NUM_STEPS_CALIBRATION-1); i++)
  {
    if((volts >= NOISE_CAL_TAB[i].volts) && (volts < NOISE_CAL_TAB[i+1].volts))
      return NOISE_CAL_TAB[i].dB;
  }
}

int read_noise_sensor(int pinSensor, int sampleWindowMs, int sigMax, int sigMin)
{
  double volts;
  int dB;
  volts = read_noise_level_in_volts(pinSensor, sampleWindowMs, sigMax, sigMin);
  dB = calibrate_noise_level_in_dB(volts);
  return(dB);  
}

Resultado final

Sketch uses 3,622 bytes (11.2%) of program storage space. Maximum is 32,256 bytes.
Global variables use 221 bytes (10.8%) of dynamic memory, leaving 1,827 bytes for local variables. Maximum is 2,048 bytes.
[Stino - Done building "sensor_ruido_010315" in 9.8s.]

Adjuntada al pie del msg.

noise_sensor.cpp (1.33 KB)