Programm umschreiben - ESP32 auf Heltec mit Display

Hallo,

ich habe einen schönen sketch gefunden der für ein esp32 mit angeschlossenem display I2C auch funktioniert.

nun möchte ich aber dass der sketch auch auf einem “WIFI Kit 32 ESP32 WIFI drahtlos mit 0,96 Zoll OLED Display CP2102” läuft.

in einem anderen sketch der wird diese library benutzt: #include <U8x8lib.h>

kann mir jemand helfen?

vielen dank hardy

#include <Wire.h> // I2C
#include <Adafruit_GFX.h> // OLED
#include <Adafruit_SSD1306.h> // Graphic


#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);

void setup() {

// initialize with the I2C addr 0x3C
// mit I2C-Adresse 0x3c initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Serial.begin(115200);

display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(2 );
display.setTextColor(INVERSE);
}

unsigned MessungNr=0;

void loop()
{
unsigned long Zeit=0;
unsigned long Start=0;
unsigned long Ende=0;
float s=0;

/*************************************************************************************
READY
FREIGABE
**************************************************************************************/
Serial.println();
Serial.println("Startfreigabe ");


// M-Nr: ### send to display
// Messung Nr. und Freigabe auf Display senden

display.clearDisplay();
display.setCursor(0,0);
display.print("M-Nr: ");
MessungNr++;
display.print(MessungNr);
display.setCursor(0,32);
display.print("Freigabe");
display.display();



/*************************************************************************************
Wait for START
Warten auf Messung START
**************************************************************************************/
while (digitalRead(0) == HIGH)
{
yield(); //warten fuer ESP8266
}

Start = millis();
Serial.print("gestartet Messung Nr.: ");
Serial.print(MessungNr);

// started send to display
// gestartet auf Display senden
display.clearDisplay();
display.setCursor(0,0);
display.print("M-Nr: ");
display.print(MessungNr);
display.setCursor(0,32);
display.print("gestartet");
display.display();

// wait for second wheel
// Draisine hat zwei Raeder
delay(2000);

/*************************************************************************************
// Waiting for FINISH
// Warten auf ZIEL
**************************************************************************************/
while (digitalRead(0) == HIGH)
{
Ende = millis();
Zeit = (Ende - Start);
s=Zeit;
s=s/1000;

// Result send to display
// Zeit auf Display senden
display.clearDisplay();
display.setCursor(0,0);
display.print("E-Nr: ");
display.print(MessungNr);
display.setCursor(0,32);
display.print(s,2);
display.print("s");
display.display();
}

//ERGEBNIS
Serial.print(" Ergebnis ");
Serial.print(s,3);
Serial.println("s");
display.clearDisplay();
display.setCursor(0,0);
display.print("E-Nr: ");
display.print(MessungNr);
display.setCursor(0,32);
display.print(s,3);
display.print("s");
display.display();

/*************************************************************************************
// Display RESULT for two seconds --> Button
// Ergebnisanzeige fuer mindestens 2s bis Taster betaetigt werden kann
*************************************************************************************/
delay(2000);

// RESULTS accepted
// Datenuebernahme mit Taster bestaetigen
while(digitalRead(0) ==HIGH)
{
yield(); //warten
}
// send WAIT to display
// Warten an Display senden
display.clearDisplay();
display.setCursor(0,0);
display.print("WARTEN");
display.display();
delay(2000);
}

Was funktioniert auf dem anderen ESP32 nicht? Wo ist das Display angeschlossen?

Gruß Tommy

das display ist fest verbaut. wird aber nicht angesprochen - also bleibt komplett dunkel.

oder was meinst du?

Dann solltest Du auf die Suche nach einem Anschlussplan gehen, aus dem zu erkennen ist, an welchen Pins das Display hängt.

Gruß Tommy

OK danke.

habe das hier gefunden aus dem Datenblatt:

OLED_SCL GPI015
OLED_SDA GPI04
OLED_RST GPI016

ist das das was du meinst?

wenn ja, wie wo muss ich das dann im sketch ändern?

vg hardy

Ja, das sind schon die wichtigen. Als Lib solltest Du die U8g2lib (ist die Weiterentwicklung der u8glib) benutzen. Dazu gibt es auch ein schönes Wiki.

Mehr kann man aus der Ferne nicht sagen. Du musst mit den Beispielen der Lib erst mal versuchen, einfache Ausgaben auf Dein Display zu bekommen. Danach kannst Du beginnen, Deine Funktionalität zu entwickeln.

Gruß Tommy

Wird bei der U8g2lib intern gemacht. Du übergibst die SDA/SCL-Pins im Konstruktor.

Gruß Tommy

ok danke, ich teste das mal durch...

so habe es nun geschafft “Hello World” mit der u8g2 auf dem display zu bekommen. :slight_smile:

heißt also dass ich das display ansprechen kann.

welche teile aus dem stopuhren-sketch muss ich aber nun rüber kopieren bzw umschreiben?

der neue sketch sieht bisher so aus:

#include <Arduino.h>
#include <SPI.h>
#include <U8g2lib.h>

/* Constructor */
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 15, /* data=*/ 4, /* reset=*/ 16);

/* u8g2.begin() is required and will sent the setup/init sequence to the display */
void setup(void) {
  u8g2.begin();
}

/* draw something on the display with the `firstPage()`/`nextPage()` loop*/
void loop(void) {
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB14_tr);
    u8g2.drawStr(0,20,"Hello World!");
  } while ( u8g2.nextPage() );
  delay(1000);
}

Das ist doch schon ein Erfolg.

Alle die Teile, die Deine Stoppuhr ausmachen. Das Delay(1000) sollte bei einer Stoppuhr aber raus.

Wenn Dur nur Zeichen (Ziffern/Buchstaben) ausgeben willst, kannst Du vom gleichen Autor auch die U8x8-Lib benutzen, die ist einfacher zu handeln.

Gruß Tommy

alle teile die meine stoppuhr ausmachen? äh.. also den code dann ab welcher zeile kopieren?

was ist z.b. mit den display.display (): oder display.clearDisplay(); - einträgen? brauche ich die auch?

du siehst, ich bin ein kompletter anfänger...

hardyn66:
du siehst, ich bin ein kompletter anfänger...

Das kannst Du ändern.

Da ist nichts mit kopieren von bis. Du musst verstehen, was da geschieht und es im neuen Sketch umsetzen.

Hast Du Dir mal die Variante mit der u8x8 angeschaut?

Gruß Tommy

es gibt eine stoppuhr variante von u8x8? oder meinst du nur die library u8x8??

Ich meine die Lib u8x8, wenn Du nur Texte/Zahlen ausgeben willst.

Gruß Tommy

mh, dass heißt ich muss den kompletten sketch neu schreiben, nur weil sich das display nicht mehr extern, sondern auf dem board befindet... ist ja blöd.

nun gut, dann werde ich wohl in ein paar wochen damit fertig werden. :slight_smile:

Du musst nicht alles neu schreiben. Du musst nur die Ausgabebefehle an das neue Display anpassen.

Aber dazu musst du eben verstehen was die Befehle bewirken.
Die Beispiele der Bibliotheken können dir dabei helfen.

hardyn66:
nun gut, dann werde ich wohl in ein paar wochen damit fertig werden. :slight_smile:

Wie......?
Doch so schnell ? :wink: