Programm auf Computer starten

Hallo zusammen,

das Sketch wie im Beitrag oben drüber erwähnt funktioniert Einwandfrei.

Allerdings möchten wir nun die erwähnten LED's je nach Inhalt der mit den .bat Datei in die .txt geschriebene wird leuchten zu lassen.

Ich habe hierzu schon einmal die Suchmaschine meines Vertrauens gefragt allerdings noch nicht richtiges Gefunden.

Daher meine Frage ist es möglich mit dem Arduino eine Datei zu überwachen?

Gruß,

Tobias

Du meinst eine Datei auf dem PC? Direkt nicht, Du müsstest den Dateiinhalt laufend zum Aeduino übertragen. Da kannst Du einfacher ein Programm auf dem PC aufsetzen, das die Datei überwacht und bei Bedarf Steueranweisungen für LED an den Arduino schicken.

Oder meinst Du etwas ganz Anderes? Dann musst Du das genauer beschreiben.

Gruß Tommy

Tommy56:
Du meinst eine Datei auf dem PC? Direkt nicht, Du müsstest den Dateiinhalt laufend zum Aeduino übertragen. Da kannst Du einfacher ein Programm auf dem PC aufsetzen, das die Datei überwacht und bei Bedarf Steueranweisungen für LED an den Arduino schicken.

Oder meinst Du etwas ganz Anderes? Dann musst Du das genauer beschreiben.

Gruß Tommy

Hi,

nein so wie du das beschrieben hast ist das komplett richtig.

Gibt es so ein Programm schon wo man Steueranweisungen auf den Arduino schicken kann?

Gruß,

Unter der cli sollte doch sowas wie copy datei.txt com2 gehen? Hab da schon länger nichts mehr gemacht mit.
Das dann in einen Cron job

togoze:
Gibt es so ein Programm schon wo man Steueranweisungen auf den Arduino schicken kann?

Ist mir nicht bekannt. Das wirst Du wohl selbst schreiben müssen. Das hängt ja auch stark davon ab, worauf de Datei überwacht werden soll.

Ob sie geändert wurde, egal wie
bestimmte Änderungen usw.

Gruß Tommy

Edit: Welches Betriebssystem?

Tommy56:
Ist mir nicht bekannt. Das wirst Du wohl selbst schreiben müssen. Das hängt ja auch stark davon ab, worauf de Datei überwacht werden soll.

Ob sie geändert wurde, egal wie
bestimmte Änderungen usw.

Gruß Tommy

Edit: Welches Betriebssystem?

Hi,

schonmal danke für die Info.
Das Schreit mir nach sehr viel Arbeit (für einen Anfänger) :slight_smile:

Auf dem PC nutzen wird das Betriebssystem Windows 10.

Es soll eine Datei (.txt) überwacht werden.
Wenn in dieser Datei Wert/Wort X steht soll LED 1 leuchten
und wenn in Wert/Wort Y steht soll LED 2 leuchten.

Gruß,

Batch-Datei machen und da so was reinschreiben:

: loop
type absoluter/pfad/zur/date > COM1
sleep 5
goto loop

Und dann nach dem Wort am Arduino suchen, sofern der auf COM1 hängt.

Ja, das ist einiges an Arbeit. In unixoiden Systemen könnte man das mit Mitteln der Shell+awk machen. Die muss man aber auch erst mal beherrschen.

Es steht immer nur die eine Zeile drin? Wieviele Varianten? Was soll WortX sein (Beispiel).

Dann schau Dir mal die Powershell an, damit sollte das machbar sein. Mit Regexp sollte sich da was bauen lassen. Zur Powershell gibt es viele Beispiele (englisch) im Netz, die man dann entsprechend kombinieren muss. Die lassen sich mit Google gut finden.

Du kannst natürlich auch mit Codeblocks in C(++) programmieren, da dürfte es aber noch etwas schwieriger werden.

Wo kommt denn die Textdatei her? Evtl. gibt es einen besseren Weg.

Gruß Tommy

zwieblum:
Und dann nach dem Wort am Arduino suchen, sofern der auf COM1 hängt.

Wenn der Aufbau einfach genug ist, ist das ein gangbarer Weg. In Puffer einlesen und mit strtok zerlegen.
COM1 wird es nie sein.

Gruß Tommy

Edit: Evtl. könnte man das noch mit der Powershell kombinieren, dass nur gesendet wird, wenn die Datei gespeichert wurde.

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.

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

Hallo zusammen,

vielen vielen Dank für die Hilfe.
Das Projekt mit der Datei Überwachung ist mit dem aktuellen Wissenstand (von mir :slight_smile: ) für mich nicht möglich :slight_smile:
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ß,

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 :wink:

MfG

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 :wink:

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 :slight_smile:

Gruß,

Tobi

Hi

Der Name der Variable ist aber genau verkehrt herum :wink:
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

postmaster-ino:
Hi

Der Name der Variable ist aber genau verkehrt herum :wink:
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 :slight_smile:

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

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

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?

//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ß,

Hi

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.

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. :slight_smile:

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:

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.