Forum: Mikrocontroller und Digitale Elektronik Von Analoge Eingänge denn MAX Wert bestimmen in eine Zeitspanne


von Johannes M. (john311)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.