Zeit erfassen und speichern zwischen 2 ereignissen

Hallo,

ich würde gerne die Zeit zwischen button drücken und ..... erneut drücken.....mit dem Arduino feststellen lassen.

Üblicherweise zwischen 2 sekunden und 3minuten...

dann die z.B. milisikunden in eine Variable speichern.. damit ich damit dann weiterarbeiten kann.

Ist das möglich?

Gruß

Simon

Natürlich geht das, einfach aus der Differenz der millis. Du musst nur dafür sorgen, dass dein Tastendruck nicht prellt und damit eine falsche Zeitspanne erfasst wird.

Und die Zeit zwischen den beiden Tastendrücken darf nicht über 49 Tage sein da ansonsten ein Überlauf stattfindet und so für Arduino die zeitmessung wieder bei 0 anfängt.
Wohlgemerkt der Überlauf stört nicht bei der Berechnung der Differenzzeit aber nach mehreren Überläufen ist aus Millis() nicht erssichtlich wie oft der Überlauf stattgefunden hat.

Grüße Uwe

Und die Zeit zwischen den beiden Tastendrücken darf nicht über 49 Tage sein da ansonsten ein Überlauf stattfindet und so für Arduino die zeitmessung wieder bei 0 anfängt.
Wohlgemerkt der Überlauf stört nicht bei der Berechnung der Differenzzeit aber nach mehreren Überläufen ist aus Millis() nicht erssichtlich wie oft der Überlauf stattgefunden hat.

Grüße Uwe

Danke an alle :slight_smile:

habe es nun hinbekommen.
Siehe:

long startTime ; // start time for stop watch
long zeit ; // elapsed time for stop watch

//im void setup ()bleibt alles so

void loop(){
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {

startTime = millis();
digitalWrite(ledPin, HIGH);
Daten_senden();

}
else {
digitalWrite(ledPin, LOW);
client.stop();
zeit = millis() - startTime;

}
}

in der Variable "zeit" speicher ich nun die zeit in millisekunden ziwschen dem "button drücken"....
Diese gebe ich per GET an eine PHP datei am server weiter.
So kann ich den "Zyklus" einer Maschine bestimmen und Speichern.

Interessehalbe wollte ich das ganze auch auf der PHP/Server Seite lösen,
und die Zeit mit PHP bestimmen lassen:

$zeit = microtime($get_as_float = true);

dann habe ich den letzten Eintrag in der Datenbank mit dem aktuellen Eintrag substrahiert.

$zyklus = ($neuerwert - $alterwert);

und bin so auf ein sehr sehr änliches Ergebnis bekommen.
Natürlich mit leichter Verzögerung auf der SQL-Variante.
Das ganze Verzögert sich sicher noch mehr, wenn die Lan-Kabel länger werden,
oder das ganze durchs WWW über WLan gesendet wird....

Deswegen wollte ich auch lieber die Berechnung vom Board :slight_smile:

Habe leider keine Ahnung von Micro-Elektronik-Kram, und dieses java - C Programmieren,.,...
aber mit PHP schaffe ich es doch etwas hier durchzusteigen..

wenn es verbesserungen gibt, bitte darauf hinweisen, ich will lernen :slight_smile:

Zum Vergleich, einige gemessene Zeiten:

Zyklus PHP berechnet liegt bei 4.22 Sekunden.
Zyklus beim Board liegt bei 4.109 Sekunden.

Zyklus PHP berechnet liegt bei 190.84 Sekunden.
Zyklus beim Board liegt bei 190.988 Sekunden.

Zyklus PHP berechnet liegt bei 10.802 Sekunden.
Zyklus beim Board liegt bei 10.713 Sekunden.

Zyklus PHP berechnet liegt bei 0.198 Sekunden.
Zyklus beim Board liegt bei 0.131 Sekunden.

Zyklus PHP berechnet liegt bei 1.195 Sekunden.
Zyklus beim Board liegt bei 1.081 Sekunden.

Die Variablen
startTime und zeit müssen vom Typ unsigned long nicht long sein weil auch millis eine unsignd long zurückgibt.

Grüße Uwe

uwefed:
Die Variablen startTime und zeit müssen vom Typ unsigned long nicht long sein
Grüße Uwe

... Sonst ist Überlauf nicht nach 49 Tagen, sondern zeit wird schon nach gut 3 Wochen ununterbrochenen Tasterdrückens negativ ... :wink:
Eine negative Startzeit ( wenn der arduino so lange kein Reset hatte ) stört nicht weiter, wenn sie nicht direkt angezeigt wird.

Aber prinzipiell hat Uwe wirklich recht, aus Faulheit das lange schwere Wort "unsigned" wegzulassen, sollte man sich gar nicht erst angewöhnen.

Bis du mit deinem sketch wirklich zufrieden ?
Solange (buttonState == HIGH) wird startzeit immer wieder neu gesetzt und Daten_senden() aufgerufen,
ansonsten (buttonState == LOW) wird zeit hochgezählt und immer wieder client.stop() aufgerufen

D.h. der Button schaltet GND auf einen pullup Eingang ?
Ich nehme an, Daten_senden () liest die globale Variable zeit, und merkt sich evtl, dass die Daten schon gesendet sind ?

? Oder hab ich da was falsch gelesen ?

Bis du mit deinem sketch wirklich zufrieden ?
Solange (buttonState == HIGH) wird startzeit immer wieder neu gesetzt und Daten_senden() aufgerufen,
ansonsten (buttonState == LOW) wird zeit hochgezählt und immer wieder client.stop() aufgerufen

NEIN! ich war noch nicht zufrieden :wink:
Daten senden wurde zwar immer wieder aufgerufen, aber es konnte nicht gesendet werden,
weil noch kein client.stop() aufgerufen wurde... habe ich so herausgefunden. ist aber nicht schön gewesen, das stimmt,
deswegen steckt es jetzt in einer while-Schleife.
daten senden:

void Daten_senden()
{

if (client.connect(server, 80)) // Verbindung zum Server aufbauen
{
client.print("GET ");
.........usw.......

Dann ist ist mir noch aufgefallen das wenn ich den Button länger drücke,
hier dann nicht wie von mir gewünscht gezählt wird.

Ich brauchte die Zeit vom ersten Drücken bis zum nächste mal drücken, egal wie lange das Signal ( in dem Testfall, der Button) gedrückt wird.

Nach vielen Stunden ^^ habe ich es nun gelöst (und gleich einen 2ten Button eingebaut - ist aber nur zur Informationszwecken)

Es schaut so aus: ( glaube ich habe zuviele hilfs-Zähler eingebaut,.egal)

unsigned long startTime ;           
unsigned long zeit;

int C = 0;
int C2 = 0;
int C3 = 0;

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  buttonState2 = digitalRead(buttonPin2);
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
   
     if (buttonState == HIGH) {
             //Serial.println(millis());
              C3 = 0;
              digitalWrite(ledPin, HIGH);
              digitalWrite(ledPin2, LOW);
              while ( C < 1){ 
              zeit =   millis() - startTime;
              Daten_senden();
             C++;
              }
              while ( C < 2){ 
              startTime = millis();  
                C++;
            Serial.println("Werkzeug offen"); 
            Serial.print("Zyklus: ");
            Serial.println(zeit);
             }
                         }
    else if (buttonState2 == HIGH){
              digitalWrite(ledPin, LOW);
              digitalWrite(ledPin2, HIGH);
              while ( C2 < 1){
            Serial.println("Werkzeug geschlossen");
             
                        C2++;
              }   
          }
    else if (buttonState == LOW){
      while ( C3 < 1){
            Serial.println("Zyklus startet.........");
            //Serial.println(zeit);
             C3++;
              } 
            digitalWrite(ledPin, LOW);
            digitalWrite(ledPin2, LOW);  
            client.stop();
            C = 0;
            C2 = 0;
          }
}

Das hier sind meine ersten Gehversuche mit Arduino, bzw überhaupt mit Drähten ;)....

Daten_senden() schickt die Arduino Variable "zeit" an meine PHP Datei, welche dieses
in eine SQL Tabelle einträgt.

Mein allgemeiner Plan:
Habe vor ein BDE-System Betriebsdatenerfassung – Wikipedia auf Arduino und php Basis in unserer Firma zum laufen zu bringen.
Hier soll dann ... später... die laufende Artikelnummer per Tastenfeld in Arduino eingegeben werden.
Dieses und der aktuelle Zyklus wird dann im LCD Display angezeigt.
Aus der SQL Datenbank soll dann der "Wunsch-SOLL-Zyklus" an den Arduino gesendet werden ..viel später ^^..
und dieses auch im Display anzeigen, so das die Arbeiter dann sehen, mist Maschine läuft zu langsam..... ( nur zur info-zwecken)
Der ganze Spaß kann dann im Browser betrachtet werden, welcher Artikel auf welcher Maschine und mit welchen Zyklus läuft.
Wenn zu langsam---> email an den Chef.. oder so :wink: - - dann ist ja alles möglich was php , mysql und Ajax so hergeben....
..... Großes Kopfkino.... aber so ist mein Plan :slight_smile:

Video:

Du willst ja nur an der Positiven Flanke des Tasters starten. Du liest die den Taster ein und hast gleichzeitig den letzten stand gemerkt.

So :

Digitalread Taster
If Taster==High && lastTaster==Low{
Starttime=millis
lastTaster=High}. //hier regierst du nur wenn der Eingang vorher low war auf das Ereignis

If lastTaster==High&& Taster==Low
LastTaster=Low