Display Oled SH1106 con Artefatti

Hai provato a compilare usando le altre opzioni disponibili per il controller SH1106.

Chiaramente sempre quelle con i2c hardware che sono da preferire se si ha disponibilità del bus in questione.

queste sono le possibilità date sul mio modello

//U8G2_SH1106_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=/ 10, / dc=/ 9, / reset=*/ 8);

//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

//U8G2_SH1106_128X64_VCOMH0_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=/ 10, / dc=/ 9, / reset=*/ 8); // same as the NONAME variant, but maximizes setContrast() range

//U8G2_SH1106_128X64_WINSTAR_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=/ 10, / dc=/ 9, / reset=*/ 8); // same as the NONAME variant, but uses updated SH1106 init sequence

io ho iusato come da doc questa
//U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

Nel frattempo mi han risposto con un generico: deve andare sia a 3.3 che a 5 come da foto

vediamo col cavo che mi arriva domani

Nel frattempo approfitto per ringraziare tutti per il supporto

Il famoso cavo è arrivato ma collegandolo banalmente e lanciando uno degli esempi non alimenta nemmeno il display, usandolo nel mio sketch pare bloccare i modulino thermo e led che prima andavano. Ho ricontrollato il collegamento e mi pare corretto, forse necessito di modificare lo sketch....o di gettare la spugna :slight_smile:

Non c'è dubbio, stai sbagliando i collegamenti o l'inizializzazione del I2C ...
... ho una R4 WiFi che uso con FreeRTOS™ e sul connettore STEMMA-QT c'è attaccato un BME280, un RTC DS3231 ed un display OLED SSD1306 e tutto funziona correttamente.

Guglielmo

I colori dei cavetti STEMMA-QT sono standardizzati e sono:

  • Nero: GND
  • Rosso: Vcc (nel caso della R4 WiFi 3.3V)
  • Giallo: SCL
  • Blu : SDA

Verifica ...

Guglielmo

Confermo di aver collegato correttamente in questo caso. avevo seguito questo schema:

I vari oggetti sono vanno collegati in parallelo ovvero, tutti e 4 i pin debbono raggiungere tutti i devices collegati al bus I2C ... i collegamenti debbono essere i più corti possibili.

Ti assicuro che FUNZIONA (ti ho detto quello che ci collego io), quindi ... o il problema è nei collegamenti o nel software (metti il codice che stai usando racchiuso nei tag CODE).

Ti ricordo che quello sul connettore STEMMA-QT è il bus I2C Wire1 e NON Wire.

Guglielmo

Ah ... con riferimento all'immagine di sopra, le Rp è sufficiente che siano su un solo device (sono le resistenze di pull-up, obbligatorie per il bus I2 e vanno collegate al Vcc).

Se tu hai già dei devices I2C che funzionano su quel connettore, sicuramente montano già le resistenze di pull-up. :slight_smile:

Nel caso della R4 WiFi, ovviamente, la Vcc su quel connettore è 3.3V e TUTTO ciò che è li collegato, va alimentato a 3.3V (utilizzando quelli che il connettore fornisce).

Guglielmo

posto questo ma premetto che mi volevo prima provare semplicemente la comunicazione con un 'hello world' o simili. (stavo pasticciando con la wire1 ho incollato nel mentre)

// Test Modulino Temp + Matrice led + schermo Oled
#include "ArduinoGraphics.h"
#include <Arduino.h>
#include <Modulino.h>
#include "Arduino_LED_Matrix.h"
#include <U8g2lib.h>
#include <Wire.h>
#define time_delay 100
#define WIRE Wire1

ArduinoLEDMatrix matrix;
ModulinoThermo thermo;
ModulinoPixels leds;

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
float celsius;
char tempura[5]; 
float umido;
char humido[5]; 
bool lightSwitch;
ModulinoColor myColor = WHITE;

void u8g2_prepare(void) {
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.setFontRefHeightExtendedText();
  u8g2.setDrawColor(1);
  u8g2.setFontPosTop();
  u8g2.setFontDirection(0);
}

void setup() {
  Serial.begin(9600);
  delay(1500);
  matrix.begin();
  Modulino.begin();
  thermo.begin();
  leds.begin();
  Wire1.begin();

  matrix.stroke(0xFFFFFFFF);
  matrix.textScrollSpeed(100);

  const char text[] = "N3bbia ";
  matrix.textFont(Font_4x6);
  matrix.beginText(0, 1, 0xFFFFFF);
  matrix.println(text);
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  u8g2.begin();
  u8g2_prepare();
}

void loop() {

  matrix.beginDraw();
  matrix.stroke(0xFFFFFFFF);
  matrix.textScrollSpeed(200);

  // Parametri
  celsius = thermo.getTemperature();
  dtostrf(celsius, 2, 2, tempura);
  umido = thermo.getHumidity();
  dtostrf(umido, 2, 2, humido);

  matrix.textFont(Font_4x6);
  matrix.beginText(0, 1, 0xFFFFFF);
  matrix.println(celsius);
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  u8g2.clearBuffer();
  u8g2.drawStr(0,0,"Controllo Temperature");
  u8g2.drawStr(0,10,"---------------------");
  u8g2.drawStr(2,30,"Temp: ");
  u8g2.drawStr(38,30,tempura);
   if (celsius <= 20) {
    u8g2.drawStr(80,30,"Fred");
    } else if (celsius > 20 && celsius < 23) {
    u8g2.drawStr(80,30,"OOOK !");
      } else if (celsius >= 23) {
    u8g2.drawStr(80,30,"Bollito");
  }
  u8g2.drawStr(2,50,"Umid: ");
  u8g2.drawStr(38,50,humido);
     if (umido <= 40) {
    u8g2.drawStr(80,50,"Seccooo");
    } else if (umido > 40 && umido < 70) {
    u8g2.drawStr(80,50,"OOOK !");
      } else if (umido >= 70) {
    u8g2.drawStr(80,50,"Palude");
  }
  u8g2.sendBuffer();
  delay(time_delay);

  if (celsius <= 20) {
    myColor = BLUE;
  } else if (celsius > 20 && celsius < 23) {
    myColor = GREEN;
  } else if (celsius >= 23) {
    myColor = RED;
  }
  for (int i = 0; i < 8; i++) {
    leds.set(i, myColor, 5);
  }
  leds.show();
}

Anche io ho quella R4 e mi funziona a cascata (2 sensori previsti con connettore qwiic):
"https://docs.arduino.cc/tutorials/uno-r4-wifi/qwiic/"
Verifica se le begin() di quelle librerie dei sensori permettono di dare come parametro Wire1 invece di nulla.
La "#define WIRE Wire1" non mi convince molto

Nella libreria Modulino (che roba è ?? 4 kg di testo e nessuna spiegazione di che è!! mah)
vedo:

#ifdef ARDUINO_UNOR4_WIFI
  void begin(HardwareI2C& wire = Wire1) {

Quindi usa di default Wire1 SE c'e' una define ARDUINO_UNOR4_WIFI (credo lo metta ide)
Secondo me l'arcano è nella inizializzazione del display
U8G2_SH1106_128X64_NONAME_F_HW_I2C(rotation, [reset [, clock, data]])
non passi clock e data e quindi prende di default i pin wire e non i pin wire1.
Credo. Non sicuro.
Non so però quali pin siano la Wire1 (letto velocemente sito arduino, non trovo nulla P400 e P401 ma non come pin arduino (A4=D19=P101 per quelli non so che dire)

Ciao grazie delle risposte.
l'inizializzazione era quella della doc ufficiale in cui ci sono sketch di test che sono andati a buon fine ... a parte il fatto dell'alimentazione a 3.3V di cui sopra.
Non mi ero concentrato su quella dandola per buona.
Al di la del discorso display i vari sketch di test dei modulini (temp, led, distanza, e in generale quelli inclusi nel kit) hanno dato esito positivo comunicando correttamente e dando gli output previsti.

NON serve proprio a nulla se qualcuno non usa il valore definito e ... io non lo vedo usato nel codice.

Purtroppo, a differenza di altre librerie, quel mattone di u8g2 NON prevede in quella fase un parametro per indicare quale Wire si sta usando ...
... andndosi però a studiare i sorgenti, si scopre che nel file U8x8lib.cpp vieve verificato un parametro:

#ifdef U8X8_HAVE_2ND_HW_I2C

che serve appunto ad indicare che il display è su una seconda I2C. Purtroppo vedo che la R4 non sembra ancora supportata, difatti, sempre in quel sorgente:

#ifdef U8X8_HAVE_HW_I2C
#  ifdef U8X8_HAVE_HW_I2C_TEENSY3
#    include <i2c_t3.h>
#  else
#    include <Wire.h>
#    ifdef U8X8_HAVE_2ND_HW_I2C
#      if defined(MINICORE) && defined(__AVR_ATmega328PB__)
#        include <Wire1.h>
#      endif
#    endif
#  endif
#endif /* U8X8_HAVE_HW_I2C */

... si parla di Teensy, di ATmega328P ma NON di Renesas :roll_eyes:

Guglielmo

Stavo spulciando la modulino.h e ho verificato questo:

class ModulinoClass {
public:
#ifdef ARDUINO_UNOR4_WIFI
  void begin(HardwareI2C& wire = Wire1) {
#else
  void begin(HardwareI2C& wire = Wire) {
#endif

#ifdef ARDUINO_UNOR4_WIFI
    // unlock Wire1 bus at begin since we don't know the state of the system
    pinMode(WIRE1_SCL_PIN, OUTPUT);
    for (int i = 0; i < 20; i++) {
      digitalWrite(WIRE1_SCL_PIN, HIGH);
      digitalWrite(WIRE1_SCL_PIN, LOW);
    }
#endif

Se non altro mi sto facendo un po' di cultura

Ci dai un link a tale libreria? Che cosa è e a cosa serve?

Guglielmo

Sperando di fornire info sufficenti:
IO ho comprato il kit "plug & make" e questa è la suggested library per i vari dispositivi inclusi

https://docs.arduino.cc/libraries/modulino/

tale libraria è inclusa in tutti gli sketch che arduino ha messo nella sezione "esempi" dell' IDE ma si possono anche copiare incollare dal sito ufficiale (se ritrovo il link)

ne posto un esempio

#include "Modulino.h"
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

ModulinoThermo thermo;
ArduinoLEDMatrix matrix;

float temperature = -273.15;
float humidity = 0.0;

void setup() {
  Serial.begin(9600);

  Modulino.begin();
  thermo.begin();

  matrix.begin();
  delay(100);
}

void loop() {
  //Acquire temperature and humidity
  temperature = thermo.getTemperature();
  humidity = thermo.getHumidity();

  //Convert the temperature float to a string with 1 decimal point shown
  //and add °C at the end
  String temperature_text = String(temperature, 1) + "°C";

  //Convert the humidity float to a string with no decimal points shown
  //and add % at the end
  String humidity_text = String(humidity, 0) + "%";

  //Print each of the sensor values on serial
  Serial.print(temperature_text + " ");
  Serial.println(humidity_text);

  //Show on the UNO R4 WiFi LED matrix the data

  matrix.beginDraw();
  matrix.stroke(0xFFFFFFFF);
  matrix.textScrollSpeed(75);
  matrix.textFont(Font_5x7);
  matrix.beginText(0, 1, 0xFFFFFF);
  matrix.println(" " + temperature_text + " " + humidity_text + " ");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
}

Edit: trovata la pagina coi progetti di esempio:

https://courses.arduino.cc/plugandmake/it/

questo il primo che ho provato (con successo)
https://courses.arduino.cc/plugandmake/it/lessons/project-eco-watch/

Chiariamo una cosa ... que kit NON prevede alcun display:

  • Modulino® Knob: for super-fine value adjustments
  • Modulino® Pixels: eight LEDs to shine bright, dim down, or change color – you choose!
  • Modulino® Distance: a time-of-flight proximity sensor to measure distances with precision
  • Modulino® Movement: to perfectly capture movements like pitch, roll or tilt
  • Modulino® Buzzer: to generate your own alarm sounds or simple tunes
  • Modulino® Thermo: a sensor for both temperature and humidity data
  • Modulino® Buttons: three buttons for quick project navigation

e quello che vedi nella libreria "modulino", fatta per i moduli che arrivano con il kit, NON ha nulla a che vedere con la libreria "u8g2" che NON è stata adattata per lavorare con la Wire1 di Arduino UNO R4.

Detto questo, dato che non mi sembra (da quanto dici, ma posso ovviamente sbagliare) che tu abbia la preparazione e le capacità per modificare tale libreria, forse, la soluzione più semplice è che ti prendi un modulo adattatore di livello (level shifter) come quello che ho indicato ed uso il display sui classici pin della Wire A4 ed A5.

Guglielmo

Confermo che non sono un programmatore (ma sono un consulente informatico per cui secoli fa programmavo qualcosa )

La modulino.h l ho inclusa (sarebbe meglio dire che son partito da uno sketch che la includeva) per utilizzare quel modulino e dirigere all sh1106 la lettura che funziona solo con la 3.3 e ho appreso che non è cosa buona se poi i segnali arrivano da A4 e5 che sono a 5V (un vero peccato perchè funziona senza acciacchi)

Al momento a me basterebbe anche scrivere un ciao su quel display, tralasciando sensori o altro, ma visto che la libreria 'ufficiale' non funziona connettendola così andrò adattatori su pin A4 5 per la cronaca ho anche i casa un sensore DHT22 nel caso.

Quello che più mi ha stranito, e fatto richiedere aiuto qui, è esser stato a quanto pare l unico che con i collegamenti e lo sketch 'ufficiale' (incluso nell ebook) non ha ottenuto il risultato atteso.

... quale ebook? Non credo quello del kit perché il kit NON comprende dsplay :thinking:

Guglielmo

Del display

Allora, se i segue ESATTAMENTE lo schema:

senza collegare null'altro ai pin A4 ed A5, su Arduino UNO R4 WiFi deve funzionare come su Arduino UNO R3 ... entrambe le schede NON montano resistenza di pull-up a bordo (contrariamente ad Arduino MEGA ed altre schede)

... per cui, se l'unica cosa che si collega ad A4 ed A5 è il display ... VA BENE e non ci sono rischi dato che le pull-up sono sul display e, sicuramente, sono collegate sui 3.3V del regolatore.

Quindi, collega ESCLUSIVAMENTE il display come da manualetto e DEVE funzionare ovviamente utilizzando la porta I2C Wire (A4 ed A5).

Prendi qualche programma d'esempio e, senza collegare altro, prova e vedi se va, poi passi al resto (su Wire1).

Guglielmo