Calcolo anticipo motore

Salve a tutti, è da un po’ che non frequento questo forum e sono un po’ arrugginito con la programmazione :sweat_smile: insomma, ho trovato un progettino che mi piacerebbe costruire ma, non riesco a capire dove sbaglio, quando vado a compilare il software mi restituisce degli errori! Il codice non è mio, è preso da questo link

Mi aiutate a capire cosa c’è di sbagliato o dove sbaglio?

Grazieeee

Buonasera, Daniele
Benvenuto nella sezione Italiana del forum :slight_smile:

Cortesemente, leggi attentamente il REGOLAMENTO di detta sezione:
[REGOLAMENTO] Come usare questa sezione del forum
(... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15)
e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione IN CODA ALL'APPOSITA DISCUSSIONE:
Presentazioni nuovi iscritti: fatevi conoscere da tutti! (Part 2)
spiegando bene quali esperienze hai in elettronica e in programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie
Gianluca

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento, nessuno ti risponderà (eventuali risposte, o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

Inoltre, pubblica qui il programma (usando il <CODE>!), in maniera che sia visibile senza doverlo scaricare da lì, e fonisci informazioni sulla scheda che stai usando e sui collegamenti che hai fatto.

1 Like

Buongiorno, sono iscritto a questo forum da molto tempo, davo per scontato di essermi già presentato in passato, ma forse non era così, adesso l'ho fatto :slight_smile:

Per il codice, eccolo qui di seguito:

#include <EEPROM.h>
#include <ESP8266WiFi.h>
//#include "SSD1306Wire.h"  //for 0.96" SSD1306 OLED display
#include <SH1106Wire.h>  //for 1.3" SH1106 OLED display
#include "GyverButton.h"
#include "GyverFilters.h"

GFilterRA testFilterRA;

GButton butt1(D7);

//SSD1306Wire  display(0x3c, D2, D1);  //D2=SDA  D1=SCL
SH1106Wire display(0x3c, D2, D1);  //D2=SDA  D1=SCL

int pickup_advance = 60;  //degrees BTDC when pickup generates pulse
unsigned long starttime = 0;
bool saved = false;

int sparkpin = D5;
int advance = 0;
int advance_a = 0;
int advance2 = 0;
int advance3 = 0;
int counter_advance = 0;
volatile bool advance_updated = false;
volatile bool spark = false;
volatile unsigned long duration_advance = 1;

int ledpin = D8;

int rpmpin = D6;
int rpm = 1;
int rpm1 = 1;
int rpm2 = 1;
float rpmai = 1;
unsigned long last_update_rpm = 0;
unsigned long last_show_rpm = 0;
unsigned long duration_rpmTmp = 0;
unsigned long last_rpmTmp = 0;
volatile unsigned long duration_rpm = 0;
volatile unsigned long last_rpm = 0;
bool rpmflag = true;
bool rpmupdated = false;

const int numReadings = 4;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;

void setup() {

  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin();
  delay(300);

  Serial.begin(115200);

  testFilterRA.setCoef(0.5);

  display.init();
  display.flipScreenVertically();
  display.setFont(Dialog_bold_42);
  display.drawString(0, 0, "Hello");
  display.display();
  delay(2000);

  pinMode(rpmpin, INPUT);
  pinMode(sparkpin, INPUT);
  pinMode(ledpin, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(rpmpin), rpm_counter, RISING);
  attachInterrupt(digitalPinToInterrupt(sparkpin), advance_counter, RISING);

  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }

  EEPROM.begin(10);
  EEPROM.get(3, pickup_advance);
  EEPROM.end();

  if (pickup_advance > 359) {
    pickup_advance = 60;
  }

  starttime = millis();
}

void loop() {

  if (!saved) {
    if ((millis() - starttime) > 60000) {
      EEPROM.begin(10);
      EEPROM.put(3, pickup_advance);
      EEPROM.commit();
      saved = true;
    }
  }

  butt1.tick();

  if (butt1.isClick()) {
    pickup_advance++;
    saved = false;
    starttime = millis();
  }

  if (butt1.isStep()) {
    pickup_advance--;
    saved = false;
    starttime = millis();
  }

  if (pickup_advance > 359) {
    pickup_advance = 0;
  }

  if (pickup_advance < 0) {
    pickup_advance = 0;
  }


  if (spark) {
    //digitalWrite(ledpin,HIGH);
    delayMicroseconds(120);
    digitalWrite(ledpin, LOW);
    spark = false;
  }

  if ((millis() - last_update_rpm) > 700) {
    rpmflag = true;
  }




  if (rpmupdated) {

    noInterrupts();
    rpmupdated = false;
    duration_rpmTmp = duration_rpm;
    last_rpmTmp = last_rpm;
    interrupts();

    rpmai = 60000000 / duration_rpmTmp;
    rpm = round(rpmai);

    total = total - readings[readIndex];
    readings[readIndex] = rpm;
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    if (readIndex >= numReadings) {
      readIndex = 0;
    }
  }

  rpm = total / numReadings;

  rpm = testFilterRA.filtered(float(rpm));

  advance = pickup_advance - ((duration_advance * 360) / duration_rpmTmp);


  if (((advance_a - 5) < advance) && (advance < (advance_a + 5))) {
    advance_a = advance;
    advance3 = advance3 + advance;
    counter_advance = counter_advance + 1;
  } else {
    advance_a = advance;
  }

  last_update_rpm = millis();
}

if ((millis() - last_show_rpm) > 300)  //refresh rate

  rpm2 = ((rpm + 5) / 10) * 10;


if (counter_advance > 0) {
  advance2 = advance3 / counter_advance;
  counter_advance = 0;
  advance3 = 0;
}

if (rpmflag) {
  rpm2 = 0;
  advance = 0;
  rpmflag = false;
}

String rpm1 = String(rpm2);
String advance1 = String(advance2);
String pickup_advance1 = String(pickup_advance);

Serial.print(rpm);
Serial.print(",");
Serial.print(rpm1);
Serial.print(",");
Serial.println(advance1);


display.clear();
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.setFont(DSEG7_Classic_Mini_Bold_40);
display.drawString(128, 0, advance1);
display.setFont(ArialMT_Plain_10);
display.drawRect(0, 0, 128, 64);
display.drawString(60, 2, "Advance");
display.drawHorizontalLine(0, 15, 60);
display.drawVerticalLine(60, 15, 37);
display.drawString(60, 16, "PickupBTDC");
display.drawHorizontalLine(0, 52, 61);
display.drawHorizontalLine(60, 46, 68);
display.drawString(60, 52, "RPM");
display.setFont(Open_Sans_SemiBold_20);
display.drawString(48, 26, "°");
display.drawString(126, 40, rpm1);
display.drawString(40, 26, pickup_advance1);
display.display();


last_show_rpm = millis();
}


yield();
}

ICACHE_RAM_ATTR void advance_counter() {
  if (!advance_updated) {
    duration_advance = micros() - last_rpm;
    advance_updated = true;
    digitalWrite(ledpin, HIGH);
    spark = true;
  }
}


ICACHE_RAM_ATTR void rpm_counter()  //ISR for RPM
{
  if ((micros() - last_rpm) > 5900)  //debounce signal. Take MAX RPM of engine and calculate time in micro seconds for full revolution:
  {                                  //   60 000 000/(max_RPM+couple_hundred_for_error)  ->  60 000 000 / (10 000 + 200) = 5882 -> rounded it to 5900
    duration_rpm = micros() - last_rpm;
    last_rpm = micros();
    rpmupdated = true;
    advance_updated = false;
  }
}

Sperano che qualcuno possa aiutarmi a risolvere :slight_smile:

Hai installato le librerie che sono incluse nello sketch?

Nell'IDE usa CTRL+T, ti indenta il codice secondo le graffe che hai messo.
Le graffe nel tuo codice sembrano messa a casaccio. Molta roba fuori dalla loop

Da riga 163 a riga 167 le graffe sembrano sballate (già sull'originale del post#1).

Ciao, grazie della risposta. Si, ho installato tutte le librerie necessarie, il problema non sono loro, ma credo la scrittura del codice in generale.

Ecco, forse questo mi aiuta, non sapevo della possibilità di fare la revisione delle graffe con CTRL+T.
Gli errori infatti si presentano proprio nelle ultime righe.

Dopo faccio un controllo, grazie.

Copia, comunque, il programma indentato con CTRL+T nel post #3, sostituendolo a quello presente.

Ciao, ho modificato il codice, incollando quello indentato, nel post #3

Spiacente, ma quel codice originale, anche indentandolo è pieno di errori.
Per me è difficile se non impossibile capire dove dovrebbero essere chiuse le graffe.
Di sicuro sono chiuse in maniera errata, ma capire dove dovevano essere aperte/chiuse veramente solo l'autore di quel codice lo sa. Siccome gli funzionava di sicuro ha il codice corretto, ma ha pubblicato un codice errato.

@danieleorrico: come ti ha indicato nid69ita, c'è qualche parentesi di troppo/messa male che chiude il loop() prima del tempo e lascia fuori pezzi di codice che non si sa bene dove vadano.

Dove hai preso quel codice? Hai un link?

Guglielmo

Guglielmo, il codice è su github, nel primo post c'e' il link.

effettivamente ci sto sbattendo la testa non poco, ma non trovo soluzione...sembra che alcune parentesi manchino. Ha aggiunto anche un file già compilato, credo funzionante, non ho provato... che peccato, è un programma così bello che soddisferebbe bene il mio bisogno

questi gli errori che mi restituisce in fase di compilazione:

src\main.cpp: In function 'void setup()':
src\main.cpp:72:50: error: 'rpm_counter' was not declared in this scope
   72 |   attachInterrupt(digitalPinToInterrupt(rpmpin), rpm_counter, RISING);
      |                                                  ^~~~~~~~~~~
src\main.cpp:73:52: error: 'advance_counter' was not declared in this scope; did you mean 'advance_updated'?
   73 |   attachInterrupt(digitalPinToInterrupt(sparkpin), advance_counter, RISING);
      |                                                    ^~~~~~~~~~~~~~~
      |                                                    advance_updated

Chiaramente manca una parentesi e quindi il tutto da errori ...
... prova questa versione che ho corretto andando ... a intuito :grin::

#include <EEPROM.h>
#include <ESP8266WiFi.h>
//#include "SSD1306Wire.h"  //for 0.96" SSD1306 OLED display
#include <SH1106Wire.h>     //for 1.3" SH1106 OLED display
#include "GyverButton.h"
#include "GyverFilters.h"

GFilterRA testFilterRA;

GButton butt1 ( D7 );

//SSD1306Wire  display(0x3c, D2, D1);  //D2=SDA  D1=SCL
SH1106Wire  display ( 0x3c, D2, D1 ); //D2=SDA  D1=SCL

int pickup_advance = 60; //degrees BTDC when pickup generates pulse
unsigned long starttime = 0;
bool saved = false;

int sparkpin = D5;
int advance = 0;
int advance_a = 0;
int advance2 = 0;
int advance3 = 0;
int counter_advance = 0;
volatile bool advance_updated = false;
volatile bool spark = false;
volatile unsigned long duration_advance = 1;

int ledpin = D8;

int rpmpin = D6;
int rpm = 1;
int rpm1 = 1;
int rpm2 = 1;
float rpmai = 1;
unsigned long last_update_rpm = 0;
unsigned long last_show_rpm = 0;
unsigned long duration_rpmTmp = 0;
unsigned long last_rpmTmp = 0;
volatile unsigned long duration_rpm = 0;
volatile unsigned long last_rpm = 0;
bool rpmflag = true;
bool rpmupdated = false;

const int numReadings = 4;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;

void setup()   {

   WiFi.mode ( WIFI_OFF );
   WiFi.forceSleepBegin();
   delay ( 300 );

   Serial.begin ( 115200 );

   testFilterRA.setCoef ( 0.5 );

   display.init();
   display.flipScreenVertically();
   display.setFont ( Dialog_bold_42 );
   display.drawString ( 0, 0, "Hello" );
   display.display();
   delay ( 2000 );

   pinMode ( rpmpin, INPUT );
   pinMode ( sparkpin, INPUT );
   pinMode ( ledpin, OUTPUT );

   attachInterrupt ( digitalPinToInterrupt ( rpmpin ), rpm_counter, RISING );
   attachInterrupt ( digitalPinToInterrupt ( sparkpin ), advance_counter, RISING );

   for ( int thisReading = 0; thisReading < numReadings; thisReading++ ) {
      readings[thisReading] = 0;
   }

   EEPROM.begin ( 10 );
   EEPROM.get ( 3, pickup_advance );
   EEPROM.end();

   if ( pickup_advance > 359 ) {
      pickup_advance = 60;
   }

   starttime = millis();

}

void loop() {

   if ( !saved ) {
      if ( ( millis() - starttime ) > 60000 ) {
         EEPROM.begin ( 10 );
         EEPROM.put ( 3, pickup_advance );
         EEPROM.commit();
         saved = true;
      }
   }

   butt1.tick();

   if ( butt1.isClick() ) {
      pickup_advance++;
      saved = false;
      starttime = millis();
   }

   if ( butt1.isStep() ) {
      pickup_advance--;
      saved = false;
      starttime = millis();
   }

   if ( pickup_advance > 359 ) {
      pickup_advance = 0;
   }

   if ( pickup_advance < 0 ) {
      pickup_advance = 0;
   }

   if ( spark ) {
      //digitalWrite(ledpin,HIGH);
      delayMicroseconds ( 120 );
      digitalWrite ( ledpin, LOW );
      spark = false;
   }

   if ( ( millis() - last_update_rpm ) > 700 ) {
      rpmflag = true;


      if ( rpmupdated ) {

         noInterrupts();
         rpmupdated = false;
         duration_rpmTmp = duration_rpm;
         last_rpmTmp = last_rpm;
         interrupts();

         rpmai = 60000000 / duration_rpmTmp;
         rpm = round ( rpmai );

         total = total - readings[readIndex];
         readings[readIndex] = rpm;
         total = total + readings[readIndex];
         readIndex = readIndex + 1;
         if ( readIndex >= numReadings ) {
            readIndex = 0;
         }
      }

      rpm = total / numReadings;

      rpm = testFilterRA.filtered ( float ( rpm ) );

      advance = pickup_advance - ( ( duration_advance * 360 ) / duration_rpmTmp );


      if ( ( ( advance_a - 5 ) < advance ) && ( advance < ( advance_a + 5 ) ) ) {
         advance_a = advance;
         advance3 = advance3 + advance;
         counter_advance = counter_advance + 1;
      } else {
         advance_a = advance;
      }

      last_update_rpm = millis();

   }

   if ( ( millis() - last_show_rpm ) > 300 ) { //refresh rate

      rpm2 = ( ( rpm + 5 ) / 10 ) * 10;


      if ( counter_advance > 0 ) {
         advance2 = advance3 / counter_advance;
         counter_advance = 0;
         advance3 = 0;
      }

      if ( rpmflag ) {
         rpm2 = 0;
         advance = 0;
         rpmflag = false;
      }

      String rpm1 = String ( rpm2 );
      String advance1 = String ( advance2 );
      String pickup_advance1 = String ( pickup_advance );

      Serial.print ( rpm );
      Serial.print ( "," );
      Serial.print ( rpm1 );
      Serial.print ( "," );
      Serial.println ( advance1 );


      display.clear();
      display.setTextAlignment ( TEXT_ALIGN_RIGHT );
      display.setFont ( DSEG7_Classic_Mini_Bold_40 );
      display.drawString ( 128, 0, advance1 );
      display.setFont ( ArialMT_Plain_10 );
      display.drawRect ( 0, 0, 128, 64 );
      display.drawString ( 60, 2, "Advance" );
      display.drawHorizontalLine ( 0, 15, 60 );
      display.drawVerticalLine ( 60, 15, 37 );
      display.drawString ( 60, 16, "PickupBTDC" );
      display.drawHorizontalLine ( 0, 52, 61 );
      display.drawHorizontalLine ( 60, 46, 68 );
      display.drawString ( 60, 52, "RPM" );
      display.setFont ( Open_Sans_SemiBold_20 );
      display.drawString ( 48, 26, "°" );
      display.drawString ( 126, 40, rpm1 );
      display.drawString ( 40, 26, pickup_advance1 );
      display.display();

      last_show_rpm = millis();
   }
   yield();
}

ICACHE_RAM_ATTR void advance_counter() {
   if ( !advance_updated ) {
      duration_advance = micros() - last_rpm;
      advance_updated = true;
      digitalWrite ( ledpin, HIGH );
      spark = true;
   }
}


ICACHE_RAM_ATTR void rpm_counter() { //ISR for RPM
   if ( ( micros() - last_rpm ) > 5900 ) { //debounce signal. Take MAX RPM of engine and calculate time in micro seconds for full revolution:
      //   60 000 000/(max_RPM+couple_hundred_for_error)  ->  60 000 000 / (10 000 + 200) = 5882 -> rounded it to 5900
      duration_rpm = micros() - last_rpm;
      last_rpm = micros();
      rpmupdated = true;
      advance_updated = false;
   }
}

Guglielmo

1 Like

giusto per cornaca, ho provato a riformattare lo sketch come segue...magari ho sbagliato...magari no :stuck_out_tongue:

#include <EEPROM.h>
#include <ESP8266WiFi.h>
//#include "SSD1306Wire.h"  //for 0.96" SSD1306 OLED display
#include <SH1106Wire.h>     //for 1.3" SH1106 OLED display
#include "GyverButton.h"
#include "GyverFilters.h"

GFilterRA testFilterRA;

GButton butt1(D7);

//SSD1306Wire  display(0x3c, D2, D1);  //D2=SDA  D1=SCL
SH1106Wire  display(0x3c, D2, D1);  //D2=SDA  D1=SCL

int pickup_advance = 60; //degrees BTDC when pickup generates pulse
unsigned long starttime= 0;
bool saved = false;

int sparkpin = D5;
int advance=0;
int advance_a=0;
int advance2=0;
int advance3=0;
int counter_advance=0;
volatile bool advance_updated = false;
volatile bool spark = false;
volatile unsigned long duration_advance=1;

int ledpin = D8;

int rpmpin = D6;
int rpm = 1;
int rpm1 = 1;
int rpm2 = 1;
float rpmai = 1;
unsigned long last_update_rpm=0;
unsigned long last_show_rpm=0;
unsigned long duration_rpmTmp=0;
unsigned long last_rpmTmp=0;
volatile unsigned long duration_rpm=0;
volatile unsigned long last_rpm=0;
bool rpmflag=true;
bool rpmupdated=false;

const int numReadings = 4;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;

void setup() {   

  WiFi.mode( WIFI_OFF );
  WiFi.forceSleepBegin();
  delay(300);
  
  Serial.begin(115200);

  testFilterRA.setCoef(0.5);

  display.init();
  display.flipScreenVertically();  
  display.setFont(Dialog_bold_42); 
  display.drawString(0, 0, "Hello");
  display.display(); 
  delay(2000);  

  pinMode(rpmpin,INPUT);
  pinMode(sparkpin,INPUT);
  pinMode(ledpin,OUTPUT);

  attachInterrupt(digitalPinToInterrupt(rpmpin), rpm_counter, RISING); 
  attachInterrupt(digitalPinToInterrupt(sparkpin), advance_counter, RISING);
  
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }

  EEPROM.begin(10);
  EEPROM.get(3,pickup_advance);  
  EEPROM.end(); 

  if (pickup_advance > 359) {
    pickup_advance = 60;
  }

  starttime = millis();

}

void loop() {
  if (!saved) {  
    if ((millis() - starttime) > 60000) {
      EEPROM.begin(10);
      EEPROM.put(3, pickup_advance);  
      EEPROM.commit();
      saved = true;
    }
  }

  butt1.tick(); 

  if (butt1.isClick()) {
    pickup_advance++;
    saved = false;
    starttime = millis();
  }

  if (butt1.isStep()) {
    pickup_advance--;
    saved = false;
    starttime = millis();    
  }

  if (pickup_advance > 359) {
    pickup_advance = 0;
  }
  
  if (pickup_advance < 0) {
    pickup_advance = 0;
  }

  if (spark) {
    //digitalWrite(ledpin,HIGH);
    delayMicroseconds(120);
    digitalWrite(ledpin, LOW);
    spark = false;
  }

  if ((millis() - last_update_rpm) > 700) {
    rpmflag = true;
  }

  if (rpmupdated) {
    noInterrupts();
    rpmupdated = false;
    duration_rpmTmp = duration_rpm;
    last_rpmTmp = last_rpm;
    interrupts();
    
    rpmai = 60000000/duration_rpmTmp;
    rpm = round(rpmai);
    
    total = total - readings[readIndex];
    readings[readIndex] = rpm;
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    
    if (readIndex >= numReadings) {
      readIndex = 0;
    }
  }

  rpm = total / numReadings;
  rpm = testFilterRA.filtered(float(rpm));
  advance = pickup_advance - ((duration_advance * 360) / duration_rpmTmp);
  
  if (((advance_a - 5) < advance) && (advance < (advance_a + 5))) {
    advance_a = advance;
    advance3 = advance3 + advance;
    counter_advance = counter_advance + 1;
  } else {
    advance_a = advance;
  }  

  last_update_rpm = millis();
  
  if ((millis() - last_show_rpm) > 300) {  //refresh rate
    rpm2 = ((rpm + 5) / 10) * 10;
  }

  if (counter_advance > 0) {   
    advance2 = advance3 / counter_advance;
    counter_advance = 0;
    advance3 = 0;
  }
  
  if (rpmflag) {
    rpm2 = 0;
    advance = 0;
    rpmflag = false;
  }

  String rpm1_str = String(rpm2);
  String advance1_str = String(advance2);
  String pickup_advance1_str = String(pickup_advance);
   
  Serial.print(rpm);
  Serial.print(",");
  Serial.print(rpm1_str);
  Serial.print(",");
  Serial.println(advance1_str);

  display.clear();
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.setFont(DSEG7_Classic_Mini_Bold_40);    
  display.drawString(128, 0, advance1_str);
  display.setFont(ArialMT_Plain_10);
  display.drawRect(0, 0, 128, 64);
  display.drawString(60, 2, "Advance");
  display.drawHorizontalLine(0, 15, 60);    
  display.drawVerticalLine(60, 15, 37);
  display.drawString(60, 16, "PickupBTDC");   
  display.drawHorizontalLine(0, 52, 61); 
  display.drawHorizontalLine(60, 46, 68); 
  display.drawString(60, 52, "RPM");
  display.setFont(Open_Sans_SemiBold_20);
  display.drawString(48, 26, "°");
  display.drawString(126, 40, rpm1_str);
  display.drawString(40, 26, pickup_advance1_str);   
  display.display();

  last_show_rpm = millis();
}

void advance_counter() {
  if (!advance_updated) {
    duration_advance = micros() - last_rpm;
    advance_updated = true;
    digitalWrite(ledpin, HIGH);
    spark = true;
  }
}

void rpm_counter() {
  if ((micros() - last_rpm) > 5900) {   //debounce signal. Take MAX RPM of engine and calculate time in micro seconds for full revolution: 
    //   60 000 000/(max_RPM+couple_hundred_for_error)  ->  60 000 000 / (10 000 + 200) = 5882 -> rounded it to 5900
    duration_rpm = micros() - last_rpm;
    last_rpm = micros();
    rpmupdated = true;
    advance_updated = false;
  }
}

comunque mi restituisce gli errori del post #14

Prova con quell che ti ho messo io e riporta gli errori ...

Guglielmo

potrebbe andare bene. Al momento non so che libreria caricare per le seguenti linee (che ho tenuto commentate durante le prove per concentrarmi sugli errori di sintassi)

display.setFont ( DSEG7_Classic_Mini_Bold_40 )
display.setFont ( Dialog_bold_42 )

Scusa, ma le libreria grafiche le hai all'inizio, o commenti una (attualmente è commantata la SSD1306Wire) o commenti l'altra (SH1106Wire.h che è in uso) ... e questo dipende da che display OLED hai ... :roll_eyes:

Guglielmo

Ciao @gpb01 ho utilizzato la tua versione (molto più pulita e indendata) ma con le linee che avevo citato nel mio post #18 e durante la compilazione non da errori.
Domani provo a flasharlo su un Wemos D1 mini e vediamo che succede. Grazie intanto :slight_smile: