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 !!!
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.
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.
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...
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]
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
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 !!
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.]