INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ram Speicher bei Arduino Mega wird knapp
02.02.2019, 15:12
Beitrag #17
RE: Ram Speicher bei Arduino Mega wird knapp
(02.02.2019 13:27)Tommy56 schrieb:  Ich nehme mal an, Du hast meine Vorschläge und die der Anderen umgesetzt.

Jetzt wäre es an der Zeit, Deinen Sketch aufzuräumen und ordentlich zu formatieren. So wie er ist, wird sich wohl kaum jemand tiefer darin einarbeiten.

Das Ergebnis solltest Du dann wieder hier vorstellen.

Gruß Tommy
Hier ist der Sketch in leicht überarbeiteter und aufgeräumter Form:
Code:
#include <SFE_BMP180.h>
#include <SimpleDHT.h>
#include <MQ2Lib.h>
#include <DCF77.h>
#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <TouchScreen.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>


#if defined(__SAM3X8E__)
    #undef __FlashStringHelper::F(string_literal)
    #define F(string_literal) string_literal
#endif


#define YP A3  
#define XM A2  
#define YM 9  
#define XP 8  

#define SD_CS 10  

#define TS_MINX 880
#define TS_MINY 100
#define TS_MAXX 130
#define TS_MAXY 910


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

#define LCD_CS A3
#define LCD_RS A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4


#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF


Adafruit_TFTLCD tft(LCD_CS, LCD_RS, LCD_WR, LCD_RD, LCD_RESET);


#define BOXSIZEX 120
#define BOXSIZEY 100
#define PENRADIUS 3

#define DCF_INTERRUPT  3
#define DCF_PIN 24

#define MINPRESSURE 10
#define MAXPRESSURE 1000

char time_s[9];
char date_s[11];

int i = 0;
int UP = 53;
int DOWN = 49;

time_t prevDisplay = 0;
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);
int g = 0;
int menue = 0;
int MQ2_Pin = A15;
float lpg,co,smoke;
MQ2 mq2(MQ2_Pin, true);

int pinDHT22 = 18;
SimpleDHT22 dht22(pinDHT22);

float temperature = 0;
float humidity = 0;

SFE_BMP180 pressure;
  char status;
  double T,P,p0,a;

int u = 0;
int r = 0;
  
void setup() {
   pinMode(UP, OUTPUT);
pinMode(DOWN, OUTPUT);
digitalWrite(DOWN, LOW);
digitalWrite(UP, LOW);
  if (pressure.begin())
mq2.begin();

   tft.reset();
  uint16_t identifier = tft.readID();
identifier=0x9341;
  tft.begin(identifier);

  DCF.Start();
  setSyncInterval(30);
  setSyncProvider(getDCFTime);
  Serial.begin(9600);
  Serial.println(F("================================================================================​================================================================================​================================================================================​===="));
  Serial.println(F("Physik Projekt von Leon Warncke und Paul Neumann"));
  Serial.println(F("Bis Genaue Zeit- und Datumsangaben vorliegen kann es einige Minuten dauern"));
  Serial.println(F("Powered by Arduino"));
  DCF.getTime();
  tft.fillScreen(BLACK);
  Serial.println(F("Tft erfolgreich gestartet"));
  pinMode(UP, OUTPUT);
  pinMode(DOWN, OUTPUT);
  digitalWrite(DOWN, LOW);
  digitalWrite(UP, LOW);
  tft.setCursor(0,0);
  tft.setRotation(2);
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.println(F("Physik Projekt "));
  tft.println(F("Wetterstation"));
  tft.setTextColor(CYAN);
  tft.setTextSize(1);
  tft.setCursor(0,300);
  tft.println(F("Powered by Arduino and developed by:"));
  tft.println(F("Leon Warncke and Paul Neumann"));
  delay(1000);
  tft.setCursor(0, 160);
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.println(F("Starte..."));
  tft.setTextColor(RED);
  tft.setTextSize(2);
  tft.println(F("!Bis genaue Zeitdaten vorliegen,"));
  tft.println(F("kann es einige Minuten dauern!"));
  digitalWrite(UP, HIGH);
  digitalWrite(DOWN, HIGH);
  delay(1000);
  digitalWrite(UP, LOW);
  digitalWrite(DOWN, LOW);


  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
   //tft.fillScreen(WHITE);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("Objekte gezeichnet!"));
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  
  LT();
  
}

void loop() {
  interrupts();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  freeRam();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  getDCFTime();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  GUI();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  action();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
}
void debug(){
  if(menue > 6){
    Serial.println(F(" "));
    Serial.println(F("Debug"));
    Serial.print(menue);
    menue = 0;
    if(menue > 100){
       menue = 0;
       r++;
    tft.reset();
    uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));Serial.print(r);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  GUI();
    }else{
      GUI();
    }
     menue = 0;
    return menue;
  }else if(menue < 0){
    Serial.println(" ");
    Serial.println("Debug");
    Serial.println(menue);
    menue = 5;
    if(menue < -100){
      menue = 5;
    r++;
    tft.reset();
    uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));Serial.print(r);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  GUI();
    }
    GUI();
  return menue;
  }else if(menue > 100){
    r++;
    tft.reset();
    uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));Serial.print(r);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  GUI();
  }else if(menue <-100){
    r++;
    tft.reset();
    uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));Serial.print(r);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  GUI();
  }
}
unsigned long getDCFTime() //Zeitempfang
{
  Serial.println(F("Arbeitsspeicher: "));
  Serial.println(freeRam());
  Serial.println(F(" "));
  Serial.println(F("Suche nach neuer Systemzeit..."));
  time_t DCFtime = DCF.getTime();
  if (DCFtime!=0) {  
    digitalWrite(UP, HIGH);
    digitalWrite(DOWN, HIGH);
    setTime(DCFtime);//Neue Systemzeit setzen
    Serial.print(F("Neue Zeit erhalten : ")); //Ausgabe an seriell
    Serial.print(F("  "));
    Serial.print(F("X"));  
     action();
  }else {
     action();
  }
  action();
  return DCFtime;
}
void GUI(){
  debug();
Serial.println(F("GUI"));
Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  if(u >= 120){
    r++;
    tft.reset();
    uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));Serial.print(r);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  u=0;
  }
  i++;
  if(i>2){
    i = 0;
    action();
  }
  tft.setTextSize(1);
  tft.setTextColor(GREEN);
  tft.setCursor(30,340);
  tft.println(F("Menueindex:"));
  tft.setCursor(30,350);
  tft.println(menue);
for(int y = 0;y<750;y+=7){
  delay(7);
  action();
}
  tft.fillRect(10,350,30,30,BLACK);
switch (menue){
  case -1:
  menue = 5;
  action();
  break;
  case 0:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;
  unsigned long currentMillis = millis();
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(3);
  tft.setTextColor(YELLOW);
  tft.print(F("Zeit: "));
  if(currentMillis - previousMillis > interval) {
    action();
    previousMillis = currentMillis;  
    if (a == false){
      action();
      tft.setCursor(10, 230);
      tft.print(hour());
      tft.setCursor(50, 230);
      tft.print(F(":"));
      tft.setCursor(70,230);
      tft.print(minute());
      tft.setCursor(120, 230);
      tft.print(second());
      tft.setTextSize(1);
      tft.setTextColor(YELLOW);
      tft.setCursor(10,300);
      tft.println(F("Menueindex:"));
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      Serial.println(F("Zeit: "));
      getDCFTime();
      action();
      GUI();
    }else{
tft.fillRect(10, 200,300, 400, BLACK);
tft.fillRect(10,310,10,10,BLACK);
a =false;
action();
    }
    }
action();
  }
  break;
  
  case 1:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;    
  unsigned long currentMillis = millis();
  boolean b = false;
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(3);
  tft.setTextColor(BLUE);
  tft.print(F("Datum:"));
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    if (b == false){
      b = true;
      tft.setCursor(10, 230);
      tft.print(day());
      tft.setCursor(50, 230);
      tft.print(":");
      tft.setCursor(70,230);
      tft.print(month());
      tft.setCursor(120, 230);
      tft.print(year());
      tft.setTextSize(1);
      tft.setTextColor(BLUE);
      tft.setCursor(10,300);
      tft.println("Menueindex:");
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      Serial.println(F("Datum"));
      b=true;
      getDCFTime();
      action();
      GUI();
    }else{
  tft.fillRect(10, 200,300, 400, BLACK);
  tft.fillRect(10,310,10,10,BLACK);
  b=false;
    }
  }
action();
}
  break;
  
  case 2:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;    
  unsigned long currentMillis = millis();
  boolean c = false;
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(3);
  tft.setTextColor(GREEN);
  tft.print(F("Temperatur:"));
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    if (c == false){
      c = true;
      tft.setTextSize(3);
      tft.setCursor(10, 230);
      tft.print(temperature);
      tft.setCursor(100, 230);
      tft.print(F("C"));
      tft.setTextSize(1);
      tft.setTextColor(GREEN);
      tft.setCursor(10,300);
      tft.println(F("Menueindex:"));
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      Serial.print(F("Temperatur:"));
      c=true;
      getDCFTime();
      action();
      GUI();
    }else{
tft.fillRect(10, 200,300, 400, BLACK);
tft.fillRect(10,310,10,10,BLACK);
c=false;
    }
  }
action();
}
  break;
  
  case 3:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;    
  unsigned long currentMillis = millis();
  boolean d = false;
  LuftDruck();
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(3);
  tft.setTextColor(CYAN);
  tft.print("Luftdruck:");
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    if (d == false){
      d = true;
      tft.setTextSize(2);
      tft.setCursor(10, 230);
      tft.print(p0);
      tft.setCursor(90, 230);
      tft.print(F("Hektopascal"));
      tft.setTextSize(1);
      tft.setTextColor(CYAN);
      tft.setCursor(10,300);
      tft.println("Menueindex:");
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      Serial.println(F("Luftdruck:"));
      d=true;
      getDCFTime();
      action();
      GUI();
    
    }else{
tft.fillRect(10, 200,300, 400, BLACK);
tft.fillRect(10,310,10,10,BLACK);
d=false;
    }
  }
  action();
  }
  break;
  
  case 4:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;    
  unsigned long currentMillis = millis();
  boolean e = false;
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(2);
  tft.setTextColor(MAGENTA);
  tft.print(F("Luftfeuchtigkeit: "));
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    if (e == false){
      e = true;
      action();
      tft.setTextSize(3);
      tft.setCursor(10, 235);
      tft.print(humidity);
      tft.setCursor(100, 235);
      tft.print("%");  
      tft.setTextSize(1);
      tft.setTextColor(MAGENTA);
      tft.setCursor(10,300);
      tft.println(F("Menueindex:"));
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      e=true;
      getDCFTime();
      action();
      GUI();
    
    }else{
tft.fillRect(10, 200,300, 400, BLACK);
tft.fillRect(10,310,10,10,BLACK);
e= false;
    }
  }
action();
  }
  break;
  
  case 5:
  {
   Serial.println(F("Uebermalt: "));
   u++;
   Serial.println(F("Gas: "));
   Gas();
  long previousMillis = 0;        
  unsigned long currentMillis = millis();
  long interval = 999;    
  boolean f = false;
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(2);
  tft.setTextColor(RED);
  tft.print(F("Gas:"));
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    if (f == false){
      action();
       tft.setCursor(10, 200);
       tft.print(F("Lpg:"));
       tft.setCursor(80, 200);
       tft.print(lpg);
       tft.setCursor(140,200);
       tft.print(F("ppm"));
       tft.setCursor(10,220);
       tft.print(F("Co:"));
       tft.setCursor(80, 220);
       tft.print(co);
       tft.setCursor(140,220);
       tft.print(F("ppm"));
       tft.setCursor(10,240);
       tft.print(F("Rauch:"));
       tft.setCursor(80,240);
       tft.print(smoke);
       tft.setCursor(140,240);
       tft.print(F("ppm"));
       tft.setTextSize(1);
       tft.setTextColor(RED);
       tft.setCursor(10,300);
       tft.println(F("Menueindex:"));
       tft.setCursor(10,310);
       tft.println(menue);
       f=true;
       getDCFTime();
       action();
       GUI();
    }
    else{
tft.fillRect(10, 200,300, 400, BLACK);
tft.fillRect(10,310,10,10,BLACK);
Serial.println(F("aus"));
f=false;
    }
  }
action();
  }
  break;
  case 6:
  menue = 0;
action();
  break;
}
}
  
void action(){
   TSPoint p = ts.getPoint();
  digitalWrite(13, LOW);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
    p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);
    Serial.println(F(" "));
   if(p.x>=0&&p.y<=313&&p.x<119&&p.y>=207){
    Serial.println(F("touched+"));
    menue = menue+1;
    Serial.println(menue);
     digitalWrite(DOWN, LOW);
    digitalWrite(UP,HIGH);
    delay(100);
    digitalWrite(UP, LOW);
    if(menue > 6){
   debug();
  }
    GUI();
    debug();
    return menue;
    digitalWrite(UP, LOW);
   }
   if(p.x>=121&&p.x<=250&&p.y<=325&&p.y>=215){
    menue = menue -1;
    Serial.println(F("touched-"));
    Serial.println(menue);
    digitalWrite(UP, LOW);
    digitalWrite(DOWN, HIGH);
    delay(100);
     digitalWrite(DOWN, LOW);
     if(menue < 0){
    debug();
  }
    GUI();
    debug();
    return menue;
    digitalWrite(DOWN, LOW);
   }
    Serial.println(menue);
    GUI();
}
}
char* sprintTime() {
  snprintf(time_s,sizeof(time_s),"%.2d:%.2d:%.2d" , hour(), minute(), second());
  time_s[strlen(time_s)] = '\0';
  return time_s;
}

char* sprintDate() {
  snprintf(date_s,sizeof(date_s),"%.2d.%.2d.%.4d" , day(), month(), year());
  date_s[strlen(date_s)] = '\0';
  return date_s;
} //Dekodierung von Daten durch DCF77 Empfänger

void Gas(){
float* values= mq2.read(false);
  lpg = mq2.readLPG();
  co = mq2.readCO();
  smoke = mq2.readSmoke();
  return smoke;
  return co;
  return lpg;
}

void LT(){
  Serial.println(F("LT"));
  int err = SimpleDHTErrSuccess;
  if ((err = dht22.read2(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.println(F("Read DHT22 failed, err=")); Serial.println(err);delay(2000);
    return;
  }
  return humidity;
  return temperature;
  for(int i = 0; i<2500;i++){
    delay(1);
    action();
  }
  GUI();
}

void LuftDruck(){
  Serial.println(F("Luftdruck"));
  status = pressure.startTemperature();
  if (status != 0)
  {
    delay(status);
    // Retrieve the completed temperature measurement:
    // Note that the measurement is stored in the variable T.
    // Function returns 1 if successful, 0 if failure.
    status = pressure.getTemperature(T);
    if (status != 0)
    {
      // Start a pressure measurement:
      // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
      // If request is successful, the number of ms to wait is returned.
      // If request is unsuccessful, 0 is returned.

   status = pressure.startPressure(3);
      if (status != 0)
      {
        // Wait for the measurement to complete:
        delay(status);
   status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // Print out the measurement:
        //   Serial.println("================================================================================​================================================================================​================================================================================​====");
          Serial.print(F("Druck: "));
          Serial.print(P,2);
          Serial.print(F(" mb, "));
          Serial.print(P*0.0295333727,2);
          Serial.println(F(" inHg"));
          p0 = pressure.sealevel(P,13); // we're at 1655 meters (Boulder, CO)
          Serial.print(F("Druck auf Meeresniveau: "));
          Serial.print(p0,2);
          Serial.print(F(" mb, "));
          Serial.print(p0*0.0295333727,2);
          Serial.println(F(" inHg"));
          
        }
}
}
  }
}
int freeRam () {
   extern int __heap_start, *__brkval;
   int v;
   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
   Serial.println(F("Arbeitsspeicher: "));
   Serial.println(freeRam());
}
Code als Datei:


Angehängte Datei(en)
.ino  Physik_Projekt_Sketch.ino (Größe: 21,6 KB / Downloads: 16)

Huh
Von den vielen Dingen die ich verloren habe vermisse ich am meisten meinen Verstand. -Ozzy Osbourne
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2019, 15:38 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2019 15:39 von Tommy56.)
Beitrag #18
RE: Ram Speicher bei Arduino Mega wird knapp
Naja, über aufgeräumten Code bin ich wohl anderer Meinung, als Du. Ich muss ihn aber auch nicht verstehen.
Du verschenkst immer noch RAM durch unüberlegte int-Variablen. Auch sinnvolle lokale Variablen und damit Verzicht auf globale Variablen könnten Dir Luft verschaffen.

Hier mal ein Beispiel für unsinnigen Code:
Code:
void LT(){
  Serial.println(F("LT"));
  int err = SimpleDHTErrSuccess;
  if ((err = dht22.read2(&temperature, &humidity, NULL)) != simpleDHTErrSuccess)   {
    Serial.println(F("Read DHT22 failed, err=")); Serial.println(err);delay(2000);
    return;
  }
  return humidity;  // <<----- Was soll das Return eines Wertes in einer als void deklarierten Funktion?
  return temperature;  // <<---- Was soll Code nach einem Return?
  for(int i = 0; i<2500;i++){  // <<---- Was soll Code nach einem Return?
    delay(1);
    action();
  }
  GUI();
}


Ähnliche Gurken sind z.B. in void debug() drin.

Du solltest in den Voreinstellungen "Ausführliche Ausgaben beim Kompilieren" und Warnungen: "Alle" einstellen. Dann weist Dich der Kompiler auf solchen Unsinn hin.

Funktionen sollten wenigstens einen kurzen Kommentar aufweisen, was sie tun sollen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2019, 16:25
Beitrag #19
RE: Ram Speicher bei Arduino Mega wird knapp
(02.02.2019 15:38)Tommy56 schrieb:  Naja, über aufgeräumten Code bin ich wohl anderer Meinung, als Du. Ich muss ihn aber auch nicht verstehen.
Du verschenkst immer noch RAM durch unüberlegte int-Variablen. Auch sinnvolle lokale Variablen und damit Verzicht auf globale Variablen könnten Dir Luft verschaffen.

Hier mal ein Beispiel für unsinnigen Code:
Code:
void LT(){
  Serial.println(F("LT"));
  int err = SimpleDHTErrSuccess;
  if ((err = dht22.read2(&temperature, &humidity, NULL)) != simpleDHTErrSuccess)   {
    Serial.println(F("Read DHT22 failed, err=")); Serial.println(err);delay(2000);
    return;
  }
  return humidity;  // <<----- Was soll das Return eines Wertes in einer als void deklarierten Funktion?
  return temperature;  // <<---- Was soll Code nach einem Return?
  for(int i = 0; i<2500;i++){  // <<---- Was soll Code nach einem Return?
    delay(1);
    action();
  }
  GUI();
}


Ähnliche Gurken sind z.B. in void debug() drin.

Du solltest in den Voreinstellungen "Ausführliche Ausgaben beim Kompilieren" und Warnungen: "Alle" einstellen. Dann weist Dich der Kompiler auf solchen Unsinn hin.

Funktionen sollten wenigstens einen kurzen Kommentar aufweisen, was sie tun sollen.

Gruß Tommy
Danke für den Hinweis, hier (hoffentlich) nochmal besser:
Code:
[code]
#include <SFE_BMP180.h>
#include <SimpleDHT.h>
#include <MQ2Lib.h>
#include <DCF77.h>
#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <TouchScreen.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>


#if defined(__SAM3X8E__)
    #undef __FlashStringHelper::F(string_literal)
    #define F(string_literal) string_literal
#endif


#define YP A3  
#define XM A2  
#define YM 9  
#define XP 8  

#define SD_CS 10  

#define TS_MINX 880
#define TS_MINY 100
#define TS_MAXX 130
#define TS_MAXY 910


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

#define LCD_CS A3
#define LCD_RS A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4


#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF


Adafruit_TFTLCD tft(LCD_CS, LCD_RS, LCD_WR, LCD_RD, LCD_RESET);


#define BOXSIZEX 120
#define BOXSIZEY 100
#define PENRADIUS 3

#define DCF_INTERRUPT  3
#define DCF_PIN 24

#define MINPRESSURE 10
#define MAXPRESSURE 1000

char time_s[9];
char date_s[11];

int i = 0;
const int UP = 53;
const int DOWN = 49;

time_t prevDisplay = 0;
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);

int menue = 0;
int MQ2_Pin = A15;
float lpg,co,smoke;
MQ2 mq2(MQ2_Pin, true);

int pinDHT22 = 18;
SimpleDHT22 dht22(pinDHT22);

float temperature = 0;
float humidity = 0;

SFE_BMP180 pressure;
char status;
double T,P,p0,a;

int u = 0;


void setup() {
  pinMode(UP, OUTPUT);
  pinMode(DOWN, OUTPUT);
  digitalWrite(DOWN, LOW);
  digitalWrite(UP, LOW);
  if (pressure.begin())
  mq2.begin();
  tft.reset();
  uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  DCF.Start();
  setSyncInterval(10);
  setSyncProvider(getDCFTime);
  Serial.begin(9600);
  Serial.println(F("================================================================================​================================================================================​================================================================================​===="));
  Serial.println(F("Physik Projekt von Leon Warncke und Paul Neumann"));
  Serial.println(F("Bis Genaue Zeit- und Datumsangaben vorliegen kann es einige Minuten dauern"));
  Serial.println(F("Powered by Arduino"));
  DCF.getTime();
  tft.fillScreen(BLACK);
  Serial.println(F("Tft erfolgreich gestartet"));
  pinMode(UP, OUTPUT);
  pinMode(DOWN, OUTPUT);
  digitalWrite(DOWN, LOW);
  digitalWrite(UP, LOW);
  tft.setCursor(0,0);
  tft.setRotation(2);
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.println(F("Physik Projekt "));
  tft.println(F("Wetterstation"));
  tft.setTextColor(CYAN);
  tft.setTextSize(1);
  tft.setCursor(0,300);
  tft.println(F("Powered by Arduino and developed by:"));
  tft.println(F("Leon Warncke and Paul Neumann"));
  delay(1000);
  tft.setCursor(0, 160);
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.println(F("Starte..."));
  tft.setTextColor(RED);
  tft.setTextSize(2);
  tft.println(F("!Bis genaue Zeitdaten vorliegen,"));
  tft.println(F("kann es einige Minuten dauern!"));
  digitalWrite(UP, HIGH);
  digitalWrite(DOWN, HIGH);
  delay(1000);
  digitalWrite(UP, LOW);
  digitalWrite(DOWN, LOW);


  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("Objekte gezeichnet!"));
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  LT();
  
}

void loop() {
  interrupts();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  freeRam();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  getDCFTime();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  GUI();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  action();
   Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
}
void debug(){ //Da das Display sich manchmal aus ungeklärter Ursache weiß füllt, bzw bei einem zu langem Input der Menue-Wert zu groß, bzw zu klein wird, wird hier das Display zurückgesetzt
if(menue > 6){
    Serial.println(F(" "));
    Serial.println(F("Debug"));
    Serial.print(menue);
    menue = 0;
    
    if(menue > 100){
       menue = 0;
      
    tft.reset();
    uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: ")),
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  GUI();
    }else{
      GUI();
    }
     menue = 0;
  }else if(menue < 0){
    Serial.println(" ");
    Serial.println("Debug");
    Serial.println(menue);
    menue = 5;
    if(menue < -100){
      menue = 5;
  
    tft.reset();
    uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  GUI();
    }
    GUI();
  }else if(menue > 100){
  tft.reset();
  uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  GUI();
  }else if(menue <-100){
  tft.reset();
  uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  GUI();
  }
}
unsigned long getDCFTime() //Zeitempfang
{
  Serial.println(F("Arbeitsspeicher: "));
  Serial.println(freeRam());
  Serial.println(F(" "));
  Serial.println(F("Suche nach neuer Systemzeit..."));
  time_t DCFtime = DCF.getTime();
  if (DCFtime!=0) {  
    digitalWrite(UP, HIGH);
    digitalWrite(DOWN, HIGH);
    setTime(DCFtime);//Neue Systemzeit setzen
    Serial.print(F("Neue Zeit erhalten : ")); //Ausgabe an seriell
    Serial.print(F("  "));
    Serial.print(F("X"));  
     action();
  }else {
     action();
  }
  action();
  return DCFtime;
}
void GUI(){ //Funktion für das grafische Darstellen der verschiedenen Messdaten (Temperatur, Luftfeuchtigkeit) auf dem Display;
  debug();
Serial.println(F("GUI"));
Serial.println(F("Arbeitsspeicher: "));
Serial.println(freeRam());
  if(u >= 120){
    tft.reset();
    uint16_t identifier = tft.readID();
  identifier=0x9341;
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(2);
  tft.fillRect(0, 0, 119, BOXSIZEY, RED);
  tft.fillRect(121, 0, 119, BOXSIZEY, RED);
  tft.setCursor(30,110);
  tft.setTextSize(5);
  tft.setTextColor(MAGENTA);
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  Serial.println(F("Repaint: "));
  Serial.println(F("================================================================================​================================================================================​================================================================================​================================================"));
  tft.print(F("<-"));
  tft.setCursor(151,110);
  tft.print(F("->"));
  u=0;
  }
  i++;
  if(i>2){
    i = 0;
    action();
  }
  tft.setTextSize(1);
  tft.setTextColor(GREEN);
  tft.setCursor(30,340);
  tft.println(F("Menueindex:"));
  tft.setCursor(30,350);
  tft.println(menue);
for(int y = 0;y<750;y+=7){
  delay(7);
  action();
}

  tft.fillRect(10,350,30,30,BLACK);
switch (menue){
  case -1:
  menue = 5;
  action();
  break;
  case 0:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;
  unsigned long currentMillis = millis();
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(3);
  tft.setTextColor(YELLOW);
  tft.print(F("Zeit: "));
  if(currentMillis - previousMillis > interval) {
    action();
    previousMillis = currentMillis;  
   // if (a == false){
      action();
      tft.setCursor(10, 230);
      tft.print(hour());
      tft.setCursor(50, 230);
      tft.print(F(":"));
      tft.setCursor(70,230);
      tft.print(minute());
      tft.setCursor(120, 230);
      tft.print(second());
      tft.setTextSize(1);
      tft.setTextColor(YELLOW);
      tft.setCursor(10,300);
      tft.println(F("Menueindex:"));
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      Serial.println(F("Zeit: "));
      getDCFTime();
      action();
      GUI();
    }
    
  
action();
  }
  
  break;
  
  case 1:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;    
  unsigned long currentMillis = millis();
// boolean b = false;
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(3);
  tft.setTextColor(BLUE);
  tft.print(F("Datum:"));
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    //if (b == false){
     // b = true;
      tft.setCursor(10, 230);
      tft.print(day());
      tft.setCursor(50, 230);
      tft.print(":");
      tft.setCursor(70,230);
      tft.print(month());
      tft.setCursor(120, 230);
      tft.print(year());
      tft.setTextSize(1);
      tft.setTextColor(BLUE);
      tft.setCursor(10,300);
      tft.println("Menueindex:");
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      Serial.println(F("Datum"));
//      b=true;
      getDCFTime();
      action();
      GUI();
  /*/  }else{
  tft.fillRect(10, 200,300, 400, BLACK);
  tft.fillRect(10,310,10,10,BLACK);
  b=false;
    }
  }
  /*/
  }
action();
}
  break;
  
  case 2:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;    
  unsigned long currentMillis = millis();
// boolean c = false;
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(3);
  tft.setTextColor(GREEN);
  tft.print(F("Temperatur:"));
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
   // if (c == false){
    //  c = true;
      tft.setTextSize(3);
      tft.setCursor(10, 230);
      tft.print(temperature);
      tft.setCursor(100, 230);
      tft.print(F("C"));
      tft.setTextSize(1);
      tft.setTextColor(GREEN);
      tft.setCursor(10,300);
      tft.println(F("Menueindex:"));
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      Serial.print(F("Temperatur:"));
      //c=true;
      getDCFTime();
      action();
      GUI();
  /*/  }else{
tft.fillRect(10, 200,300, 400, BLACK);
tft.fillRect(10,310,10,10,BLACK);
c=false;
    }
  }
  /*/
  }
action();
}
  break;
  
  case 3:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;    
  unsigned long currentMillis = millis();
  //boolean d = false;
  LuftDruck();
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(3);
  tft.setTextColor(CYAN);
  tft.print("Luftdruck:");
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    //if (d == false){
     // d = true;
      tft.setTextSize(2);
      tft.setCursor(10, 230);
      tft.print(p0);
      tft.setCursor(90, 230);
      tft.print(F("Hektopascal"));
      tft.setTextSize(1);
      tft.setTextColor(CYAN);
      tft.setCursor(10,300);
      tft.println("Menueindex:");
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
      Serial.println(F("Luftdruck:"));
     // d=true;
      getDCFTime();
      action();
      GUI();
    /*/}else{
tft.fillRect(10, 200,300, 400, BLACK);
tft.fillRect(10,310,10,10,BLACK);
d=false;
    }
  }
  /*/
  }
  action();
  
  }
  break;
  
  case 4:
  {
  Serial.println(F("Uebermalt: "));
  u++;
  long previousMillis = 0;        
  long interval = 999;    
  unsigned long currentMillis = millis();
// boolean e = false;
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(2);
  tft.setTextColor(MAGENTA);
  tft.print(F("Luftfeuchtigkeit: "));
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
   // if (e == false){
    //  e = true;
      action();
      tft.setTextSize(3);
      tft.setCursor(10, 235);
      tft.print(humidity);
      tft.setCursor(100, 235);
      tft.print("%");  
      tft.setTextSize(1);
      tft.setTextColor(MAGENTA);
      tft.setCursor(10,300);
      tft.println(F("Menueindex:"));
      tft.setCursor(10,310);
      tft.println(menue);
      Serial.println(F(" "));
     // e=true;
      getDCFTime();
      action();
      GUI();
    
   /*/ }else{
tft.fillRect(10, 200,300, 400, BLACK);
tft.fillRect(10,310,10,10,BLACK);
e= false;
    }
  }
  /*/
  }
action();
  }
  
  break;
  
  case 5:
  {
   Serial.println(F("Uebermalt: "));
   u++;
   Serial.println(F("Gas: "));
   Gas();
  long previousMillis = 0;        
  unsigned long currentMillis = millis();
  long interval = 999;    
  tft.fillRect(10,310,10,10,BLACK);
  tft.fillRect(10,180,400,400,BLACK);
  tft.setCursor(10,180);
  tft.setTextSize(2);
  tft.setTextColor(RED);
  tft.print(F("Gas:"));
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
      action();
       tft.setCursor(10, 200);
       tft.print(F("Lpg:"));
       tft.setCursor(80, 200);
       tft.print(lpg);
       tft.setCursor(140,200);
       tft.print(F("ppm"));
       tft.setCursor(10,220);
       tft.print(F("Co:"));
       tft.setCursor(80, 220);
       tft.print(co);
       tft.setCursor(140,220);
       tft.print(F("ppm"));
       tft.setCursor(10,240);
       tft.print(F("Rauch:"));
       tft.setCursor(80,240);
       tft.print(smoke);
       tft.setCursor(140,240);
       tft.print(F("ppm"));
       tft.setTextSize(1);
       tft.setTextColor(RED);
       tft.setCursor(10,300);
       tft.println(F("Menueindex:"));
       tft.setCursor(10,310);
       tft.println(menue);
       getDCFTime();
       action();
       GUI();
    }
  
action();
  }
  break;
  case 6:
  menue = 0;
action();
  break;
}
}
  
void action(){ //Funktion, die für die Touch-Eingabe auf dem Display zuständig ist
   TSPoint p = ts.getPoint();
  digitalWrite(13, LOW);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
    p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);
    Serial.println(F(" "));
   if(p.x>=0&&p.y<=313&&p.x<119&&p.y>=207){
    Serial.println(F("touched+"));
    menue = menue+1;
    Serial.println(menue);
     digitalWrite(DOWN, LOW);
    digitalWrite(UP,HIGH);
    delay(100);
    digitalWrite(UP, LOW);
    if(menue > 6){
   debug();
  }
    GUI();
    debug();
    digitalWrite(UP, LOW);
   }
   if(p.x>=121&&p.x<=250&&p.y<=325&&p.y>=215){
    menue = menue -1;
    Serial.println(F("touched-"));
    Serial.println(menue);
    digitalWrite(UP, LOW);
    digitalWrite(DOWN, HIGH);
    delay(100);
     digitalWrite(DOWN, LOW);
     if(menue < 0){
    debug();
  }
    GUI();
    debug();
    digitalWrite(DOWN, LOW);
   }
    GUI();
}
}
char* sprintTime() {
  snprintf(time_s,sizeof(time_s),"%.2d:%.2d:%.2d" , hour(), minute(), second());
  time_s[strlen(time_s)] = '\0';
  return time_s;
} //Dekodierung von Daten des DCF77 Empfängers

char* sprintDate() {
  snprintf(date_s,sizeof(date_s),"%.2d.%.2d.%.4d" , day(), month(), year());
  date_s[strlen(date_s)] = '\0';
  return date_s;
} //Dekodierung von Daten des DCF77 Empfängers

void Gas(){ //Messung eines MQ2-Sensors
  lpg = mq2.readLPG();
  co = mq2.readCO();
  smoke = mq2.readSmoke();
}

void LT(){
  Serial.println(F("LT"));
  int th = SimpleDHTErrSuccess;
  th = dht22.read2(&temperature, &humidity, NULL); //Funktion zum Auslesen von Temperatur und Luftfeuchtigkeit
  }

void LuftDruck(){ //Hier wird der Luftdruck gemessen
  Serial.println(F("Luftdruck"));
  status = pressure.startTemperature();
  if (status != 0)
  {
    delay(status);
    // Retrieve the completed temperature measurement:
    // Note that the measurement is stored in the variable T.
    // Function returns 1 if successful, 0 if failure.
    status = pressure.getTemperature(T);
    if (status != 0)
    {
      // Start a pressure measurement:
      // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
      // If request is successful, the number of ms to wait is returned.
      // If request is unsuccessful, 0 is returned.

   status = pressure.startPressure(3);
      if (status != 0)
      {
        // Wait for the measurement to complete:
        delay(status);
   status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // Print out the measurement:
        //   Serial.println("================================================================================​================================================================================​================================================================================​====");
          Serial.print(F("Druck: "));
          Serial.print(P,2);
          Serial.print(F(" mb, "));
          Serial.print(P*0.0295333727,2);
          Serial.println(F(" inHg"));
          p0 = pressure.sealevel(P,13); // we're at 1655 meters (Boulder, CO)
          Serial.print(F("Druck auf Meeresniveau: "));
          Serial.print(p0,2);
          Serial.print(F(" mb, "));
          Serial.print(p0*0.0295333727,2);
          Serial.println(F(" inHg"));
          
        }
}
}
  }
}
int freeRam () { //freier Ram wird berechnet
   extern int __heap_start, *__brkval;
   int v;
   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
   Serial.println(F("Arbeitsspeicher: "));
   Serial.println(freeRam());
}
[/code]

Huh
Von den vielen Dingen die ich verloren habe vermisse ich am meisten meinen Verstand. -Ozzy Osbourne
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2019, 16:49
Beitrag #20
RE: Ram Speicher bei Arduino Mega wird knapp
Wenn Du meine ehrliche Meinung wissen willst (auch wenn Du mich dafür hassen wirst): Wirf den Code weg und baue ihn von Anfang an sinnvoll neu auf. Das bestehende Chaos wirst Du so wohl nicht mehr aufgedröselt bekommen.

Schreibe logisch sinnvolle Teilfunktionen, die bestimmte Schritte erledigen und Rückgabewerte haben, mit denen Du weiter arbeiten kannst. Nicht alles void und mit globalen Variablen.

Allein die vielen Zeilen in debug, wo Du irgendwelche Menüeinträge korrigierst, solltest Du komplett neu bauen. An einer Stelle wird das Menü geändert, danach wird die Sinnhaftigkeit gecheckt, evtl. korrigiert und das wars. Das machst Du seitenweise.

Unsinnig:
Code:
menue = 5;
    if(menue < -100){  // <<--- völlig unsinniger Code, die Bedingung wird nie erfüllt

debug() ruft GUI() auf und GUI() ruft debug() auf -->> da brauchst Du Dich über den RAM-Verbrauch nicht mehr zu wundern.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2019, 17:36
Beitrag #21
RE: Ram Speicher bei Arduino Mega wird knapp
(02.02.2019 16:49)Tommy56 schrieb:  Wenn Du meine ehrliche Meinung wissen willst (auch wenn Du mich dafür hassen wirst): Wirf den Code weg und baue ihn von Anfang an sinnvoll neu auf. Das bestehende Chaos wirst Du so wohl nicht mehr aufgedröselt bekommen.

Schreibe logisch sinnvolle Teilfunktionen, die bestimmte Schritte erledigen und Rückgabewerte haben, mit denen Du weiter arbeiten kannst. Nicht alles void und mit globalen Variablen.

Allein die vielen Zeilen in debug, wo Du irgendwelche Menüeinträge korrigierst, solltest Du komplett neu bauen. An einer Stelle wird das Menü geändert, danach wird die Sinnhaftigkeit gecheckt, evtl. korrigiert und das wars. Das machst Du seitenweise.

Unsinnig:
Code:
menue = 5;
    if(menue < -100){  // <<--- völlig unsinniger Code, die Bedingung wird nie erfüllt

debug() ruft GUI() auf und GUI() ruft debug() auf -->> da brauchst Du Dich über den RAM-Verbrauch nicht mehr zu wundern.

Gruß Tommy
Dann hätte ich nur noch eine Frage...
Wie kann ich die Funktionen und co. so gestalten, dass sie sehr wenig RAM verbrauchen?

Huh
Von den vielen Dingen die ich verloren habe vermisse ich am meisten meinen Verstand. -Ozzy Osbourne
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2019, 17:47 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2019 17:47 von Tommy56.)
Beitrag #22
RE: Ram Speicher bei Arduino Mega wird knapp
Alle Variablen, die nicht global sein müssen, lokal halten.
Für alle Variablen den notwendigen (kleinsten) Typ ermitteln und nutzen.
Nutzung des F-Macros (hattest Du ja schon).

Übersichtliche Einheiten in Funktionen zusammen packen, nicht mehrfach den gleichen Code schreiben.
Keine Rekursion! (also nicht GUI ruft debug auf und debug ruft GUI auf)

Alle Warnungen des Kompilers einschalten, Ursachen von Fehlern beseitigen, nicht an den Symptomen rum programmieren. (Ein Menüpunkt ändert sich nicht von allein, sondern weil Du ihn im Programm änderst). Deshalb einfache und übersichtliche Programmstrukturen, in denen eine Sache nur an einer Stelle gemacht wird.

Mit einfachen, kleinen Einheiten anfangen, z.B. Displayausgabe. Zum Debuggen immer den seriellen Monitor nutzen, nicht beides vermischen.

Erst wenn ein Programmteil sauber läuft, den nächsten Teil in Angriff nehmen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2019, 18:40 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2019 19:53 von unkreativ.)
Beitrag #23
RE: Ram Speicher bei Arduino Mega wird knapp
Ok, danke für die viele Hilfe und die vielen Posts

Ich habe es geschafft den RAM-Verbrauch konstant zu halten!!
Der Sketch läuft einwandfrei!
Danke nochmal für euren Support, ihr seid die besten!

*Für Interessierte habe ich den fertigen Sketch angehängt*


Angehängte Datei(en)
.ino  Physik_Projekt_Sketch.ino (Größe: 21,13 KB / Downloads: 16)

Huh
Von den vielen Dingen die ich verloren habe vermisse ich am meisten meinen Verstand. -Ozzy Osbourne
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  If...els if wird nich korrekt ausgeführt suterb 18 808 28.05.2019 13:51
Letzter Beitrag: Tommy56
  Speed versus Speicher bei Variablendef shrimps 2 420 29.04.2019 11:38
Letzter Beitrag: shrimps
  Bedingung wird nicht wiederholt ausgeführt Lite 16 1.032 29.03.2019 05:11
Letzter Beitrag: Lite
  HC-06 Arduino Mega Übertragungsprobleme fv1895 4 403 15.03.2019 11:35
Letzter Beitrag: fv1895
  Attiny85 zu wenig Speicher Harry 36 2.081 20.01.2019 16:15
Letzter Beitrag: Harry
  Elegoo Mega 2560 R3 lässt sich nicht programieren Union1925 6 1.054 03.12.2018 21:21
Letzter Beitrag: Tommy56
  Loop wird doppelt ausgeführt nanoheld 6 819 26.11.2018 21:06
Letzter Beitrag: hotsystems
  Befehl wird nicht ausgeführt renesworld 15 1.334 19.10.2018 12:37
Letzter Beitrag: hotsystems
  Mega 2560 + USB Host Shield + USB-Stick Cospieler 4 1.131 19.09.2018 11:17
Letzter Beitrag: Tommy56
  Serielle Daten Windigipet 2018 Software, Arduino Mega 2560 verarbeiten/melden Christian_Moba-Arduino 11 2.216 15.09.2018 09:43
Letzter Beitrag: MicroBahner

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste