Geschwindigkeitsproblem UNO

Hallo Forum,

ich möchte Euch um Euren geschätzten Rat bitten da ich an mehrere Grenzen stosse.
Das beigefügte Programm soll Durchgänge zählen, Temperaturen messen und anzeigen.
Ich habe mich bisher mit den Temperaturen und dem Speichern mit dem Adafruit Datalogger
Shield auf die SD-Karte konzentriert.
Nun stell ich fest, da ich mit einem Taster das Zählen simuliere, das die ganze Geschichte so
langsam geworden ist, das der Taster lang gedrückt werden muß.

Meine Fragen :

  • grundsätzliche Anmerkungen zum Programmaufbau ??
  • bringt mir der Umzug auf Mega etwas ( zumal ich noch 1 Woche der Daten im LCD
    scrollen muß und ich nun schon 23582 Bytes verschossen habe )
  • natürlich die Geschwindigkeitsfrage

Vielen Dank im voraus für die Hilfe

Gruß olmuk

Test1.ino (3.16 KB)

  delay(800);

Man muss bei dem Sensor zwar für 12 Bit 750ms warten, aber das kann man auch mit millis() abfragen. Dann blockiert nichts.

Beim DS18B20 kannst du auch die Auflösung runtersetzen. Für 9 Bit (0.5°) braucht man nur 94ms.

Die String Klasse ist auch sehr langsam, da du beim Konkatenieren unnötig Objekte anlegst und wieder zerstörst:

Das Datum formatieren kann man schön mit sprintf() machen:

#include <avr/pgmspace.h>

char dateString[7];
sprintf_P(dateString, PSTR("%02d%02d%02d"), rtc[4], rtc[5], rtc[6]);

strcat() ist auch eine Alternative, aber war bei mir merklich langsamer

Aber dein Hauptproblem wir das Delay von 0,8s sein

Hallo Serenifly,

vielen Dank für die schnelle Hilfe ?
habe beide direkt umgesetzt und es bringt erhebliche Vorteile in der Geschwindigkeit !!
Vor allem die String-Behandlung gefällt mir.
Ich muss allerdings kein #include <avr/pgmspace.h> einfügen und was bedeutet vor der Formatierung
PSTR und sprintf_P statt sprintf ?

Zu meinen anderen Fragen : der Mega dürfte mit der gleichen Taktfrequenz nicht schneller sein, oder ?

Das _P und PSTR() lässt den Format-String im Flash, statt das RAM voll zumüllen. PSTR() ist dabei ein Makro, das mit PROGMEM einen Flash String deklariert und die _P Versionen der String Funktionen erwarten so einen String.

Du hast allerdings auch sonst so viele Strings im RAM, dass das hier keine Rolle spielt. :slight_smile:

Bei print() kannst du einfach das machen:

Serial.print(F("String im Flash"));
file.print(F("String im Flash"));

Spart sehr viel RAM.

Ich muss allerdings kein #include <avr/pgmspace.h> einfügen

Mhh, in der Arduino IDE anscheinend nicht. Ich programmiere in Visual Studio, da ist es nötig was ich so sehe. Etwas seltsam, aber na ja.

Zu meinen anderen Fragen : der Mega dürfte mit der gleichen Taktfrequenz nicht schneller sein, oder ?

Nein. Du musst dir nur abgewöhnen delay() zu verwenden und statt dessen mit millis() abfragen ob schon eine gewisse Zeit vergangen ist. delay() blockiert den Prozessor völlig für die Zeit.