creare librerie

stavo provando a fare una libreria che dati in input i pin di output e il valore di hue, "scrivesse" il colore in RGB

naturalmente non compila :sob:

ho seguito il tutorial che tempo fa si trovava in vetrina.

il file header:

#ifndef RGB.h
#define RGB.h

#include "Arduino.h"

class RGB
{
  public:
    RGB(unsigned int hue);
    RGB(byte red);
    RGB(byte green);
    RGB(byte blue);
    void out();
  private:
    int _hue;
    byte _RED;
    byte _GREEN;
    byte _BLUE;
};

#endif

mentre il file cpp:

#include "Arduino.h"
#include "RGB.h"

RGB::RGB(unsigned int hue,byte red,byte green,byte blue)
{
    pinMode(red, OUTPUT);
    pinMode(green, OUTPUT);
    pinMode(blue, OUTPUT);
    _RED = red;
    _GREEN = green;
    _BLUE = blue;
    _hue = hue;
}

void RGB::out()
{
    if (_hue <= 60) {
    analogWrite(_RED,255);
    analogWrite(_GREEN,map(hue, 0, 60, 0, 255));
    analogWrite(_BLUE,0);
  }
  else if (_hue <= 120) {
    analogWrite(_RED,map(hue, 60, 120, 255, 0));
    analogWrite(_GREEN,255);
    analogWrite(_BLUE ,0);
  }
  else if (_hue <= 180) {
    analogWrite(_RED,0);
    analogWrite(_GREEN,255);
    analogWrite(_BLUE,map(hue, 120, 180, 0, 255));
  }
  else if (_hue <= 240) {
    analogWrite(_RED,0);
    analogWrite(_GREEN,map(hue, 180, 240, 255, 0));
    analogWrite(_BLUE,255);
  }
  else if (_hue <= 300) {
    analogWrite(_RED,map(hue, 240, 300, 0, 255));
    analogWrite(_GREEN,0);
    analogWrite(_BLUE,255);
  }
  else if (_hue <= 359) {
    analogWrite(_RED,255);
    analogWrite(_GREEN,0);
    analogWrite(_BLUE,map(hue, 300, 359, 255, 0));
  }
}

mentre il codice che carico sulla scheda è questo:

#include <RGB.h>

RGB RGB(100,6,5,3);
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
RGB.out();
}

durante il vano tentativo di compilare come errore mi da: "sketch_jan13a.ino:11:1: note: in expansion of macro 'RGB'"

i file sono in una cartella chiamata RGB dentro alla cartella librerie, e si chiamano RGB.h e RGB.cpp (non credo che il problema sia questo poiche la libreria viene vista nell elenco librerie dell ide)

probabilmente è una cosa stupida, ma al momento da solo non riesco a venirne fuori...

attendo con ansia le vostre correzioni :grin:

non puoi chiamare una variabile come la classe stessa!

modifica così

#include <RGB.h>

RGB rgb(100,6,5,3);
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
rgb.out();
}

infine Attiva gli errori e i warning e postali per intero.

ciao!

grazie mille della correzione, ma continua a non andare.

ho messo l'output dettagliato durante la compilazione, e il risultato è allegato come immagine

PS non ho effettuato nessun cambiamento ai due file cpp e h, avrei dovuto?

trovato, ma la prossima volta postalo sul forum, non fare l'immagine!
l'errore è il primo in rosso.

#ifndef RGB.h
#define RGB.h

Non puoi usare il punto.

#ifndef _RGB_H_HEADER_
#define _RGB_H_HEADER_

modifica solo quelle due linee, dovrebbe andare, in alternativa posta gli errori

adesso il problema è un altro :grin:

e credo risieda nella dichiarazione delle funzioni. prima di tutto l'errore è questo:

Arduino:1.6.5 (Windows 8.1), Scheda:"Arduino/Genuino Uno"

Uso la libreria RGB nella cartella: C:\Users\AleAndre\Documents\Arduino\libraries\RGB (legacy)



G:\boschi\arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10605 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IG:\boschi\arduino\hardware\arduino\avr\cores\arduino -IG:\boschi\arduino\hardware\arduino\avr\variants\standard -IC:\Users\AleAndre\Documents\Arduino\libraries\RGB C:\Users\AleAndre\AppData\Local\Temp\build7820883891764666436.tmp\sketch_jan14a.cpp -o C:\Users\AleAndre\AppData\Local\Temp\build7820883891764666436.tmp\sketch_jan14a.cpp.o 

In file included from sketch_jan14a.ino:1:0:
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:12:5: error: 'RGB::RGB(byte)' cannot be overloaded
     RGB(byte green);
     ^
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:11:5: error: with 'RGB::RGB(byte)'
     RGB(byte red);
     ^
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:13:5: error: 'RGB::RGB(byte)' cannot be overloaded
     RGB(byte blue);
     ^
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:11:5: error: with 'RGB::RGB(byte)'
     RGB(byte red);
     ^
sketch_jan14a.ino:3:5: error: no matching function for call to 'RGB::RGB()'
sketch_jan14a.ino:3:5: note: candidates are:
In file included from sketch_jan14a.ino:1:0:
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:11:5: note: RGB::RGB(byte)
     RGB(byte red);
     ^
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:11:5: note:   candidate expects 1 argument, 0 provided
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:10:5: note: RGB::RGB(unsigned int)
     RGB(unsigned int hue);
     ^
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:10:5: note:   candidate expects 1 argument, 0 provided
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:7:7: note: RGB::RGB(const RGB&)
 class RGB
       ^
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:7:7: note:   candidate expects 1 argument, 0 provided
sketch_jan14a.ino: In function 'void loop()':
sketch_jan14a.ino:11:18: error: no matching function for call to 'RGB::out(int, int, int, int)'
sketch_jan14a.ino:11:18: note: candidate is:
In file included from sketch_jan14a.ino:1:0:
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:14:10: note: void RGB::out()
     void out();
          ^
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:14:10: note:   candidate expects 0 arguments, 4 provided
no matching function for call to 'RGB::RGB()'

il broblema credo risieda qui e/o qui:
parte del file cpp:

RGB::RGB(unsigned int hue,byte red,byte green,byte blue)
{
    codice...
}

void RGB::out()
{
altro codice...
}

oppure nel file .h

class RGB
{
  public:
    RGB(unsigned int hue);
    RGB(byte red);
    RGB(byte green);
    RGB(byte blue);
    void out();
  private:
    int _hue;
    byte _RED;
    byte _GREEN;
    byte _BLUE;
};

credo sia colpa della cattiva dichiarazione degli argomenti che gli passo.

in teoria io vorrei solo la funzione RGB.out, alla quale passo 4 argomenti, hue (unsigned int) e 3 pin PWM (byte)

riguardando il codice non sono sicuro di aver bisogno RGB rgb, ma l'ho messa perche cosi faceva il tutorial. esattamente cosa fa? passa i valori alla funzione e li mette in delle variabili accessibili solo alla mia funzione? e se io facessi:

void RGB::out(unsigned int hue,byte red,byte green,byte blue)

e mettessi il codice di rgb in out?(quello che passa i valori)

LEGGI!

cannot be overloaded

non puoi sovraccaricare una funzione senza cambiare gli argomenti!

QUESTO NON SI FA

class RGB
{
  public:
    RGB(unsigned int hue);
    RGB(byte red);
    RGB(byte green);
    RGB(byte blue);
    void out();
  private:
    int _hue;
    byte _RED;
    byte _GREEN;
    byte _BLUE;
};

cosi:

class RGB
{
  public:
    RGB(unsigned int hue, byte red, byte green, byte blue);
    void out();
  private:
    int _hue;
    byte _RED;
    byte _GREEN;
    byte _BLUE;
};

dopo aver ripreso in mano il tutorial mi sono accorto che le keyword non erano opzionali....

ed ora rieccomi qui.

sono leggermente andato avanti, ma continua a non funzionare, e gli errori mi creano solo confusione.

C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:7:7: note:   candidate expects 0 arguments, 3 provided
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:7:7: note: RGB::RGB(const RGB&)
C:\Users\AleAndre\Documents\Arduino\libraries\RGB/RGB.h:7:7: note:   candidate expects 1 argument, 3 provided
BareMinimum.ino: In function 'void loop()':
BareMinimum.ino:11:3: error: 'rgb' was not declared in this scope
no matching function for call to 'RGB::RGB(int, int, int)'

il codice per il test è:

void setup() {
RGB rgb(6,5,3);
}

void loop() {
  rgb.out(100);
}

il file .h è questo:

#ifndef _RGB_H_HEADER
#define _RGB_H_

#include "Arduino.h"

class RGB
{
  public:
    void rgb(byte, byte, byte);
    void out(int);
  private:
    int _hue;
    byte _RED;
    byte _GREEN;
    byte _BLUE;
};

#endif

adesso passo a una prima funzione i dati dei pin, e a una seconda il valore di hue, la quale lo rende pwm e lo "stampa" anche.

mi fa strano l'errore:

no matching function for call to 'RGB::RGB(int, int, int)'

io non ho dichiarato nessuna funzione che prenda in input 3 parametri int....

posta tutto il codice.
poi

void setup() {
RGB rgb(6,5,3);
}

void loop() {
  rgb.out(100);
}

come fai ad usare rgb se è dichiarata solo dentro a setup?

Ti consiglio di studiare le basi del C e del suo compilatore, poi ti dai una lettura veloce al C++, vedrai che ti sarà tutto piu chiaro.

scusa, pensavo bastasse il file.h :grin:

questo è il file cpp

#include "Arduino.h"
#include "RGB.h"

RGB::rgb(byte red,byte green,byte blue)
{
    pinMode(red, OUTPUT);
    pinMode(green, OUTPUT);
    pinMode(blue, OUTPUT);
    _RED = red;
    _GREEN = green;
    _BLUE = blue;
}

void RGB::out(int hue)
{
    _hue = hue;

if (_hue <= 60) {
    analogWrite(_RED,255);
    analogWrite(_GREEN,map(_hue, 0, 60, 0, 255));
    analogWrite(_BLUE,0);
   
    //altro codice molto simile che si ripete
  }
}

be, rgb dichiara solo i pin da usare, quindi credo che mi basti solo "inizializzarla" e poi basta, non devo piu chiamarla

Le funzioni che dichiari nel file .cpp devono essere uguali a quelli dell'header che poi dovranno essere richiamate nello stesso modo.

Se ad esempio nella tua classe hai:

class TEST
{
    TEST(int h, byte a, byte b, byte c)
};

nel file .cpp dovrai avere una funzione che corrisponda:

TEST::TEST(int h, byte a, byte b, byte c)
{
    //faccio qualcosa
}

e quando la usi dovrai farlo come specificato:

TEST mytest(1,2,3,4);

Occhio che se rgb() vuoi che sia il costruttore della tua classe, deve chiamarsi RGB(), maiuscolo, come la classe stessa.

grazie mille adesso compila ;D

@SukkoPera uhm... cosa è un costruttore?

Google ti è amico :slight_smile: