Problema con creazione di libreria per sensori

Buonasera a tutti,
Io ultimamente mi sono messo a studiare le librerie ed eventualmente a scriverle. Ieri ho iniziato a scrivere una libreria per leggere dei sensori che solitamente non necessitano di una.
I sensori in questione sono:

  • HC-SR04 (misuratore di distanza ad ultrasuoni),

  • TMP 36GZ (misuratore di temperatura).

Gli script che utilizzo per effettuare le misurazioni con questi sensori sono i seguenti:
Per HC-SR04:

digitalWrite(trigPin,  LOW); 
    delayMicroseconds(2); 
    digitalWrite(trigPin,  HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trigPin,  LOW);   
    duration =  pulseIn(echoPin,  HIGH);  
   distance = duration * 0.034 / 2; 
    delay(10);

Dove misura il tempo impiegato dall'ultrasuono a tornare al sensore e poi sapendo la velocità del suono ricava la distanza.

Per il TMP 36GZ

float voltage = (analogRead(PIN)/1024.0) /5.0;
float temperature = (voltage - 0.5)*100;

Dove sono tutti calcoli che si basano sulla resistenza del sensore.

La libreria volevo crearla con i seguenti comandi:
attachT(pinT) per definire il pin impiegato dal sensore per comunicare,
attachD(echo, trig) è la stessa cosa di prima ma con il misuratore di distanza
getT() è la funzione che fa tutti i calcoli per ottenere la temperatura
getD() stessa cosa di getT() ma con la distanza.

La libreria che ho scritto fino ad ora è la seguente:

sensors.h:

#ifndef __SENSORS_H__
#define __SENSORS_H__

class Sensors{
public:
  Sensors();
  void attachT(const int pinT);
  void attachD(const int echo, const int trig);
  void getD();
  void getT();
private:
  int _pinT;
  int _echo;
  int _trig;
  int _voltage;
  int _temperature;
  int _duration;
};
#endif

sensors.cpp:

#include <Arduino.h>
#include <ctype.h>
#include "sensors.h"

Sensors::Sensors(){}

void attachT(const int pinT){
  _pinT = pinT;
  pinMode(_pinT, INPUT);
  Serial.println("inizializzazione del sensore di temperatura completata");
}

void attachD(const int echo, const int trig){
  _trig = trig;
  _echo = echo;
  pinMode(_trig, OUTPUT);
  pinMdoe(_echo, INPUT);
  Serial.println("inizializzazione del sensore ad ultrasuoni completata");
}

float getT(){
  _voltage = (analogRead(_pinT)/1024.0 * 5.0;
  _temperature = (_voltage - 0.5) * 100;
  return _temperature;
}

il messaggio di errore che mi dà con questo codice è:

#include <sensors.h>
Sensors sium();
void setup(){
  Serial.begin(9600);
  sium.attachT(10);
}
void loop(){
  Serial.print(sium.getT());
  Serial.println(";    ");

}

errore:

C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino: In function 'void setup()':
C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino:5:8: error: request for member 'attachT' in 'sium', which is of non-class type 'Sensors()'
   sium.attachT(10);
        ^~~~~~~
C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino: In function 'void loop()':
C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino:8:21: error: request for member 'getT' in 'sium', which is of non-class type 'Sensors()'
   Serial.print(sium.getT());
                     ^~~~

exit status 1

Compilation error: request for member 'attachT' in 'sium', which is of non-class type 'Sensors()'

Hai sbagliato a definire le funzioni nel file .cpp

Manca il riferimento alla classe.

void attachT(const int pinT){...

deve diventare

void Sensors::attachT(const int pinT){...

Stessa cosa per tutti gli altri metodi.

Hai ragione!!!
Adesso correggo!
Grazie mille

Continua a darmi lo stesso errore. Ho corretto il file .cpp in:

#include <Arduino.h>
#include <ctype.h>
#include "sensors.h"

Sensors::Sensors(){}

void Sensors::attachT(const int pinT){
  _pinT = pinT;
  pinMode(_pinT, INPUT);
  Serial.println("inizializzazione del sensore di temperatura completata");
}

void Sensors::attachD(const int echo, const int trig){
  _trig = trig;
  _echo = echo;
  pinMode(_trig, OUTPUT);
  pinMode(_echo, INPUT);
  Serial.println("inizializzazione del sensore ad ultrasuoni completata");
}

float Sensors::getT(){
  _voltage = (analogRead(_pinT)/1024.0 * 5.0;
  _temperature = (_voltage - 0.5) * 100;
  return _temperature;
}
float Sensors::getD(){
  digitalWrite(_trig,  LOW); 
  delayMicroseconds(2); 
  digitalWrite(_trig,  HIGH); 
  delayMicroseconds(10); 
  digitalWrite(_trig,  LOW);   
  _duration =  pulseIn(_echo,  HIGH);  
  _distance = _duration * 0.034 / 2; 
  return _distance
}

lo script:

#include <sensors.h>
Sensors prova();
void setup(){
  Serial.begin(9600);
  prova.attachT(10);
}
void loop(){
  Serial.print(prova.getT());
  Serial.println(";    ");
}

l'errore:

In file included from C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino:1:0:
c:\Users\LENOVO\Documents\Arduino\libraries\SensorsLibrary/sensors.h:18:7: error: expected ';' at end of member declaration
   int distance
       ^~~~~~~~
C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino: In function 'void setup()':
C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino:5:8: error: request for member 'attachT' in 'sium', which is of non-class type 'Sensors()'
   sium.attachT(10);
        ^~~~~~~
C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino: In function 'void loop()':
C:\Users\LENOVO\Documents\Arduino\progetti\miei\braccio robotico\prove\prova_MAP\prova_MAP.ino:8:21: error: request for member 'getT' in 'sium', which is of non-class type 'Sensors()'
   Serial.print(sium.getT());
                     ^~~~

exit status 1

Compilation error: request for member 'attachT' in 'sium', which is of non-class type 'Sensors()'

Il file sersors.h non è lo stesso che hai messo nel primo post perché la variabile distance non è dichiarata.
Il messaggio di errore è chiaro: manca un ;

Infatti non c'era.. Però continua a darmi errore

file .cpp:

#include <Arduino.h>
#include <ctype.h>
#include "sensors.h"

Sensors::Sensors(){}

void Sensors::attachT(const int pinT){
  _pinT = pinT;
  pinMode(_pinT, INPUT);
  Serial.println("inizializzazione del sensore di temperatura completata");
}

void Sensors::attachD(const int echo, const int trig){
  _trig = trig;
  _echo = echo;
  pinMode(_trig, OUTPUT);
  pinMode(_echo, INPUT);
  Serial.println("inizializzazione del sensore ad ultrasuoni completata");
}

float Sensors::getT(){
  _voltage = (analogRead(_pinT)/1024.0 * 5.0;
  _temperature = (_voltage - 0.5) * 100;
  return _temperature;
}
float Sensors::getD(){
  digitalWrite(_trig,  LOW); 
  delayMicroseconds(2); 
  digitalWrite(_trig,  HIGH); 
  delayMicroseconds(10); 
  digitalWrite(_trig,  LOW);   
  _duration =  pulseIn(_echo,  HIGH);  
  _distance = _duration * 0.034 / 2; 
  return _distance
}

file .h:

#ifndef __SENSORS_H__
#define __SENSORS_H__

class Sensors{
public:
  Sensors();
  void attachT(const int pinT);
  void attachD(const int echo, const int trig);
  float getD();
  float getT();
private:
  int _pinT;
  int _echo;
  int _trig;
  int _voltage;
  float _temperature;
  int _duration;
  int distance;
};
#endif

script sempre uguale

Devi fare più attenzione a quello che scrivi e ai messaggi del compilatore: ci sono ancora un paio di errori:

  • distance != _distance
  • _voltage = (analogRead(_pinT)/1024.0 * 5.0; manca una parentesi tonda (oppure ce n'è una di troppo)

Infine, la tua classe non ha parametri nel costruttore quindi non va chiamata usando le parentesi, altrimenti il compilatore la confonde con una funzione.

  • Sensors sium;

Grazie mille!
Ora compila tutto! Devo stare più attento :sweat_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.