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!