Problema codice con due potenziometri analogici

Salve,
Sto programmando un Leonardo per la funzione Keyboard da utilizzare come pulsanti cockpit per Flight Simulator X.

Ho un problema per gestire le cifre sullo schermo LCD, in particolare quelle del trim, dove ci sono numeri positivi e negativi (da 10 a -10). Sui numeri positivi ho utilizzato "variabile /10 %10" e "variabile %10". I negativi come li devo gestire? considerando che mostra il "-" e poi sballa tutto sull'lcd.
Di seguito il codice...che ho aggiustato per renderlo più comprensibile perché non era elegantissimo. Allego la sezione void loop con la sola funzione 'trim' dove c'è il problema della visualizzazione numerica su lcd. Il resto del codice va bene.

//Librerie
#include <Wire.h>
#include <Keyboard.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//definizione pulsanti
#define Buzzer 11
#define led_red 12
#define led_green 13
//definizioni variabili
int potTrimVal = 0;
int toneBuzzer = 220;
int durBuzzer = 200;
int potTrimVal = 0;

void setup() {
  lcd.init();  
  lcd.backlight();
  pinMode(Buzzer, OUTPUT);          //11
  pinMode(led_red, OUTPUT);         //12
  pinMode(led_green, OUTPUT);       //13
  schermata_default();
}

void loop() {
  pulsanteTrim();
}

void pulsanteTrim() {
    int potTrim = A3;
    if ((analogRead(potTrim) > 900) && (analogRead(potTrim) < 1020)) {
      potTrimVal--;
      if (potTrimVal <= -10) {
        potTrimVal = -10;
        lcd.setCursor(17, 2);
        lcd.print(potTrimVal / 10 % 10);
        lcd.print(potTrimVal % 10);
        digitalWrite(led_red, HIGH);
        delay(200);
        digitalWrite(led_red, LOW);
        delay(400);
      } else {
        tone(Buzzer, toneBuzzer, durBuzzer);
        digitalWrite(led_red, HIGH);
        delay(200);
        digitalWrite(led_red, LOW);
        Keyboard.begin();
        Keyboard.press('t');
        delay(200);
        Keyboard.releaseAll();
        lcd.setCursor(17, 2);
        lcd.print(potTrimVal / 10 % 10);
        lcd.print(potTrimVal % 10);
        delay(400);
      } 
   else if ((analogRead(potTrim) > 300) && (analogRead(potTrim) < 700)) {
      delay(400);
    } 
   else if ((analogRead(potTrim) > 100) && (analogRead(potTrim) < 200)) {
       potTrimVal++;
        tone(Buzzer, toneBuzzer, durBuzzer);
        digitalWrite(led_green, HIGH);
        delay(200);
        digitalWrite(led_green, LOW);
        Keyboard.begin();
        Keyboard.press('l');
        delay(200);
        Keyboard.releaseAll();
        lcd.setCursor(17, 2);
        lcd.print(potTrimVal / 10 % 10);
        lcd.print(potTrimVal % 10);
        delay(400);
      }
    }
}

void schermata_default() {
    lcd.setCursor(12, 2);
    lcd.print("Trim ");
    lcd.setCursor(17, 2);
    lcd.print(potTrimVal / 10 % 10);
    lcd.print(potTrimVal % 10);
  }

mah

io ti direi:

  1. pubblica il codice tra i tag code
  2. ben commentato e ben indentato
  3. e senza String
    e ci posso guardare dentro, ma nella situazione attuale credo che solo un masochista si metta a leggere il tuo codice

@hagu78: come richiesto al punto 7 del REGOLAMENTO , per favore edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di sistemare al più presto. :wink:

Ho risolto il problema del potenziometro. Funziona tutto.
Unico problema rimasto è la visualizzazione del valore su LCD
della variabile riferita al potenziometro Trim.
I valori che restituisce vanno da +10 a -10 per controllare su FlightSimulator il beccheggio.
Su lcd, i numeri positivi si vedono bene. Scendendo dallo 0 ad un numero negativo e ritornando sui valori positivi, riscontro il problema della visualizzazione corretta su schermo LCD
Sia sui valori positivi che negativi utilizzo:

        lcd.setCursor(17, 2);
        lcd.print(potTrimVal / 10 % 10);
        lcd.print(potTrimVal % 10);

Evidentemente non è corretto e non so come si fa.
Di seguito il codice più approfondito.

void loop() {
  pulsanteTrim();
}
void pulsanteTrim() {
    int potTrim = A3;
    if ((analogRead(potTrim) > 900) && (analogRead(potTrim) < 1020)) {
      potTrimVal--;
      if (potTrimVal <= -10) {
        potTrimVal = -10;
        lcd.setCursor(17, 2);
        lcd.print(potTrimVal / 10 % 10);
        lcd.print(potTrimVal % 10);
        digitalWrite(led_red, HIGH);
        delay(200);
        digitalWrite(led_red, LOW);
        delay(400);
      } else {
        tone(Buzzer, toneBuzzer, durBuzzer);
        digitalWrite(led_red, HIGH);
        delay(200);
        digitalWrite(led_red, LOW);
        Keyboard.begin();
        Keyboard.press('t');
        delay(200);
        Keyboard.releaseAll();
        lcd.setCursor(17, 2);
        lcd.print(potTrimVal / 10 % 10);
        lcd.print(potTrimVal % 10);
        delay(400);
      }
    } else if ((analogRead(potTrim) > 300) && (analogRead(potTrim) < 700)) {
      delay(400);
    } else if ((analogRead(potTrim) > 100) && (analogRead(potTrim) < 200)) {
      potTrimVal++;
       if (potTrimVal >= 10) {
        potTrimVal = 10;
        lcd.setCursor(17, 2);
        lcd.print(potTrimVal / 10 % 10);
        lcd.print(potTrimVal % 10);
        digitalWrite(led_red, HIGH);
        delay(200);
        digitalWrite(led_red, LOW);
        delay(400);
      } else {  
        tone(Buzzer, toneBuzzer, durBuzzer);
        digitalWrite(led_green, HIGH);
        delay(200);
        digitalWrite(led_green, LOW);
        Keyboard.begin();
        Keyboard.press('l');
        delay(200);
        Keyboard.releaseAll();
        lcd.setCursor(17, 2);
        lcd.print(potTrimVal / 10 % 10);
        lcd.print(potTrimVal % 10);
        Keyboard.println(potTrimVal / 10 % 10);
        Keyboard.println(potTrimVal % 10);
        delay(400);
      }
   }
 }
void schermata_default() {
    lcd.setCursor(0, 1);
    lcd.print("Eng ");
    lcd.setCursor(5, 1);
    lcd.print(eng_stateOff);
    lcd.setCursor(12, 1);
    lcd.print("Flap ");
    lcd.setCursor(18, 1);
    lcd.print(potFlapsVal / 10 % 10);
    lcd.print(potFlapsVal % 10);
    lcd.setCursor(0, 2);
    lcd.print("Gear ");
    lcd.setCursor(5, 2);
    lcd.print(Landing_GearOn);
    lcd.setCursor(12, 2);
    lcd.print("Trim ");
    lcd.setCursor(17, 2);
    lcd.print( potTrimVal);
    lcd.setCursor(0, 3);
    lcd.print("APil ");
    lcd.setCursor(5, 3);
    lcd.print(Autopilot_stateOff);
  }

Beh se il problema è il carattere in più non credo che tu possa farci molto, se non prevedere uno spazio in più (quindi non solo 2 caratteri ma 3) ossia scrivi il prefisso, ' ' per i positivi e '-' per quelli negativi. Una cosa di questo tipo:

        lcd.setCursor(17, 2);
        if (potTrimVal>=0)
          lcd.print(' ');
        else
          lcd.print('-');
        lcd.print(abs(potTrimVal) / 10 % 10);
        lcd.print(abs(potTrimVal) % 10);

Ciao proverò domani…una domanda, cosa sta per “abs” sul codice?.

lcd.print(abs(potTrimVal) / 10 % 10);

Fai sempre riferimento al reference e troverai tutto :wink:

Guglielmo

grazie :+1:t2:

Per scrivere sull'LCD un intero fra -10 e 10 basta semplicemente così...

        lcd.setCursor(17, 2);
        if (potTrimVal>=0)
          lcd.print(' ');
        else
          lcd.print('-');
        lcd.print(abs(potTrimVal))

e comunque, altrove, per la prima cifra avrei scritto così:

lcd.print((int)(abs(potTrimVal)/10));

No, così scrive solo una cifra lui (pare) ne vuole 2. E comunque la "if" è la stessa che ho scritto già io nel post #9...

Si ma a che serve? Ossia, che ha che non va l'istruzione col modulo 10? :wink:
Diciamo che anche a me non piace molto, più elegantemente avrei fatto:

  char buf[4];
  sprintf(buf, "% 03d", potTrimVal);
  lcd.print(buf);

Perché scrive solo una cifra???... Ho sempre fatto cose del genere e funzionano:

void printImp() // =cpm
{
if(U==1)Imp/=60; // Se viene cambiata unità di misura, diventano cps.
if     (Imp<10) {lcd.print("    ");}
else if(Imp<100) {lcd.print("   ");}
else if(Imp<1000) {lcd.print("  ");}
else if(Imp<10000) {lcd.print(' ');}
lcd.print(Imp);
if(Imp<100000){lcd.print(' ');}
} // END printImp()

Perché stampa solo il valore. Se è minore di 10, ad esempio 4, lcd.print(abs(potTrimVal)) stampa solo "4" e non " 4" o "04".

Hehe, si a funzionare funzionano, ma invece di quella catena di elseif che come dicono a New York "nun se po' vede'" :wink: nel tuo caso ti basta una istruzione:

  char buf[7];
  sprintf(buf, "% 6d", Imp);
  lcd.print(buf);

Sì, capisco. In futuro lo proverò e vedrò anche quanta memoria risparmia.

Mi riferivo, però, soprattutto a questo:

        lcd.print(abs(potTrimVal) / 10 % 10);
        lcd.print(abs(potTrimVal) % 10);

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.