Motorradtacho mit Arduino nano // Hilfe benötigt

Ok, aber ohne unsigned gibt es doch keinen Konflikt mehr... Sinnhaftigkeit hin oder her...

Somit dürfte mein Problem woanders liegen...

Kleines Update:
Ich habe rausgefunden, dass das Problem verschwindet, sobald man diese Line auskommentiert (auch wenn sie viel später im code steht):

sprintf(Uhrzeit, "%02d:%02d", now.hour(), now.minute());

Mache ich da irgendwas falsch?

Bin gerade etwas angefressen O_o...

mfg
basti

BwieBertha:
Ich habe rausgefunden, dass das Problem verschwindet, sobald man diese Line auskommentiert (auch wenn sie viel später im code steht):

Wo sich die Ursache für ein Fehlverhalten versteckt, ist eines der vielen großen und kleinen Adventures, die man im Leben spielt. Manchmal helfen nur gute Flüche und ein Backup. Glücklich ist, wer versioniert :slight_smile:

Gruß

Gregor

Danke......

Mittlerweile hab ich noch zwei weitere Ungereimtheiten gefunden, die sich jedoch alle in Luft auflösen, wenn ich sämtliche sprintf() Anweisungen rausnehme.

Kann mir jemand sagen ob ich da was falsch mache?
Oder ist diese Funktion generell mit Vorsicht zu genießen?

Hilfe...

BwieBertha:
Danke......

Mittlerweile hab ich noch zwei weitere Ungereimtheiten gefunden, die sich jedoch alle in Luft auflösen, wenn ich sämtliche sprintf() Anweisungen rausnehme.

Kann mir jemand sagen ob ich da was falsch mache?
Oder ist diese Funktion generell mit Vorsicht zu genießen?

Ja ist doch super.
Funktioniert dann dein Sketch noch ?

Im übrigen sind alle Funktionen und Anweisungen mit Vorsicht zu genießen, wenn man nicht damit umgehen kann.

Einfach mal die Dokumentation dazu lesen.

Nein, mein sketch funktioniert nicht mehr ohne sprintf.
Des weiteren bin ich mir sicher, sprintf richtig zu verwenden.
Das Problem muss wo anders liegen.... Evtl ein Speicherschmierer?

(deleted)

Das kann ich eigentlich ausschließen....

Es sei denn, die RunnigAverage Lib hat einen bug, aber das kann ich mir nicht vorstellen.

Edit: (Um das nochmal zu präzisieren:)
RunningAverage liest hier immer 5 (Geschwindigkeits-)Werte ein und bildet dann den Mittelwert.
Ich habe mir jeden dieser Werte vorher ausgeben lassen - alle waren ok (zwischen 0 und 210).
Allerdings bringt die Abfrage von RA.getElement(0) schon NaN (obwohl die Input-Größe wie besagt nachweislich ok war).

(deleted)

Ja, das weiß ich. Aber ich füge ja laufend neue Werte hinzu....

Wenn ich die sprintf auskommentiere funktioniert auch alles...

Mir ist einfach dieser Zusammenhang unklar.

(deleted)

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

Danke dennoch!

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

#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);
}

(deleted)

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

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

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.

(deleted)

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: Arduino/libraries/RunningAverage at master · RobTillaart/Arduino · GitHub

mfg

Basti

RunningAverage.zip (17.3 KB)

(deleted)