Arduino millis zeiten Stimmen nicht?!

Guten Abend,
ich bin totaler Anfänger und möchte dennoch eine kleine Steuerung für ein Tor Basteln.

Es funktioniert alles bis auf die Zeiten, die varieren Stark.

Eingestellt sind 5000ms / dennoch schaltet das Tor mal nach 1sek, 2sek, 4sek... ab, verstehe leider nicht warum :frowning:

generelle funktion :

Ich habe 2 Taster für AUF, und 2 Taster für ZU.

Der Erste Taster ist einfach nur ein Taster ..
Solange Taster gedrückt, TOR Fährt.
2ter Taster=Automatik, Tor Fährt die eingestellte Zeit und Stopt dann.

Das gleiche für zu natürlich.

Viele Grüße
Christian


// RemoteXY select connection mode and include library 
#define REMOTEXY_MODE__ESP8266WIFI_LIB
#include <ESP8266WiFi.h>

#include <RemoteXY.h>

// RemoteXY connection settings 
#define REMOTEXY_WIFI_SSID "--"
#define REMOTEXY_WIFI_PASSWORD "--"
#define REMOTEXY_SERVER_PORT 6377


// RemoteXY configurate  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =   // 546 bytes
  { 255,13,0,3,0,27,2,16,31,5,1,3,27,86,34,12,0,40,31,0,
  130,1,0,9,63,27,1,54,130,1,0,36,63,19,1,180,130,0,0,55,
  63,29,1,96,1,1,43,56,12,12,1,2,31,0,1,1,43,71,12,12,
  1,2,31,0,129,0,18,60,21,6,1,8,84,111,114,32,65,117,102,0,
  129,0,19,74,18,6,1,8,84,111,114,32,90,117,0,129,0,1,98,12,
  2,0,17,65,114,100,117,105,110,111,32,86,51,46,49,0,1,0,24,38,
  12,12,1,134,31,0,129,0,2,37,14,6,1,8,76,105,99,104,116,0,
  129,0,15,0,33,6,1,8,72,97,117,112,116,109,101,110,195,188,0,1,
  0,9,10,12,12,1,2,31,0,1,0,9,23,12,12,1,2,31,0,129,
  0,22,13,18,6,1,8,65,117,102,0,129,0,23,26,7,6,1,8,90,
  117,0,129,0,40,11,19,4,1,1,65,117,116,111,109,97,116,105,107,0,
  129,0,37,89,13,6,0,1,83,116,111,112,0,129,0,1,56,12,4,1,
  8,84,105,112,112,101,110,0,131,1,1,86,24,5,1,2,31,72,97,117,
  112,116,109,101,110,195,188,0,131,0,1,92,24,5,2,2,31,69,105,110,
  115,116,101,108,108,117,110,103,101,110,0,129,0,3,20,31,6,2,17,65,
  117,102,102,97,104,114,122,101,105,116,0,129,0,3,30,18,6,2,17,90,
  117,102,97,104,114,122,101,105,116,0,129,0,13,3,39,6,2,17,69,105,
  110,115,116,101,108,108,117,110,103,101,110,0,7,52,38,20,20,5,2,2,
  26,2,7,52,38,30,20,5,2,2,26,2,70,16,1,13,7,7,1,26,
  37,0,70,16,1,26,7,7,1,26,37,0,70,16,4,43,9,9,1,27,
  121,0,1,0,43,38,12,12,1,37,31,0,129,0,27,51,5,4,1,8,
  69,105,110,0,129,0,46,51,7,4,1,8,65,117,115,0,129,0,3,39,
  30,5,2,17,76,105,99,104,116,32,65,78,32,90,101,105,116,0,7,52,
  38,38,20,5,2,2,26,2,129,0,1,51,39,5,2,8,90,101,105,116,
  101,110,32,115,105,110,100,32,105,110,32,109,115,0,129,0,1,63,53,5,
  2,8,49,48,48,48,48,109,115,61,49,48,83,101,107,117,110,100,101,110,
  0,129,0,1,57,47,5,2,8,49,48,48,48,109,115,61,49,83,101,107,
  117,110,100,101,110,0 };
  
// this structure defines all the variables and events of your control interface 
struct {

    // input variables
  uint8_t Stop; // =1 if button pressed, else =0 
  uint8_t Auf_Tippen; // =1 if button pressed, else =0 
  uint8_t zu; // =1 if button pressed, else =0 
  uint8_t Licht_Ein; // =1 if button pressed, else =0 
  uint8_t Auto_Auf; // =1 if button pressed, else =0 
  uint8_t Auto_ZU; // =1 if button pressed, else =0 
  int16_t Auffahrzeit;  // 32767.. +32767 
  int16_t Zufahrzeit;  // 32767.. +32767 
  uint8_t Licht_Aus; // =1 if button pressed, else =0 
  int16_t Licht_Zeit;  // 32767.. +32767 

    // output variables
  uint8_t led_1; // led state 0 .. 1 
  uint8_t led_2; // led state 0 .. 1 
  uint8_t led_3; // led state 0 .. 1 

    uint8_t Ausgang_Tippen_Auf; // =1 if button pressed, else =0 
      uint8_t Ausgang_Auto_Auf; // =1 if button pressed, else =0
  uint8_t Ausgang_Tippen_zu;
  uint8_t Ausgang_Auto_zu;
  uint8_t Ausgang_STOP;



    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////



unsigned long previousMillisZU = 0;
unsigned long previousMillisAUF = 0;
unsigned long previousMillisLICHT = 0;

void setup() 
{
  RemoteXY_Init (); 
  //AUSGÄNGE 
  pinMode (D5, OUTPUT);
  pinMode (D6, OUTPUT);

  
  // TODO you setup code
  
}

void loop() 
{ 
  RemoteXY_Handler ();

//ZEITEINSTELLUNGEN HANDY!----------------------------------
const long intervalZU = RemoteXY.Zufahrzeit; // handy eingabe ist 5000
const long intervalAUF = RemoteXY.Auffahrzeit;  // handy eingabe ist 5000
const long intervalLICHT = RemoteXY.Licht_Zeit;
//ZEITEINSTELLUNGEN HANDY ENDE!--------------------------------


//STOP------------------------
 if (RemoteXY.Stop!=0){ //STOP TASTE 
RemoteXY.Ausgang_STOP = HIGH; // STOP Variable SETZEN 
}
//STOP ENDE------------------------


/////////////////////////////////////////////
//         TOR AUF          //
/////////////////////////////////////////////

//Schalter tippen auf
if (RemoteXY.Auf_Tippen!=0) {//Schalter tippen auf
RemoteXY.Ausgang_Tippen_Auf = HIGH; // VAriable setzen
}else  {                      // else
RemoteXY.Ausgang_Tippen_Auf = LOW;     // VAriable zurücksetzen
}


//schalter Auto Auf
 if (RemoteXY.Auto_Auf!=0){ //Schalter auf am Handy
RemoteXY.Ausgang_Auto_Auf = HIGH; // Variable Setzen
RemoteXY.led_1 = HIGH;
}

//Zeitbaustein für AUF
unsigned long currentMillisAUF = millis();
  if (currentMillisAUF - previousMillisAUF >= intervalAUF){
    previousMillisAUF = currentMillisAUF; 
RemoteXY.Ausgang_Auto_Auf = LOW;  //variable nach zeit zurücksetzen   
RemoteXY.led_1 = LOW; //led am handy aus
RemoteXY.Ausgang_STOP = LOW; // STOP variable  nach zeit zurücksetzen 
}


// Schalter tippen oder auto sendet das signal 
if (RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Tippen_Auf ||RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Auto_Auf) 

//Ausgänge
digitalWrite(D5, LOW);
else
digitalWrite(D5, HIGH);

 /////////////////////////////////////////////
//         TOR AUF ENDE          //
/////////////////////////////////////////////


//-------------------------------------------------------------------------------------------


/////////////////////////////////////////////
//         TOR ZU          //
/////////////////////////////////////////////

//Schalter tippen zu
if (RemoteXY.zu!=0) {//zu tippen taste am Handy ---wenn
RemoteXY.Ausgang_Tippen_zu = HIGH; // Variable Setzen
}else  {                      //--- sonst
RemoteXY.Ausgang_Tippen_zu = LOW;     // Variable zurücksetzen
}



//schalter Auto zu
 if (RemoteXY.Auto_ZU!=0){ //Schalter auto zu am handy
RemoteXY.Ausgang_Auto_zu = HIGH; // Variable Setzen
RemoteXY.led_2 = HIGH; //handy led Anzeige
}

//Zeitbaustein für ZU
unsigned long currentMillisZU = millis();
  if (currentMillisZU - previousMillisZU >= intervalZU){
    previousMillisZU = currentMillisZU; 
RemoteXY.Ausgang_Auto_zu = LOW;    
RemoteXY.led_2 = LOW;
RemoteXY.Ausgang_STOP = LOW;  // STOP variable zurücksetzen 
}



// Schalter tippen oder auto sendet das signal 
if (RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Tippen_zu ||RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Auto_zu) 

//Ausgänge
digitalWrite(D6, LOW); //AUSGANG AUS verwirrt weil relais gedreht sind
else
digitalWrite(D6, HIGH); //AUSGANG AN

/////////////////////////////////////////////
//         TOR ZU Ende         //
/////////////////////////////////////////////



//-------------------------------------------------------------------------------------------


//LICHT--------------------------------------------------------------------

 if (RemoteXY.Licht_Ein!=0){ //licht an taste
//RemoteXY.Ausgang_Auto_zu = HIGH; // then turn on red light
RemoteXY.led_3 = HIGH; //handy LED EIN
}

 if (RemoteXY.Licht_Aus!=0){ //Licht aus taste
//RemoteXY.Ausgang_Auto_zu = HIGH; // then turn on red light
RemoteXY.led_3 = LOW; //handy LED AUS
}

//LICHT ENDE--------------------------------------------------------------------




  // TODO you loop code
  // use the RemoteXY structure for data transfer
  // do not call delay(), use instead RemoteXY_delay() 

}

Bitte ergänze zunächst das fehlende Anführungszeichen am Ende, dann liest sich das Programm besser.

EDIT: Perfekt!


Mein Compiler (für ESP32) meckert diese Zeilen an:

Test_Forum:116:14: error: unused variable 'intervalLICHT' [-Werror=unused-variable]
   const long intervalLICHT = RemoteXY.Licht_Zeit;
              ^~~~~~~~~~~~~
Test_Forum:155:30: error: suggest parentheses around '&&' within '||' [-Werror=parentheses]
 if (RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Tippen_Auf ||RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Auto_Auf)
     ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Test_Forum:201:30: error: suggest parentheses around '&&' within '||' [-Werror=parentheses]
 if (RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Tippen_zu ||RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Auto_zu)
     ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mit diesen Einstellungen:

Hallo M3tzl3r

tausche mal

//ZEITEINSTELLUNGEN HANDY!----------------------------------
  const long intervalZU = RemoteXY.Zufahrzeit; // handy eingabe ist 5000
  const long intervalAUF = RemoteXY.Auffahrzeit;  // handy eingabe ist 5000
  const long intervalLICHT = RemoteXY.Licht_Zeit;

gegen

//ZEITEINSTELLUNGEN HANDY!----------------------------------
  const uint32_t intervalZU = RemoteXY.Zufahrzeit; // handy eingabe ist 5000
  const uint32_t intervalAUF = RemoteXY.Auffahrzeit;  // handy eingabe ist 5000
  const uint32_t intervalLICHT = RemoteXY.Licht_Zeit;

aus.

Im Sketch werden möglicherweise zwei unterschiedliche, auf millis() basierende Zeitschlitz, verwendet

unsigned long currentMillisAUF = millis();

und

 unsigned long currentMillisZU = millis();

Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren in C++.

Hi paulpaulson,
habe es ausgetauscht, leider macht es kein Unterschied.

Im Sketch werden möglicherweise zwei unterschiedliche, auf millis() basierende Zeitschlitz, verwendet

Ja möchte das Tor zb. mal 5sek auf und 10sek zu laufen lassen.

Viele Grüße
Christian

Du willst eine Schrittkette bauen.
Doch, das willst Du :slight_smile:

Du hast IMHO mindetsens zwei Probleme.
previousMillisAUF und previousMillisZUsind bei der Verwendung nicht gesetzt.

Das heisst, Deine "Zeitschaltung" hat einen Startpunkt, den Du nicht bestimmen kannst.
Der Endpunkt ist mit intervalAUF bzw. intervalZU festgelegt.

Wenn Du eine Schrittkette mit Abbruchmöglichkeit baust, dann sparst Du die Hälfte der Variablen und bekommst das übersichtlich von oben nach unten. (Oder von mir aus anders rum :slight_smile: )

Hi my_xy_projekt,
OK wenn ich das will, kann ich diese mit Stop auch unterbrechen?

Baust mir das schnell?! :slight_smile:

wäre es einfacher eine Zeit zu verwenden? zb 10sek auf und zu?
Der Startpunkt sollte halt bei 0 liegen und nicht undefiniert...

Viele Grüße
Christian

Versuch das mal so und beim schließen ebenso

Hi Rentner,

Das hilft schon, nur der Stop funktioniert nur Kurz , Stop Schaltet aus aber nach ein paar Sekunden wird das Tor weitergefahren.

der Code sieht so aus jetzt.



// RemoteXY select connection mode and include library 
#define REMOTEXY_MODE__ESP8266WIFI_LIB
#include <ESP8266WiFi.h>

#include <RemoteXY.h>

// RemoteXY connection settings 
#define REMOTEXY_WIFI_SSID ".."
#define REMOTEXY_WIFI_PASSWORD ".."
#define REMOTEXY_SERVER_PORT 6377


// RemoteXY configurate  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =   // 546 bytes
  { 255,13,0,3,0,27,2,16,31,5,1,3,27,86,34,12,0,40,31,0,
  130,1,0,9,63,27,1,54,130,1,0,36,63,19,1,180,130,0,0,55,
  63,29,1,96,1,1,43,56,12,12,1,2,31,0,1,1,43,71,12,12,
  1,2,31,0,129,0,18,60,21,6,1,8,84,111,114,32,65,117,102,0,
  129,0,19,74,18,6,1,8,84,111,114,32,90,117,0,129,0,1,98,12,
  2,0,17,65,114,100,117,105,110,111,32,86,51,46,49,0,1,0,24,38,
  12,12,1,134,31,0,129,0,2,37,14,6,1,8,76,105,99,104,116,0,
  129,0,15,0,33,6,1,8,72,97,117,112,116,109,101,110,195,188,0,1,
  0,9,10,12,12,1,2,31,0,1,0,9,23,12,12,1,2,31,0,129,
  0,22,13,18,6,1,8,65,117,102,0,129,0,23,26,7,6,1,8,90,
  117,0,129,0,40,11,19,4,1,1,65,117,116,111,109,97,116,105,107,0,
  129,0,37,89,13,6,0,1,83,116,111,112,0,129,0,1,56,12,4,1,
  8,84,105,112,112,101,110,0,131,1,1,86,24,5,1,2,31,72,97,117,
  112,116,109,101,110,195,188,0,131,0,1,92,24,5,2,2,31,69,105,110,
  115,116,101,108,108,117,110,103,101,110,0,129,0,3,20,31,6,2,17,65,
  117,102,102,97,104,114,122,101,105,116,0,129,0,3,30,18,6,2,17,90,
  117,102,97,104,114,122,101,105,116,0,129,0,13,3,39,6,2,17,69,105,
  110,115,116,101,108,108,117,110,103,101,110,0,7,52,38,20,20,5,2,2,
  26,2,7,52,38,30,20,5,2,2,26,2,70,16,1,13,7,7,1,26,
  37,0,70,16,1,26,7,7,1,26,37,0,70,16,4,43,9,9,1,27,
  121,0,1,0,43,38,12,12,1,37,31,0,129,0,27,51,5,4,1,8,
  69,105,110,0,129,0,46,51,7,4,1,8,65,117,115,0,129,0,3,39,
  30,5,2,17,76,105,99,104,116,32,65,78,32,90,101,105,116,0,7,52,
  38,38,20,5,2,2,26,2,129,0,1,51,39,5,2,8,90,101,105,116,
  101,110,32,115,105,110,100,32,105,110,32,109,115,0,129,0,1,63,53,5,
  2,8,49,48,48,48,48,109,115,61,49,48,83,101,107,117,110,100,101,110,
  0,129,0,1,57,47,5,2,8,49,48,48,48,109,115,61,49,83,101,107,
  117,110,100,101,110,0 };
  
// this structure defines all the variables and events of your control interface 
struct {

    // input variables
  uint8_t Stop; // =1 if button pressed, else =0 
  uint8_t Auf_Tippen; // =1 if button pressed, else =0 
  uint8_t zu; // =1 if button pressed, else =0 
  uint8_t Licht_Ein; // =1 if button pressed, else =0 
  uint8_t Auto_Auf; // =1 if button pressed, else =0 
  uint8_t Auto_ZU; // =1 if button pressed, else =0 
  int16_t Auffahrzeit;  // 32767.. +32767 
  int16_t Zufahrzeit;  // 32767.. +32767 
  uint8_t Licht_Aus; // =1 if button pressed, else =0 
  int16_t Licht_Zeit;  // 32767.. +32767 

    // output variables
  uint8_t led_1; // led state 0 .. 1 
  uint8_t led_2; // led state 0 .. 1 
  uint8_t led_3; // led state 0 .. 1 

    uint8_t Ausgang_Tippen_Auf; // =1 if button pressed, else =0 
      uint8_t Ausgang_Auto_Auf; // =1 if button pressed, else =0
  uint8_t Ausgang_Tippen_zu;
  uint8_t Ausgang_Auto_zu;
  uint8_t Ausgang_STOP;



    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////


unsigned long previousMillisZU = 0;
unsigned long previousMillisAUF = 0;
unsigned long previousMillisLICHT = 0;


void setup() 
{
  RemoteXY_Init (); 
  //AUSGÄNGE 
  pinMode (D5, OUTPUT);
  pinMode (D6, OUTPUT);

  
  // TODO you setup code
  
}

void loop() 
{ 
  RemoteXY_Handler ();



//ZEITEINSTELLUNGEN HANDY!----------------------------------
  const long intervalZU = RemoteXY.Zufahrzeit; // handy eingabe ist 5000
  const long intervalAUF = RemoteXY.Auffahrzeit;  // handy eingabe ist 5000
  const long intervalLICHT = RemoteXY.Licht_Zeit;

//ZEITEINSTELLUNGEN HANDY ENDE!--------------------------------


//STOP------------------------
 if (RemoteXY.Stop!=0){ //STOP TASTE 
RemoteXY.Ausgang_STOP = HIGH; // STOP Variable SETZEN 
}
//STOP ENDE------------------------


/////////////////////////////////////////////
//         TOR AUF          //
/////////////////////////////////////////////

//Schalter tippen auf
if (RemoteXY.Auf_Tippen!=0) {//Schalter tippen auf
RemoteXY.Ausgang_Tippen_Auf = HIGH; // VAriable setzen
}else  {                      // else
RemoteXY.Ausgang_Tippen_Auf = LOW;     // VAriable zurücksetzen
}


//schalter Auto Auf
 if (RemoteXY.Auto_Auf!=0){ //Schalter auf am Handy
RemoteXY.Ausgang_Auto_Auf = HIGH; // Variable Setzen
RemoteXY.led_1 = HIGH;
previousMillisAUF =millis();
}

//Zeitbaustein für AUF
unsigned long currentMillisAUF = millis();
  if (currentMillisAUF - previousMillisAUF >= intervalAUF){
    previousMillisAUF = currentMillisAUF; 
RemoteXY.Ausgang_Auto_Auf = LOW;  //variable nach zeit zurücksetzen   
RemoteXY.led_1 = LOW; //led am handy aus
RemoteXY.Ausgang_STOP = LOW; // STOP variable  nach zeit zurücksetzen 
}


// Schalter tippen oder auto sendet das signal 
if (RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Tippen_Auf ||RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Auto_Auf) 

//Ausgänge
digitalWrite(D5, LOW);
else
digitalWrite(D5, HIGH);

 /////////////////////////////////////////////
//         TOR AUF ENDE          //
/////////////////////////////////////////////


//-------------------------------------------------------------------------------------------


/////////////////////////////////////////////
//         TOR ZU          //
/////////////////////////////////////////////

//Schalter tippen zu
if (RemoteXY.zu!=0) {//zu tippen taste am Handy ---wenn
RemoteXY.Ausgang_Tippen_zu = HIGH; // Variable Setzen
}else  {                      //--- sonst
RemoteXY.Ausgang_Tippen_zu = LOW;     // Variable zurücksetzen
}



//schalter Auto zu
 if (RemoteXY.Auto_ZU!=0){ //Schalter auto zu am handy
RemoteXY.Ausgang_Auto_zu = HIGH; // Variable Setzen
RemoteXY.led_2 = HIGH; //handy led Anzeige
previousMillisAUF =millis();
}

//Zeitbaustein für ZU
unsigned long currentMillisZU = millis();
  if (currentMillisZU - previousMillisZU >= intervalZU){
    previousMillisZU = currentMillisZU; 
RemoteXY.Ausgang_Auto_zu = LOW;    
RemoteXY.led_2 = LOW;
RemoteXY.Ausgang_STOP = LOW;  // STOP variable zurücksetzen 
}



// Schalter tippen oder auto sendet das signal 
if (RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Tippen_zu ||RemoteXY.Ausgang_STOP==0 && RemoteXY.Ausgang_Auto_zu) 

//Ausgänge
digitalWrite(D6, LOW); //AUSGANG AUS verwirrt weil relais gedreht sind
else
digitalWrite(D6, HIGH); //AUSGANG AN

/////////////////////////////////////////////
//         TOR ZU Ende         //
/////////////////////////////////////////////



//-------------------------------------------------------------------------------------------


//LICHT--------------------------------------------------------------------

 if (RemoteXY.Licht_Ein!=0){ //licht an taste
//RemoteXY.Ausgang_Auto_zu = HIGH; // then turn on red light
RemoteXY.led_3 = HIGH; //handy LED EIN
}

 if (RemoteXY.Licht_Aus!=0){ //Licht aus taste
//RemoteXY.Ausgang_Auto_zu = HIGH; // then turn on red light
RemoteXY.led_3 = LOW; //handy LED AUS
}

//LICHT ENDE--------------------------------------------------------------------




  // TODO you loop code
  // use the RemoteXY structure for data transfer
  // do not call delay(), use instead RemoteXY_delay() 

}

Ne. Schnell wird nicht mehr, in ein paar Minuten ist hier Schluß.

Nein.
Du musst nur bei jeder Aktion die Startzeit initialisieren, das dürfte schon reichen.

Nein, Dein Startpunkt muss mit dem auslösen der Taste gesetzt sein. Die Ausschaltzeit bestimmt sich aus currentMillisZU und previousMillisZU Wenn eine der Variablen einen undefinierten Zustand hat, kommt der vergleich auf intervalZUgenauso undefiniert raus.

Ich würde eine Variable "tor_fahren" als Boolean deklarieren und die einfach bei jeden Fahrbefehl abfragen.

Standard status wäre true. = Sie darf fahren.

Bei auslösen von STOP (Button) wird "tor_fahren" auf False gesetzt und gleichzeitig die STOP-Routine aufgerufen.

Ohne eine "Rücksetzung" von STOP bleibt die false und nix fährt mehr.

So funktionieren grundsätzlich alle Stop-Befehle, genau wie bei meinen Denon-Kassettendeck :wink:

Gruß

Pucki

Hallo,
Mmm ich glaube das wird so nix , Vermutlich laufen beide Zeiten ab, und dann blinken die Ausgänge eventuell hin und her. Das müsste irgendwie gegeneinander verriegelt werden. Ich hab das aber auch noch nicht verstanden was da wie geschaltete werden soll. Die Logik ist mir nicht klar.

Also Du hast zwei Taster auf und zu, damit kannst Du das Fahren auf oder zu starten? Und nach der Wartezeit willst Du die Ausgänge wieder automatisch abschalten. ? Das wäre ja dann je eine "Ausschaltverzögerung". Jeweils mit der anderen Richtung musste sofort abgeschaltete werden. ?

Du solltest mal ein paar Serial.print() einbauen damit Du was sehen kannst. Aber @my_xy_projekt hat schon recht eine Ablaufsteuerung ist sicher da eindeutiger.

Du hast diese Funktionen:

Warte auf Tastendruck
wenn Taste auf dann Tor auf
wenn Tor ganz auf Stop

wenn Taste zu dann Tor zu
Wenn Tor ganz zu dann Stop

Wenn Taste Stop Stop

Das lässt sich ganz wunderbar mit einer state-machine programmieren.
Und der Vorteil ist dass man nur wenige If-Bedingungen braucht, weil
nämlich immer nur die Teile an Code ausgeführt werden die gerade wirklich gerbraucht werden.

Beispiel: wenn das Tor gerade auf fährt braucht man den Sensor "Tor ganz zu" nicht abfragen.

Die Teile des Codes die nicht gerbraucht werden, werden einfach übersprungen.

Ohne State-Machine wird das ein immer größeres Gewusel von sich gegenseitig sperrenden Variablen und If-bedingungen mit immer mehr Teilbedingungen.

Wenn du einmal state-machine begriffen hast dann willste nie wieder ohne

Und nein ich programmiere die jetzt auch nicht schnell. Ich gebe Unterstützung wenn du den Anfang machst.

@Forum: ich soll ja keine englischen threads im deutschen posten.
Hat mal einer schnell einen Link zu einem deutschen state-machine tutorial?

vgs

Ich bau gern zu morgen.

Heute bin ich raus. :zzz:

Wenn Tor ganz auf meint Zeit abgelaufen ??

Also dann doch zwei Ausschaltverzögerungen. Zeit startet mit der Flanke vom Taster.

Wenn Taster Flanke auf
zeit starten
Tor auf Relais ein
wenn Zeit abgelaufen
Tor stop

Wenn Taster Flanke zu
zeit starten
Tor zu Relais ein
wenn Zeit abgelaufen
Tor stop

Wenn Taster Stop
Tor Stop

sowas in der Art ?

Bin ich mir auch nicht sicher.
Die Kommentare im code sind zu knapp um wirklich verständlich zu sein

  // Schalter tippen oder auto sendet das signal
  if (RemoteXY.Ausgang_STOP == 0 && RemoteXY.Ausgang_Tippen_Auf || RemoteXY.Ausgang_STOP == 0 && RemoteXY.Ausgang_Auto_Auf)
    //Ausgänge
    digitalWrite(D5, LOW);
  else
    digitalWrite(D5, HIGH);
  //         TOR AUF ENDE          //

was bedeutet in der Realität "auto sendet das Signal"?

  • Dein Kraftfahrzeug fährt auf das Tor zu und löst auch irgendwie ein Signal aus?
  • Fahre Tor automatisch auf ? (wobei mir dann nicht klar ist wo ist der Unterschied zum manuell Tor manuell aufmachen?

Und dann so Variablennamen wie

Ausgang_Tippen_Auf

Soll das ein Modus sein bei dem das Tor nur so lange in Richtung "offen" fährt wie der Taster gedrückt wird?

oder
fährt das Tor dann nur eine zehntel Sekunde und dann hält es wieder an?
So ne Art Tip-Tip-Tip-Betrieb??

Es wäre super wenn du eine in normalen Worten verfasste aber ausführliche Beschreibung der gewünschten Funktionalität posten würdest

vgs

Hi Alle :-),

Rentner hat es beschrieben.

Ich habe 2 Taster für Auf und 2 Taster für ZU.

Der Erste Taster ist einfach nur ein Taster ..
Solange Taster gedrückt, TOR Fährt.
2ter Taster=Automatik, Tor Fährt die eingestellte Zeit und Stopt dann.

Das gleiche für zu natürlich.

LG
Christian

und was soll passieren, wenn die Automatik läuft und ein anderer Taster gedrückt wird? Die Beschreibung ist noch lange nicht vollständig. Oder wenn du 2 Taster gleichzeitig drückst?

Hallo ,
ich vermute jetzt mal es gibt eine reine "Tip" Funktion für beide Richtungen und eine "auto" Funktion damit fährt das Tor über eine Zeit bis die Zeit abgelaufen ist, also bis zur Endlage.

Aber da muss sich der T0 noch mal zu auslassen.

es gäbe also für den Versuchsaufbau 5 Eingänge und 2 Ausgänge
tip_auf
tip_zu
auto_auf
auto_zu
stop

Relais_auf (invertiert)
Relais_ab (invertiert)

Hi StefanL38,

  • Dein Kraftfahrzeug fährt auf das Tor zu und löst auch irgendwie ein Signal aus?

Also Auto bzw. Automatik auf, soll einfach das TOR eine eingestellte Zeit Fahren.

  • Fahre Tor automatisch auf ? (wobei mir dann nicht klar ist wo ist der Unterschied zum manuell Tor manuell aufmachen?

Automaik=Zeit zb. 5sek fahren, Manuell nur solange ich Drücke.

Und dann so Variablennamen wie
Ausgang_Tippen_Auf`

Etwas ungünstig formuliert.
wenn ich zb. eine variable mit Tippen_Auf (Taste) was setze, habe ich einfach Ausgang_Tippen_Auf als name getauft.

LG

Hi,
das ist ein Guter einwand,

und was soll passieren, wenn die Automatik läuft und ein anderer Taster gedrückt wird? Die Beschreibung ist noch lange nicht vollständig. Oder wenn du 2 Taster gleichzeitig drückst?

Im Prinzip ist es Hardware verriegelt.
wäre aber schon schön, wenn es gegenseitig verriegelt wäre.
Leider kenne ich mich zuwenig aus und wollte es so einfach wie möglich lösen.
oder Stück für Stück es verbessern.

LG