Hallo zusammen,
ich habe ein Projekt mit einigen Breakout Boards realisiert:
1x RTC_DS1307
1x DHT11
1x BMP085
1 TFT Display inkl. SD Card
Nun sollen mir die Daten auf dem Display und der SD ausgegeben werden. Der Code funktioniert soweit. Jedoch ist der Speicher 31.072 Bytes (von einem Maximum von 32.256 Bytes) fast voll.
Was mache ich falsch? Kann ich noch irgendwie Speicher zurückgewinnen?
#include <TinyDHT.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_ST7735.h>
#include <Adafruit_GFX.h>
#include <SD.h>
#include <Adafruit_BMP085.h>
//#include <DHT.h>
#include <RTClib.h>
#define file "log1.txt"
//Display
//mosi=11=grün, sclk=13=blau
#define tft_cs 10 //rot
#define tft_dc 9 //schwarz
#define tft_rst 8 //gelb
Adafruit_ST7735 tft = Adafruit_ST7735(tft_cs, tft_dc, tft_rst);
//SD
#define sd_cs 7
//RTC
RTC_DS1307 RTC;
//Sensoren
//DTH11
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//DHT dht;
#define dhtPin 2
DHT dht(dhtPin, DHTTYPE);
//BMP085
Adafruit_BMP085 bmp;
void setup(){
// Serial.begin(9600);
// Initialisiere RTC
RTC.begin();
// Prüfen ob RTC läuft
if (! RTC.isrunning()) {
// Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht läuft
RTC.adjust(DateTime(__DATE__, __TIME__));
// Serial.println("Echtzeituhr wurde gestartet und auf Systemzeit gesetzt.");
}
// else Serial.println("Echtzeituhr laeuft bereits.");
// DHT Sensor initialisieren
dht.begin();
// dht.setup(dhtPin);
//BMP Sensor initialisieren
bmp.begin();
//SD Init
// Serial.print("Initializing SD card...");
pinMode(10, OUTPUT);
if (!SD.begin(sd_cs)) {
// Serial.println("initialization failed!");
return;
}
// Serial.println("initialization done.");
//TFT
tft.initR(INITR_BLACKTAB); // ST7735-Chip initialisieren
tft.setRotation(1);
tft.fillScreen(ST7735_BLUE);
int y=0;
tft.setCursor(0,y);
tft.print("Temperatur S1 :");
tft.setCursor(0,y+=10);
tft.print("Temperatur S2 :");
tft.setCursor(0,y+=10);
tft.print("Luftfeuchtigkeit:");
tft.setCursor(0,y+=10);
tft.print("Barometer :");
tft.setCursor(0,y+=10);
tft.print("Hoehe :");
tft.setCursor(0,y+=10);
tft.print("Datum Uhrzeit :");
}
void loop(){
DateTime now=RTC.now();
int8_t lDHT11 = dht.readHumidity();
int16_t tDHT11 = dht.readTemperature(0);
// float tDHT11 = dht.getTemperature(); // Auslesen der Luftfeuchtigkeit DHT11
// float lDHT11 = dht.getHumidity(); // Auslesen der Temperatur DHT11
float tBMP = bmp.readTemperature(); // Auslesen der Temperatur BMP085
int32_t pBMP = bmp.readPressure(); // Auslesen des Drucks BMP085
float aBMP = bmp.readAltitude(); // Auslesen der Hoehe BMP085
//aktualisiere TFT
displayTFT(tDHT11, lDHT11, tBMP, pBMP, aBMP, getTimestamp(now));
writeToSD(tDHT11, lDHT11, tBMP, pBMP, aBMP, getTimestamp(now));
}
void displayTFT(int16_t tDHT11, int8_t lDHT11, float tBMP, int32_t pBMP, float aBMP, String timeStamp){
int color = ST7735_WHITE;
//DHT11Temp
set_text(105,0,tDHT11,color,1);
tft.write(247);tft.print("C");
//DHT11Hum
set_text(105,20,lDHT11,color,1);
tft.print("%");
//BMP085Temp
set_text(105,10,tBMP,color,1);
tft.write(247);tft.print("C");
//BMP085Druck
set_text(105,30,pBMP/100,color,1);
tft.print("hPa");
//BMP085Höhe
set_text(105,40,aBMP,color,1);
tft.print("m");
//Datum UHrzeit
set_text(0,60,timeStamp,color,1);
//Delay und Reset
delay(3000);
color = ST7735_BLUE;
set_text(105,0,tDHT11,color,1);
set_text(105,20,lDHT11,color,1);
set_text(105,10,tBMP,color,1);
set_text(105,30,pBMP/100,color,1);
set_text(105,40,aBMP,color,1);
set_text(0,60,timeStamp,color,1);
}
void set_text(int x,int y,String f,int color,int size){
tft.setTextSize(size);
tft.setCursor(x,y);
tft.setTextColor(color);
tft.print(f);
}
void set_text(int x,int y,float f,int color,int size){
tft.setTextSize(size);
tft.setCursor(x,y);
tft.setTextColor(color);
tft.print(f);
}
void set_text(int x,int y,int8_t f,int color,int size){
tft.setTextSize(size);
tft.setCursor(x,y);
tft.setTextColor(color);
tft.print(f);
}
void set_text(int x,int y,int16_t f,int color,int size){
tft.setTextSize(size);
tft.setCursor(x,y);
tft.setTextColor(color);
tft.print(f);
}
void set_text(int x,int y,int32_t f,int color,int size){
tft.setTextSize(size);
tft.setCursor(x,y);
tft.setTextColor(color);
tft.print(f);
}
void writeToSD(int16_t tDHT11, int8_t lDHT11, float tBMP, int32_t pBMP, float aBMP, String timeStamp){
File myFile = SD.open(file, FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
String text = "Writing to " + String(file);
Serial.print(text);
myFile.print(timeStamp);
myFile.print(";");
myFile.print(tDHT11);
myFile.print(";");
myFile.print(lDHT11);
myFile.print(";");
myFile.print(tBMP);
myFile.print(";");
myFile.print(pBMP);
myFile.print(";");
myFile.print(aBMP);
myFile.println();
// close the file:
myFile.close();
}
else {
// if the file didn't open, print an error:
// Serial.println("error opening " + String(file));
}
}
String getTimestamp(DateTime datetime){
String stamp;
if(datetime.day()<10)stamp += 0;
stamp += datetime.day();
stamp += ".";
if(datetime.month()<10) stamp += 0;
stamp += datetime.month();
stamp += ".";
stamp += datetime.year();
stamp += " ";
if(datetime.hour()<10)stamp +=0;
stamp += datetime.hour();
stamp += ":";
if(datetime.minute()<10)stamp += 0;
stamp += datetime.minute();
stamp += ":";
if(datetime.second()<10)stamp += 0;
stamp += datetime.second();
return stamp;
}