[Anfrage] Möchte Stoppuhr mit USB Button und Eingabeformular programmieren

  • Hallo miteinander,

    für einen Promoschen Stand bei dem ein kleines Spiel auf zeit durchgeführt wird möchte ich etwas programmieren, bin mir nur nicht sicher ob ich hier das Richtige Medium wählen würde daher suche ich ein wenig Infos und Inspiration.

    Wie ich mir das vorstelle.

    1. USB Button Startet die Stoppuhr auf dem Monitor.

    1.1 Es wird eine MP3 wehrend der Stoppuhr mit abgespielt.

    2. USB Button Stoppt die Stoppuhr auf dem Monitor.

    2.1. Das Ergebnis der Stoppuhr ist für xx Sekunden auf dem Monitor zu sehen.

    3. Das Ergebnis der Stoppuhr wird an ein Formular übergeben.

    4. Der Spieler kann sich in das Formular eintragen.

    5. Das Formular wird auf dem Rechner in eine Textdatei gespeichert (CSV Datei)

    6. Das ganze beginnt wider von Vorne.

    00. Das Programm kann jederzeit mit der Taste F3 Beendet werden.

    Es soll kein Fensterrahmen zu sehen sein.

    Der Hintergrund für die Stoppuhr ist FIX.

    Der Hintergrund für das Formular ist FIX.

    Die MP3 ist Fix.

    Die Stoppuhr ist Groß und genau in der Mitte des Monitors.

    Das Programm soll als EXE Datei fertig sein.

    Über ein Konfigurationsdatei können Parameter festgelegt werden.

    - Hintergrundbild (Stoppuhr)

    - Hintergrundbild (Formular)

    - Hintergrundmusik (Stoppuhr)

    - Anzeige Dauer Stoppuhr Ergebnis (in Sekunden)

    - Programm Beenden Taste (F3)

    Auf Amazon habe ich einen USB Button gesehen, bin mir nicht sicher ob das überhaupt der richtige ist für so was.

    Was meint ihr ist das machbar?

    und wenn ja wie fange ich da am besten an?

    Gruß Mücke

  • Habe den Button gerade angesehen und denke nicht, daß dieser Button dafür geeignet ist. Die Beschreibung wie immer bei Amazon nichtssagend.

    Aber laut etlichen Kommentaren wird der Button nur deshalb mit USB angestopst um die soundfiles darauf zu laden.

    Deshalb denke den wirst du für dein Vorhaben nicht verwenden können.

    Alles andere sollte sehr gut mit Autoit realisierbar sein.

    Brauchst dir nur noch einen wenn möglich konigurierbaren Button aussuchen, dann kannst du loslegen mit programmieren oder eben wieder fragen.

    So etwas wie hier sollte gehen, evtl gibts ja auch noch etwas günstigeres in der art

    https://www.amazon.de/USB-PushButton…e/dp/B00IXIM6BC

    Edit: fast vergessen, du kannst ja auch einfach die Maus dafür hernehmen.

  • Hey Tuxedo,

    das sind doch mal gute Nachrichten.

    Denn von dir verlinkten Button hatte ich mir auch schon angeschaut, habe das nur nicht verstanden wie der programmiert werden soll, würde mir aber gut gefallen.

    Dann mache ich mich mal schlau wie ich ein Konfigurationsdatei einlesen kann, und so ein Stoppuhr programmieren könnte :-).

    Danke schon mal.

    Wenn ich etwas weiter bin würde ich mich noch mal melden.

    ps. warum bekomme ich keine Benachrichtigung bei neuen Beiträgen?


    Gruß Mücke

  • zu Benachrichtigung: Eventuell sind deine Profileinstellungen nicht korrekt oder wurden durch ein Update resettet.

    Das Forum ist im Moment immer noch im Update-Wahn, kann passieren, daß immer wieder etwas nicht funktioniert oder wieder funktioniert.

    Ich kann diesem Update-Wahn auch nichts abgewinnen.

    Ich denke dieser Buzzer kann in der Systemsteuerung oder per Software so eingerichtet werden, daß bei Betätigung ein bestimmter Tastencode gesendet wird,

    und diesen kannst du dann im Script auswerten(evtl per Hotkey und sonst per _IsPressed) oder wenn du es kompliziert magst geht sowas sicher auch per DLL Calls oder per WinApi.

    Ich weiss es nicht genau, aber ich glaube eine Uhr in gross und Fullscreen (oder fast) hat entweder Oscar oder UEZ mal ein Script im Forum veröffentlicht.

    Wenn ich es finde poste ich einen Link dorthin.

    Die Konfig-Datei kannst du mit iniread und iniwrite oder auch mit fileread oder filereadline bedienen, wobei die ersten beiden am geeignetsten wären, denke ich.

    Das sollte dir erstmal über die Runden helfen.

    Es grüsst Tuxedo

    Einmal editiert, zuletzt von Tuxedo (19. November 2018 um 18:26)

  • Hey Tuxedo,

    erst ein mal viel dank das du mir etwas unter die Ahme greifen tust, ich habe mich mal dran gesetzt und mit der INI Datei angefangen, habe auch die Werte die ich einlese einer Prüfung unterzogen, sprich auf Plausibilität geprüft.

    Bei der Prüfung bin ich mir nur nicht sicher wie ich eine Tastenkombination auf Plausibilität Prüfen kann.


    Als Zweites habe ich versucht eins der Bilder auf dem Monitor zu laden, was mir auch gelingt, jedoch habe ich entweder die Titelleiste oder die Taskleiste mit im Bild, kann man die beide ausschalten?

    Habe meinen bisherigen Code mal hier angehängt.

  • Ich werde aus deinem Code nicht so ganz schlau, sieht für mich aus als ob du 10 Dinge gleichzeitig machen wolltest.

    Fange vielleicht erstmal mit der Stoppuhr an und versuche die perfekt zum laufen zu bringen, so wie du sie brauchst.

    Die Grafik und den ganzen anderen Klimbim kannst du danach auch noch einfügen.

    Für die Stoppuhr hätte ich dir ein paar Beispiele zur Inspiration(die Beispiele stammen von verschiedenen Usern).

    Nach ein bissschen rumexperimentieren damit ,hat sich für mich als wichtig herausgestellt die Uhr aus verschiedenen Blöcken

    zusammenzustellen, dann kannst du auch nur Teile davon aktualisieren statt den ganzen String auf einen Rutsch, das würde dem Flackern

    vorbeugen wenn du Hundertsel oder sogar Tausendstel Sekunden anzeigen willst. Aber ich denke Hundertstel sollten auch genügen.

    Wenn die Stoppuhr dann läuft kannst du die anderen Dinge einbauen wie ein Hintergrundbild und später dann die Konfiguration per ini hinzufügen

    und den Sound zum Schluss noch oben drauf.

    Aber irgendwie ist mir nicht wirklich klar was dir da genau im Kopf herumgeistert, wie das zum Schluss aussehen und funktionieren soll.

    Gibt es da irgend eine Vorlage nach der du vorgehen willst(wenn ja,wäre ein Bild oder Video davon sicher hilfreich)?

    Hätte fast den Anhang vergessen:

  • erst mal danke für die zusammen Stellungen des Codes das ist ja genial, danke, da kann ich mir einige heraus nehmen.

    Bin mal gespannt ob ich das etwas geschmeidiger hin bekomme, die Uhren laufen alle etwas Stockend (Bildlich).

    Ja da hast du recht man muss die Stunde, Minute, Sekunde und Millisekunde immer separat Aktualisieren ansonsten Flackert die Uhr :(

    Habe mal meinen Ablauf in einem Bild zusammen gestellt.

    Die Roten Ziffern sollen die Abfolge sein.

    das Programm soll jederzeit und überall mit eine Tastenkombination beendet werden können.

    1. Startbildschirm, es wird gewartet bis der Bitter gedrückt wird (ist eine Tastenkombination)

    2. der Timer läuft und Aktualisiert sich

    Wenn der Butter erneut gedrückt wird Stoppt der Timer

    3. Die Timer zeit wird für 10 Sekunden angezeigt

    4. Ein Eingabe Formular öffnet sich, bei dem der User sich eintragen kann.

    Das Formular kann nur mit einer Tastenkombination gespeichert werden (so muss ich das Formular vor dem Speichern nicht auf Richtigkeit Prüfen lassen sondern das mache ich selber dann)

    5. Das Programm fängt wider von vorne an.

    Was soll über die INI eingetragen werden können.

    - jeder Schritt bekommt ein eigenes Bild (Hintergrund)

    - alle Tastenkombination

    - Wartezeit bei Schritt 3

    - Jeder Schritt soll mit einer MP3 untermalt werden können


    Was ich bisher in meinem Code versucht habe.

    1. INI erstellen und einlesen

    2. Werte die aus INI kommen auf Plausibilität prüfen und gegebenenfalls Abbruch einleiten oder Info ausgeben.

    3. Bild auf Fullscreen anzeigen

    mehr habe ich noch nicht gemacht.

    bzw. ich habe mir die Funktion TimerInit angeschaut und experimentiert, das ist aber nicht in dem Code zu sehen.

    Ich schaue mir das noch mal mit der GUI an damit ich das Richtig erstellt bekomme, denn darin muss ich ja dann später alles machen.

    Dann schaue ich mir den TimerInit bzw. die Codes die du mir angehängt hast an und schaue ob ich einen Timer gebaut bekomme.

    Wenn ich das habe dann melde ich mich noch mal.


    Gruß Mücke

  • Bei diesem gewünschten Ablauf würde es sich anbieten, folgende Struktur zu verwenden:

    1. Eine Hauptschleife While-Wend oder Do Until die alles steuert

    2. Eine Funktion mit eigener GUI und Schleife für den StartBildschirm

    3. Eine Funktion für den laufenden Timer mit eigener GUI und Schleife

    4. Eine Funktion für die Ergebnis Anzeige mit eigener GUI und Schleife

    5. Eine Funktion mit GUI und Schleife für die Dateneingabe.

    6: Eine Funktion zum Beenden

    Wenn du alles in eigene Funktionen verpackst ist es leichter die verschiedenen Sounds und Bilder einzufügen.

    Und nicht auf notwendige Status-Variablen vergessen, damit du jederzeit die Funktionen sauber beenden kannst(ohne MemoryLeaks

    die durch mehrfache Funktionsaufrufe entstehen ohne die Funktionen vorher zu beenden).

    Allerdings bin ich mir durch deinen Schritt 4 nicht mehr sicher, daß eine Ini Datei dafür wirklich geeignet ist, ja nach dem wieviele Mitspieler

    hier auftreten können, wäre es eventuell besser gleich in eine csv Datei zu schreiben(in Tabellenform).

    Das könnte man dann später in Excel weiterverarzten. Dafür gäbe es auch eine Excel-UDF die anscheinend gerne verwendet wird.

  • ja so habe ich mir das vorgestellt mit den Funktion.

    Was meinst du mit Status-Variablen?

    Sound und Bilder würde ich mit in die Funktion packen.

    die Formulardaten würde ich ihn die Formulardaten würde ich in eine CSV Datei speichern wollen.

    Die INI Datei dachte ich eigentlich dafür dass man die Tastenkürzel Sound Dateien und Bilddateien hinein schreibt, sodass ich diese auch nach dem ist eine exe-Datei ist noch verändern kann.

  • Hier bekommst ein kleins Beispiel wofür die Status-Variablen wichtig sind.

    Mit F5 wird die Funktion gestartet.

    Mit ESC kannst du die Funktion abbrechen und landest in der Hauptschleife, Script wird nicht beendet

    Mit F2 wird das Script beendet.

    Ich denke die Funktion der Variable $Status sollte daraus ersichtlich sein, du kannst durchaus auch mehrere solcher Varaiblen einsetzen.

    Natürlich mit jeweils anderen für dich passenden Namen.


    Es funktinoniert folgendermassen:

    Durch den Start per F5 wird der $Status auf True gesetzt, dann startet weil $Status = True die While Schleife in der Timer-Funktion,

    dann läuft die For Next Schleife durch. Und durch die Abfrage von $Status kann auch die For Next Schleife durch Abbruch per Beenden Funktion mit ESC

    unterbrochen werden, weil in der Beenden Funktion abgefragt wird mit welchem Hotkey die Beenden-Funktion aufgerufen wurde.

    Dadurch wird die For Next Schleife per ExitLoop verlassen und landet dann in der While Schleife der Timer Funktion, die dann ebenfalls

    verlassen wird weil eben While $Status = True nicht mehr stimmt und danach wird die Funktion verlassen und das Script landet wieder in

    der Hauptschleife. Jetzt kann die Funktion wieder neu gestartet werden oder man beendet es mit F2.

    So wird die Funktion sauber verlassen ohne immer neue Instanzen davon im Speicher anzusammeln.

    Viel Spass damit


    Edit:

    Das mit den Hotkeys und den Infos zu Bildern und Sounds in die Ini zu schreiben ist denke ich gut so. Ich würde es vermutlich anders machen,

    aber ich bin auch kein Berufsprogrammierer und schreibe so wie es mir am Besten passt(und nicht wie es am Besten wäre...)

    Und beim Formular wird dir die Funktion _ArrayToString vermutlich weiterhelfen. Dafür musst die die Formulardaten allerdings

    in einem 2D Array erfassen. Dafür würdest du wenn du das oben abgebildete Forumlar verwendest 10 Spalten und was weiß ich

    z.B. 100 Zeilen brauchen. Wenn die Hundert Spieler gespeichert wurden, schreibst du das ganze Array dann mit _ArrayToString in eine Textdatei (Formular.csv). Dann das Array wieder leeren und wieder weitermachen bis die Hundert wieder voll sind.

    Das Array könnte in deinem Fall wie folgt aussehen $Array[100,10] Die Daten aus der ersten Zeile kannst du wie folgt

    ansprechen $Array[0][0] bis $Array[0][9], Zeile 2 ist dann $Array[1][0] bis $Array[1][9]

    Das "D-Array kannst du dir am Leichtesten wie eine Excel Tabelle vorstellen.

    Irgendein User hier ein mal ein gutes Tutorial über Arrays erstellt(ist aber ein Kopfweh-Thema), könnte BugFix gewesen sein.

    Darüber findest du ausreichend Informationen in der Hilfe

    Man mir raucht der Kopf (Schei.. Arrays)

    3 Mal editiert, zuletzt von Tuxedo (23. November 2018 um 15:21)

  • Ich denke dieser Buzzer kann in der Systemsteuerung oder per Software so eingerichtet werden, daß bei Betätigung ein bestimmter Tastencode gesendet wird,


    und diesen kannst du dann im Script auswerten(evtl per Hotkey und sonst per _IsPressed) oder wenn du es kompliziert magst geht sowas sicher auch per DLL Calls oder per WinApi.

    Wenn man dem Buzzer sagen kann er soll "Enter" betätigen brauchst du nicht mal die Taste abfragen, sofern der Knopf immer ausgewählt ist.

  • Eine Abfrage wirst aber immer machen müssen, wenn du die Taste nicht abfragst, dann musst du eben das Fenster abfragen.

    Du willst ja, daß dein Programm irgendwie auf den Tastendruck(oder Buzzer) reagiert und eine bestimmte Aktion ausführen soll.

    Oder du hast ein Event registriert, dann wird eben auf dieses Event reagiert.

  • Kann sein, das ich hier zu "einfach" gedacht habe, da ich alles was mit GUI's zu tun hat, die mehr als nur eine Ausgabe enthalten, meist in Delphi programmiere und dort ist das "OnEnter"-Event Standardmäßig aktiv für den ausgewählten Button, was bei Autoit natürlich nicht der Fall ist.

    Müsste doch aber über

    Code
    ; Set an accelerator key - ENTER will fire $press
    Local $aAccelKeys[1][2] = [["{ENTER}", $press]]
    GUISetAccelerators($aAccelKeys)

    Ergänzbar sein und somit bräuchte man keine Tastenabfrage und muss nur beim starten des Timers, den Button aktivieren, der den Timer startet/ stoppt.

    2 Mal editiert, zuletzt von Moombas (27. November 2018 um 09:18)

  • Warum auch immer, hat sich das erstellen der Stoppuhr in diese beitrage verlagert.

    Sehr schnell in GUI schreiben

    Dort ist dann auch der Code der Stoppuhr zu finden.

    ich mache jetzt weiter, also ich versuche mit der ein und der Selben Tastenkombinationen verschiedene Statue in einer Variable zu erstellen, so das ich abhängig des Status der Variable dann den Richtigen Monitor anzeigen kann :) bzw. unterschiedliche GUI

    Dazu habe ich ein Frage kann ich mehre GUI erstellen und mir die dann immer dann anzeigen lassen wenn ich die Benötige? dann muss ich die nicht immer wieder neu erstellen? oder ?

  • so langsam aber kontinuierlich geht es weiter :)

    Ich habe es geschafft verschiedene GUI`s zu erstellen die ich dann auch nacheinander aufrufen kann, und das immer mit dem Selben Tastenkürzel (Button) .

    Habe auch den Timer mit eingebaut bekommen.

    Jetzt rauscht mir jedoch der Kopf und ich muss mal wider pause machen, das war jetzt eine Tagesaufgabe für mich :-.

    Als nächstes muss ich raus finden wie ich ein Formular bauen kann das auf dem Monitor in meiner GUI funktioniert das dann wiederum in eine Datei (TXT) Speichern kann.

    Gruß Mücke


    Damit ich euch nicht meinen Code vorenthalte habe ich euch meinen Code hier im Anhang :)

    Ihr dürft gerne Kritik üben, bitte bedenkt das ich ein Blutiger Anfänger bin der noch nicht alle Tricks und Kniffe drauf hat.

    Wenn Ihr den Code testen wollt, gerne.

    um aus der GUI Formular zu kommen muss man das "Formular" Speichern, dann geht das ganze wider von vorne los, bis auf die Start GUI die soll nur beim Programm Start angezeigt werden, für den User das er wies welche tasten Kombi für was ist.

    Code ist zu lange für das Forum daher jetzt als Datei im Anhang.

  • Erstmal ein Lob an dich, hast du gut gemacht.

    Aus dem Stadium "eines blutigen Anfängers" bist du aber wohl schon lange rausgewachsen. Die Uhr ohne Flackern hinzukriegen ist nicht so leicht

    wie es scheinen mag. Es funktioniert gut, dein Code ist sehr gut lesbar.

    Allerdings hättest du die jeweils aufeinanderfolgenden GUIsetState(@SW_SHOW) und GUIsetState(@SW_HIDE) überall bei den

    Gui Deklarationen weglassen können.

    Es reicht wenn du die GUI's erstellst, die Befehle für die Anzeige und wieder ausblenden rufst du ja eh später auf.

    Ausserdem fände ich es hilfreich wenn du die Hilfe der Startseite jederzeit wieder ansehen könntest. Habe dir ein Bespiel dazu gemacht.

    Falls du es verwenden willst musst nur oben bei den Hotkeyset Befehlen einen zB. mit F1 aufrufbaren Hotkey zu der Hilfefunktion einpflanzen:

    HotKeySet("{F1}", "_Hilfe")

    Code
    Func _Hilfe()
        Local Static $Status
        $Status = Not $Status
        If $Status = True Then
            GUISetState(@SW_SHOW, $ID_GUI_Start)
            Else
            GUISetState(@SW_HIDE, $ID_GUI_Start)
            EndIf
    EndFunc

    Und jetzt noch ein weiterer Tipp, die GUI fürs Formular kannst du doch mit dem Koda Formdesigner erstellen, aufrufbar im Editor Scite,

    ich nehme mal einfach an du benutzt ihn. Den Koda Form Designer findst du im selben Menü wo auch das Script gestartet wird,

    ist bei mir unter "Extras" und dort brauchst dann nur das Formular nach deinen Wünschen gestalten. Um die Daten ins Texfile deiner Wahl zu bekommen hast du dann mehrere Möglichkeiten. Die Formularfelder auslesen mit GuiCtrlRead und ins File schreiben.
    Datei vorher mit Fileopen zum Beschreiben öffnen und und mit dem Handle per Filewrite oder FilewriteLine oder iniwrite schreiben.

    Das Fileclose beim Beenden nicht vergessen.

    Viel Erfolg beim fertigstellen wünscht Tuxedo

  • Hey,

    erst mal danke für das Lob, den Code für die Uhr habe ich jedoch von Bitnugger übernommen aus dem Post Sehr schnell in GUI schreiben, hier wurde mir gezeigt wie man ein Label im Nachgang verändern kann, was dann deutlich weniger zeit in Anspruch nimmt und das Flackern dann nicht mehr so stark hervor kommt.

    Das freut mich das der Code gut lesbar ist, (habe extra schön geschrieben ;-)) ne Spaß bei Seite, das ist echt anstrengend keinen Spaghetti Code zu produzieren und das dann auch noch ordentlich zu Strukturiren.

    Daher Danke.

    Allerdings hättest du die jeweils aufeinanderfolgenden GUIsetState(@SW_SHOW) und GUIsetState(@SW_HIDE) überall bei den

    Gui Deklarationen weglassen können.

    Das hatte ich in meinen Hilfsprogramm bei dem ich mit den GUI`s geübt habe zu beginn auch gemacht, das hatte aber zu Problemen geführt.

    Ich konnte die GUI nicht anzeigen lassen oder sie ist wenn eine andere GUI Drüber lag nicht mehr in den Vordergrund gekommen, das kann zu dem Zeitpunkt vielleicht auch an anderen Dingen noch gelegen haben, jedoch hatte ich das in den Griff bekommen in dem ich die GUI ein mal angezeigt und dann sofort wider verborgen hatte.

    Habe es gerade getestet, hier im Programm macht es tatsächlich keine Probleme, habe die zwei Zeilen jeweils heraus genommen, werde mir das für die Zukunft merken, danke.

    Die Idee mit der Hilfsseite finde ich gut, würde das aber anders Lösen wollen.

    Ich werde den F1 HotKey einfügen würde dann aber für 10 Sekunden ein Tooltip ausgeben lasse, so wird das Programm nicht unterbrochen und die Info ist nur kurz und Klein zu sehen.

    Hintergrund ist der das der Timer später auf einen Großen Monitor laufen soll vor vielen Personen, da muss nicht jeder alles erkennen ;)


    Den Code mit dem ToolTip und das heraus nehmen der zwei Zeilen in den GUI`s habe ich wider angehängt.

    Das mit dem Formular muss ich mir genauer anschauen, ja ich nutze den SciTE Editor, und ich habe dank dir das mit dem Formular auch schon gefunden, da muss ich mich aber erst einarbeiten.

    Da melde ich mich dann wider.

    Gruß Mücke

  • Muss dich leider noch ein bisschen enttäuschen, verwendest du im Timerkern Funktionen mit dem Wort ticks im Funktionsnamen, ich vermute mal sehr, daß das der Fall ist.

    Dann solltest du dir überlegen wie du dir selbst einen Zeitzählkern basteln kannst. Beim Testen deines Scripts ist mir das merkwürdige Verhalten der Millisekunden in der Zeitanzeige aufgefallen. Das dürfte von den ticks Funktionen stammen.

    Ich habe die letzen Wochen einige Testläufe mit Timern und Stoppuhren hinter mir und dabei war öfters das Verhalten der Millisekunden beim Verwenden der ticks Funktionen auffällig. Ich hatte sogar Fälle da wurde der Timer mit der Zeit schneller.

    Ausserdem wäre zu überdenken ob du für eine Stoppuhr die durch Menschenhand gesteuert wird nicht besser auf die Millisekundenanzeige verzichtest,

    und nur auf Hundertstel genau anzeigst. Ich glaube nicht, daß du auf Menschen triffst die auf paar Millisekunden genau die Stoppuhr steuern können.

    Aber eventuell gibt es welche die es auf 80 bis 120 Hundertstel schaffen. Ausserdem ist das Anzeigebild bei Hundertstel Sekunden wesentlich

    runder und fließender. Dann sieht es beinahe einer Nixie-Uhr ähnlich.