Kommentare zum Code - Kamerasteuerung durch Schall, Licht, Geräuschsensoren

Hallo,

ich habe ja als ziemlicher Laie an meinem Projekt rumgeschraubt.
Dabei habe ich einige "Bausteine" verwendet (z.B. von jurs die Ventilsteuerung und die LCD-Benutzung von "irgendwoher".

Andere Sachen habe ich selber gebastelt und nu kommt's:
Ich schätze mal das man bei meinem dilettantischen Programmierstil einiges besser und kürzer machen könnte.

Bestünde das Interesse da mal drüber zu schauen und Verbesserungsvorschläge zu machen?

Ihr dürft mir aber nicht meinen Arduino wegnehmen oder sogar den Computer, weil alles so schrecklich ist, versprochen?
(Ich kann eigentlich nur ein kleines bisschen PHP und früher mal TurboPascal / Delphi und kratze mir im Moment alles nebenbei in der Freizeit zusammen.)

Das Ganze ist nun gut 820 Zeilen lang geworden - es stehen aber auch ein paar Kommentare drin.

Ich schätze mal, ich schicke das als Anhang mit und man kann per Codeschnipsel oder Zeilennummern Kommentare abgeben.
Das Zeuch kann auch gerne von anderen verwendet werden, wenn da was Brauchbares dabei sein sollte.

Das Projekt ist noch nicht abgeschlossen.
Ich wollte jetzt erstmal das Gerüst optimieren, bevor die wirklichen Sensorerfassungen und Kamerauslöseroutinen optimiert werden - wenn sich das lohnt.
Deswegen ist z. B. das Untermenü allgemein und für alle Aktionen bislang gleich gehalten.
Das macht nicht immer Sinn, z.B.: Falls das mit dem Gewitterblitz einfangen überhaupt klappt, brauche ich definitiv keine Auslöseverzögerung für die Kamera vorschalten und ich muss auch keine Blitz auslösen - ist ja schon hell ;-).

Danke im Voraus - für konstruktive Kritik ]:smiley: -,
Klaus

fotoros_o_mat_0_12_ino.ino (26.9 KB)

snprintf(line,sizeof(line),"%3s %10s %10s %2s","Pin","Soll-Zeit","Ist-Zeit","Status");

Hier hast du printf() vielleicht nicht ganz verstanden. Man kann bei %s zwar eine Breite angeben. Aber das hier Unsinn. Vor allem bei "Status", das 5 Zeichen hat, aber auf eine Breite von 2 formatiert wird.

Das ist dazu da um die Teil-Strings auf eine Mindestbreite zu formatieren, in dem man die Zahl größer als die Länge des Strings macht. Die Differenz sind dann Leerzeichen.

Aber generell ist printf() hier keine gute Wahl. Die Ausgabe sieht so aus:

Pin  Soll-Zeit   Ist-Zeit Status

Die Leerzeichen kannst du auch fest in einen String einfügen ohne printf() zu verwenden. z.B.:

Serial.println("Pin  Soll-Zeit   Ist-Zeit Status");

Ansonsten ist hier manchmal das Tabulatorzeichen \t praktisch

Du verwendest zwar nicht so viele Strings, aber du solltest überall wo die print()/println() mit String Konstanten verwendest (sowohl bei Serial als auch LCD), ein F() um den String machen:

Serial.println(F("String im Flash"));

Dann belegt der String kein RAM mehr:

So ähnlich kann man auch printf() optimieren:

snprintf_P(line, sizeof(line), PSTR("%3S %10S %10S %2S") , PSTR("Pin"), PSTR("Soll-Zeit"), PSTR("Ist-Zeit"), PSTR("Status"));
snprintf_P(line, sizeof(line), PSTR("%3d %6ld.%03ld %6ld.%03ld %d"), ...);

Die _P Version sorgt dafür dass man einen Format-String im PROGMEM verarbeiten kann. Dieser wird mit PSTR() erzeugt. Mit %S statt %s erwartet die Funktion dann für die Argumente ebenfalls Strings im Flash statt im RAM.

Danke für die "String-Optimierungsvorschläge".
Die kann ich in speicherproblematischen Projekten bestimmt mal brauchen. :slight_smile:

Beim aktuellen Projekt sind die Ausgabegeschichten eigentlich nur zum Debuggen und könnten irgendwann rausfliegen ...

Da muss nämlich sogar ein Fehler in meiner einstellungen() sein.
Wenn ich da mal den Blitz oder die Kamera deaktiviere, werden zwar die Werte korrekt behalten bzw. ins eeprom gelegt, jedoch stimmen die "temporären" Werte, die via serial.print nach dem Starten der Aktion angezeigt werden, nicht ...

Grüße,
Klaus

Gibt's nix Erhellendes zu meinem Code zu sagen?