Go Down

Topic: Anfänger Braucht hilfe für Absperrkette (Read 849 times) previous topic - next topic

lanoph

Hallo, bin noch zeimlich neu. Bitte um Hilfe. :-/ :-/

Habe folgendes Problem: Ich möchte eine Funkgesteuerte Absperrkette bei uns im Hof einbauen weil die Pflastersteine schon total eingesunken sind und jeder bei uns dreht. Ist dann total sch... beim Schneeschieben usw, da die Schaufel immer an allen Steinkanten hängenbleibt. Ausserdem müssen wir jetzt nach 3 Jahren schon wieder unsere Auffahrt neu machen lassen.
Habs schon viele Threads gelesen, bin aber nicht wirklich weiter gekommen.

Also:
Hab ein Eingang:  Taster an Pin8  (Schalter8) - kommt von einer vorahnden Funkanlage wo nur noch ein Ausgang frei ist.
und hab noch 3 Ausgänge: Relais1 (Pin2 = Ab-Relais), Relais2 (Pin3 = Auf-Relais), Relais3 (Pin4 = Lampen-Relais)

Möchte jetzt folgendes:
1x Drücken: Relais1 schaltet für 1 sec,
2tes x Drücken: Relais1 schaltet noch einmal für 1 sec.
nochmaliges Drücken: Relais2 schaltet für 1 sec.
nochmaliges Drücken: Relais2 schaltet nochmal für 1 sec.

nach 1 Min. soll alles gelöscht werden und dann wieder mit Relais 1 begonnen werden.

während dem ganzen soll dann aber noch das Licht-Relais für 3 Min. schalten. Als Sicherheitslampe zwecks Hinweis, dass die Kette hoch und runter fährt.

Zusätzlich hätte ich dann da noch folgende Wünsche:
1.
Wenn die Kette heruntergefahren ist, also Relais1 nur einmal betätigt wurde, soll nach ca 10 Min die Kette wieder hochfahren (also Relais2 für 1 sec schalten).
2.
Wenn ich den Impuls des Tasters für 10 Sekunden gebe, dann soll die Kette nach unten fahren (Relais1 für 1 sec schalten) und dann erst wieder hochfahren (Relais2 für 1 sec) wenn ich wieder auf den Taster drücke.

Hoffe ihr habt alles verstanden und hoffe Ihr könnt mir da irgendwie helfen.
Hab such schon seit 1 Woche von Morgnes bis abends, da ich krank zuhause (frisch Operriert) herum liege.

Gruß   Christoph  :-?  :-?

Korman

#1
Sep 26, 2010, 10:50 am Last Edit: Sep 26, 2010, 10:57 am by Korman Reason: 1
Hallo Christoph,

das ist ein recht einfaches Anfängerprojekt. Als Versuchsaufbau nimm dir einen Taster um die Fernsteuerung zu simulieren und 3 leds für die Relais. Dann kannst du mit dem Arduino und einem UBS-Kabel unabhängig an der Software basteln. Als Anfang für das Programmieren arbeite dich durch die Blink und Button Beispiele, die sollten schon genug Basiswissen vermitteln. Ich vermute, du wirst folgende Funktionen benötigen:
  • pinMode()
       
  • digitalWrite()
       
  • digitalRead()
       
  • millis()


Dazu noch eine Handvoll Variablen und ein Gläschen Wein oder zwei.

Für die Hardwareansteuerung wirst du wahrscheinlich ein paar Komponenten benötigen, oder du verwendest ein fertiges Shield. Man müßte nur wissen, was für Spannungen und Ströme da gesteuert werden sollen. Aber ich glaube, für den Anfang ist das unerheblich, dieses Problem kannst du lösen wenn der Rest der Software steht.

Viel Spaß,

Korman

lanoph

Hallo Korman,

hab mich schon seit einiger Zeit durch die
?pinMode() ?digitalWrite()  versucht. Hab auch alle möglichen examples von Arduino versucht, krig das aber mit den Variablen und den Rückmeldungen nicht so hin.
Einzeln kann ich die einzelen Relais (im Moment LED´s) alle ansteuern und mit delay funktioniert das auch alles mit Pause.
Hab auch noch ein DSC1377 (Urthmodul) .
Wie genau ich das aber alles Programmieren muss, weiß ich noch nicht so genau. Hab auch schon Bücher und beispiele aus dem Netzt, aber irgendie steige ichd a noch nicht so direkt durch.

Christoph

Korman

#3
Sep 26, 2010, 11:24 am Last Edit: Sep 26, 2010, 11:25 am by Korman Reason: 1
Uhrmodul brauchst nicht, da dich die Tageszeit nicht interessiert. 10 Minuten kannst mit millis() messen.

delay brauchst wahrscheinlich auch nicht.

Schau dir die Button Beispiele ein wenig genauer an.

Im Prinzip brauchst du in deiner Funktion loop etwa folgendes:

Wird der Knopf gedrückt worden, starte Zeitmessung.
Wird der Knopf ausgelassen worden, beende die Zeitmessung, schaue wie lange er gedrückt war und steuere das reichtige Relay.
Hat sich der Status des Knopfes nicht geändert, mache nichts.
Ist eine der sonstigen Waartezeiten abgelaufen, mach was.

Für die Zeitmessung reicht der Wert der Funktion millis().

Korman

lanoph

#4
Sep 26, 2010, 03:53 pm Last Edit: Sep 26, 2010, 10:50 pm by lanoph Reason: 1
Hallo,

also das mit den LED´s Blinken usw klappt eigentlich ganz gut, mit dealy klappt es auch aber irgenwie mit der Millis() klappts nicht so.
Kann mir da nochmal jemand helfen?

bis jetzt sieht es so aus:


//Erste Testschaltung

int Ab2 =  2;      // Nummer des Ab-Realis-Pins
int Auf3 =  3;      // Nummer des Auf-Relais-Pins
int Lampe4 =  4;      // Nummer des Lampen-Relais-Pins
long previousMillis = 0;        // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
long ZeitLampe = 1000;           // Interval zwischen zwei Änderungen
int Schalter8 = 8;   // Nummer des Schalteingangs
int ZustandSchalter = 0;


void setup()
{
 pinMode(Ab2, OUTPUT);      // definiert Pin 2 als digitalen Ausgang (Ab-Relais)
 pinMode(Auf3, OUTPUT);      // definiert Pin 3 als digitalen Ausgang (Auf-Relais)
 pinMode(Lampe4, OUTPUT);      // definiert Pin 4 als digitalen Ausgang (Lampen-Relais)
 pinMode(Schalter8, INPUT);  // definiert Pin 8 als digitalen Eingang (Schalter8)
 digitalWrite (Schalter8, HIGH); // Schaltet den internen "Pullup Widerstand" ein
}

void loop()
{ // Code der immer laufen soll kommt hier hin.
 ZustandSchalter = digitalRead(Schalter8); // der digitale Eingang (Pin8) wird abgefragt
 if (ZustandSchalter == HIGH) {        
    previousMillis = millis();  // aktuelle Zeit abspeichern
    digitalWrite(Ab2, LOW);   // schaltet Ab-Relais am Ausgang 2 ein
          {if (millis() - previousMillis <= 3000-) {   // LED einschalten.
           digitalWrite(Lampe4, LOW);}
           else digitalWrite (Lampe4, HIGH); };
 }          
 else {
  digitalWrite(Ab2, HIGH);  // schaltet Ab-Relais am Ausgang 2 aus
  previousMillis = 0; }
 
 
}

lanoph

Hallo,

bin schon etwas weiter. Das mit dem Taster-Drücken und die Sicherheitsbeeleuchtung habe ich jetzt, auch, dass wenns zu lange unten ist, das andere Relais an geht und dann wieder die Lampe. (siehe Code unten).

Nur was muss ich machen, damit ich die Sache mit dem Wechsel der Relais mit nur einem Taster erreiche?  

Währe super, wenn Ihr mir da noch mal helfen könntet.

Danke Danke Danke schon im Voraus.

Christoph

hier kommt mein Code bis jetzt:

// Testschaltung Absperrkette


int Schalter8 = 8;            //deifiniert DigitalPin 8 als Schalter8
int Ab2 = 2;                  //deifiniert DigitalPin 2 als Ab2
int Auf3 = 3;                  //deifiniert DigitalPin 3 als Auf3
int Lampe4 = 4;                    // deifiniert DigitalPin 4 als Lampe4
int LampeZustand = 0;           // Variable für Lampenzustand  =  0  = aus
int LampeZustand2 = 0;          // Variable für Lampenzustand nach vergessen hochfahren  =  0  = aus
int currentTime = 0;            // Variable für aktuelle Zeit  =  0  = keine
int ZustandSchalter = 0;        // Variable für Schalterzustand  =  0  = aus
int LampeZeit = 10000;          // Leuchtdauer des Lampe4-Relais
int AbZeit = 15000;             // Zeit für Kette unten 600000 ist 10 Min
int AbZustand = 0;              // Variable für Kettenzustand unten = 0 = unten


void setup()
{
     pinMode(Ab2, OUTPUT);                  //definiert Ab2 als Ausgang
     pinMode(Auf3, OUTPUT);                    //definiert Auf3 als Ausgang
     pinMode(Schalter8, INPUT);            //definiert Schalter8 als Eingang
     pinMode(Lampe4, OUTPUT);              //definiert Lampe4 als Ausgang
     Serial.begin(9600);                  // Set up serial communication at 9600bps
     
     digitalWrite(Ab2, LOW);                 // Pins resetten, zur Sicherheit...
     digitalWrite(Auf3, LOW);                // Pins resetten, zur Sicherheit...
     digitalWrite(Lampe4, LOW);              // Pins resetten, zur Sicherheit...
       digitalWrite (Schalter8, HIGH);         // Schaltet den internen "Pullup Widerstand" ein
}

void loop()
{
       ZustandSchalter = digitalRead(Schalter8); // der digitale Eingang (Pin8) wird abgefragt
                                                 // durch den internen "Pullup Widerstand"
                                                 //drehen sich die Zustände um:
                                                 // ist der Schalter offen (Startzustand) so ist ZustandSchalter = HIGH
                                                 // ist der Schalter geschlossen so ist  ZustandSchalter = LOW
 
       if (ZustandSchalter == LOW) {             // wenn Schalter gedrückt
           digitalWrite(Ab2, HIGH);              // schaltet Ab2-Relais ein
               currentTime = millis();           // setzt Variable für Zeit auf jetzt
           digitalWrite(Lampe4, HIGH);       // schaltet Lampe4-Relais ein
           LampeZustand = 1;                 // setzt Variable für Lampe auf an
               AbZustand = 1;                    // setzt Variable für Ab2 auf unten
               delay (100);                      // pause für 0,1 sec
               digitalWrite(Ab2, LOW);           // schaltet Ab2-Relais wieder aus
     }

     if (LampeZustand==1 && millis()-currentTime >= LampeZeit) {   // wenn LampenZustand länger als Variable LampeZeit
           digitalWrite(Lampe4, LOW);                            // schaltet Lampe4-Relais aus
               delay (100);                                          // pause für 0,1 sec
               LampeZustand = 0;                                     // setzt Variable für Lampe auf aus
     }
       
       if (AbZustand==1 && millis()-currentTime >= AbZeit) {         // Wenn AbZustand länger als Variable AbZeit
           digitalWrite(Ab2, HIGH);                              // schaltet Ab2-Relais an
               delay (100);                                          // pause für 0,1 sec
               digitalWrite(Ab2, LOW);                               // schaltet Ab2-Relais aus
               AbZustand = 0;                                        // setzt Variable für Ab2 auf oben  
               LampeZustand2 = 1;                                    // setzt Variable für LampeZustand2 auf ein
       }        
       if (LampeZustand2 == 1) {                                     // wenn Variable für LampeZustand2 auf ein
               currentTime = millis();                               // setzt Variable für Zeit auf jetzt
           digitalWrite(Lampe4, HIGH);                           // schaltet Lampe4-Relais ein
       }
       
       if (LampeZustand2==1 && millis()-currentTime >= LampeZeit) {   // wenn LampenZustand2 länger als Variable LampeZeit
           digitalWrite(Lampe4, LOW);                             // schaltet Lampe4-Relais aus
               delay (100);                                           // pause für 0,1 sec
               LampeZustand2 = 0;                                     // setzt Variable für LampeZustand2 auf aus
     }
}



Go Up