Da contenuto stringa a nome variabile

Salve a tutti, prima di tutto vi informo che da tempo remoto ho problemi con le stringhe, array e tutto quello che è connesso ad esse …(non è che nel resto poi sia un genio…) non le ho mai capite, abbiate pazienza… vengo subito al dunque:

Arduino UNO + LCD 16x2 caratteri + encoder rotativo

ho impostato delle variabili:

scelta0 = “rosso”, scelta1 = “verde”, scelta2 = “blu”, ecc ecc

l’encoder rotativo mi fornisce una variabile che aumenta e diminuisce…

Vorrei visualizzare nell’LCD la scelta fatta esempio quando l’encoder restituisce 2 visualizzare il valore di scelta2 e quindi visualizzare “blu”

Credo che potrei fare il tutto con degli if…

if (valore encoder == 2 {
lcd.print(scelta2);
}

ma le variabili scelta potrebbero essere molte e non credo sia molto “pulito” scrivere un codice chilometrico…

pensavo… si può trasformare il valore di una stringa nel nome della variabile da visualizzare?

esempio:

String scelta= “scelta”+ valore encoder

restituisce :“scelta2” invece di scelta2

Grazie mille
Marco

inserisco codice per completezza

//////////variabili generiche////////////
String scelta = "scelta";
String scelta0 = "rosso";
String scelta1 = "verde"; 
String scelta2 = "blu";
String scelta3 = "arancione";
String scelta4 = "viola";
////////////////// ENCODER //////////
int val;
const int buttonPin = 2; // pin SW
int encoder0PinA = 4; // pin CLK 
int encoder0PinB = 3; // pin dt
int encoder0Pos = -1;
int encoder0PinALast = LOW;
int n = LOW;
int buttonState = 0; 
/////////////////// LCD /////////////
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
String line2 = "";
void setup() { 
  ////////////////// ENCODER //////////
  Serial.begin (9600);
  pinMode (encoder0PinA,INPUT);
  pinMode (encoder0PinB,INPUT);
  pinMode(buttonPin, INPUT);  
  lcd.begin(16,2);
} 
void loop() { 
  ////////////////// ENCODER //////////
  n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      encoder0Pos--;
       } 
    else {
      encoder0Pos++;
    }
  } 
  encoder0PinALast = n;
  /////////////////// LCD /////////////
 String line2 = scelta + encoder0Pos; /// qui c'è il problema
    lcd.setCursor(1, 1);
    lcd.print(line2);
    delay(100);
    lcd.clear();
    }

Ciao, per il tuo problema un array di stringhe è la soluzione, pochissimo codice e risultato garantito :slight_smile:
puoi defiire una cosa del tipo:

char valori[3][20] = { "primo","secondo","terzo" };

poi in base al valore di posizione dell'encoder prelevi il valore e lo copi in una variabile del tipo

char array2[20];
size_t destination_size = sizeof (array2);
strncpy(array2, valori[POS_DECODER], destination_size);
array2[destination_size - 1] = '\0';

e visualizzi il contenuto di array2
Chiaramente dovrai verificare che la variabile indicata come POS_DECODER non prenda valori più piccoli di 0 e più grandi del valore massimo dell'array per evitare errori in fase di runtime

Inizia con cercare le stringhe per il linguaggio C, no c++ come nel tuo esempio.
Per fare poi quello che ti serve basta metterle dentro ad un vettore:

char *scelta[] = {"scelta","rosso",verde"};

...
...
if ( encoder0Pos >=0 && encoder0Pos < MaxScelta )
    lcd.print(scelta[encoder0Pos]);

Grazie mille a tutti e due… per quanto riguarda il valore dell’encoder devo ancora porri i limiti > <

String scelta= "scelta"+ valore encoder

in ogni caso se vuoi proprio usare le stringhe non puoi sommare una stringa+intero, l'intero va convertito in stringa anche lui per correttezza

String scelta= "scelta : "+ (String)valore encoder

restituisce :"scelta2" invece di scelta2

non l'ho capita ... cioè ci mette le virgolette?

pablos:
String scelta= "scelta"+ valore encoder

in ogni caso se vuoi proprio usare le stringhe non puoi sommare una stringa+intero, l'intero va convertito in stringa anche lui per correttezza

String scelta= "scelta : "+ (String)valore encoder

non l'ho capita ... cioè ci mette le virgolette?

Vuole restituire il valore contenuto nella variabile e non il nome dellla variabile calcolandolo la variabile da mostrare in funzione della posizione dell'encoder...