Creare un messaggio d'errore.

Salve a tutti. Sto creando una libreria per la gestione di un sensore di colore e avrei bisogno di passare una variabile di tipo intero ad una funzione, la variabile deve assumere i valori 2, 20 o 100, che devono essere passati alla funzione dal programmatore e se non viene passato uno di questi tre valori l'IDE dovrebbe dare un errore. Sapreste dirmi come fare?

Non puoi passare dati durante la programmazione se non nelle variabili dichiarate nello sketch ma puoi creare un funzione interattiva passando i dati all'Arduino tramite il serial monitor.
Sullo stesso serial monitor puoi stampare i messaggi di errore semplicemente utilizzando i serial.print dallo sketch.

Sull'ultimo numero di Elettonica In c'è un progetto che utilizza Arduino ed il sensore colore con TCS230.

Nello sketch è presente proprio la funzione che richiedi.

PaoloP:
Non puoi passare dati durante la programmazione

In realtà è fattibile, però non dall'IDE di Arduino, gcc permette di specificare dei parametri che vengono utilizzati come le #define, esempio classico la F_CPU che specifica il clock.
Per passare dei valori al software durante la fase di compilazione basta usare il parametro -D, p.e. "-Dquellochetipare=10", questo comando crea l'equivalente di "#define quellochetipare 10" e tale valore sarà sempre disponibile nell'eseguibile una volta compilato.
Puoi vedere l'uso della -D da parte del IDE abilitando i messaggi di compilazione in preferenze.

Estratto dalla riga di comando per avrgcc generata dal IDE:

"-DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR"

Allora diciamo che se uno prepara più platform.txt o board virtuali può assegnare i parametri tramite l'opzione flag.

-->https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/platform.txt
--> https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/boards.txt

Penso di essermi spiegato male. Nella libreria è presente la seguente funzione:

initialize(int pin1, int pin2, int scale)
{
pinMode(pin1,OUTPUT);
pinMode(pin2,OUTPUT);
pinMode(pin3,OUTPUT);
if(scale==2)
digitalWrite(pin1,LOW);
digitalWrite(pin2,HIGH);
else if(scale==20)
digitalWrite(pin1,HIGH);
digitalWrite(pin2,HIGH);
else if(scale==100)
digitalWrite(pin1,HIGH);
digitalWrite(pin2,HIGH);
else
//genera errore
}

e chi usa la libreria la chiama dichiarando i 2 pin da usare e scale che deve essere 2, 20 o 100 e in caso non sia 2, 20 o 100 l'IDE deve dare il meggaggio d'errore.

L'errore che generi è a runtime, come può il compilatore sapere che cosa verrà passato a quella funzione prima che il programma giri?
In genere io faccio l'opposto, ossia restituisco un errore in caso di parametri errati, in questo modo scarico la responsabilità sul programmatore che deve controllare egli stesso ciò che passa.

Ad esempio, la tua funzione invece che di tipo void falla diventare di tipo int. Poi la riscrivi così:

int initiliaze(int pin1, int pin2, int scale) {
  if ((scale != 2) && (scale != 20) && (scale != 100)) {
    return -1;
  }
  .....
  return 0;
}

a questo punto la chiami così:

if (initialize(1, 2, 5) == -1) {
  ...gestisci l'errore nel codice
}