Hilfe bei Garagetor

Hallo,

Die Platine von mein Garagentor Steuerung ist kaputt und will jetzt mit einen UNO eine neue bauen.
Hab nur eine Problem, wie mach ich mit einen pulsschalter es so dass ich ein mal drücke dass Tor hoch geht und bei und wen das Tor hoch ist, bei näckstemal drücken es wider nach unten rollt.
Bin schone eine weil am suchen mit Google auf pulsbutton aber hiermit komm ich leider nicht weiter vielleicht falsches such begriff.

Hat jemand so ein Beispiel für mich?
Oder erklärt wie so was funktioniert.

Danke

Das Zauberwort ist "endlicher Automat".
Und, ein wenig "Taste entprellen" ist auch kein Fehler.

Endschalter und Schutzeinrichtung, wenn das Tor mal blockiert (z.B. wg. Eis, Kleinkind, usw)

Das könnte man mit einem endlichen Automaten (Schrittkette, FSM) lösen, der je nach Zustand (Schritt) auf das Drücken reagiert.

Was drückst Du denn, Tasten oder eine Fernbedienung?

Damit willkommen im Forum!

combie:
Endschalter und Schutzeinrichtung, wenn das Tor mal blockiert (z.B. wg. Eis, Kleinkind, usw)

Dass ist vorhanden

agmue:
Was drückst Du denn, Tasten oder eine Fernbedienung?

Beides aber beide waren auf ein Input und dass ist jetzt geschieden.

In einem anderen Thema habe ich ein Programm vorgeschlagen. Das könntest Du für Dich adaptieren, zumindest die Tastenentprellung. Wäre das ein Anfang für Dich?

Hi

Atwist:

combie:
Endschalter und Schutzeinrichtung, wenn das Tor mal blockiert (z.B. wg. Eis, Kleinkind, usw)

Dass ist vorhanden

Da wirst Du wohl irren - diese Schutzmaßnahmen werden in der abgerauchten Steuerung gesessen haben.
Die Steuerung muß Weg und Kraft bei der Einlernfahrt 'erlernen'.
Wenn jetzt -egal was- das Tor blockiert (meine 5cn hoher Gegenstand), darf das Tor nur maximal mit 'so und so viel' kg auf dieses Hindernis drücken UND muß wieder hoch fahren, damit das Hindernis entkommen kann.
Die maximal zulässige Kraft ist an die Widerstandsfähigkeit eines Kinderschädel angelehnt (müsste nachlesen, wie viel Das jetzt war).

Im privaten Bereich brauchst Du Dir darüber aber erst Sorgen machen, wenn was passiert ist - dann ist's aber zu spät!

Vll. kann man mit einer einfachen Motorstrom-Messung das Gröbste erschlagen, also immer noch eine Einlern-Fahrt, danach aber statt Kraft auf Position X 'nur' auf eine maximale Kraft (= Motorstrom) begrenzen/beim Überschreiten wieder auf fahren.

Von der Logik her ist Das kein so großes Problem.

Dein Pulsschalter nennt sich Draußen Taster - dazu gibt es in der IDE, meines Wissen, auch ein Beispiel, wie man mit einem Taster eine LED an UND ausschalten kann.

MfG

So ich bin schon ein Stuck weiter gekommen.
Vielleicht entsprecht es nicht was ihr mir versucht bei zubringen.

Jetzt bin ich auf einen Punkt wo ich es nicht mehr weiß, dass Script lauft bis die void loop
Hab eine paar Debugs ein gebaut, finden meinen Fehler nicht.
Bitte um hilfe.

/*
 * Dis Script runs on a Arduino Mega 2560
 * 
 */
#include "Timer.h"

const int doorisdownPin = 2;      // Active if door is down.
const int doorisupPin = 3;        // Active if door is up.
const int safetytubePin = 4;      // Active if safetytube is pusht.
const int doorupPin = 5;          // Door goes up.
const int doordownPin = 6;        // Door goes down.
const int lightPin =  7;          // Output for light.
const int buttonPin = 8;          // Input for button.
const int transmitterPin = 9;     // Input for transmitter.


int doorisdownPinState = 0;       
int doorisupPinState = 0;         
int safetytubePinState = 0;       
int buttonPinState = 0;           
int transmitterPinState = 0;      

Timer t;

byte button;
byte oldbutton = 0;
byte buttonpin = 2;
byte state = 0;


//*******************************************************************************
void setup() {
  Serial.begin (115200);
  pinMode(doorisdownPin, INPUT);
  pinMode(doorisupPin, INPUT);
  pinMode(safetytubePin,  INPUT);
  pinMode(buttonPin, INPUT);
  pinMode(transmitterPin, INPUT);
  pinMode(doorupPin, OUTPUT);
  pinMode(doordownPin,  OUTPUT);
  pinMode(lightPin,  OUTPUT);

  doorup;                               // If powerup then doordown.
  Serial.println("Program start");
}
//*******************************************************************************
void loop() {
  digitalRead(transmitterPin);
  digitalRead(buttonPin);

  if (button && !oldbutton)              // same as if(button == high && oldbutton == low)
  {
    //we have a new button press
    if (state == 0)                      // if the state is off, turn it on
    {
      doorup;
      state = 1;
    }
    else                                 // if the state is on, turn it off
    {
      doordown;
      state = 0;
    }
    oldbutton = 1;
  }
  else if (!button && oldbutton)         // same as if(button == low && oldbutton == high)
  {
    oldbutton = 0;                       // the button was released
  }
  
}
//********************************************************************************
void doorup()
{
  digitalWrite(doorupPin, HIGH);        // Door goes UP.
  Serial.println("Door goes UP");
  light;                                // Light ON.
  if (doorisupPin == HIGH);             // Door is UP.
  {
    digitalWrite(doorupPin, LOW);       // Poweroff "door up".
    Serial.println("Door is UP");
  }
}
//*******************************************************************************
void doordown()
{
  digitalWrite(doordownPin, HIGH);      // Door goes DOWN.
  Serial.println("Door goes DOWN");
  if (safetytubePin == HIGH);           // Safetytube is active.
  Serial.println("Safetytube is active");
  {
    digitalWrite(doordownPin, LOW);     // Poweroff "door down".
    digitalWrite(doorupPin, HIGH);      // Poweron " door up".
  }
  digitalRead(doorisdownPin == HIGH);   // Door is DOWN.
  {
    digitalWrite(doordownPin, LOW);     // Poweroff "door down".
    Serial.println("Door is DOWN");
  }
}
//*******************************************************************************
void light()
{
t.pulse(lightPin, 2 * 60 * 1000, HIGH); // Light ON for 2 minutes
t.update();                             // Reset timer
  }
  
//*******************************************************************************
//Program end
//*******************************************************************************

Du fragst am Anfang der loop zwei Pins ab, aber wo landet der Wert der Pins ?

Hi

Erledige Einzelprobleme - in Deinem Sketch hast Du bereits die ganze Ablaufsteuerung drin, sogar mit Licht :o
Funktionieren tut davon aber noch nicht viel.

Schmeiß vorerst Alles raus und nehme die Probleme EINZELN in den Sketch auf.
Lasse zu Beginn eine LED aufleuchten, wenn ein Tastendruck erkannt wurde.
Wenn Das sauber funktioniert, kannst Du diesen Tastendruck zum UMschalten der LED benutzen.
Diese zeigt dann die Richtung des Tor an.
Jetzt packst Du die Endschalter mit rein und das Tor stoppt in den Endstellungen.
Nun die Sicherheits-Einrichtungen NACHEINANDER.
Bei jedem Sicherheits-Vorfall muß ja irgend was gemacht werden - z.B. kurz auffahren, damit das eingeklemmte Kind befreit wird.
Wenn der ganze Kram läuft, kann das Licht einziehen.

Wie bereits geschrieben wurde, fehlt in der Abfrage digitalRead() die Zuweisung in eine Variable.
Stichwort Variable - wie viele Pins hat Dein µC?
Bei <256 kannst Du byte statt int benutzen (bei const aber wohl mehr Schönheit als Nutzen).
Die Zustände aka ‘doorisdownPinState’ können nur 1 oder 0 annehmen, hier reicht boolean - dann meckert der Kompiler auch, wenn Du versuchst, einen anderen Wert (… 12) zuzuweisen.
Möglich sind dann nur noch HIGH/LOW/TRUE/FALSE/1/0

MfG

MfG

Ich bin jetzt ziemlich weit mit mein Script hab nur noch 2 Probleme

  1. wen ich auf einen Button drücke dann ist es einen Puls statt HoldOn Signal, wie bekomme ich einen HoldOn Signal.
    Will nicht die Button eingedrückt halten.

  2. Wenn die Tür sich öffnend dann geht das licht An, prima so soll es sein nach 10 sec. (Testphase) wieder Aus.
    Aber nach 10 sec. geht es wieder An und nicht meer Aus.
    Wo ist hier die Fehler.

#include "Timer.h"
#include "Bounce2.h"

#define lightPin D9       //OUTPUT
#define dooropenPin D8    //OUTPUT
#define doorclosePin D7   //OUTPUT
#define doorupPin D6
#define doordownPin D5
#define safetytubePin D4
#define doorisupPin D3
#define doorisdownPin D2
int n=0;

Timer t;
Bounce debouncer = Bounce();

void setup()
{
  Serial.begin(115200);
  pinMode(dooropenPin,OUTPUT);
  pinMode(doorclosePin,OUTPUT);
  pinMode(lightPin,OUTPUT);
    pinMode(doorupPin,INPUT);
  pinMode(doordownPin,INPUT);
  pinMode(safetytubePin,INPUT);
  pinMode(doorisupPin,INPUT);
  pinMode(doorisdownPin,INPUT);

  debouncer.attach(doorclosePin);             // Pin to debounce.
  debouncer.attach(dooropenPin);              // Pin to debounce.
  debouncer.attach(safetytubePin);            // Pin to debounce.
  debouncer.interval(50);                     // Debounce interval time in ms
}


void loop()
{
  t.update();                                 // Reset timer
  debouncer.update();                         // Update the Bounce instance 
  int value = debouncer.read();              // Get the updated value
 
  if((digitalRead(doorupPin)==HIGH)&&(digitalRead(doorisupPin)==LOW)&&(digitalRead(safetytubePin)==LOW)&&(digitalRead(doordownPin)==LOW)&&(digitalRead(doorisdownPin)==LOW))
  {
    n=1; //Door UP situation
  }
  else if((digitalRead(doordownPin)==HIGH)&&(digitalRead(doorisdownPin)==LOW)&&(digitalRead(safetytubePin)==LOW)&&(digitalRead(doorupPin)==LOW)&&(digitalRead(doorisupPin)==LOW))
  {
    n=2; //Door DOWN situation
  }
  else if((digitalRead(safetytubePin)==HIGH)&&(digitalRead(doorupPin)==LOW)&&(digitalRead(doorisupPin)==LOW)&&(digitalRead(doordownPin)==LOW)&&(digitalRead(doorisdownPin)==LOW))
  {
    n=3; // Protection situation
  }
  else
  {
    n=0; // Do noting 
  }
  switch (n)
  {
    case 0:
      digitalWrite(dooropenPin,LOW);
      digitalWrite(doorclosePin,LOW);
      break;
    case 1:
      digitalWrite(dooropenPin,HIGH);
      digitalWrite(doorclosePin,LOW);
      digitalWrite(lightPin, HIGH);
      t.pulse(lightPin, 1 * 10 * 1000, HIGH); // Light ON for 10 sec.
      Serial.println("UP");
    break;
    case 2:
      digitalWrite(dooropenPin,LOW);
      digitalWrite(doorclosePin,HIGH);
      digitalWrite(lightPin, LOW);
      Serial.println("DOWN");
    break;
    default:
      digitalWrite(dooropenPin,HIGH);
      digitalWrite(doorclosePin,LOW);
      Serial.println("Safetytube active");
    break;
  }
  delay(500);
}
//************************************************************************

Ich bitte um eure Lösung, Vielen DANK

Hi

Schön, daß Du so ziemlich alle Ratschläge ignorierst.

n wird wie groß und auch negativ? → byte

Einzelprobleme bereits Alle gelöst?
Super, dann kannst Du die Einzel-Lösungen kombinieren.
Wenn’s jetzt hakt, wird der Fehler in der minimalen Änderung des Sketch zu finden sein (wenigstens der Auslöser des Fehler).

Dein If-Konstrukt liest sich recht schwer, was spricht gegen eine State-Maschine auf switch/case-Basis?

Damit kannst Du auch direkt Deinen Taster zum Rast-Schalter umfunktionieren - wenn Du Das unbedingt willst.

debouncer gibt bei read ggf. negative Werte zurück?
Wenn Werte <256 wäre hier Byte zu bevorzugen - spart Platz (1 Byte), wird atomar gelesen/geschrieben.

Was macht das delay() am Ende der loop()?

Eigentlich schade, daß ich mehr Fragen an Dich habe, als Du zu Deinem Sketch an uns;)

MfG

Die Zeile

int value = debouncer.read();              // Get the updated value

entprellt Dir nicht

digitalRead(safetytubePin)

Und was die Ausgangspins beim Entprellen sollen, erschließt sich mir auch nicht.

Schön, daß Du so ziemlich alle Ratschläge ignorierst.

Ich versuche es aber ich krieg es nicht hin.
Jetzt hab ich in mein Augen etwas schönes gebastelt und Funktioniert ziemlich gut.
Weiß auch das ich kein Profi bin.

Bin wieder ein Stück weiter gekommen mit eine "endlichen Automaten" 8) 8) 8)
Nun hab ich zu viel "State" in meinen "loop" bekomme
" too few arguments to function 'void digitalWrite(uint8_t, uint8_t)"

Wie kann ich dass ändern ich brauche diesen "states"

// Inputs
const int doorisdownPin = D2;
const int doorisupPin = D3;
const int safetytubePin = D4;
const int dooropenButton = D5;
const int doorcloseButton = D6;
const int doorstopButton = D7;
// Outputs
const int doorclosePin =  D8;
const int dooropenPin =  D9;
const int lightPin =  D10;

// I/O States
int doorcloseState = 0;
int dooropenState = 0;
int safetytubeState = 0;
int doorupState = 0;
int doordownState = 0;
int doorstopState = 0;


void setup() { 
  Serial.begin (115200);

  //Input
  pinMode(doorisdownPin, INPUT);
  pinMode(doorisupPin, INPUT);
  pinMode(safetytubePin, INPUT);
  pinMode(dooropenButton, INPUT);
  pinMode(doorcloseButton, INPUT);
  pinMode(doorstopButton, INPUT);

  //Output
  pinMode(doorclosePin, OUTPUT);
  pinMode(dooropenPin, OUTPUT);
  pinMode(lightPin, OUTPUT);

}

void doorstop() {
  Serial.println("DOORSTOP.");                   // STOP
  digitalWrite(doorclosePin, LOW);
  digitalWrite(dooropenPin, LOW);
  delay(500);
}

void doorclose() {                           // Door CLOSE
  Serial.println("Door goes CLOSE.");
  digitalWrite(doorclosePin, HIGH);
}

void dooropen() {                           // Door OPEN
  Serial.println("Door goes OPEN.");
  digitalWrite(dooropenPin, HIGH);
  
}
void safety() {                             // Safetytube is ACTIVE
  Serial.println("Saferty active.");
  doorstop();
  digitalWrite(dooropenPin, HIGH);
}

void doorisdown() {                         // Door is DOWN.
  Serial.println("Door is DOWN.");
  digitalWrite(doorclosePin, LOW);
  Serial.println("Lights OFF.");
  digitalWrite(lightPin, LOW);
}

void doorisup() {                           // Door is UP.
  Serial.println("Door is UP.");
  digitalWrite(dooropenPin, LOW);
}

void light(){                               //Lights ON if door goes open.
  Serial.println("Lights ON.");
  digitalWrite(lightPin, HIGH);
}

void loop() {
  doorcloseState = digitalRead(doorcloseButton);
  dooropenState = digitalRead(dooropenButton);
  safetytubeState = digitalRead(safetytubePin);
 //doorupState = digitalWrite(doorisupPin);
 // doordownState = digitalWrite(doorisdownPin);
 // doorstopState = digitalWrite(doorstopButton);

  if ((doorcloseState == HIGH) && (safetytubeState == LOW)) {
    doorclose();
  }

  if (dooropenState == HIGH) {
    dooropen();
    light();
  }

  if (safetytubeState == HIGH) {
    safety();
  }

  if (doordownState == HIGH) {
    doorisdown();
  }

  if (doorupState == HIGH) {
    doorisup();
  }

  if (doorstopState == HIGH) {
    doorstop();
  }

}

Ich kann die Meldung nicht reproduzieren!
Erhalte andere, aber nicht diese.

Wie kann ich dass ändern …

Das fängt damit an, dass du die Fehlermeldung liest, und auch versuchst zu verstehen.
Dann ist die Lösung für dieses Detailproblem offensichtlich.

Wenn Du uns die Zeile, die der Kompiler anmeckert auch mit gibst, müssen wir nicht suchen.
Du hast da mal zuwenig (<2) Argumente in digitalWrite.

Gruß Tommy

Dass ist alles was ich bekomme.

Arduino: 1.6.5 (Linux), Platine: "WeMos D1(Retired), 80 MHz, 921600, 4M (3M SPIFFS)"

Build-Optionen wurden verändert, alles wird neu gebaut
GagareDoor.ino.ino: In function 'void loop()':
GagareDoor.ino:85: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'
In file included from GagareDoor.ino.ino:3:0:
/home/andre/arduino-1.6.5/hardware/esp8266com/esp8266/cores/esp8266/Arduino.h:195:6: note: declared here
 void digitalWrite(uint8_t pin, uint8_t val);
      ^
GagareDoor.ino:86: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'
In file included from GagareDoor.ino.ino:3:0:
/home/andre/arduino-1.6.5/hardware/esp8266com/esp8266/cores/esp8266/Arduino.h:195:6: note: declared here
 void digitalWrite(uint8_t pin, uint8_t val);
      ^
GagareDoor.ino:87: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'
In file included from GagareDoor.ino.ino:3:0:
/home/andre/arduino-1.6.5/hardware/esp8266com/esp8266/cores/esp8266/Arduino.h:195:6: note: declared here
 void digitalWrite(uint8_t pin, uint8_t val);
      ^
too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'

  Dieser Report hätte mehr Informationen mit
  "Ausführliche Ausgabe während der Kompilierung"
  aktiviert in Datei > Einstellungen

Hast du denn auch mal das gemacht, was am Ende der Meldung steht ?

Und mal den kompletten Sketch posten.

HotSystems:
Und mal den kompletten Sketch posten.

Ich glaub das du es übersehen hast.

Atwist:
Bin wieder ein Stück weiter gekommen mit eine "endlichen Automaten" 8) 8) 8)
Nun hab ich zu viel "State" in meinen "loop" bekomme
" too few arguments to function 'void digitalWrite(uint8_t, uint8_t)"

Wie kann ich dass ändern ich brauche diesen "states"

// Inputs

const int doorisdownPin = D2;
const int doorisupPin = D3;
const int safetytubePin = D4;
const int dooropenButton = D5;
const int doorcloseButton = D6;
const int doorstopButton = D7;
// Outputs
const int doorclosePin =  D8;
const int dooropenPin =  D9;
const int lightPin =  D10;

// I/O States
int doorcloseState = 0;
int dooropenState = 0;
int safetytubeState = 0;
int doorupState = 0;
int doordownState = 0;
int doorstopState = 0;

void setup() {
  Serial.begin (115200);

//Input
  pinMode(doorisdownPin, INPUT);
  pinMode(doorisupPin, INPUT);
  pinMode(safetytubePin, INPUT);
  pinMode(dooropenButton, INPUT);
  pinMode(doorcloseButton, INPUT);
  pinMode(doorstopButton, INPUT);

//Output
  pinMode(doorclosePin, OUTPUT);
  pinMode(dooropenPin, OUTPUT);
  pinMode(lightPin, OUTPUT);

}

void doorstop() {
  Serial.println("DOORSTOP.");                  // STOP
  digitalWrite(doorclosePin, LOW);
  digitalWrite(dooropenPin, LOW);
  delay(500);
}

void doorclose() {                          // Door CLOSE
  Serial.println("Door goes CLOSE.");
  digitalWrite(doorclosePin, HIGH);
}

void dooropen() {                          // Door OPEN
  Serial.println("Door goes OPEN.");
  digitalWrite(dooropenPin, HIGH);
 
}
void safety() {                            // Safetytube is ACTIVE
  Serial.println("Saferty active.");
  doorstop();
  digitalWrite(dooropenPin, HIGH);
}

void doorisdown() {                        // Door is DOWN.
  Serial.println("Door is DOWN.");
  digitalWrite(doorclosePin, LOW);
  Serial.println("Lights OFF.");
  digitalWrite(lightPin, LOW);
}

void doorisup() {                          // Door is UP.
  Serial.println("Door is UP.");
  digitalWrite(dooropenPin, LOW);
}

void light(){                              //Lights ON if door goes open.
  Serial.println("Lights ON.");
  digitalWrite(lightPin, HIGH);
}

void loop() {
  doorcloseState = digitalRead(doorcloseButton);
  dooropenState = digitalRead(dooropenButton);
  safetytubeState = digitalRead(safetytubePin);
//doorupState = digitalWrite(doorisupPin);
// doordownState = digitalWrite(doorisdownPin);
// doorstopState = digitalWrite(doorstopButton);

if ((doorcloseState == HIGH) && (safetytubeState == LOW)) {
    doorclose();
  }

if (dooropenState == HIGH) {
    dooropen();
    light();
  }

if (safetytubeState == HIGH) {
    safety();
  }

if (doordownState == HIGH) {
    doorisdown();
  }

if (doorupState == HIGH) {
    doorisup();
  }

if (doorstopState == HIGH) {
    doorstop();
  }

}