Creare una classe per la gestione di LED RGB [RISOLTO]

Salve a tutti,
mi capita spesso di associare un led RGB ad ogni sensore per indicare lo stato dello stesso, esempio ROSSO in errore, GIALLO in lettura, VERDE lettura eseguita, BLU in attesa ecc.
La voglia di creare la mia prima Classe è stata molto forte, mi sono quindi cimentato ma purtroppo con esiti poco lusinghieri.
Le funzionalità richieste non sono particolari:

  • durante l’instanza comunico i tre pin da utilizzare e controllo se sono tutti PWM
  • Spegni() spegnimento del led
  • Rosso(); Verde(); Blu(); Giallo(); Bianco() per accendere con un determitato colore
  • Colore() per accenderlo con un qualunque colore se i pin sono PWM

quindi ho creato il mio LedRGB.h

#ifndef ledrgb_h
#define ledrgb_h

class LedRGB {
  public:
    LedRGB(int PinR, int PinG, int PinB);
    Spegni();
    Rosso();
    Verde();
    Blu();
    Giallo();
    Bianco();
    Colore(int ValR, int ValG, int ValB);

  private:
    int r, g, b;
    bool ColPWM;
};



#endif  // ledrgb_h

il file LedRGB.cpp

#include <LedRGB.h>
#include <Boards.h>
#include <Arduino.h>

LedRGB::LedRGB(int PinR, int PinG, int PinB)
{
  r = PinR;
  g = PinG;
  b = PinB;
  pinMode(r, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(b, OUTPUT);
  digitalWrite(r, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  ColPWM = digitalPinHasPWM(r) && 
           digitalPinHasPWM(g) && 
           digitalPinHasPWM(b); 
}

void LedRGB::Spegni()
{
  digitalWrite(r, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
}

void LedRGB::Rosso()
{
  digitalWrite(r, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
}

void LedRGB::Verde()
{
  digitalWrite(r, LOW);
  digitalWrite(g, HIGH);
  digitalWrite(b, LOW);
}

void LedRGB::Blu()
{
  digitalWrite(r, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, HIGH);
}

void LedRGB::Giallo()
{
  digitalWrite(r, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(b, LOW);
}

void LedRGB::Bianco()
{
  digitalWrite(r, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(b, HIGH);
}


void LedRGB::Colore(int ValR, int ValG, int ValB)
{
  if(ColPWM){
    analogWrite(r, ValR);
    analogWrite(g, ValG);
    analogWrite(b, ValB);
  }
}

ed infine ho cercato di utilizzarlo in uno sketch di termometro temporizzato da un potenziometro

#include <LedRGB.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define DEVICE_DISCONNECTED -127 // Codice di Errore

/* Costanti */
const int DS18B20_Pin = 2;       // Pin sensore temperatura
const int PinPot = A0;           // pin analogico potenziometro (tempo letture)

/* Variabili */
float Temp;                      // Temperatura rilevata
float Interv, OldInt;            // Intervallo di tempo tra le letture / precedente
unsigned long Start;             // millis() dell'ultima lettura rilevata

/* Istanze */
OneWire oneWire(DS18B20_Pin);                 // Istanza OneWire
DallasTemperature sensors(&oneWire);          // Istanza DallasTemperature
LedRGB LedTemp(9, 10, 11);                    // Led del sensore
  
void setup() {
  Serial.begin(115200);                       // Inizializzazione Serial
  sensors.begin();                            // Inizializzazione sensore
  sensors.setResolution(11);                  // Risoluzione sensore 0.125°C / tempo di risposta 375 ms
  delay(5000);
}

void loop() {
  Start = millis();                                         // Rilevazione tempo lettura
  LedTemp.Giallo();
  sensors.requestTemperatures();
  Temp = sensors.getTempCByIndex(0);                        // Rilevazione temperatura
  if (Temp == DEVICE_DISCONNECTED){
    Serial.println("Sensore disconnesso");
    LedTemp.Rosso();
    return;
  }
  LedTemp.Verde();
  Serial.print(Temp, 3);
  Serial.println();
  Interv = Fmap(float(analogRead(PinPot)),0.0, 1020.0, 0.5, 10.0);  // Tempo di attesa tra le rilevazioni termiche
  OldInt = Interv;
  do{                                                               // se durante l'attesa viene modificato il tempo
    LedTemp.Blu();
    Interv = Fmap(float(analogRead(PinPot)), 0.0, 1020.0, 0.5, 10.0);
    if(abs(Interv - OldInt) > 0.1) break;
  } while((millis()-Start) < long(Interv * 1000.0));
}

/* Come la funzione map ma con parametri e risultato di tipo float */
float Fmap(float x, float in_min, float in_max, float out_min, float out_max){
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Il risultato è questa lista d’errori molto sconfortante dalla quale non riesco a cavare nessuna soluzione al problema:

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:21:6: error: prototype for 'void LedRGB::Spegni()' does not match any in class 'LedRGB'

 void LedRGB::Spegni()

      ^~~~~~

In file included from C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:1:0:

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB/LedRGB.h:7:5: error: candidate is: int LedRGB::Spegni()

     Spegni();

     ^~~~~~

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:28:6: error: prototype for 'void LedRGB::Rosso()' does not match any in class 'LedRGB'

 void LedRGB::Rosso()

      ^~~~~~

In file included from C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:1:0:

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB/LedRGB.h:8:5: error: candidate is: int LedRGB::Rosso()

     Rosso();

     ^~~~~

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:35:6: error: prototype for 'void LedRGB::Verde()' does not match any in class 'LedRGB'

 void LedRGB::Verde()

      ^~~~~~

In file included from C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:1:0:

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB/LedRGB.h:9:5: error: candidate is: int LedRGB::Verde()

     Verde();

     ^~~~~

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:42:6: error: prototype for 'void LedRGB::Blu()' does not match any in class 'LedRGB'

 void LedRGB::Blu()

      ^~~~~~

In file included from C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:1:0:

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB/LedRGB.h:10:5: error: candidate is: int LedRGB::Blu()

     Blu();

     ^~~

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:49:6: error: prototype for 'void LedRGB::Giallo()' does not match any in class 'LedRGB'

 void LedRGB::Giallo()

      ^~~~~~

In file included from C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:1:0:

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB/LedRGB.h:11:5: error: candidate is: int LedRGB::Giallo()

     Giallo();

     ^~~~~~

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:56:6: error: prototype for 'void LedRGB::Bianco()' does not match any in class 'LedRGB'

 void LedRGB::Bianco()

      ^~~~~~

In file included from C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:1:0:

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB/LedRGB.h:12:5: error: candidate is: int LedRGB::Bianco()

     Bianco();

     ^~~~~~

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:64:6: error: prototype for 'void LedRGB::Colore(int, int, int)' does not match any in class 'LedRGB'

 void LedRGB::Colore(int ValR, int ValG, int ValB)

      ^~~~~~

In file included from C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB\LedRGB.cpp:1:0:

C:\Users\Claudio Carletta\Documents\Arduino\libraries\LedRGB/LedRGB.h:13:5: error: candidate is: int LedRGB::Colore(int, int, int)

     Colore(int ValR, int ValG, int ValB);

     ^~~~~~

Più di una libreria trovata per "LedRGB.h"
Usata: C:\Users\Claudio
Più di una libreria trovata per "OneWire.h"
Usata: C:\Users\Claudio
Più di una libreria trovata per "DallasTemperature.h"
Usata: C:\Users\Claudio
Non usata: C:\Users\Claudio
Più di una libreria trovata per "Boards.h"
Usata: C:\Users\Claudio
Non usata: C:\Program
Più di una libreria trovata per "SoftwareSerial.h"
Usata: C:\Program
exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Qualcuno può aiutarmi?
Grazie

Risolto :slight_smile:
avevo dimenticato il void nei metodi del file LedRGB.h
Nel frattempo ho implementato pure la possibilità di scegliere tra led RGB a Catodo o Anodo comune durante l’istanza della classe.
Sembra che funzioni

LedRGB.h

#ifndef ledrgb_h
#define ledrgb_h

class LedRGB {
  public:
    LedRGB(int PinR, int PinG, int PinB, int Com);
    void Spegni();
    void Rosso();
    void Verde();
    void Blu();
    void Giallo();
    void Bianco();
    void Colore(int ValR, int ValG, int ValB);

  private:
    int r, g, b, C;
    bool ColPWM;
};



#endif  // ledrgb_h

LedRGB.cpp

#include <LedRGB.h>
#include <Boards.h>
#include <Arduino.h>

LedRGB::LedRGB(int PinR, int PinG, int PinB, int Com) // Com = 0 Catodo comune (GND)
{  // Com = 1 Anodo comune (+)
  r = PinR;
  g = PinG;
  b = PinB;
  C = Com;
  pinMode(r, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(b, OUTPUT);
  digitalWrite(r, C);
  digitalWrite(g, C);
  digitalWrite(b, C);
  ColPWM = digitalPinHasPWM(r) && 
           digitalPinHasPWM(g) && 
           digitalPinHasPWM(b); 
}

void LedRGB::Spegni()
{
  digitalWrite(r, C);
  digitalWrite(g, C);
  digitalWrite(b, C);
}

void LedRGB::Rosso()
{
  digitalWrite(r, !C);
  digitalWrite(g, C);
  digitalWrite(b, C);
}

void LedRGB::Verde()
{
  digitalWrite(r, C);
  digitalWrite(g, !C);
  digitalWrite(b, C);
}

void LedRGB::Blu()
{
  digitalWrite(r, C);
  digitalWrite(g, C);
  digitalWrite(b, !C);
}

void LedRGB::Giallo()
{
  digitalWrite(r, !C);
  digitalWrite(g, !C);
  digitalWrite(b, C);
}

void LedRGB::Bianco()
{
  digitalWrite(r, !C);
  digitalWrite(g, !C);
  digitalWrite(b, !C);
}


void LedRGB::Colore(int ValR, int ValG, int ValB)
{
  if(ColPWM){
 if (C){
 analogWrite(r, 255-ValR);
 analogWrite(g, 255-ValG);
 analogWrite(b, 255-ValB);
 }
 else{
 analogWrite(r, ValR);
 analogWrite(g, ValG);
 analogWrite(b, ValB);
}
  }
}

Spero che possa essere utile a qualcuno :wink: