Aiuto sviluppo libreria per sensori di prossimità IR

Ciao a tutti ragazzi. Dopo un anno quasi di sperimentazione su i sensori ERER vedi:
http://www.gioblu.com/tutorials/sensori/59-sensore-prossimita-led
http://www.gioblu.com/tutorials/sensori/179-app-in-processing-sperimentazione-sensore-led-ir

ho iniziato a sviluppare qualche giorno fa una libreria che permette di utilizzare in modo semplice e veloce due led ir come sensore di prossimità con range superiori a 2 metri, ma soprattutto, con poche linee di codice di controllarne fino a 4 coppie con arduino diecimila / duemilanove / UNO e molti di piu’ con arduino Mega.

Ecco il codice della libreria:
ERER.h

/*
  ERER.cpp - Library for ERER sensors.
  (use 2 infrared LEDs to build a distance sensor)
  Created by Giovanni Blu Mitolo, March 11, 2011.
  Released with Creative Commons Attribution licence
*/
#ifndef ERER_h
#define ERER_h

class ERER {
  public:
    long ambient; 
    void ambientCheck();
    long currentInit;
    long distance;
    void distanceCheck();
    void emissionCheck();
    void gain(int setGain)
    void init(int emitter);
    long lightTime;
    void maxRangeValue(int setMaxRangeValue);
    void maxRange(int setMaxRange);
    long rawData;
    void emitterN(int emitterNegative);
    void receiverN(int receiverNegative);
    void receiverP(int receiverPositive);
  private:
    int _irEmitterP;
    int _irReceiverP;
    int _irReceiverN;
    int _gain; 
    long _maxRange;
    long _maxRangeValue; 
};

#endif

ERER.cpp

/*
  ---------------------------------------------------
  ERER.cpp - Library for ERER sensors.
  Use 2 infrared LEDs to build a distance sensor
  After that think about to matrix it with this - _-
  ---------------------------------------------------
  Created by Giovanni Blu Mitolo, March 11, 2011.
  www.gioblu.com - gioscarab@gmail.com
  Released with Creative Commons Attribution licence
  ---------------------------------------------------
*/

#include "WProgram.h"
#include "ERER.h"

void ERER::emitterN(int emitterNegative){
 pinMode(emitterN, OUTPUT);
 _irEmitterP = emitterNegative;
}

void ERER::receiverN(int receiverNegative){
 _irReceiverN = receiverNegative;
}

void ERER::receiverP(int receiverPositive){
 _irReceiverP = receiverPositive;
}

void ERER::gain(int setGain){
 _gain = setGain;
}

void ERER::maxRangeValue(int setMaxRangeValue){
 _maxRangeValue = setMaxRangeValue;
}

void ERER::maxRange(int setMaxRange){
 _maxRange = setMaxRange;
}
/////////////////////////////////////////////////////////////////////////////


void ERER::distanceCheck() { 
  if(currentInit == 0){if(digitalRead(_irReceiverN) == LOW) ERER::ambientCheck();}
  if(currentInit == 1){if(digitalRead(_irReceiverN) == LOW) ERER::emissionCheck();}
}

void ERER::ambientCheck() {
  ambient = micros() - lightTime;
  init(1);
}

void ERER::emissionCheck(){
  rawData = micros() - lightTime;
  distance = rawData * (ambient / (ambient - rawData));
  distance = map(distance, 0, _maxRangeValue, 0, _maxRange);
  if(distance <= 0) distance = 0;
  if(distance > 15) distance = sqrt(distance) * _gain;
  rawData = 0; 
  ambient = 0;
  init(0);
}

void init(int emitter) {
  if(emitter == 0)digitalWrite(_irEmitterP, LOW);   
  if(emitter == 1)digitalWrite(_irEmitterP, HIGH); 
  lightTime = micros();
  pinMode(_irReceiverN, OUTPUT);
  digitalWrite(_irReceiverN, HIGH); //carico ricevitore di induttanza
  pinMode(_irReceiverN, INPUT);
  digitalWrite(_irReceiverN, LOW);
  if(emitter == 1) currentInit = 1;
  if(emitter == 0) currentInit = 0;
}

e questo è il codice da inserire nell’ide:

#include <ERER.h>
ERER sensore1;

sensore1.receiverN(2);
sensore1.receiverP(5);
sensore1.emitterP(13);
sensore1.gain(4);
sensore1.maxRangeValue(666666);
sensore1.maxRange(2000);

void setup(){
  Serial.begin(9600);
}

void loop(){
 sensore1.distanceCheck();
}

Purtroppo mi ritorna sempre questo errore:
/ERER.cpp:73: error: ‘currentInit’ was not declared in this scope
Sembra ritornare sempre l’ultima riga come zona errore…

qualcuno saprebbe darmi una mano? :grin:

Prova con l'IDE in versione 0021. La 0022 ha un nuovo parser Java per cui alcune direttive del C++ (tipo i template e le classi) non sono elaborate più in maniera corretta. Alternativamente prova a mettere il file in un'altra linguetta dell'IDE importando i file che vuoi allegare allo sketch.

infatti currentInit non sembra essere dichiarato da nessuna parte :P

La versione 22 crea problemi nella scrittura delle librerie?? Come è possibile che una versione piu' recente abbia un problema di una piu' vecchia????? Ciao Brain cosa itendi??

la dichiaro qui: long currentInit; in ERER.h

scusa per le risposta corta :P http://cplusplus.syntaxerrors.info/index.php?title=%E2%80%98bar%E2%80%99_was_not_declared_in_this_scope#Missing_declaration

  • nel .h: void gain(int setGain) Ti sei dimenticato il ";"[/li]
  • chiami una funzione init, ma probabilmente quel nome è già utilizzato da qualche funzione di Arduino(a me lo visualizza in giallino), l'errore però anche cambiando il nome rimane. Tutte le variabili di quella funzione a me danno lo stesso errore.
  • Il problema secondo me non è nè del compilatore (io uso 0021)...al momento non mi viene in mente altro

Prima di fati i due file .h e .cpp testa il codice scrivendo la classe e le funzioni in un unico sketch...ti semplifichi la vita e ti trova tutti gli errori :-)

gbm: La versione 22 crea problemi nella scrittura delle librerie?? Come è possibile che una versione piu' recente abbia un problema di una piu' vecchia?????

Non ho detto che crea problemi in scrittura, hanno cambiato il parser (confermato sulla segnalazione errori). Considera che l'IDE è in Java, quindi c'è un parser che legge il codice e lo controlla prima di passarlo al compilatore. Prova con la 0022 a mettere un template: ti verrà subito dato un errore, mentre con la 0021 tutto fila liscio. L'alternativa è inglobare il template in un file esterno e aggiungerlo al progetto.