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