Aggiungere accensione led ad uno sketch chi mi aiuta?

Dalla domanda è evidente che sono alle prime armi. Ho uno sketch per nano33 IOT con il quale interfaccio un ricetrasmettitore e al variare di 9 bande varia una tensione su A0.
Vorrei banalmente aggiungere l'accensione di un led ad ogni cambio di banda utilizzando D2 - D12
pensavo a if return e poi writeled ecc..
Potreste indicarmi il modo corretto per programmare la condizione? di seguito lo sketch
grazie a tutti coloro che vorranno darmi una mano

*/
 
/* Begin user configurable settings. */
#define RADIO_BAUD 115200
#define COMPUTER_BAUD 115200

/* Change for your country. Defaults to US band plan. */
#define BAND_MIN_160M 1800000
#define BAND_MAX_160M 2000000

#define BAND_MIN_80M 3500000
#define BAND_MAX_80M 4000000

/* FT-817/818 does not define a specific 60m voltage, so you may want
 * to update the frequency ranges below to output e.g. 40M's instead.
 */
//#define BAND_MIN_60M 5330000
//#define BAND_MAX_60M 5407000

#define BAND_MIN_40M 7000000
#define BAND_MAX_40M 7300000

#define BAND_MIN_30M 10000000
#define BAND_MAX_30M 10150000

#define BAND_MIN_20M 14000000
#define BAND_MAX_20M 14350000

#define BAND_MIN_17M 18068000
#define BAND_MAX_17M 18168000

#define BAND_MIN_15M 21000000
#define BAND_MAX_15M 21450000

#define BAND_MIN_12M 24930000
#define BAND_MAX_12M 24990000

#define BAND_MIN_10M 28000000
#define BAND_MAX_10M 29700000

#define BAND_MIN_6M 50000000
#define BAND_MAX_6M 54000000

/* End user configurable settings. */
#define HZ_TO_KHZ 1000
#define COMMAND_TERMINATOR 0xfd
// #define TRANSCEIVER_INFORMATION_RSP "0xfe0xfe"
#define SERIAL_TIMEOUT_MS 1

#define ANALOG_PIN A0 /* MKR Zero pure analog pin */
#define VOLTAGE_STANDARD 330 /* 3.3V; 5V would be 500 */
#define MAX_INT_FOR_VOLTAGE_STANDARD 1023 /* 10 binary ones is 1023 */

#define VOLTAGE_160M  33
#define VOLTAGE_80M   66
//#define VOLTAGE_60M  
#define VOLTAGE_40M  100
#define VOLTAGE_30M  130
#define VOLTAGE_20M  160
#define VOLTAGE_17M  200
#define VOLTAGE_15M  230
#define VOLTAGE_12M  270
#define VOLTAGE_10M  300
#define VOLTAGE_6M   330

static int count = 0;
static int cntr = 0;
static unsigned long timer = 0;
static unsigned long oldfrequency = -1;
static unsigned int oldptt = -1;
static int state = 0;

// Converts a voltage to a value suitable for analogWrite().
int voltageToInteger(int voltage)
{
  return voltage * MAX_INT_FOR_VOLTAGE_STANDARD / VOLTAGE_STANDARD;
}

int frequencyToVoltage(long frequency)
{
  if (frequency >= BAND_MIN_160M && frequency <= BAND_MAX_160M)
  {
    return VOLTAGE_160M;
  }
  else if (frequency >= BAND_MIN_80M && frequency <= BAND_MAX_80M)
  {
    return VOLTAGE_80M;
  }
  /*else if (frequencyKhz >= BAND_MIN_KHZ_60M && frequencyKhz <= BAND_MAX_KHZ_60M)
  {
    return VOLTAGE_60M;
  }*/
  else if (frequency >= BAND_MIN_40M && frequency <= BAND_MAX_40M)
  {
    return VOLTAGE_40M;
  }
  else if (frequency >= BAND_MIN_30M && frequency <= BAND_MAX_30M)
  {
    return VOLTAGE_30M;
  }
  else if (frequency >= BAND_MIN_20M && frequency <= BAND_MAX_20M)
  {
    return VOLTAGE_20M;
  }
  else if (frequency >= BAND_MIN_17M && frequency <= BAND_MAX_17M)
  {
    return VOLTAGE_17M;
  }
  else if (frequency >= BAND_MIN_15M && frequency <= BAND_MAX_15M)
  {
    return VOLTAGE_15M;
  }
  else if (frequency >= BAND_MIN_12M && frequency <= BAND_MAX_12M)
  {
    return VOLTAGE_12M;
  }
  else if (frequency >= BAND_MIN_10M && frequency <= BAND_MAX_10M)
  {
    return VOLTAGE_10M;
  }
  else if (frequency >= BAND_MIN_6M && frequency <= BAND_MAX_6M)
  {
    return VOLTAGE_6M;
  }
  else
  {
    return 0; // disable band output
  }
}

void setBand(long frequency)
{
  // Serial.print(F("Set Voltage for Frequency ")); Serial.println(frequency);
  Serial.print(F("Voltage is ")); Serial.println(frequencyToVoltage(frequency));
  analogWriteResolution(10);
  analogWrite(ANALOG_PIN, voltageToInteger(frequencyToVoltage(frequency)));
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode(NINA_GPIO0, OUTPUT);
  digitalWrite(NINA_GPIO0, HIGH);
  pinMode(NINA_RESETN, OUTPUT);
  digitalWrite(NINA_RESETN, HIGH);
  
  // Open serial ports
  Serial.begin(COMPUTER_BAUD);
  // Serial.setTimeout(SERIAL_TIMEOUT_MS);
  SerialNina.begin(RADIO_BAUD);
  // SerialBT.begin("RadioOut");
  // Serial1.setTimeout(SERIAL_TIMEOUT_MS);

  // Set analog output pin to 0V.
  setBand(0);

  // Give time for Windows 10 to initialize
  delay(5000);
  count = 0;
  timer = millis();
  oldfrequency = -1;
  oldptt = -1;
  state=0;
}
  
void loop() 
{
  static String computerBuffer;
  static unsigned char radioBuffer[64];

  static bool doneReceiving = false;
  static char buf[20];
  static unsigned char character;
  static int i;
  static int j;
  static long mult;
  static long frequency;
  static int ptt;
  static unsigned char freqcmd[6] = {0xfe,0xfe,0xa4,0xe0,0x03,0xfd};
  static unsigned char pttcmd[7] = {0xfe,0xfe,0xa4,0xe0,0x1c,0x00,0xfd};

  while (SerialNina.available() > 0)
    {
    character = SerialNina.read();
    // sprintf(buf, "%02X", character);
    // Serial.print(buf);
    if (character == COMMAND_TERMINATOR)
      {
      // Serial.println();
      radioBuffer[count++] = character;
      j=count;
      count=0;

      if ((radioBuffer[2] == 0xe0) && (radioBuffer[3] == 0xa4)) {
        // Serial.print("\r\nLine: ");
        // print the result
        // for (i=0 ; i < j ; i++) {
        //   sprintf(buf, "%02X", radioBuffer[i]);
        //   Serial.print(buf);
        // }
        // Serial.println();

        // At his point, we have a command in the buffer - process it
        if (radioBuffer[4] == 0x03) {
          mult = 1;
          frequency = 0;
          for(i = 5 ; i < 10 ; i++) {
            frequency += (radioBuffer[i] & 0xf) * mult;
            frequency += ((radioBuffer[i] >> 4) & 0xf) * mult * 10;
            mult *= 100;
          }
        timer = millis();
        state = 2;
        if (frequency != oldfrequency) {
          oldfrequency = frequency;
          Serial.print("Frequency = "); Serial.println(frequency);
          setBand(frequency);
          }
        }
        if ((radioBuffer[4] == 0x1c) && (radioBuffer[5] == 0x00)) 
          {
          ptt = radioBuffer[6];
          timer = millis();
          state = 0;
          if (ptt != oldptt) {
            oldptt = ptt;
            Serial.print("PTT = "); Serial.println(radioBuffer[6]);
            if (ptt == 1) {
              digitalWrite(LED_BUILTIN, HIGH);
            } else {
              digitalWrite(LED_BUILTIN, LOW);
            }
          }
        }
      }
    }
    else
    {
      radioBuffer[count++] = character;
    }
  }
  if (millis() - timer > 5000) {
    timer = millis();
    state = 0;
    }
  if (state == 0) {
    SerialNina.write(freqcmd, 6);
    timer = millis();
    state = 1;
    }
  if (state == 2) {
    SerialNina.write(pttcmd, 7);
    timer = millis();
    state = 3;
    }
}

@parallasse: in conformità al REGOLAMENTO , punto 7, cortesemente 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 TUTTA 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 all'intero del IDE). Per maggiori informazioni ... punto 17.2 del succitato regolamento. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di fare il tutto al più presto. :wink:

Gentilissimo Guglielmo grazie per i preziosi suggerimenti, cercherò di prestare più attenzione
Ho seguito le indicazioni, mi auguro di aver corretto nel modo ottimale il contenuto del post.

cordiali saluti

Alessandro Iannone

Emmm ... non so se ho capito la domanda ma, mooolto banalmente, se prendi uno qualsiasi dei tuoi multipli IF ...

...e, prima del return fai un ciclo in cui spegni tutti i LED e accendi solo quello corrispondente?

Non sarà molto "elegante", ma è molto semplice.

Guglielmo

Grazie per la risposta Guglielmo. La modifica consiste nell aggiungere l accensione di led legati alle singole condizioni if sulle porte d.
Quindi return digitalwrite(X, HIGH);
E poi proseguendo...

Guglielmo grazie al suo aiuto ci sono riuscito. Ha ragione non era complicato. Ora vorrei completare visualizzando su oled i2c 128x32 il risultato. Ho provato a creare variabili in void setup e poi ho cercato, prendendo copia incolla dai samples adafruit di far girare in void loop l'istruzione che mi visualizzasse il cambio di accensione led. Riesco solo a far apparire una scritta fissa...

... se crei variabili all'interno di una "funzione", e setup() e loop() SONO funzioni, esse sono visibili SOLO all'interno della funzione, quando esci vengono distrutte. Se ti serve una variabile che puoi usare sia in setup() che loop() la devi dichiarare al di fuori di dette funzioni.

Usa la stessa tecnica, ogni volta che cambi potenza tu salva in una variabile un valore diverso e nel loop() tu controlli, ad ogni giro, se il valore di detta variabile è uguale al suo valore precedente; se è uguale, vuol dire che non è cambiato nulla e non devi fare niente, se è diverso, devi salvare il nuovo valore come valore attuale (che, al prossimo giro, sarà il valore precedente) ed aggiornare il display con il nuovo messaggio.

Guglielmo

Grazie per la risposta. Quindi per visualizzare su display un testo in corrispondenza del led acceso devo creare delle altre variabili e altre condizioni if else come quelle utilizzate per accendere i led. Mi auguro di aver compreso che le variabili utilizzate per una funzione non possono essere utilizzate anche per la stampa sul display del testo...

... NO, devi capire il concetto di "variabili LOCALI" e "variabili GLOBALI".

Se tu dichiari una variabile in una funzione ... questa è LOCALE ed esiste solo quando la funzione viene eseguita, se la dichiari fuori da tutte le funzioni, questa è GLOBALE ed esiste e quindi è accessibile, sempre da tutte le funzioni.

Altra cosa, ti basta una variabile numerica che indica con 1, 2, 3, .. N, il valore di potenza che hai impostato (quando imposti il valore, metti anche il numero nella variabile), dopo di che verificando nel loop() se il valore precedente è diverso dal valore attuale (quindi se hai cambiato potenza, inutile aggiornare sempre il display se non ci sono cambiameni), vai a scrivere nel display il relativo messaggio.

Guglielmo

P.S.: altra cosa ... vatti a studiare anche la struttura switch .. case, che, in questi casi, è molto utile. :wink:

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