Passare variabile a funzione e stamparla su display OLED

Ciao a tutti! Ho acquistato un display OLED clone della Adafruit.

Funziona bene, tuttavia ho un paio di domande:

  1. Che voi sappiate, è possibile scrivere una sola riga (quindi aggiornarne una sola, lasciando il resto del display invariato) come si fa per gli LCD? A me è sembrato di no, e di dover “pulire” tutto il display e riscriverlo.

  2. Il mio problema è questo:
    A. Leggo il valore di un potenziometro (mi serve per regolare la luminosità di un LED)
    B. L’analogread viene inserito in una variabile, chiamata per comodità PWM
    C. Leggo la variabile e la uso per stabilire la luminosità del LED
    D. La variabile numerica, portata da 0-1023 a 0-100, deve essere stampata sul display OLED

Ora, il problema fondamentale è questo: per evitare di scrivere un numero enorme di linee di codice, appesantendo inutilmente il programma, volevo fare una funzione schermata a cui passo la variabile pwm e lui me la stampa sul display. Non ci sono riuscito. Come devo fare? Vi allego il codice…

Grazie a tutti! Ciao!! :slight_smile:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// If using software SPI (the default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

  int pinpot = 0;
  int pinled = 8;
  int valpot = 0;
  int valled = 0; 

void setup()   {
               
  Serial.begin(9600);
  pinMode(pinled, OUTPUT);
  digitalWrite(pinled, LOW);
  
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)

  display.begin(SSD1306_SWITCHCAPVCC);
  // init done
  
  // Show image buffer on the display hardware.
  // Since the buffer is intialized with an Adafruit splashscreen
  // internally, this will display the splashscreen.
  display.display();
  delay(2000);

  // Clear the buffer.
  display.clearDisplay();

  // text display tests
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("Prova LED");
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,30);
  display.print("Loading...");
  display.display();
  delay(2000);

  
  // Clear the buffer.
  display.clearDisplay();
  delay(2000);
  // text display tests
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("Prova LED");
  display.setTextSize(2);
  display.setCursor(30,20);
  display.setTextColor(WHITE);
  display.print("Ready");
  display.setCursor(0,46);
  display.setTextColor(WHITE);
  display.print("Pulse:   0");
  display.display();
  delay(2000);
}

void loop()
{
  valpot = analogRead(pinpot);
  int pwm = 0;
  if (valpot >= 0 && valpot <= 255) pwm = 25;
  else if (valpot >= 256 && valpot <= 512) pwm = 50;
  else if (valpot >= 513 && valpot <= 768) pwm = 75;
  else if (valpot >= 769 && valpot <= 1023) pwm = 100;
}

void schermata(int (pwm[]))
{
  display.clearDisplay();
  // text display tests
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Prova LED");
  display.setTextSize(2);
  display.setCursor(30,20);
  display.setTextColor(WHITE);
  display.print("Ready");
  display.setCursor(0,46);
  display.setTextColor(WHITE);
  display.println("Pulse: ");
  display.println(); //qui dovrebbe andare la PWM
  display.display();
}

cacelli solo la posizione dello schermo voluta e ci ridisegnò il testo.

Ciao Vbextreme e grazie per la risposta!

Ho cercato su adafruit ma non ho trovato nessun esempio su come cancellare solo una porzione di display… inoltre, come passare la variabile PWM alla funzione? Googlando non ho trovato nulla, forse per errate keywords…

Risolto il problema dell’aggiornamento display:

Ho disegnato un rettangolo nero per cancellare solo quella porzione, quindi ho riscritto il testo.

  // Cancella il display e scrive la PWM
  display.fillRect(80, 46, 42, 14, BLACK);
  display.setCursor(84, 46);
  display.print(" 90");
  display.display();
  delay(500);

Lo lascio a futuro riferimento.

La sintassi di display.fillRect è la seguente:

display.fillRect(X, Y, LUNGHEZZA, ALTEZZA, COLORE)

ovviamente COLORE è BLACK o WHITE, essendo il display monocromatico.

La domanda resta: come si passa la variabile ad una funzione?
Ovvero: creo questo aggiornamento come un “void” e a questo “void” voglio passare una variabile che deve essere aggiornata sul display, al posto del " 90"

Grazie! :slight_smile:

per la funzione, innanzitutto credo che la dichiarazione del parametro sia sbagliata.
se usi pwm indichi un array. inoltre ci sono delle parentesi che non servono.
è sufficiente

void schermata(int pwm)

dentro alla funzione chiami semplicemente

display.println(pwm);

dimenticavo...
per chiamare la funzione scrivi:

schermata(pwm);

Grazie per le dritte, fratt!

Alla fine ho risolto in modo diverso, ma comunque capire come passare le variabili a una funzione mi è servito molto!! Mi ci stavo barcamenando da un pò… ecco il codice che ho creato:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// If using software SPI (the default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

  int pinpot = 2;
  int pinled = 8;
  
  int valpot = 0;
  int valled = 0; 

void setup()   {
               
  Serial.begin(9600);
  pinMode(pinled, OUTPUT);
  digitalWrite(pinled, LOW);
  
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC);
  // init done
  
  // Show image buffer on the display hardware.
  // Since the buffer is intialized with an Adafruit splashscreen
  // internally, this will display the splashscreen.
  display.display();
  delay(2000);

  // Clear the buffer.
  display.clearDisplay();

  // text display tests
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("LED");
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,30);
  display.print("Loading...");
  display.display();
  delay(2000);

  
  // Clear the buffer.
  display.clearDisplay();
  delay(2000);
  // text display tests
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("LED");
  display.setTextSize(2);
  display.setCursor(30,20);
  display.setTextColor(WHITE);
  display.print("Ready");
  display.display();
  delay(2000);
  display.clearDisplay();
  // text display tests
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("LED");
  display.setTextSize(2);
  display.setCursor(30,20);
  display.setTextColor(WHITE);
  display.print("Ready");
  display.setCursor(0,46);
  display.setTextColor(WHITE);
  display.println("Pulse:");
  display.display();
}

void loop()
{
  valpot = analogRead(pinpot);
  int pwm = 0;
  int valore = 0;
  
  valore = valpot / 10;
  valore1 = valore / 1.02;
  
  valled = valpot / 4;
  analogWrite(pinled, valled);
  
  // Cancella il display e scrive il valore analogico in percentuale 0-100
  display.fillRect(80, 46, 42, 14, BLACK);
  display.setCursor(84, 46);
  display.print(valore1);
  display.display();
}

…spero sia tutto ok, non mi dà errori in compilazione: domani mattina lo provo!

non c'è di che, con tutte le volte che gli altri hanno dato una mano a me... per una volta ho ricambiato.