Adafruit SSD1306 Objekt lässt keine Zeiger zu

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

Gast #7629357
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

Gast #7629359
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.

Gast #7629362
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>
Angehängte Dateien:
Gast #7629371
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);
Gast #7629374
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.

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

Gast #7629395
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren