esp8266

Buonasera

Ho trovato questo progetto con un display oled 168x64 e un modulo esp8266.

Il codice è questo

#include <ESP8266WiFi.h>
#include <time.h>

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

#define OLED_RESET LED_BUILTIN  //4
Adafruit_SSD1306 display(OLED_RESET);

const char* ssid = "<your wifi ssid>";
const char* password = "<your wifi password>";

int ledPin = 13;

int timezone = 7 * 3600;
int dst = 0;

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



void setup() {

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  // Clear the buffer.
  display.clearDisplay();
  display.display();
  
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,LOW);

  Serial.begin(115200);

  display.setTextSize(1);
  display.setTextColor(WHITE);
  
  display.setCursor(0,0);
  display.println("Wifi connecting to ");
  display.println( ssid );

  WiFi.begin(ssid,password);
 
  display.println("\nConnecting");

  display.display();

  while( WiFi.status() != WL_CONNECTED ){
      delay(500);
      display.print("."); 
      display.display();       
  }

  // Clear the buffer.
  display.clearDisplay();
  display.display();
  display.setCursor(0,0);
  
  display.println("Wifi Connected!");
  display.print("IP:");
  display.println(WiFi.localIP() );

  display.display();

  configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
  display.println("\nWaiting for NTP...");

  while(!time(nullptr)){
     Serial.print("*");
     
     delay(1000);
  }
  display.println("\nTime response....OK"); 
  display.display();  
  delay(1000);

  display.clearDisplay();
  display.display();
}

void loop() {
  
  time_t now = time(nullptr);
  struct tm* p_tm = localtime(&now);
  int r = 35;
  // Now draw the clock face 
  
  display.drawCircle(display.width()/2, display.height()/2, 2, WHITE);
  //
  //hour ticks
  for( int z=0; z < 360;z= z + 30 ){
  //Begin at 0° and stop at 360°
    float angle = z ;
    
    angle=(angle/57.29577951) ; //Convert degrees to radians
    int x2=(64+(sin(angle)*r));
    int y2=(32-(cos(angle)*r));
    int x3=(64+(sin(angle)*(r-5)));
    int y3=(32-(cos(angle)*(r-5)));
    display.drawLine(x2,y2,x3,y3,WHITE);
  }
  // display second hand
  float angle = p_tm->tm_sec*6 ;
  angle=(angle/57.29577951) ; //Convert degrees to radians  
  int x3=(64+(sin(angle)*(r)));
  int y3=(32-(cos(angle)*(r)));
  display.drawLine(64,32,x3,y3,WHITE);
  //
  // display minute hand
  angle = p_tm->tm_min * 6 ;
  angle=(angle/57.29577951) ; //Convert degrees to radians  
  x3=(64+(sin(angle)*(r-3)));
  y3=(32-(cos(angle)*(r-3)));
  display.drawLine(64,32,x3,y3,WHITE);
  //
  // display hour hand
  angle = p_tm->tm_hour * 30 + int((p_tm->tm_min / 12) * 6 );
  angle=(angle/57.29577951) ; //Convert degrees to radians  
  x3=(64+(sin(angle)*(r-11)));
  y3=(32-(cos(angle)*(r-11)));
  display.drawLine(64,32,x3,y3,WHITE);

  display.setTextSize(1);
  display.setCursor((display.width()/2)+10,(display.height()/2) - 3);
  display.print(p_tm->tm_mday);
  
   // update display with all data
  display.display();
  delay(100);
  display.clearDisplay();

}

Quando lo carico mi dà questo errore:#error(Height incorrect,please fix Adafruit_SSD1306.h").

Preciso che dopo aver scaricato la libreria Adafruit community ho selezionato Generic Esp8266 Module.

Ho controllato lo sketch con Notepad per vedere cosa poter fare ma non ho trovato niente da riparare.

Ho provato a sostituire Adafruit con oled I2C ma le righe in rosa che mi segnalavano errori non finivano più!
A questo punto ho ceduto e ho deciso di chiedere aiuto.
Grazie

Te lo dice l'errore esattamente cosa DEVI fare ... devi andare a modificare il file Adafruit_SSD1306.h della libreria e definire quale altezza ha il tuo OLED (64 pixel).

Se apri il suddetto file, alle righe 28, 29 e 30 hai TRE #define di cui una sola deve essere senza commento ... devi mettere il commento a quella che attualmete NON lo ha (riga 29) e toglerlo a quella relativa al TUO OLED (riga 28) che, contrariamente a quanto scrivi, immagino sia 128x64.

Guglielmo

Buongiorno.
Grazie per la risposta.Il suo consiglio l’ho seguito già in un’altra occasione senza risultati.
Comunque ho aperto lo sketch con notepad e alle righe in oggetto è già presente l’eliminazione del commento per la riga 28.

// ONE of the following three lines must be #defined:
#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
//#define SSD1306_128_32   ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16  ///< DEPRECATED: old way to specify 96x16 screen

Forse oltre a ciò bisogna fare qualcosa d’altro?

Ho copiato,nel frattempo la riga 28 nello sketch e mi arriva questo messaggio: errore durante la compilazione per la scheda Generic esp8266 Module.

Allora … il messaggio di errore che vedi è generato da questa parte di codice nel TUO programma :

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

… ora, dato che nella libreria c’è chiaramente scritto, alle linee 98-101:

#if defined SSD1306_128_64
 #define SSD1306_LCDWIDTH  128 ///< DEPRECATED: width w/SSD1306_128_64 defined
 #define SSD1306_LCDHEIGHT  64 ///< DEPRECATED: height w/SSD1306_128_64 defined
#endif

… vedi bene che, se la modifica è fatta, è IMPOSSIBILE che “SSD1306_LCDHEIGHT != 64” dato che a tale valore lo mette la seconda #define.

Il mio sospetto che tu abbia più copie di questa libreria e stia modificando la copia sbagliata, ovvero NON quella che usa l’IDE … ::slight_smile:

Guglielmo

Ah … io sto sempre aspettando che tu sistemi QUESTO tuo post come ti ho indicato al post immediatamente succesivo.

Quindi, cortesemnte, prima di ogni altra cosa, vai a sistemare quel post nel rispetto del REGOLAMENTO e poi si prosegue. Grazie :slight_smile:

Guglielmo

Fatto.Me ne ero dimenticato! Controlla se va bene.

karafasta: Fatto.Me ne ero dimenticato! Controlla se va bene.

Perfetto ... ... tornando al problema, hai verificato di avere UNA sola copia della libreria ?

Guglielmo

allora nelle librerie trovo

Adafruit GFXLibrary

AdafruitSSD1306

AdafruitESP8266

<ce ne sono altre di Adafruit ma non credo abbiano gioco nello sketch che mi interessa tipo:
Adafruit ILI9341 o Adafruit Uniffied Sensor , LIquidCrystal, NeoPixel ecc. che metto solo per completezza d’informazione.

Allora …
… se questa #define, all’inizio del .h, non è commentata e quindi viene compilata:

#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen

… dato che nel .h ci sono le seguenti righe:

#if defined SSD1306_128_64
 #define SSD1306_LCDWIDTH  128 ///< DEPRECATED: width w/SSD1306_128_64 defined
 #define SSD1306_LCDHEIGHT  64 ///< DEPRECATED: height w/SSD1306_128_64 defined
#endif

… come fa a verificarsi questa cosa (da il messaggio di errore)? ? ?

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

… non lo capisco … ::slight_smile:

Guglielmo

Figurati se capisco io! :slight_smile:

L'unica idea che ho è che tu abbia modificato una "copia" della libreria che ... NON è quella che sta usando l'IDE ... ::)

Guglielmo

Per inciso, hai fatto anche quanto scritto nella descrizione della libreria per la compatibilità con ESP8266 in certe condizioni?

Se vai QUI e scorri verso il basso, trovi una tabella con le compatibilità/modifiche da fare ... ::)

Guglielmo

Controlla la libreria nella cartella ARDUINOxxx (non so che versione hai) ma controlla anche le librerie nella cartella SKETCHBOOK e poi LIBRARIES perché le librerie sono li.

Ho controllato le librerie e non trovo mi sembra tutto a posto. Per quanto riguarda GitHub avrei trovato questo: Compatibility

ESP8266 X Change OLED_RESET to different pin if using default I2C pins D4/D5.

Altro non so fare.Ho raggiunto il mio "livello di incompetenza".

Non voglio portarvi via altro tempo per cui forse è meglio finirla qui.

Grazie

karafasta: Ho controllato le librerie e non trovo mi sembra tutto a posto. ...

Non ti far prendere dallo sconforto, succede :)

Quindi tu mi stai dicendo che NON hai una doppia cartella libraries? "Mi sembra tutto a posto" implicha che E' tutto a posto e hai trovato una sola cartella libraries o non sai come o dove cercare? Fai anche una altra prova per vedere se quella libreria è quella che stai effettivamente usando e non è una copia: click destro sopra il nome e RENAME e gli aggiungi, per esempio, X al nome. In questo modo il programma non dovrebbe più vederla e ti darà errore. Ma se continua a vederla è la conferma che non è quella la libreria che andava modificata come ti diceva Guglielmo.

Allora vista la tua disponibilità proviamo ancora.Sarà dura!

Sono andato su Documenti->Arduino->Libraries:

Adafruit_GFX_Library Adafruit_SDD_1306-master Adafruit_ESP8266 sono queste che ci interessano,no? Le ho tutte rinominate con una x e cliccando si sono aperte.

E adesso? p.s. ho visto che tra le librerie manca ESP8266Wifi.h

se si sono aperte da IDE e non dal disco, significa che non sono quelle.

Vai su una cartella che si chiama sketchbook, dove hai tutti i programmi di arduino, e anche li c'è una cartella LIBRARIES

Mi sembra che si siano aperte dal disco perchè quando ci clicco sopra non compare l'ide di arduino e comunque non trovo lo sketchbox. :confused:

Ma guarda mi dispiace darti tanto disturbo non ce la faremo mai!

Non devi fare così. Adesso che le hai rinominate entri nel programma arduino e provi ad inserire di nuovo una di quelle librerie... Se te lo fa, non erano quelle

karafasta: Mi sembra che si siano aperte dal disco perchè quando ci clicco sopra non compare l'ide di arduino e comunque non trovo lo sketchbox. :confused:

La cartella sketchbook DEVE esserci altrimenti non puoi lavorare con il programma di Arduino. Cercala e vedrai che c'è