Hi everyone,
i'm relatively new to programming arduinos and right now i need some help to get my 128x32 OLED display working.
It works fine in a standalone solution, but when i implement it in my whole project code, it shows "Allocation failed". Research on here showed me that the problem is most likely caused by not having enough available RAM memory.
I've improved the things i could, but most topics solutions are very specific, so i hope you can help me downsize my code.
I am using an Arduino Uno.
Thank you and have a great day.
-Maik
unsigned long currentTime;
//Button
byte buttonPin = 9;
int butRead;
//Wasserpumpe
const byte pumpPin=4;
//Temperatur- & Feuchtigkeitssensor DHT22:
#include <DHT.h>
#define DHTTYPE DHT22
const byte DHTPin=8;
DHT dht(DHTPin, DHTTYPE);
const unsigned long eventTime_1=1000;
unsigned long previousTime_1 = 0;
float h;
float t;
//Bodenfeuchtigkeit:
const byte moistPin=A0;
int sensValMoist;
int dry=615;
int wet=241;
int moistPercentage;
const unsigned long eventTime_2=1000;
unsigned long previousTime_2 = 0;
//Wasserzerstaeuber
const byte waterPin=1;
//RTC (Real-Time-Clock)
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
DateTime now;
//SD Card
#include <SD.h>
#include <SPI.h>
File myFile;
const byte pinCS=10;
const unsigned long eventTime_3=10000;
unsigned long previousTime_3 = 0;
//Display 128X32
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
analogReference(EXTERNAL);
dht.begin();
pinMode(moistPin,INPUT);
pinMode(buttonPin,INPUT);
pinMode(DHTPin,INPUT);
pinMode(waterPin,OUTPUT);
pinMode(pumpPin,OUTPUT);
pinMode(pinCS,OUTPUT);
digitalWrite(pinCS,HIGH);
//RTC (Real-Time-Clock)
rtc.begin();
Wire.begin();
if(!rtc.begin()){
Serial.println("Couldn't find RTC");
}
if(!rtc.isrunning()){
Serial.println("RTC is NOT running");
}
//rtc.adjust(DateTime(__DATE__, __TIME__)); //Zeit/Datum neu justieren
//SD Card
if (SD.begin()){
Serial.println("SD card is ready to use.");
} else {
Serial.println("SD card initialization failed");
}
// SD.remove("datalog.txt"); //Deleting Textfile
//Display 128x32
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
}
void loop() {
//Temperatur- & Feuchtigkeitssensor DHT22:
currentTime = millis();
if (currentTime - previousTime_1 >= eventTime_1){
h = dht.readHumidity();
t = dht.readTemperature();
Serial.print("Humidity: ");
Serial.print(h);
Serial.print("% ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print("°C ");
previousTime_1 = currentTime;
}
//Bodenfeuchtigkeit:
currentTime = millis();
if(currentTime - previousTime_2 >= eventTime_2){
sensValMoist = analogRead(moistPin);
moistPercentage=map(sensValMoist, dry, wet, 0, 100);
if(moistPercentage<0){
moistPercentage=0;
}
Serial.print("Moisture: ");
Serial.print(moistPercentage);
Serial.println("% ");
previousTime_2 = currentTime;
}
//ButtonPin
butRead = digitalRead(buttonPin);
if(butRead==1){
// digitalWrite(waterPin,HIGH);} //Wasserzerstaeuber
// else{
// digitalWrite(waterPin,LOW);
digitalWrite(pumpPin,HIGH);} //Pumpe
else{
digitalWrite(pumpPin,LOW);
}
//RTC
now=rtc.now();
// if(now.day()<10){ //Uhrzeit anzeigen
// Serial.print("0");
// }
// Serial.print(now.day(), DEC);
// Serial.print("/");
// if(now.month()<10){
// Serial.print("0");
// }
// Serial.print(now.month(), DEC);
// Serial.print("/");
// Serial.print(now.year(), DEC);
// Serial.print(" ");
// if(now.hour()<10){
// Serial.print("0");
// }
// Serial.print(now.hour(),DEC);
// Serial.print(":");
// if(now.minute()<10){
// Serial.print("0");
// }
// Serial.print(now.minute(),DEC);
// Serial.print(":");
// if(now.second()<10){
// Serial.print("0");
// }
// Serial.print(now.second(),DEC);
// Serial.println();
//SD Card
currentTime = millis();
if (currentTime - previousTime_3 >= eventTime_3){
myFile = SD.open("datalog.txt",FILE_WRITE); //Create/Open file
if (myFile){ //if the file opened okay, write to it
if(now.day()<10){
myFile.print("0");
}
myFile.print(now.day(),DEC);
myFile.print(" ");
if(now.month()<10){
myFile.print("0");
}
myFile.print(now.month(),DEC);
myFile.print(" ");
myFile.print(now.year(),DEC);
myFile.print(" ");
if(now.hour()<10){
myFile.print("0");
}
myFile.print(now.hour(),DEC);
myFile.print(" ");
if(now.minute()<10){
myFile.print("0");
}
myFile.print(now.minute(),DEC);
myFile.print(" ");
if(now.second()<10){
myFile.print("0");
}
myFile.print(now.second(),DEC);
myFile.print(" ");
myFile.print(t);
myFile.print("°C");
myFile.print(" ");
myFile.print(h);
myFile.print("%");
myFile.print(" ");
myFile.print(moistPercentage);
myFile.print("%");
myFile.println();
myFile.close();
}
else{ //if the file didn't open, print an error
Serial.println("Error opening file");
}
previousTime_3=currentTime;
}
// // myFile=SD.open("datalog.txt"); //Reading the file
// // if(myFile){
// // Serial.println("Read: ");
// // while (myFile.available()){ //Reading the whole file
// // Serial.write(myFile.read());
// // }
// // myFile.close();
// // }
// // else{
// // Serial.println("Error opening file");
// // }
//Display 128x32
display.clearDisplay(); // Clear display buffer
display.drawLine(40, 0, 40, display.height()-1, SSD1306_WHITE);
display.drawLine(86, 0, 86, display.height()-1, SSD1306_WHITE);
display.setTextColor(SSD1306_WHITE); // Draw white text
display.cp437(true); // Use full 256 char 'Code Page 437' font
display.setTextSize(1); // Normal 1:1 pixel scale
display.setCursor(6, 0);
display.write("Temp");
display.setTextSize(2);
display.setCursor(7, 15);
display.write("22");
display.setTextSize(1);
display.write(248);
display.setTextSize(1);
display.setCursor(54, 0);
display.write("Hum");
display.setTextSize(2);
display.setCursor(51, 15);
display.write("70");
display.setTextSize(1);
display.write(37);
display.setTextSize(1);
display.setCursor(96, 0);
display.write("Moist");
display.setTextSize(2);
display.setCursor(97, 15);
display.write("30");
display.setTextSize(1);
display.write(37);
display.display(); // Update screen with each newly-drawn line
delay(500);
}