Problem Arduino Uno mit Data Logger RTC Shield kein OLED

Hallo liebe Gemeinde,
ich bin noch relativ neu im Arduino-Universum und habe aber auch schon ein paar erste Schritte in Sachen Programmierung und Bastelei hinter mir.

Jetzt zum Problem.

Ich habe einen Arduino Uno mit einem Data Logger RTC Shield und einem BMP 280 Temperatur und Luftdruck-Sensor ausgestattet. Im SD-Slot steckt ein 8 GB SD-Card und das Ganze läuft soweit sehr gut. Mit diesem Sketch.

#include <Wire.h>
#include "RTClib.h"
#include <MyBMP280.h>
#include <Metro.h>
#include <SD.h> 

const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)
 
RTC_DS1307 rtc;

MyBMP280 BMP(0x76);
Metro leseZyklus = Metro(1000); //Zykluszeit in ms für Auslesen des Sensors


int hoehe = 250; //Messort: 460 m über dem Meer
float luftTemp, luftDruck, redLuftDruck;



void setup () {
 
  while (!Serial); // for Leonardo/Micro/Zero
 
  Serial.begin(9600);

  if (BMP.isReady()) Serial.println("BMP280 Ok!");
  else
  {
    Serial.println("BMP280 Fehler!");
    while (1); //Im Fehlerfall geht's hier nicht weiter!
  }

  BMP.setPressOversampling(BMP280_P_OVERSAMPLING_x2); //Ändere Druck-Oversampling Parameter
  BMP.init();





  
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
 
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println("RTC adjusted!");
  }

  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");


  
}
 
void loop () {
    DateTime now = rtc.now();
 
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');

if (now.minute() < 10)  {
          Serial.print("0");
          Serial.print(now.minute(), DEC);
        } else {
          Serial.print(now.minute(), DEC);
        }
    
   // Serial.print(now.minute(), DEC);
    Serial.print(':');
if (now.second() < 10)  {
          Serial.print("0");
          Serial.println(now.second(), DEC);
        } else {
          Serial.println(now.second(), DEC);
        }
    
    //Serial.println(now.second(), DEC);
    
if (leseZyklus.check())
  {
    luftTemp = BMP.readTemp();
    Serial.print("Lufttmperatur  : ");
    Serial.print(luftTemp);
    Serial.println(" Grad C");

    luftDruck = BMP.readPress();
    Serial.print("Luftdruck      : ");
    Serial.print(luftDruck);
    Serial.println(" hPa");

    redLuftDruck = BMP.readReducedPress(hoehe);
    Serial.print("Reduz.Luftdruck: ");
    Serial.print(redLuftDruck);
    Serial.println(" hPa");

    Serial.println();
  }

File dataFile = SD.open("werte.csv", FILE_WRITE);

if (dataFile) {
    dataFile.print(now.year(), DEC);
    dataFile.print('/');
    dataFile.print(now.month(), DEC);
    dataFile.print('/');
    dataFile.print(now.day(), DEC);
    dataFile.print(" ");
    dataFile.print(now.hour(), DEC);
    dataFile.print(':');
    if (now.minute() < 10)  {
          dataFile.print("0");
          dataFile.print(now.minute(), DEC);
        } else {
          dataFile.print(now.minute(), DEC);
        }
    
       dataFile.print(':');
if (now.second() < 10)  {
          dataFile.print("0");
          dataFile.print(now.second(), DEC);
        } else {
          dataFile.print(now.second(), DEC);
        }
    dataFile.print(";");
    dataFile.print(luftTemp);
    dataFile.print(";");
    dataFile.print(luftDruck);
    dataFile.print(";");
    dataFile.println(redLuftDruck);

dataFile.close();
    // print to the serial port too:
    
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening werte.csv");
  } 


    
    delay(60000);
}

Ich möchte nun ein paar Daten gern direkt am Datenlogger einsehen und ein kleines OLED-Display verbauen. Doch lässt es sich nicht ansteuern, wenn ich den Datenlogger Code-Anteil mit hochlade.

#include <Wire.h>
#include <SPI.h>
#include <RTClib.h>
#include <MyBMP280.h>
#include <Metro.h>
#include <SD.h> 
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
Adafruit_SSD1306 display(4);

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, change Adafruit_SSD1306.h");
#endif

const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)
 
RTC_DS1307 rtc;

MyBMP280 BMP(0x76);
Metro leseZyklus = Metro(1000); //Zykluszeit in ms für Auslesen des Sensors


int hoehe = 250; //Messort: 460 m über dem Meer
float luftTemp, luftDruck, redLuftDruck;




void setup () {
 
  
 
  Serial.begin(9600);

  if (BMP.isReady()) Serial.println("BMP280 Ok!");
  else
  {
    Serial.println("BMP280 Fehler!");
    while (1); //Im Fehlerfall geht's hier nicht weiter!
  }

  BMP.setPressOversampling(BMP280_P_OVERSAMPLING_x2); //Ändere Druck-Oversampling Parameter
  BMP.init();





  
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
 
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println("RTC adjusted!");
  }

  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();

  
}
 
void loop () {
    DateTime now = rtc.now();
 
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');

if (now.minute() < 10)  {
          Serial.print("0");
          Serial.print(now.minute(), DEC);
        } else {
          Serial.print(now.minute(), DEC);
        }
    
   // Serial.print(now.minute(), DEC);
    Serial.print(':');
if (now.second() < 10)  {
          Serial.print("0");
          Serial.println(now.second(), DEC);
        } else {
          Serial.println(now.second(), DEC);
        }
    
    //Serial.println(now.second(), DEC);
    
if (leseZyklus.check())
  {
    luftTemp = BMP.readTemp();
    Serial.print("Lufttmperatur  : ");
    Serial.print(luftTemp);
    Serial.println(" Grad C");

    luftDruck = BMP.readPress();
    Serial.print("Luftdruck      : ");
    Serial.print(luftDruck);
    Serial.println(" hPa");

    redLuftDruck = BMP.readReducedPress(hoehe);
    Serial.print("Reduz.Luftdruck: ");
    Serial.print(redLuftDruck);
    Serial.println(" hPa");
    Serial.print("Hoehe          : ");
    Serial.print(hoehe);
    Serial.println(" m");
    Serial.println();
  }

File dataFile = SD.open("werte.csv", FILE_WRITE);

if (dataFile) {
    dataFile.print(now.year(), DEC);
    dataFile.print('/');
    dataFile.print(now.month(), DEC);
    dataFile.print('/');
    dataFile.print(now.day(), DEC);
    dataFile.print(" ");
    dataFile.print(now.hour(), DEC);
    dataFile.print(':');
    if (now.minute() < 10)  {
          dataFile.print("0");
          dataFile.print(now.minute(), DEC);
        } else {
          dataFile.print(now.minute(), DEC);
        }
    
       dataFile.print(':');
if (now.second() < 10)  {
          dataFile.print("0");
          dataFile.print(now.second(), DEC);
        } else {
          dataFile.print(now.second(), DEC);
        }
    dataFile.print(";");
    dataFile.print(luftTemp);
    dataFile.print(";");
    dataFile.print(luftDruck);
    dataFile.print(";");
    dataFile.println(redLuftDruck);

dataFile.close();
    // print to the serial port too:
    
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening werte.csv");
  } 

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("test");
    display.display();
    display.clearDisplay();
    
    delay(60000);
}

Ich habe schon die üblichen Suchfunktionen des WWW ausgeschöpft und brauche einen Denkanstoß. Wo es hakt. Wenn ich den SD-Card-Code weglasse, funktioniert das Display.

Vielen Dank!

So wie ich das erkennen kann (der Sketch ist nicht gut lesbar) hast du deinen Display-Code an eine falsche Stelle kopiert.

Formatiere den Sketch mal richtig in der IDE (Strg + T), dann wird der auch lesbar.

Danke für die schnelle Nachricht und den Tipp mit der automatischen Formatierung.

Ich habe den Problem-Code hier nun besser lesbar nochmal:

#include <Wire.h>
#include <SPI.h>
#include <RTClib.h>
#include <MyBMP280.h>
#include <Metro.h>
#include <SD.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>



const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)

RTC_DS1307 rtc;

MyBMP280 BMP(0x76);
Metro leseZyklus = Metro(1000); //Zykluszeit in ms für Auslesen des Sensors


int hoehe = 250; //Messort: 460 m über dem Meer
float luftTemp, luftDruck, redLuftDruck;

Adafruit_SSD1306 display(4);

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, change Adafruit_SSD1306.h");
#endif


void setup () {



  Serial.begin(9600);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();

  if (BMP.isReady()) Serial.println("BMP280 Ok!");
  else
  {
    Serial.println("BMP280 Fehler!");
    while (1); //Im Fehlerfall geht's hier nicht weiter!
  }

  BMP.setPressOversampling(BMP280_P_OVERSAMPLING_x2); //Ändere Druck-Oversampling Parameter
  BMP.init();

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println("RTC adjusted!");
  }

  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");




}

void loop () {
  DateTime now = rtc.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');

  if (now.minute() < 10)  {
    Serial.print("0");
    Serial.print(now.minute(), DEC);
  } else {
    Serial.print(now.minute(), DEC);
  }
  Serial.print(':');
  if (now.second() < 10)  {
    Serial.print("0");
    Serial.println(now.second(), DEC);
  } else {
    Serial.println(now.second(), DEC);
  }

  if (leseZyklus.check())
  {
    luftTemp = BMP.readTemp();
    Serial.print("Lufttmperatur  : ");
    Serial.print(luftTemp);
    Serial.println(" Grad C");

    luftDruck = BMP.readPress();
    Serial.print("Luftdruck      : ");
    Serial.print(luftDruck);
    Serial.println(" hPa");

    redLuftDruck = BMP.readReducedPress(hoehe);
    Serial.print("Reduz.Luftdruck: ");
    Serial.print(redLuftDruck);
    Serial.println(" hPa");
    Serial.print("Hoehe          : ");
    Serial.print(hoehe);
    Serial.println(" m");
    Serial.println();
  }

  File dataFile = SD.open("werte.csv", FILE_WRITE);

  if (dataFile) {
    dataFile.print(now.year(), DEC);
    dataFile.print('/');
    dataFile.print(now.month(), DEC);
    dataFile.print('/');
    dataFile.print(now.day(), DEC);
    dataFile.print(" ");
    dataFile.print(now.hour(), DEC);
    dataFile.print(':');
    if (now.minute() < 10)  {
      dataFile.print("0");
      dataFile.print(now.minute(), DEC);
    } else {
      dataFile.print(now.minute(), DEC);
    }

    dataFile.print(':');
    if (now.second() < 10)  {
      dataFile.print("0");
      dataFile.print(now.second(), DEC);
    } else {
      dataFile.print(now.second(), DEC);
    }
    dataFile.print(";");
    dataFile.print(luftTemp);
    dataFile.print(";");
    dataFile.print(luftDruck);
    dataFile.print(";");
    dataFile.println(redLuftDruck);

    dataFile.close();

  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening werte.csv");
  }

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("test");
  display.display();
  display.clearDisplay();

  delay(60000);
}

Du sprachst von einem Code-Teil an falscher Stelle. Welcher???

Der Teil wo du dein Display beschreibst.
Pack den Teil doch in eine Funktion, dann kannst du den Funktionsaufruf einfach mal verschieben.

Nach mehreren erfolglosen Versuchen Programmteile zu verschieben, habe ich nun eine andere Display-Bibliothek verwendet. Mit der Libary ssd1306ascii konnte ich nun das Display korrekt ansteuern. Viel Dank!

emmett_brown_76:
Nach mehreren erfolglosen Versuchen Programmteile zu verschieben, habe ich nun eine andere Display-Bibliothek verwendet. Mit der Libary ssd1306ascii konnte ich nun das Display korrekt ansteuern. Viel Dank!

Mit diesen Einstellungen?

const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)

Adafruit_SSD1306 display(4);

Benutzt Du für das Display jetzt auch für ChipSelect PIN 4 und Hardware SPI für SD-Karte und Display oder bist Du dem Example gefolgt und jetzt PIN 7?

Ich habe jetzt folgenden Code benutzt der wohl für das Display den PIN -1 verwendet.

#define I2C_ADDRESS 0x3C

SSD1306AsciiWire oled;

const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)

void setup () {



  Serial.begin(9600);

  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x32, I2C_ADDRESS,-1);
  oled.setFont(System5x7); // Auswahl der Schriftart
  oled.clear();

Das funktionert soweit. Nur flackert das Display leicht, wenn die loop-Schleife durchlaufen und es neu beschrieben wird. Das ging mit der Adafriut-Libary (ohne Daten-Logger) besser.

Dieser Code funktioniert garantiert nicht, da er unvollständig ist.

Gruß Tommy

#include <Wire.h>
#include <SPI.h>
#include <RTClib.h>
#include <MyBMP280.h>
#include <Metro.h>
#include <SD.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C

SSD1306AsciiWire oled;

const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)

RTC_DS1307 rtc;

MyBMP280 BMP(0x76);
Metro leseZyklus = Metro(1000); //Zykluszeit in ms für Auslesen des Sensors


int hoehe = 285; //Messort: 460 m über dem Meer
float luftTemp, luftDruck, redLuftDruck;




void setup () {



  Serial.begin(9600);

  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x32, I2C_ADDRESS, -1);
  oled.setFont(System5x7); // Auswahl der Schriftart
  oled.clear();


  if (BMP.isReady()) Serial.println("BMP280 Ok!");
  else
  {
    Serial.println("BMP280 Fehler!");
    while (1); //Im Fehlerfall geht's hier nicht weiter!
  }

  BMP.setPressOversampling(BMP280_P_OVERSAMPLING_x2); //Ändere Druck-Oversampling Parameter
  BMP.init();

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println("RTC adjusted!");
  }

  Serial.print("Initializing SD card...");
  oled.println("SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    oled.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
  oled.print("card initialized.");

  delay(5000);


}

void loop () {
  long runtime = millis() / 60000;

  DateTime now = rtc.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');

  if (now.minute() < 10)  {
    Serial.print("0");
    Serial.print(now.minute(), DEC);
  } else {
    Serial.print(now.minute(), DEC);
  }
  Serial.print(':');
  if (now.second() < 10)  {
    Serial.print("0");
    Serial.println(now.second(), DEC);
  } else {
    Serial.println(now.second(), DEC);
  }

  if (leseZyklus.check())
  {
    luftTemp = BMP.readTemp();
    Serial.print("Lufttmperatur  : ");
    Serial.print(luftTemp);
    Serial.println(" Grad C");

    luftDruck = BMP.readPress();
    Serial.print("Luftdruck      : ");
    Serial.print(luftDruck);
    Serial.println(" hPa");

    redLuftDruck = BMP.readReducedPress(hoehe);
    Serial.print("Reduz.Luftdruck: ");
    Serial.print(redLuftDruck);
    Serial.println(" hPa");
    Serial.print("Hoehe          : ");
    Serial.print(hoehe);
    Serial.println(" m");
    Serial.println();
  }



  File dataFile = SD.open("werte.csv", FILE_WRITE);

  if (dataFile) {
    dataFile.print(now.year(), DEC);
    dataFile.print('/');
    dataFile.print(now.month(), DEC);
    dataFile.print('/');
    dataFile.print(now.day(), DEC);
    dataFile.print(" ");
    dataFile.print(now.hour(), DEC);
    dataFile.print(':');
    if (now.minute() < 10)  {
      dataFile.print("0");
      dataFile.print(now.minute(), DEC);
    } else {
      dataFile.print(now.minute(), DEC);
    }

    dataFile.print(':');
    if (now.second() < 10)  {
      dataFile.print("0");
      dataFile.print(now.second(), DEC);
    } else {
      dataFile.print(now.second(), DEC);
    }
    dataFile.print(";");
    dataFile.print(luftTemp);
    dataFile.print(";");
    dataFile.print(luftDruck);
    dataFile.print(";");
    dataFile.println(redLuftDruck);

    dataFile.close();

  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening werte.csv");
  }

  oled.setFont(System5x7); // Auswahl der Schriftart
  oled.clear(); //Löschen der aktuellen Displayanzeige
  oled.print(now.year(), DEC);
  oled.print('/');
  oled.print(now.month(), DEC);
  oled.print('/');
  oled.print(now.day(), DEC);
  oled.print(" ");
  oled.print(now.hour(), DEC);
  oled.print(':');

  if (now.minute() < 10)  {
    oled.print("0");
    oled.println(now.minute(), DEC);
  } else {
    oled.println(now.minute(), DEC);

  }
  oled.println("");
  oled.print(luftTemp);
  oled.print(" C ");
  oled.print(redLuftDruck);
  oled.println(" hPa");
  oled.print(hoehe);
  oled.print(" m ");
  oled.print(runtime);
  oled.print(" min");

  delay(60000);
}

Das flackert, weil Du immer das ganze Display löschst und neu beschreibst.
Schreibe nur das neu, was sich geändert hat.

Gruß Tommy

Mit dem delay(60000); muss man aber sehr genau und lange hinschauen, um etwas flackern zu sehen. Und ob zu diesem delay noch etwas Zeit für die SD Karte und die vielen Serial.print() hinzukommt, sollte eigentlich keine Rolle spielen. Außer da ist eine Pin-Überschneidung und das Display zuckt schon merklich vor dem oled.clear();

Das oled.setFont(System5x7); kann auf jeden Fall aus loop() raus.

Bitte mach doch mal ein Foto von Deinem Aufbau. Wenn Du es GENAU schaffst Deine KOMPLETTE Verdratung aufzuschreiben, kannst Du das auch tun, aber Wenn man das selbst auslesen kan, ist es einfacher und vor allem sinnvoller.

Wenn möglich so, das man sieht was am MEGA angesteckt und belegt ist.
Ich schliesse mich michael_x an und hab ne Vermutung…

Vielen Dank für die sehr kompente Hilfe bisher. Ich finde mich schon mehr und mehr in die Materie ein. Leider habe ich das Board momentan nicht zur Hand (liegt zu Hause - ich auf Arbeit).

Kurz zur Beschreibung:

Auf dem Arduino Uno (kompatibel)

steckt der Data-Logger-RTC-Shield:

Das Display

und der Temperatur/Luftdrucksensor

sind über ein Micro-Breadboard am SDA und SCL entsprechend parallel über den Shield am Uno SDA- bzw. SCL-PIN (nicht A4 bzw. A5 sondern den neben AREF) angeschlossen.

Das Display wird mit 5V und der Sensor mit 3,3 V betrieben. Also Vcc am jeweiligen Spannungspin und GND an GND.

Die Verkabelung ist also recht simple.

Foto kommt erst heute Abend. Vielen Dank schonmal im Voraus!

Was ich noch kritisch sehe, ist die Verwendung von 3,3V I2C-Module und 5V I2C-Module an einem Bus.
Hier kann es am I2C-Bus zu Problemen kommen, wenn alle Module eigene Pullup-Widerstände enthalten.
Dann sollte unbedingt mit einem Levelshifter gearbeitet werden.

Beim BMP280 sieht mir das danach aus, beim Display ist das schwer zu erkennen.

Da solltest du unbedingt mal nachmessen, ob Widerstände verbaut sind.
Jeweils per Ohmmeter an SDA und SCL gegen VCC messen. Aber im nicht gesteckten Zustand.