Forum: Mikrocontroller und Digitale Elektronik Adafruit SSD1306 Objekt lässt keine Zeiger zu


von Thorsten M. (cortex_user)


Lesenswert?

Hallo,

ich verzweifel grad bei der Arduino IDE.

Definition
1
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
2
#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
3
Adafruit_SSD1306 oled1(128, 64, &Wire, OLED_RESET);
4
Adafruit_SSD1306 oled2(128, 64, &Wire, OLED_RESET);

Aufruf einer Grafikfunktion soll so sein:
1
void DrawPowerGraph(Adafruit_SSD1306* oled) {
2
3
  oled->clearDisplay();
4
  oled->setTextColor(SSD1306_WHITE, SSD1306_BLACK);
5
6
  /* ..... */
7
}

Aufruf mit DrawPowerGraph(&oled1)

Also, dass eine Grafikfunktion auf zwei Displays angewendet werden kann.
Ständig haut der Compiler mit das raus. Was stimmt denn da nicht. Das 
ist doch bloss Übergabe eines C++ Objektes per Zeiger an eine Funktion 
dessen Methoden ich dann  benutze. Wenn man das void durch int ersetzt 
kommt neuer Murks.

E:\Embedded\ESP32\USB_Power_Meter\grafik.ino:107:21: error: variable or 
field 'DrawPowerGraph' declared void
 void DrawPowerGraph(Adafruit_SSD1306* oled) {
                     ^~~~~~~~~~~~~~~~
E:\Embedded\ESP32\USB_Power_Meter\grafik.ino:107:21: error: 
'Adafruit_SSD1306' was not declared in this scope
E:\Embedded\ESP32\USB_Power_Meter\grafik.ino:107:21: note: suggested 
alternative: 'Adafruit_SPIDevice_h'
 void DrawPowerGraph(Adafruit_SSD1306* oled) {
                     ^~~~~~~~~~~~~~~~
                     Adafruit_SPIDevice_h
E:\Embedded\ESP32\USB_Power_Meter\grafik.ino:107:39: error: 'oled' was 
not declared in this scope
 void DrawPowerGraph(Adafruit_SSD1306* oled) {
                                       ^~~~

: Bearbeitet durch User
von Marci W. (marci_w)


Lesenswert?

Hallo Throsten,

ich habe keine Ahnung von Arduino, aber vermutlich hast Du einen Header 
vergessen einzubinden.

Der Compiler schlägt vor: 'Adafruit_SPIDevice_h'
Evtl. sind dort die fehlenden Typen deklariert.

ciao

Marci

: Bearbeitet durch User
von Thorsten M. (cortex_user)


Lesenswert?

Marci W. schrieb:
> ich habe keine Ahnung von Arduino, aber vermutlich hast Du einen Header
> vergessen einzubinden.

Header ist mit drin vorne im Namensgebenden Modul des Sketches.. Habe 
den auch nochmal verdoppelt für das Modul . Ändert nichts. Lief ja alles 
vorher auch. Nur eben mit oled1 und oled2. Nur neben ohne Übergabe.

von Harald K. (kirnbichler)


Lesenswert?

Thorsten M. schrieb:
> Ständig haut der Compiler mit das raus. Was stimmt denn da nicht.

Zeig den kompletten Quelltext, keine Schnipsel. Als Dateianhang, nicht 
im Beitragstext.

von Thorsten M. (cortex_user)


Angehängte Dateien:

Lesenswert?

Bitteschön ... andere Module gehen nicht, da sind Passwörter und 
externer Link für Zugriff auf meine Fritzbox drin, muss hier nicht rein.

Im Setup
1
 // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
2
  if (!oled1.begin(SSD1306_SWITCHCAPVCC, 0x3d)) {
3
    Serial.println(F("SSD1306 allocation failed"));
4
    for (;;)
5
      ;  // Don't proceed, loop forever
6
  }
7
8
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
9
  if (!oled2.begin(SSD1306_SWITCHCAPVCC, 0x3c)) {
10
    Serial.println(F("SSD1306 2 allocation failed"));
11
    for (;;)
12
      ;  // Don't proceed, loop forever
13
  }

Diese Objekte lassen sich aus welchen Gründen auch nicht "verzeigern". 
Bei allen anderen geht das die ich bisher verwendet habe, zb Senoren 
usw.
1
#include <SPI.h>
2
#include <Wire.h>
3
#include <time.h>
4
#include <WiFi.h>
5
#include <WiFiClient.h>
6
#include <HTTPClient.h>
7
#include <ArduinoJson.h>
8
#include <Adafruit_GFX.h>
9
#include <esp32-hal.h>
10
#include <esp_task_wdt.h>
11
#include <Ticker.h>
12
#include <EEPROM.h>
13
#include <Adafruit_SSD1306.h>

: Bearbeitet durch User
von Marci W. (marci_w)


Lesenswert?

Hi Thomas,

vllt. hab ich ja grad was auf den Augen, aber wo ist das include?

ciao

Marci

von Thorsten M. (cortex_user)


Lesenswert?

Marci W. schrieb:
> vllt. hab ich ja grad was auf den Augen, aber wo ist das include?

Steht doch da .... bei Arduino muss man das ja nur einmal machen, der 
verwurstet das für alle Module dann.

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

: Bearbeitet durch User
von Thorsten M. (cortex_user)


Angehängte Dateien:

Lesenswert?

Im Beispiel ist das nicht, wie ich gerade merke.

: Bearbeitet durch User
von Thorsten M. (cortex_user)


Lesenswert?

Kompiliert durch:
1
void MyFunction(Adafruit_SSD1306* dis) {
2
3
  dis->clearDisplay();
4
}
5
6
void setup() {
7
  Serial.begin(9600);
8
9
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
10
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
11
    Serial.println(F("SSD1306 allocation failed"));
12
    for(;;); // Don't proceed, loop forever
13
  }
14
15
  MyFunction(&display);

von Thorsten M. (cortex_user)


Angehängte Dateien:

Lesenswert?

Ich glaube ich habe es. Es ist leider nicht egal wo die Funktion steht. 
Kopiere ich sie in das Hauptmodul, also wo auch der Include steht läuft 
das einwandfrei durch.

Das Problem dürfte also tief im Bauch der Arduino IDE liegen. das ist 
bei defines genauso, die im Hauptmodul sind überall bekannt. Die aus den 
anderen Modulen nur im Modul slebst.

Da lobe ich mir doch bare metal Programmierung der Cortexe, mit Headern, 
make Datei usw. Da weiss man genau was abgeht.

: Bearbeitet durch User
von J. S. (jojos)


Lesenswert?

https://arduino.github.io/arduino-cli/0.20/sketch-build-process/

Eine Forward Deklaration für die Funktion im Hauptsketch könnte helfen. 
Ich mag solche Automatismen auch nicht, PlatformIO ist da schon besser 
und bietet mehr Möglichkeiten und vor allem auch eine Benennung der 
verwendeten Referenzen.

von Thorsten M. (cortex_user)


Lesenswert?

J. S. schrieb:
> Eine Forward Deklaration für die Funktion im Hauptsketch könnte helfen.

Tut sie leider nicht. Diese Arduino IDE erzeugt header, protoypen, 
externals usw scheinbar automatisch.

Lassen wir es dabei, mir fällt schon was ein und wenn ich die Funktionen 
verdoppelt, Platz genug hat der esp32 ja.

von Marci W. (marci_w)


Lesenswert?

Thorsten M. schrieb:
> Das Problem dürfte also tief im Bauch der Arduino IDE liegen

unter anderem ist das der Grund, warum ich nichts mit der Arduino IDE 
mache.
Obwohl, wenn man ein Projekt mit ESPIDF baut, weiß man auch nicht so 
genau, was da alles im Hintergrund passiert. Jedenfalls ist das ne ganze 
Menge.
Aber wenigstens kann ich mich drauf verlassen, dass alles C/C++ konform 
läuft. ;-)

J. S. schrieb:
> Ich mag solche Automatismen auch nicht, PlatformIO ist da schon besser
> und bietet mehr Möglichkeiten

Ich glaub es wird Zeit, dass ich mir das auch mal anschaue!

ciao

Marci

: Bearbeitet durch User
von Thorsten M. (cortex_user)


Lesenswert?

Marci W. schrieb:
> unter anderem ist das der Grund, warum ich nichts mit der Arduino IDE
> mache.

Strukturiertes Programmieren wird damit jedenfalls zum Abenteuer, wenn 
es mehr als 2-3 Module sind.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.