Hallo, ich stehe gerade vor einem Problem einen Betriebsstundenzähler umzusetzen.
Die kleine Aufgabe hierzu wäre einen Betriebsstundenzähler mit einer Drehzahlmessung zu vereinen. Ich möchte gerne an meiner Drehbank die Drehzahl messen.
Das geht auch schon! Jetzt käme noch ein Betriebsstundenzähler hinzu. Nach einer Stunde Spindelbetrieb soll dann eine Meldung auf das LCD ausgegeben werden, wo hier der Hinweis kommt, dass die Maschine gefettet bzw. geschiert werden muss.
Würde mich freuen, wenn Ihr mir Ansätze und Ideen liefern könntet, das ganze zu realisieren.
Nur eins sei noch dazu gesagt, ich bin im Programieren noch Anfänger und kenne mich nicht ganz so gut aus.
Dafür bin ich aber in der Hardware recht stark
Gratulation zu deinem Projekt, sieht ja schon ganz gut aus (so, jetzt hab ich auch meine Pflicht getan ;)).
Wenn du das Ein-und Ausschalten der Maschine messen kannst (z.B. immer wenn die Drehzahl null wird = aus, wenn Drehzahl steigt = an), dann kannst du über die einfache Formel
Ausschaltzeit - Einschaltzeit = Betriebsdauer
immer die Betriebsdauer für einen Lauf berechnen. Die speicherst du im internen EEPROM des ATMega ab, damit sie auch ohne Strom erhalten bleibt.
Wird die Maschine das nächste Mal angeschmissen, berechnet sich wieder die Betriebsdauer. Dann kannst du den alten Wert aus dem EEPROM auslesen, die neue Betriebsdauer dazuaddieren, und das ganze wieder im EEPROM speichern (am besten im nächsten Byte, damit alle Zellen gleichmäßig beansprucht werden).
Speicherst du nicht immer in der gleichen Speicherzelle, sondern in verschiedenen, dann musst du irgendwo auf dem EEPROM auch die Information ablegen, wo die Betriebsdauer das letzte Mal hingeschrieben wurde. Deutlich einfacher (und halt beanspruchender für einzelne EEPROM-Zellen) wäre natürlich, einfach immer in die gleichen Zellen zu schreiben, dann kannst du dir die Adressspeicherei sparen (sollte man wohl auch nicht überbewerten mit den Schreibzyklen...).
Es gibt auch Libraries, die “große Zahlen” ins EEprom speichern. Sonst passt immer nur 0-255 da rin!
Irgendwas mit “multi-type-variable in eeprom” oder sinngemäß.
Mal im Playgroud rumstöbern!
Immer nächste Zelle beschreiben klingt in der Theorie gut, nur: In welche Zelle speicherst du den Zeiger, bei welcher Zelle du grad bist
EDIT: Zeitgleichpost… OK, wenn du sek, min und h getrennt speicherst, sollte das wohl auch mit “kleinen Zahlen” gehen
nur: In welche Zelle speicherst du den Zeiger, bei welcher Zelle du grad bist
Naja, man könnte ganz am Anfang oder Ende seines "Datenbrockens" einen Marker setzen; eine bestimmte Byte-Kombination oder so, die man sonst nicht verwendet.
Und wenn man das nächste Mal was schreibt, dann fängt man nicht "sauber" hinter dem alten Datenbrocken an sonder "kurz davor", so dass man den alten Marker überschreibt.
Damit müsste man dann (passende Anzahl zu speichernde Bytes vorausgesetzt) eigentlich immer schön im Kreis rum schreiben und alle möglichen Speicherplätze längerfristig gleichmäßig nutzen...
@OP: Wäre gut zu wissen was genau nicht funzt, ansonsten kann man schlecht Vermutungen anstellen. Schmeißt der Compiler eine Fehlermeldung aus? Wird nicht gespeichert? Hängt der Sketch sich auf?
Es kommen nach dem Neustart relativ merkwürdige Zeitwerte heraus.
Beispiel:
1. Ich lasse es 30 Sekunden laufen... speichere ins eeprom (Reset-Simulation)
2. er fängt neu an zu starten, holt sich die 30 sekunden... zählt weiter...
3. nach erneutem speichern nach 40 sekunden zeigt er auch wirklich 1:10min. an... soweit ok...
ich speichere erneut... mache ein reset... nun steht hier 9:55:14 ...
total falsche Zeit....
Da die Millis korrekt sein müssen...und sind, kann es sich bei dem Fehler nur um einen Rechen oder Deklarationsfehler handeln.... im eeprom steht nach überprüfung der richtige wert.
da er das temporäre speichern richtig macht... gehe ich nicht von einem Logikfehler im Code aus... schließe das natürlich aber nicht aus...
einfach mal laden und ausführen....
0 - Byte 0 bis 3 löschen
- aktuellen Wert speichern
mal resetten, und schauen was er als alte Zeit ausgibt....