RP2040 mit OLED 1306 pgmspace.h Fehler

Guten Tag,
dies ist meine Erste Frage im Forum, bitte verzeiht es mir, falls ich Formatierungsfehler oder Ähnliches mache.
Ich habe ein Programm in dem ich u.a. ein 0,91" OLED Display (128*32px) zur Ausgabe einiger Daten ansteuern möchte (mit einem Arduino RP2040 Connect).
Ich benutze den Arduino IOT Web Editor, da ich das Dashboard und die Onlinefuktion brauche.

Dann komm komme ich immer zu folgendem Problem:

/mnt/create-efs/webide/42/86/hier ist ein Pfad/libraries_v2/Adafruit SSD1306/Adafruit_SSD1306.cpp:42:10: fatal error: pgmspace.h: No such file or directory
#include <pgmspace.h>

Ich habe mich schon Stundenlang durchs Forum geschlagen, und etliche YT-Tutorials gesehen aber es will einfach nicht.
Ich probiere hier mal mein Code einzubinden

/*
  Sketch generated by the Arduino IoT Cloud Thing "Untitled"
  https://create.arduino.cc/cloud/things/CLOUDID

  Arduino IoT Cloud Variables description

  The following variables are automatically generated and updated when changes are made to the Thing

  int rpm;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/
#include <Arduino.h>                                    // Bibliothek für Arduino Funktionen
//-------Display-------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <gfxfont.h>
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_WIDTH 128 // OLED display Breite, in pixels
#define SCREEN_HEIGHT 64 // OLED display Höhe, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//------ESC--------
#include <Servo.h>                                      //Hinzufügen der Servobibliothek. ESC aus elektrischer Sicht in gleicher Weise wie ein Servo angesteuert wird.
Servo ESC;                                              // Der ESC-Controllerwird als Objekt mit dem Namen "ESC" festgelegt.


#include "thingProperties.h"
byte Pin_RPM = 2;                                       //Interrupt Pin
volatile unsigned long RPM_T2, RPM_Count;               // Volatile Variablen für die Drehzahlberechnung
unsigned long RPM, RPM_T1;                              // Variablen für die Drehzahlberechnung

unsigned long oldMillis, actMillis, letzteMillis;       // Variablen für die Zykluserstellung
const long cycle = 50;                                  // Konstante Zykluszeit
int intervall = 10000, Test=0;

void setup() {
//-----Arduino IOT Vorgegeben Anfang------------------------------
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500);
  // Defined in thingProperties.h
  initProperties();
  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
  */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
//-----Arduino IOT Vorgegeben Ende-----------------------------  

  //-----ESC-----
  ESC.attach(8, 1000, 2000); // ESC an Pin 8, und kann zwischen 1000 und 2000 senden; muss so für ESC
  //ESC.write(180);

  pinMode(Pin_RPM, INPUT);                  //------Drehzahlpin
  RPM_T1 = 0;                               // Variablen initialisieren
  RPM_T2 = 0;
  RPM_Count = 0;
  attachInterrupt(digitalPinToInterrupt(Pin_RPM), Drehzahl, FALLING); //Pin der durch einen Hallsensor interruptet wird
//---------Display
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C address = 0x3C
  delay(1000);
  display.clearDisplay();                          //aus Beispiel wie man Oled ansteuert
  display.setTextSize(1);                         //aus Beispiel wie man Oled ansteuert
  display.setTextColor(WHITE);             //aus Beispiel wie man Oled ansteuert
  display.setCursor(0, 0);                        //aus Beispiel wie man Oled ansteuert
  display.print("Test");                            //aus Beispiel wie man Oled ansteuert
  display.display(); 
}

void loop() {
  ArduinoCloud.update();
  // Your code here
  //actMillis = millis();                   // Aktuelle Systemzeit für Zyklus zuweisen
  //oldMillis = actMillis;                  // Neue Zeit für den Zyklus zuweisen (Systemzeit schreitet voran)
  Drehzahl_Auswertung();
//  display.setFont(System5x7); // Auswahl der Schriftart
//  display.clear(); //Löschen der aktuellen Displayanzeige
//  display.println("Viel"); //Text in der ersten Zeile. "Println" sorgt dabei für einen Zeilensprung.
//  display.print("Erfolg!!!"); // Text in der zweiten Zeile. Da es keine dritte Zeile gibt, wird hier kein Zeilenumsprung benötigt.
//delay (2000);
}

/*void setup1() {

}

void loop1() {
  
}*/

void ESCStart() {                 //mein Code für mein eigentliches Projekt
  while ((millis() - letzteMillis) < (intervall));
  {
    ESC.write(180);    // Der endgültige Wert für den ESC wird an den ESC gesendet. Der ESC nimmt das Signal an dieser Stelle auf und steuert den Motor entsprechend der gesendeten Werte an.
  }
  letzteMillis = millis();
  ESC.write(0);
  while ((millis() - letzteMillis) < (intervall));
  {
    ESC.write(0);
  }
  while ((millis() - letzteMillis) < intervall - 8000);
  {
  }
}

void Drehzahl () {                //mein Code für mein eigentliches Projekt
  RPM_Count++;                              // Zähler inkrementieren
  RPM_T2 = millis();                        // Neue Zeit zuweisen (für Berechnung Drehzahl)
}

void Drehzahl_Auswertung() {        //mein Code für mein eigentliches Projekt
  if (RPM_T2 > RPM_T1) {                  // Bedingung: Wenn Zeit vergangen ist Drehzahl berechnen
    rpm = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 - RPM_T1));  // Drehzahl berechnen (Anzahl Impulse geteilt durch vergangene Zeit, Multiplikator: (60 s/min * 1000 s/ms)/ 6 Impulse/rpm)
    RPM_T1 = RPM_T2;                      // Neue Zeit gleich alte Zeit (Systemzeit schreitet voran)
    RPM_Count = 0;                        // Zähler zurücksetzen
  }
  else {
    // RPM = 0;
  }
}



/*
  Since Rpm is READ_WRITE variable, onRpmChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onRpmChange()  {
  // Add your code here to act upon Rpm change
}

Ich bedanke mich schonmal im voraus, wenn ihr mehr Infos braucht bitte bescheid sagen

Die Meldung ist berechtigt.

Für den RP2400 wird pgmspace.h weder benötigt noch existiert diese für den Prozessortype.

Es ist an Adafruit das zu reparieren, oder eben du.....

Vielen Dank, für die schnelle Antwort.
kann ich das einfach in der Adafruit_SSD1306.cpp Datei rauslöschen?
Folgendes kommt von Ardufruit aus der Adafruit_SSD1306.cpp:

#ifdef __AVR__
#include <avr/pgmspace.h>
#elif defined(ESP8266) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
#include <pgmspace.h>
#else
#define pgm_read_byte(addr)                                                    \
  (*(const unsigned char *)(addr)) ///< PROGMEM workaround for non-AVR
#endif

Oder ist das was gößeres und nicht mal eben so behoben, oder anders gefragt:
Wie kann ich das beheben?

#ifdef __AVR__
#include <avr/pgmspace.h>
#elif defined(ESP8266) || defined(ESP32) 
// || defined(ARDUINO_ARCH_RP2040)
#include <pgmspace.h>
#else
#define pgm_read_byte(addr)                                                    \
  (*(const unsigned char *)(addr)) ///< PROGMEM workaround for non-AVR
#endif

Ein Schuss ins Blaue!

Compilieren kann ich es schonmal,
heute abend nach der Arbeit probiere ich es mal hochzuladen.

Sieht aber schonmal gut aus. :partying_face:

Besten Dank schonmal!

So ich kann das Programm auch hochladen, aber leider zeigt das Display überhaupt nichts an.
ich habe noch ein paar Fehler ausgebügelt, also der Quellcode ist nicht mehr ganz aktuell oben... Also hier der neue:

/*
  Sketch generated by the Arduino IoT Cloud Thing "Untitled"
  https://create.arduino.cc/cloud/things/...............

  Arduino IoT Cloud Variables description. The following variables are automatically generated and updated when changes are made to the Thing

  int rpm;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions which are called when their values are changed from the Dashboard. These functions are generated with the Thing and added at the end of this sketch.
*/

#include <Arduino.h>                                    // Bibliothek für Arduino Funktionen

//______________________________________________________SD-Karte Anfang
#include <SPI.h>                                        //für SD-Karte CIPO D12; COPI D11; SCK(Clock) D13; CS alles außer A6/A7   The signal names MOSI (COPI), MISO (CIPO) and SS (CS) has been replaced by COPI (Controller Out , Peripheral In), CIPO (Controller In, Peripheral Out) and CS (Chip Select).
#include <SD.h>
byte Pin_SD = 4;                                        // CS Pin
File myFile;
//______________________________________________________SD-Karte Ende

//______________________________________________________Display Anfang
#include <Wire.h>                                       //für i2c SDA = A4 ; SCL = A5
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_RESET -1                                   // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_WIDTH 128                                // OLED display Breite, in pixels
#define SCREEN_HEIGHT 32                                // OLED display Höhe, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//______________________________________________________Display Ende

//______________________________________________________ESC Anfang
#include <Servo.h>                                      //Hinzufügen der Servobibliothek. ESC aus elektrischer Sicht in gleicher Weise wie ein Servo angesteuert wird.
Servo ESC;                                              // Der ESC-Controllerwird als Objekt mit dem Namen "ESC" festgelegt.
int intervall = 9000;                                  //ESC Starten millisekunden
int Turborpm = 0;
//______________________________________________________ESC Ende

//______________________________________________________Beschleunigungssensor Anfang
#include <Arduino_LSM6DSOX.h>
float beschlX, beschlY, beschlZ;                        //Beschleunigungswerte
float gyroX, gyroY, gyroZ;                              //Gyroskopwertewerte
int TempIMU;                                            //interne Temperatur
byte Pin_ESC = 8;                                       // Pin zur ESC Ausgabe
//______________________________________________________Beschleunigungssensor Ende

#include "thingProperties.h"                            //Irgendwas von Arduino IOT

byte Pin_RPM = 2;                                       // Interrupt Pin zur Drehzahlberechnung
volatile unsigned long RPM_T2, RPM_Count;               // Volatile Variablen für die Drehzahlberechnung
unsigned long RPM, RPM_T1;                              // Variablen für die Drehzahlberechnung
unsigned long oldMillis, actMillis, letzteMillis;       // Variablen für die Zykluserstellung
const long cycle = 50;                                  // Konstante Zykluszeit


void setup() {
//______________________________________________________Arduino IOT Vorgegeben Anfang
  //Serial.begin(9600);                                 // Initialize serial and wait for port to open
  //delay(1500);                                        // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  initProperties();                                     // Defined in thingProperties.h
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);    // Connect to Arduino IoT Cloud
  /*
  The following function allows you to obtain more information related to the state of network and IoT Cloud connection and errors the higher number the more granular information you’ll get. The default is 0 (only errors). Maximum is 4
  */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
//______________________________________________________Arduino IOT Vorgegeben Ende  

  //-----ESC-----
  ESC.attach(Pin_ESC, 1000, 2000);                      // ESC an Pin_ESC = 8, und kann zwischen 1000 und 2000 senden; muss so für ESC
  //ESC.write(180);

  pinMode(Pin_RPM, INPUT);                              //------Drehzahlpin
  RPM_T1 = 0;                                           // Variablen initialisieren
  RPM_T2 = 0;
  RPM_Count = 0;
  
//______________________________________________________Arduino IMU Anfang
  beschlX = 0;
  beschlY = 0;
  beschlZ = 0;
  gyroX = 0;
  gyroY = 0;
  gyroZ = 0;
  TempIMU = 0;
  IMU.begin();
//______________________________________________________Arduino IMU Ende

//______________________________________________________Arduino SD Anfang
  Serial.print("Initializing SD card...");

  if (!SD.begin()) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("DATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.print("Writing to DATA.txt...");
    myFile.println("RPM, Laptime");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening DATA.txt");
  }
//______________________________________________________Arduino SD Ende

  attachInterrupt(digitalPinToInterrupt(Pin_RPM), Drehzahl, FALLING); //Pin der durch einen Hallsensor interruptet wird
  
//______________________________________________________Display Anfang
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);            // I2C address = 0x3C
  display.clearDisplay();                               //aus Beispiel wie man Oled ansteuert
  display.display();                                    //Daten zum Display senden
  display.setTextSize(1);                               //aus Beispiel wie man Oled ansteuert
  display.setTextColor(WHITE);                          //aus Beispiel wie man Oled ansteuert
  display.setCursor(0, 0);                              //aus Beispiel wie man Oled ansteuert
  display.print("Test");                                //aus Beispiel wie man Oled ansteuert
  display.display();                                    //Daten zum Display senden
  //delay(1000);                                        //evtl brauch man das?
//______________________________________________________Display Ende
}

void loop() {
  ArduinoCloud.update();
  //actMillis = millis();                               // Aktuelle Systemzeit für Zyklus zuweisen
  //oldMillis = actMillis;                              // Neue Zeit für den Zyklus zuweisen (Systemzeit schreitet voran)
  Drehzahl_Auswertung();
  Turbo();
  Anzeigen();
  aufSDSchreiben();
}

void ESCStart() {                                       //mein Code für mein eigentliches Projekt
  while ((millis() - letzteMillis) < (intervall));
  {
    ESC.write(180);                                     // Der endgültige Wert für den ESC wird an den ESC gesendet. Der ESC nimmt das Signal an dieser Stelle auf und steuert den Motor entsprechend der gesendeten Werte an.
  }
  letzteMillis = millis();
  ESC.write(0);
  while ((millis() - letzteMillis) < (intervall));
  {
    ESC.write(0);
  }
  while ((millis() - letzteMillis) < intervall - 8000);
  {
  }
}

void Drehzahl () {                                      //mein Code für mein eigentliches Projekt
  RPM_Count++;                                          // Zähler inkrementieren
  RPM_T2 = millis();                                    // Neue Zeit zuweisen (für Berechnung Drehzahl)
}

void Drehzahl_Auswertung() {                            //mein Code für mein eigentliches Projekt
  if (RPM_T2 > RPM_T1) {                                // Bedingung: Wenn Zeit vergangen ist Drehzahl berechnen --> evtl bedingung ändern
    rpm = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 - RPM_T1));  // Drehzahl berechnen (Anzahl Impulse geteilt durch vergangene Zeit, Multiplikator: (60 s/min * 1000 s/ms)/ 6 Impulse/rpm)
    RPM_T1 = RPM_T2;                                    // Neue Zeit gleich alte Zeit (Systemzeit schreitet voran)
    RPM_Count = 0;                                      // Zähler zurücksetzen
  }
  else {
    // RPM = 0;
  }
}

void IMUAuswerten () {                                  //mein Code für mein eigentliches Projekt
  if (IMU.gyroscopeAvailable()) {                       //Gyroskopwerte auslesen
    IMU.readGyroscope(gyroX, gyroY, gyroZ);
  }
  
  if (IMU.accelerationAvailable()) {                    //Beschleunigungswerte auslesen
    IMU.readAcceleration(beschlX, beschlY, beschlZ);
  }
  IMU.readTemperature(TempIMU);                         //interne Temperatur auslesen
  
}

void Anzeigen() {
  display.clearDisplay();                                      //Löschen der aktuellen Displayanzeige
  display.display();                                    //Daten zum Display senden
  display.println("Viel");                              //Text in der ersten Zeile. "Println" sorgt dabei für einen Zeilensprung.
  display.print("Erfolg!!!");                           // Text in der zweiten Zeile. Da es keine dritte Zeile gibt, wird hier kein Zeilenumsprung benötigt.
  display.display();                                    //Daten zum Display senden
  //delay (2000);
}

void aufSDSchreiben(){
  myFile = SD.open("DATA.txt");
  if (myFile) {
    Serial.println("test.txt:");
    myFile.println("Testdaten1, Testdaten2");
  }
  myFile.close();
}

void mapESC(){
  Turborpm = map(rpm, 1500, 6000, 0, 180);                           // Der Wert aus RPM wird linear von einer Skala von 1500RPM-6000RPM auf eine Skala von 0-180 umgeschrieben, der Wert dient dann dem ESC
}

void Turbo(){
  ESC.write(Turborpm);
}
/*
  Since Rpm is READ_WRITE variable, onRpmChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onRpmChange()  {
  // Add your code here to act upon Rpm change
  mapESC();
  Anzeigen();
}

Ich habe natürlich GND an GND angeschlossen, VCC an 3,3V, SDA an SDA und SCK an SCK
aber es bleibt alles dunkel... jemand eine Idee, oder ist das Display kaputt?

Danke,
Fabian

Ich wurde erst mall die Beispiele aus der Lib probieren damit das Display funktioniert.
Der RP2040 Connect ist ziemlich neu, und nicht alles ist auf den angepasst worden.
Wen die Anzeige funktioniert langsam Rest einbinden.

Ich habs jetzt hinbekommen, er hatte sich irgendwo beim initalisieren der SD-Karte aufgehangen, aber trotzdem im loop weiter gemacht.
Danke an alle die geholfen haben!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.