Go Down

Topic: Programm auf Computer starten (Read 1 time) previous topic - next topic

ElEspanol

#75
Oct 13, 2019, 09:53 am Last Edit: Oct 13, 2019, 09:55 am by ElEspanol
Kann man dafür nicht einfach das Archiv Flag missbrauchen?

Per bat laufend überwachen, ob das Flag gesetzt ist, wenn ja, senden und Flag löschen.

Und die Datei vom Backup rausnehmen.

Tommy56

Auch das geht. Es kommt immer darauf an, was man genau machen möchte und was man evtl. schon in der "Bastelkiste" liegen hat.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

togoze

Hallo zusammen,

vielen vielen Dank für die Hilfe.
Das Projekt mit der Datei Überwachung ist mit dem aktuellen Wissenstand (von mir :) ) für mich nicht möglich :)
Deshalb belassen wir das erstmal so, das die LED einfach kurz aufleuchtet.

Was ich allerdings noch einbauen will ist das der Befehl erst ausgeführt wird wenn der Taster Länger als 5 Sekunden gedrückt wird.

Das habe ich mir mit der "IF" Abfrage vorgestellt.
Bis jetzt habe ich im Netz nur diesen Artikel gefunden
https://forum.arduino.cc/index.php?topic=477326.30

Leider liefert mir dieser Artikel nicht direkte Denkanstöße für das Projekt.

Deshalb die Frage a) ist das möglich und b) wie ?

Danke und Gruß,

postmaster-ino

Hi

a) Ja
b) Teile Dein Problem auf
- kannst Du einen Tastendruck erkennen?
-> merke Dir die Startzeit (millis)
Wenn jetzt der Taster gedrückt ist UND die Startzeit des Tastendruck länger als 5 Sekunden her ist, dann ...

Du musst dabei nicht nur den Tastendruck, sondern auch das Lösen des Tasters erkennen - wenn der Taster weiterhin gedrückt ist, bleibt die Startzeit unberührt.
Wenn der taster aber vorhin noch nicht gedrückt war, jetzt aber schon, wird Startzeit auf den aktuellen Wert gesetzt.

Das sollte eigentlich als Denk-Hilfe reichen - oder soll's doch eher ein kompletter Sketch werden?
Letzteres scheidet aber leider aus - bevor Du fragst ;)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

togoze

Hi

a) Ja
b) Teile Dein Problem auf
- kannst Du einen Tastendruck erkennen?
-> merke Dir die Startzeit (millis)
Wenn jetzt der Taster gedrückt ist UND die Startzeit des Tastendruck länger als 5 Sekunden her ist, dann ...

Du musst dabei nicht nur den Tastendruck, sondern auch das Lösen des Tasters erkennen - wenn der Taster weiterhin gedrückt ist, bleibt die Startzeit unberührt.
Wenn der taster aber vorhin noch nicht gedrückt war, jetzt aber schon, wird Startzeit auf den aktuellen Wert gesetzt.

Das sollte eigentlich als Denk-Hilfe reichen - oder soll's doch eher ein kompletter Sketch werden?
Letzteres scheidet aber leider aus - bevor Du fragst ;)

MfG
Hi Postmaster,

super DANKE.
Ich denke ich bin hiermit sehr weitergekommen.

Diese Funktion sollte dann ja eigentlich so Funktionieren:

if (millis() - gedrueckt < 5000)

"gedrueckt" ist wie folgt Definiert: unsigned long gedrueckt;;


Ich werde das Später mal auf drauf spielen und mich melden ob das so Funktioniert :)

Gruß,

Tobi

postmaster-ino

Hi

Der Name der Variable ist aber genau verkehrt herum ;)
Du willst Dir ja die Start-Zeit des Drückens merken - soweit ok - dazu musst Du aber immer die Zeit notieren, wenn NICHT gedrückt ist.
Vll. wäre hier unsigned long last_not_press; - also, wann zuletzt nicht gedrückt wurde (weil seit Dem wird ja gedrückt) ein eingängigerer Name.

Man muß sehr oft genau anders herum an das Problem heran gehen, als maneigentlich als Lösung haben will - hier willst Du die Länge des gedrückt Haltens wissen - dafür ist's sinnvoll, die 'Uhrzeit' zu merken, wo nicht gedrückt war.

Wenn Du den Taster nun >>47 Tage drückst, wird der Sketch kurz falsch laufen - denke, mit dieser Gefahr können wir hier aber gerade so leben - oder ist mit Tastendrücken von mehr als 47,x Tagen zu rechnen? (nach dieser Zeit läuft millis() über und die Prüfbedingung wird wieder wahr)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

togoze

Hi

Der Name der Variable ist aber genau verkehrt herum ;)
Du willst Dir ja die Start-Zeit des Drückens merken - soweit ok - dazu musst Du aber immer die Zeit notieren, wenn NICHT gedrückt ist.
Vll. wäre hier unsigned long last_not_press; - also, wann zuletzt nicht gedrückt wurde (weil seit Dem wird ja gedrückt) ein eingängigerer Name.

Man muß sehr oft genau anders herum an das Problem heran gehen, als maneigentlich als Lösung haben will - hier willst Du die Länge des gedrückt Haltens wissen - dafür ist's sinnvoll, die 'Uhrzeit' zu merken, wo nicht gedrückt war.

Wenn Du den Taster nun >>47 Tage drückst, wird der Sketch kurz falsch laufen - denke, mit dieser Gefahr können wir hier aber gerade so leben - oder ist mit Tastendrücken von mehr als 47,x Tagen zu rechnen? (nach dieser Zeit läuft millis() über und die Prüfbedingung wird wieder wahr)

MfG
Hi, die Bezeichnung habe ich geändert :)

Es kann schon durchaus sein das der Taster innerhalb von 47 Tagen nicht betätigt wird.
Bedeutet der Taster muss nach 47 Tagen 2x betätigt werden um zu Funktionieren?

Gruß,

Tobias

postmaster-ino

Hi

Nein - im Gegenteil - wenn Er über 47 Tage am Stück betätigt wird, wird ja die Startzeit nicht neu gesetzt - und wenn dann millis() überläuft, haben wir wieder eine ungültige Abfrage, obwohl der Taster bereits viel länger gedrückt ist, als gefordert.

In 47 Tagen muß der Taster zumindest 1x nicht betätigt sein - darin sehe ich aber kein Problem.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

togoze

#83
Oct 20, 2019, 05:35 pm Last Edit: Oct 20, 2019, 05:37 pm by togoze
Ich habe das ganze jetzt in meinem eigentlichen Sketch integriert.
Nur leider funktioniert das ganze so nicht.
Hat hierzu jemand eine Idee warum?
Eigentlich müsste das mit IF und der millis() doch passen?

Code: [Select]

//Installation
#include <Keyboard.h>
const byte tasterPin1 = 6;                                                      //Taster Rot
const byte tasterPin2 = 2;                                                      //Taster Grün
const byte tasterLED1 = 4;                                                      //LED Rot
const byte tasterLED2 = 8;                                                      //LED Grün

unsigned long last_not_press;;

//Def. Variable
void setup() {
  Keyboard.begin();
  pinMode(tasterPin1, INPUT_PULLUP);
  pinMode(tasterPin2, INPUT_PULLUP);
  pinMode(tasterLED1, OUTPUT);
  pinMode(tasterLED2, OUTPUT);
}

//Loop Taster + leuchten der LED
void loop() {
  if (!digitalRead(tasterPin1)) {                                // Taster-ROT wurde gedrückt
   if (millis() - last_not_press < 3000) {
        Keyboard.press(KEY_LEFT_GUI);                                        // Windows-Taste
        Keyboard.press('r');                                                           // R-Taste
        digitalWrite(tasterLED1, HIGH);                                           // Schalte LED ROT an
        delay(100);
        Keyboard.releaseAll();                                                            // Tasten lösen
        delay(200);
        Keyboard.print("C>&Users&Public&BatchDateienAenderungAlarmablauf&Unwetter.bat"); 
        Keyboard.write(KEY_RETURN);
        delay(500);
        digitalWrite(tasterLED1, LOW);                                                                   // Schalte LED ROT aus
  }}



Gruß,

postmaster-ino

#84
Oct 20, 2019, 06:54 pm Last Edit: Oct 20, 2019, 06:55 pm by postmaster-ino
Hi
Code: [Select]

const boolean gedruckt = LOW;   //Pegel bei gedrücktem Taster


//Installation
#include <Keyboard.h>
const byte tasterPin1 = 6;                                                      //Taster Rot
const byte tasterPin2 = 2;                                                      //Taster Grün
const byte tasterLED1 = 4;                                                      //LED Rot
const byte tasterLED2 = 8;                                                      //LED Grün

unsigned long last_not_press;

//Def. Variable
void setup() {
  Keyboard.begin();
  pinMode(tasterPin1, INPUT_PULLUP);
  pinMode(tasterPin2, INPUT_PULLUP);
  pinMode(tasterLED1, OUTPUT);
  pinMode(tasterLED2, OUTPUT);
}

//Loop Taster + leuchten der LED
void loop() {
  if (digitalRead(tasterPin1) == gedruckt) {                              // Taster-ROT wurde gedrückt
    if (millis() - last_not_press > 3000) {     //> 3000, wenn wir mehr als 3 Sekunden gedrückt haben
      Keyboard.press(KEY_LEFT_GUI);                                        // Windows-Taste
      Keyboard.press('r');                                                           // R-Taste
      digitalWrite(tasterLED1, HIGH);                                           // Schalte LED ROT an
      delay(100);
      Keyboard.releaseAll();                                                            // Tasten lösen
      delay(200);
      Keyboard.print("C>&Users&Public&BatchDateienAenderungAlarmablauf&Unwetter.bat");
      Keyboard.write(KEY_RETURN);
      delay(500);
      digitalWrite(tasterLED1, LOW);                                                                   // Schalte LED ROT aus
    }
  }else{
    last_not_press=millis();    //wenn NICHT gedrückt wird, müssen wir uns ja merken, wann nicht gedrückt war
  }

Eigentlich habe ich jetzt nur das < in ein > umgedreht und im ELSE-Zweig die Uhrzeit gemerkt, wenn der Taster NICHT gedrückt ist.
... und ich habe mir eine Hilfs-Variable gebaut - liest sich leichter (und bei Relais kann man einfacher von LOW-Aktiv (z.B. 8-fach Relais-Karte) auf HIGH-Aktiv (z.B. SSRs) umbauen)

MfG

PS: Kompiliert bei mir nicht, da mir 'ein Sack voll' Library's fehlen.
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

uxomm

Ja, der Else-Zweig ist ein ganz wichtiger Schritt.
Das Problem könnte aber sein, dass jetzt, wenn der Taster etwas länger als 3 Sekunden gedrückt ist (bzw. bleibt) etwa alle 800 ms Datei "Unwetter.bat" (erneut) am PC gestartet wird.
Möglicherweise ist das nicht ganz im Sinne der Aufgabe. :)

Da braucht es vielleicht noch eine weitere Variable, wo "gemerkt" wird, ob der Taster bereits gedrückt ist oder nicht.

Hier wäre der erweiterte Code:
Code: [Select]
const boolean gedruckt = LOW;   //Pegel bei gedrücktem Taster
#include <Keyboard.h>
const byte tasterPin1 = 6;                                                      //Taster Rot
const byte tasterPin2 = 2;                                                      //Taster Grün
const byte tasterLED1 = 4;                                                      //LED Rot
const byte tasterLED2 = 8;                                                      //LED Grün
boolean taster1 = false;
boolean taster2 = false;
unsigned long last_not_press_taster1;
unsigned long last_not_press_taster2;

void setup() {
  Keyboard.begin();
  pinMode(tasterPin1, INPUT_PULLUP);
  pinMode(tasterPin2, INPUT_PULLUP);
  pinMode(tasterLED1, OUTPUT);
  pinMode(tasterLED2, OUTPUT);
}

void loop() {
  // Taster 1:
  if (digitalRead(tasterPin1) == gedruckt) {                                     // Taster-ROT wurde gedrückt
    if ( (millis() - last_not_press_taster1 > 3000)  &&  (taster1 == false) ) {  // > 3000, wenn wir mehr als 3 Sekunden gedrückt haben
      taster1 = true;
      Keyboard.press(KEY_LEFT_GUI);                                 // Windows-Taste
      Keyboard.press('r');                                          // R-Taste
      digitalWrite(tasterLED1, HIGH);                               // Schalte LED ROT an
      delay(100);
      Keyboard.releaseAll();                                        // Tasten lösen
      delay(200);
      Keyboard.print("C>&Users&Public&BatchDateienAenderungAlarmablauf&Unwetter.bat");
      Keyboard.write(KEY_RETURN);
      delay(500);
      digitalWrite(tasterLED1, LOW);                               // Schalte LED ROT aus
    }
  } else {
    last_not_press_taster1 = millis();   // wenn NICHT gedrückt wird, müssen wir uns ja merken, wann nicht gedrückt war
    taster1 = false;
  }

  // Taster 2:
  if (digitalRead(tasterPin2) == gedruckt) {                                     // Taster-GRÜN wurde gedrückt
    if ( (millis() - last_not_press_taster2 > 3000)  &&  (taster2 == false) ) {  // > 3000, wenn wir mehr als 3 Sekunden gedrückt haben
      taster2 = true;
      Keyboard.press(KEY_LEFT_GUI);                                  // Windows-Taste
      Keyboard.press('r');                                           // R-Taste
      digitalWrite(tasterLED2, HIGH);                                // Schalte LED RÜN an
      delay(100);
      Keyboard.releaseAll();                                         // Tasten lösen
      delay(200);
      Keyboard.print("C>&Users&Public&BatchDateienAenderungAlarmablauf&AllesImGruenenBereich.bat");
      Keyboard.write(KEY_RETURN);
      delay(500);
      digitalWrite(tasterLED2, LOW);                                // Schalte LED GÜN aus
    }
  } else {
    last_not_press_taster2 = millis();  //wenn NICHT gedrückt wird, müssen wir uns ja merken, wann nicht gedrückt war
    taster2 = false;
  }

}


Die Dateinamen (.bat) musst du wahrscheinlich noch deinen Gegebenheiten anpassen.
Always decouple electronic circuitry.

togoze

Hallo Postmaster-ino
Hallo uxomm

vielen vielen Dank an euch beiden.
Der Schalter funktioniert nun so wie wir das wollen.
Der Schalter geht nun in seinen Testbetrieb für die nächsten Monate :)

Danke und Gruß,

Tobias

Go Up