Hallo, Ich brauche Hilfe! Und zwar, wie Programmire ich eine Ausgabe die 0.5s lang einen Analogen Eingang beobachten soll und mir, dann den maximal wert ausgeben soll. Und dann mit einen anderen Analogen Eingang das selbe. Und das sollte dann in einer dauerschleife laufen. Das soll dann auf einen Arduino laufen. Ich habe schon so viel versucht aber bekomme das mit der Zeit nicht hin das ich da die Maxwerte bekomme. Könnt ihr mir den oder die Befehle sagen die ich dafür brauche??? mfg John
Johannes Maurer schrieb: > Hallo, > > Ich brauche Hilfe! > > Und zwar, > wie Programmire ich eine Ausgabe die 0.5s lang einen Analogen Eingang > beobachten soll und mir, dann den maximal wert ausgeben soll. Und dann > mit einen anderen Analogen Eingang das selbe. Und das sollte dann in > einer dauerschleife laufen. > > Das soll dann auf einen Arduino laufen. > > Ich habe schon so viel versucht aber bekomme das mit der Zeit nicht hin > das ich da die Maxwerte bekomme. Na, wie machst du das denn höchstpersönlich selbst, wenn du als Mensch diese Aufgabe lösen solltest? Ich würde ja so vorgehen: Ich würde mir auf einem Zettel so etwas wie den 'momentanen bisherigen Maximalwert' merken. Alle paar Augenblicke (wenn ich gerade Zeit hab), mach ich eine neue Messung und wenn sich daraus ein Messwert ergibt, der größer als mein 'momentaner bisheriger Maximalwert' ergibt, dann habe ich offenbar ein neues 'momentanes bisheriges Maximum', welches ich mir statt dessen merke (aufschreibe). Ist die Zeit um, dann wird aus dem 'momentanen bisherigen Maximalwert' der 'tzatsächlich beobachtete Maximalwert', denn dann steht ja fest (weil die Zeit um ist), dass nichts größeres mehr kommen kann. Die nächste Messperiode beginne ich dann wieder mit einem angenommenen 'momentanen bisherigen Maximalwert' von dem ich annehmen kann, dass er recht wahrscheinlich nicht das tatsächliche Maximum sein wird. Wenn ich zb weiß, dass nur positive Zahlen vorkommen, dann starte ich eben zb mit einer 0 in die nächste Messperiode. Sobald ein größerer WErt vorkommt, ersetzt der dann diese 0 als 'bis zu diesem Zeitpunkt maximal vorgekommener Wert) > Könnt ihr mir den oder die Befehle sagen die ich dafür brauche??? Es hilft nichts. Du wirst dich davon verabschieden müssen, dass Programmieren nur darin besteht, die 'Befehle' zu kennen. Es ist die Kombination von Befehlen, die sog. Algorithmen, die in Zukunft immer mehr deine Programmierung beeinflussen. Die grundlegenden Befehle zu kennen ist wichtig, keine Frage. Aber Algorithmen (also Kombinationen) sind noch wichtiger. Das ist wie beim Schachspiel: Die Zugmöglichkeiten aller Figuren zu kennen ist wichtig. Aber sie sind nicht das, was Schachspiel ausmacht. Die Zugkombinationen und was sich daraus ergibt sind das, was beim Schach interessant ist. Viele Algorithmen benutzt du jeden Tag im täglichen Leben. Die Kunst besteht darin, sie zu erkennen und in den 'Wörtern' deiner Programmiersprache auszudrücken. Aber Ideen für Algorithmen findet man überall, wenn man nur sich selbst beobachtet und wie man selbst ein bestimmtes Problem löst.
> Und das sollte dann in einer dauerschleife laufen. > Das soll dann auf einen Arduino laufen. Nein. Auf einem Arduino willst du nichts in einer Dauerschleife laufen lassen. Die Dauerschleife ist implizit hier
1 | void loop() |
2 | {
|
3 | ....
|
4 | }
|
bereits enthalten. An die Stelle der Punkte kommt der 'Schleifenkörper' deiner Dauerschleife. Aber die Schleife selbst schreibst du nicht. Die ist dir bereits vorgegeben und bereits immer vorhanden. Du kümmerst dich nur noch darum, was bei EINEM Durchlauf durch diese Dauerschleife zu geschehen hat. Du musst also deine Operation als Abfolge von Zeitpunkten ansehen, wobei jeder Aufruf von loop() so einem Zeitpunkt entspricht. Dein Denken muss also weggehen von zeitlichen Steuerungen durch Schleifen. Statt dessen muss dein Denken hingehen zu: Ich bin jetzt gerade aufgewacht. Ich kann auf meine Uhr schauen und abhängig davon, wie die Zeiger gerade stehen kann ich Aktionen machen. Habe ich meine Aktionen gemacht, dann schlafe ich weiter bis ich das nächste mal aufwache. Deine Aktion nach dem Aufwachen ist * 1 Messung machen und feststellen ob ein neues (temporäres) Maximum gefunden wurde * feststellen ob die Messzeit um ist. Wenn ja, dann den bisher gefundenen Maximalwert ausgeben und neuen 'Messzyklus' starten, in dem das temporär bisher gefundene Maximum wieder auf 0 gesetzt wird. * Vorkehrungen dafür treffen, dass beim nächsten Aufwachen festgestellt werden kann, ob der Messzyklus um ist. Speziell letzteres macht man auf dem Arduino so
1 | unsigned long previousTime; |
2 | |
3 | ...
|
4 | |
5 | void loop() |
6 | {
|
7 | unsigned long now = millis(); |
8 | |
9 | if( now - previousTime > 500 ) { // 500ms sind 1/2 Sekunde |
10 | previousTime = now; |
11 | |
12 | .... mach was alle halbe Sekunde |
13 | |
14 | }
|
15 | |
16 | .... mach Dinge, die nicht von der verstrichenen Zeit abhängen |
17 | |
18 | }
|
das ist eine einfache und die übliche Methode, wie man Dinge ab dem Millisekundenraster aufwärts in regelmässigen Zeitabständen macht. Und wenn du das mal durchdenkst folgt das genau dem Prinzip des: Ich bin jetzt aufgewacht, was gibt es genau jetzt (zu diesem Zeitpunkt) zu tun? In dem Fall ist das halt einfach ein Uhrenvergleich. Wann habe ich das letzte mal meine Aktion gemacht und wie spät ist es jetzt? Wenn zwischen dem letzten mal und jetzt mehr als 500 Millisekunden liegen, dann wird es wieder mal Zeit die Aktion durchzuführen und sich zu merken, wann ich das getan habe.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.