Adafruit SSD1306 Objekt lässt keine Zeiger zu

Gast #7629351

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) { ^~~~

Gast #7629357

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

Gast #7629359

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.

Gast #7629362

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>
Angehängte Dateien:
Gast #7629366

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>

Gast #7629371

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);
Gast #7629374

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.

Angehängte Dateien:
Gast #7629386

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.

Gast #7629395

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 2 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.