Go Down

Topic: Motorradtacho mit Arduino nano // Hilfe benötigt (Read 983 times) previous topic - next topic

BwieBertha

Habs eben probiert - bringt leider keine Änderung meines Problems ....

Danke dennoch!

BwieBertha

Hallo Kollegen,
sorry aber ich muss den Thread nochmal aufwärmen, da ich hier einfach nicht weiterkomme.
Ich habe meinen Sketch auf ein (kompilierendes) Minimum runtergestrickt; den Fehler "provoziere" ich in der Setup() Routine.
Hier übergebe ich 5 Werte an Runningaverage und lese anschließend den Mittelwert aus. Nach wievor bekomme ich "nan" als Rückgabewert.
Allerdings wird das Problem gelöst, wenn ich:
  • getKilometerstand() auskommentiere  ODER
  • draw() auskommentiere   ODER
  • OneButton.h inkl. aller Aufrufe entferne ODER
  • das Display inkl. u8g2 entferne ODER
  • die RTC entferne

Eine dieser Aktionen reicht!!! Das macht doch alles keinen Sinn.
Wie kann eine Funktion in void setup() von später aufgerufenen Funktionen beeinflusst werden? Zumal diese Funktionen nichts mit RunningAverage zu tun haben?

ARGH!!!!  :o

Code: [Select]

#include <EEPROM.h>
#include <RunningAverage.h>
#include "OneButton.h"
#include <U8g2lib.h>
#include "RTClib.h"

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17);   // ESP32 Thing, HW I2C with pin remapping
RTC_DS3231 rtc;

RunningAverage myRA(5);
short VAnzeige;
const int buttonPin = 4;
OneButton button(buttonPin, true);
char Speed[10];

unsigned long GesamtMeter;
unsigned long TripMillimeter;
int GesamtMeter_ADDR = 0;
int TripMillimeter_ADDR = GesamtMeter_ADDR + 4;
char TripKm[10];
char GesamtKm[10];

void setup()   {
  Serial.begin(9600);      // open the serial port at 9600 bps:
   
  myRA.clear();
  Serial.println("5 Werte werden übergeben");
  myRA.addValue(5);
  myRA.addValue(100);
  myRA.addValue(20);
  myRA.addValue(30);
  myRA.addValue(77);
  Serial.println(myRA.getAverage()); 

  getKilometerstand();                                   //gespeicherten Tachostand abrufen (eeprom-adresse mit höchstem Zählerstand suchen)

}

void loop() {                   
  u8g2.clearBuffer();
  draw();     
  u8g2.sendBuffer();
}


void draw() { 
  DateTime now = rtc.now();
  int hunderter = (TripMillimeter / 100000) % 10;
  int tausender = TripMillimeter / 1000000;
  sprintf(GesamtKm, "%6ldkm", GesamtMeter/1000);
  sprintf(TripKm, "%5d.%dkm", tausender, hunderter);
  sprintf(Speed, "%3d", VAnzeige);
  }

void getKilometerstand(){     
  EEPROM.get(GesamtMeter_ADDR, GesamtMeter);   
  EEPROM.get(TripMillimeter_ADDR, TripMillimeter);
  Serial.println("########");
  Serial.println("gefundener Kilometerstand:");     
  Serial.println(GesamtMeter);
}



anwofis

Hallo,

ich bekomme beim Kompilieren für den Nano folgende Meldung und auch dein Problem:

Quote
Der Sketch verwendet 12748 Bytes (41%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 1859 Bytes (90%) des dynamischen Speichers, 189 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten.
Am Mega läufts einwandfrei.

BwieBertha

öh.. ist das Verhalten also "geräteabhängig"?????

Es beruhigt mich aber _ungemein_, dass du das Problem nachstellen kannst.

postmaster-ino

#19
Aug 11, 2018, 10:45 pm Last Edit: Aug 11, 2018, 10:48 pm by postmaster-ino
Hi

Hast Du einen Link zur RunningAverage?
Die fehlt mir und in der Arduino-eigenen-Bibliotheks-Auswahl ist Diese nicht enthalten.
-> bei mir kompiliert der Sketch so nicht (bisher das Einzige, was Er anmeckert)

MfG

PS:
Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten.
Das soll Dir sagen, daß beim Anlegen diverser lokalen Variablen der Speicher ausgehen wird und der Arduino Mist baut.
Du hast sehr sehr viele globale Variablen - überdenke, Welche Du davon wirklich global  brauchst und Welche Du nur innerhalb irgend welcher Abläufe benötigst.
Wobei in diesem Sketch DEINE Variablen echt übersichtlich sind - die ganzen eingebundenen Libs werden sich dort großzügig bedient haben - aber z.B. das Display wird den Puffer wohl brauchen.
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

anwofis

In der Wanung steht, dass schon 90% des RAM belegt sind. Ich kenne mich jetzt auch nicht so aus - ich glaub', dass dann für lokale Variablen kein Platz mehr da sein könnte. Ich vermute die u8g2lib ist einfach zu groß.

Dieser Sketch brauch schon 74%:

Code: [Select]
#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17);   // ESP32 Thing, HW I2C with pin remapping

void setup() {}

void loop() {}



BwieBertha

#21
Aug 11, 2018, 10:53 pm Last Edit: Aug 11, 2018, 10:55 pm by BwieBertha
Danke für eure Hinweise - ich wäre nie drauf gekommen, dass zuwenig Arbeitsspeicher schon zu Problemen in der Setup-Routine führen kann.

Der Speicherhunger von u8g2 stellt mich jetzt natürlich vor ein konzeptionelles Problem, da ich da nicht drauf verzichten kann.
Wieviel Arbeitsspeicher darf ich denn belegen, um auf der sicheren Seite zu sein?

@ino-postmaster:
Ich hab dir die RunningAverage angehängt..
Alternative hier zu finden: https://github.com/RobTillaart/Arduino/tree/master/libraries/RunningAverage

mfg

Basti

anwofis

Gibt's da keine kompaktere Bibliothek für dein Display? Ist das so ein kleines OLED-Ding? Sonst fällt mir nur ein einen Mega oder so zu nehmen.

Go Up