INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Taster keine Funktion leider
07.08.2014, 13:21 (Dieser Beitrag wurde zuletzt bearbeitet: 07.08.2014 13:24 von rudi52056.)
Beitrag #1
Taster keine Funktion leider
Hallo Leute

Habe jetzt meine Baustellen Ampel soweit fertig , aber leider bringe ich die Taster nicht zum Laufen.

Bitte um Eure hilfe

Mfg Rudi

Code:
/*********************************************
*** Arduino        MEC Projekt        ***
*** Baustellenampelsteuerung mit ATmega328 ***
*** Erstellt: Rudi Oberst                  ***
*** Datum: 7.8.2014                        ***
*** Version: 0.1                           ***
*********************************************/

    #include <Servo.h>

    
    /******** definiere die Pinzuordnung der Ein- und Ausgänge    *************/

    // Reedkontakte
    int button_richtung1 = 2;                    // PIN INT0 löst Unterbrechung des Programmes aus
    int button_richtung2 = 3;                    // PIN INT1 löst Unterbrechung des Programmes aus

    // LEDS für Ampel 1
    int led_richtung1_rot = 11;      //rot
    int led_richtung1_gelb = 12;     //orange
    int led_richtung1_gruen = 13;     //grün

    // LEDs für Ampel 2 in der gegenrichtung
    int led_richtung2_rot = 8;         //rot
    int led_richtung2_gelb = 7;     //orange
    int led_richtung2_gruen = 6;     //grün

    // Zuordnung der Servos
    Servo servo_r1;
    Servo servo_r2;

    /******** definiere Festwerte    *************/
    int servo_stop = 0;
    int servo_go =     150;
    
    
    
    /******** definiere die allgemein benötigten Variablen    *************/
    
    // volatile muss davor stehen wenn die Variable in der Interruptroutine verändert wird !!!
    volatile int autozaehler_richtung1 = 0;        // Festlegen einer Variablen im Integerformat (max. Zählerstand = 32767)
    volatile int autozaehler_richtung2 = 0;        // Festlegen einer Variablen im Integerformat (max. Zählerstand = 32767)

    int fahrtfreigabe = 0;            // 1 bedeutet Ampelzyklus1 freigegeben     2 bedeutet Ampelzyklus2 freigegeben



    /******** kompletter Ampelzyklus für Ampel 1 oder 2 je nach fahrfreigabe    *************/
void ampelzyklus(){
    if (fahrtfreigabe == 1){
        digitalWrite(led_richtung1_rot, HIGH);        // noch ist Grundsettlung    ==> nur ROT
        digitalWrite(led_richtung1_gelb, LOW);        
        digitalWrite(led_richtung1_gruen, LOW);        
        delay(10000);

        digitalWrite(led_richtung1_gelb, HIGH);        // jetzt kommt gelb dazu ==> ROT und Gelb
        delay(1000);

        digitalWrite(led_richtung1_gelb, LOW);      // jetzt geht rot und gelb aus und grün leuchtet und ...
        digitalWrite(led_richtung1_rot, LOW);        
        digitalWrite(led_richtung1_gruen, HIGH);    
        servo_r1.write(servo_go);                   // gleichzeitig Fahrfreigabe in Richtung 1        
        delay(10000);                                

        digitalWrite(led_richtung1_gruen, LOW);     // grün geht aus und gleichzeitig kommt gelb
        digitalWrite(led_richtung1_gelb, HIGH);
        delay(15);
        servo_r1.write(servo_stop);                    // Servo geht etwas später auf halt, da die Fahrer auf gelb ja in echt erst reagieren müssen
        delay(1000);

        digitalWrite(led_richtung1_gelb, LOW);        // nun noch gelb aus und rot an, dann ist wieder Grundstellung
        digitalWrite(led_richtung1_rot, HIGH);

    }
    
    
    if (fahrtfreigabe == 2){
        digitalWrite(led_richtung2_rot, HIGH);        // noch ist Grundsettlung    ==> nur ROT
        digitalWrite(led_richtung2_gelb, LOW);        
        digitalWrite(led_richtung2_gruen, LOW);        
        delay(10000);

        digitalWrite(led_richtung2_gelb, HIGH);        // jetzt kommt gelb dazu ==> ROT und Gelb
        delay(1000);

        digitalWrite(led_richtung2_gelb, LOW);      // jetzt geht rot und gelb aus und grün leuchtet und ...
        digitalWrite(led_richtung2_rot, LOW);        
        digitalWrite(led_richtung2_gruen, HIGH);    
        servo_r2.write(servo_go);                   // gleichzeitig Fahrfreigabe in Richtung 1        
        delay(10000);                                

        digitalWrite(led_richtung2_gruen, LOW);     // grün geht aus und gleichzeitig kommt gelb
        digitalWrite(led_richtung2_gelb, HIGH);
        delay(15);
        servo_r2.write(servo_stop);                    // Servo geht etwas später auf halt, da die Fahrer auf gelb ja in echt erst reagieren müssen
        delay(1000);

        digitalWrite(led_richtung2_gelb, LOW);        // nun noch gelb aus und rot an, dann ist wieder Grundstellung
        digitalWrite(led_richtung2_rot, HIGH);
    }

   }
    
    /******** Setup-Programm um Ein-/Ausgänge und alles sonstiges für den Start festzulegen  *************/
    
void setup () {

  // Legt die Unterbrechungsroutinen für die Interruptroutinen an INT0 und INT1 fest
  attachInterrupt(0, zaehle_richtung1, FALLING);    // Flanke High-Low (Low-High wäre RISING)
  attachInterrupt(1, zaehle_richtung2, FALLING);    // Flanke High-Low (Low-High wäre RISING)

  // Legt den Zugriff und die Anschlüsse für Servos fest
  servo_r1.attach(9);
  servo_r2.attach(10);

  // Legt die Anschlüsse als Eingänge fest
  pinMode(button_richtung1, INPUT_PULLUP);
  pinMode(button_richtung2, INPUT_PULLUP);

  
  // Legt die Anschlüsse als Ausgänge fest
  pinMode(led_richtung1_rot, OUTPUT);                // setze Ausgänge für Ampel 1
  pinMode(led_richtung1_gelb, OUTPUT);
  pinMode(led_richtung1_gruen, OUTPUT);
  
  pinMode(led_richtung2_rot, OUTPUT);                // setze Ausgänge für Ampel 2
  pinMode(led_richtung2_gelb, OUTPUT);
  pinMode(led_richtung2_gruen, OUTPUT);
  
  // fährt die Servos in Grundstellung
  servo_r1.write(servo_stop);                          // Servo in grundstellung zu
  servo_r2.write(servo_stop);                          // Servo in grundstellung zu
  
  // Grundstellung der Ampeln jeweils Rot ein sowie Gelb und Grün aus
  digitalWrite(led_richtung1_rot, HIGH);
  digitalWrite(led_richtung2_rot, HIGH);
  digitalWrite(led_richtung1_gelb, LOW);
  digitalWrite(led_richtung2_gelb, LOW);
  digitalWrite(led_richtung1_gruen, LOW);    
  digitalWrite(led_richtung1_gruen, LOW);  
  }


  
    /******** Hier beginnt das eigentliche Programm  *************/
void loop(){


while(1)                                            // Endlosschleife für die Ampel
    {

    if (autozaehler_richtung1 > 0)                // es sind Autos über den Reedkontakt gefahren....
        {
        fahrtfreigabe == 1;                            // Richtung 1 darf fahren     
        ampelzyklus();
        autozaehler_richtung1=0;                    // hier könnte man runterzählen wenn man auch die ausfahrenden erfasst6
        fahrtfreigabe == 0;                            //     
        }
        

        if (autozaehler_richtung2 > 0)                // es sind Autos über den Reedkontakt gefahren....
        {
        fahrtfreigabe == 2;                            // Richtung 2 darf fahren     
        ampelzyklus();
        autozaehler_richtung2=0;                    // hier könnte man runterzählen wenn man auch die ausfahrenden erfasst6
        fahrtfreigabe == 0;                            //     
        }


        }                                    // ende der Endlosschleife ... es geht zurück nach oben zu while....
}                                        // ende des Hauptgrogrammes


/********************************   Hier kommen die beiden Interruptroutinen zum Autozählen ****************/

// Reedkontakt für Richtung 1 wird betätigt
void zaehle_richtung1()
{
  autozaehler_richtung1 = autozaehler_richtung1 + 1;        // Zähl die anzahl der Reedbetätigungen mit
}




// Reedkontakt für Richtung 2 wird betätigt
void zaehle_richtung2()
{
  autozaehler_richtung2 = autozaehler_richtung2 + 1;        // Zähl die anzahl der Reedbetätigungen mit
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.08.2014, 17:14 (Dieser Beitrag wurde zuletzt bearbeitet: 07.08.2014 17:16 von rkuehle.)
Beitrag #2
RE: Taster keine Funktion leider
Hallo Rudi,
dass die Taster nicht laufen wundert nicht wirklich:
1. Wie schon 1000 mal betont: vergesst (bis auf Ausnahmen) die delay()-FunktionExclamationExclamationExclamation Während delay() kann alles passieren und der Arduino nimmt keinerlei Notiz davon, damit auch kein Interrupt!
Also delay() mit einer millis()-Abfrage ersetzen. dazu gibts im Forum nun schon zig Beispiele.
2. im Setup()
Code:
digitalWrite(led_richtung1_gruen, LOW);    
digitalWrite(led_richtung1_gruen, LOW);
soll das so sein ???
3. kann das nix bringen:
Code:
fahrtfreigabe == 1;
fahrtfreigabe == 2;
setzt die Variable nicht auf 1 oder 2, sondern macht einen Vergleich ohne nachfolgende Aktion. Aus "==" muss "=" werden.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.08.2014, 21:19
Beitrag #3
RE: Taster keine Funktion leider
Hallo

Leider habe ich das noch nie gemacht könntest Du mir vielleicht bitte helfen.

mfg rudi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.08.2014, 06:43 (Dieser Beitrag wurde zuletzt bearbeitet: 08.08.2014 10:45 von RMR.)
Beitrag #4
RE: Taster keine Funktion leider
(07.08.2014 21:19)rudi52056 schrieb:  Leider habe ich das noch nie gemacht könntest Du mir vielleicht bitte helfen.

Guggst du hier
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.08.2014, 06:54 (Dieser Beitrag wurde zuletzt bearbeitet: 08.08.2014 08:02 von rkuehle.)
Beitrag #5
RE: Taster keine Funktion leider
Moin Rudi,

anstatt "delay(1000)" kann man folgendes machen:
Code:
unsigned long last_event=0; // Variable für aktuelle Laufzeit
unsigned int intervall=1000; // Variable für Wartezeit, entspr. Parameter von delay()
loop()
{
// .... im loop() an der Stelle wo vorher delay(1000) stand
last_event=millis();
while (millis() - last_event < intervall) ;
}
Bedeutet:
- ermittle die aktuelle Laufzeit und setze diese auf last_event
- Schleife: solange aktuelle aktuelle Laufzeit - last_event < Wartezeit mache nix
Der Unterschied zu delay() ist, dass der Arduino nicht angehalten wird, die Interrupts also erfasst werden und die Interruptroutinen abgearbeitet werden.
Übrigens hat die while(1) - Schleife in deinem Code keinerlei Auswirkungen. Ist nur eine Endlosschleife in der loop - Endlosschleife.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.08.2014, 10:42 (Dieser Beitrag wurde zuletzt bearbeitet: 08.08.2014 10:45 von Thorsten Pferdekämper.)
Beitrag #6
RE: Taster keine Funktion leider
(08.08.2014 06:43)RMR schrieb:  Guggst du hier
Mit dem Link stimmt was nicht, richtig ist das hier:
Guggst du hier
Meiner Meinung nach ist das eins der Sachen, die jeder hier unbedingt bis auf's letzte Bit verstanden haben muss.
Gruss,
Thorsten

Vielleicht noch eins:
Ich wuerde auch das
Code:
while(1)
rauswerfen. Die Funktion loop() wird ohnehin immer wieder aufgerufen, ich bin mir aber nicht sicher, ob das uebergeordnete Programm noch etwas zwischen den loop()-Aufrufen tut. D.h. bestenfalls ist das "while(1)" ueberfluessig, es kann aber auch sein, dass es schaedlich ist.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.08.2014, 18:50
Beitrag #7
RE: Taster keine Funktion leider
Hallo Leute

Hier mal die Beschreibung wie die Schaltung genau funktionieren sollte.

Die Baustellen Ampel für das Faller Car System.
Mit 2 Servos und 2 Reed kontakten.

1. Beide Ampeln beim Start auf Rot.
2. Kommt ein Fahrzeug (das an der Lenkung einen Magneten hat der den Reed auslöst)
3. Sollte der Reed 1 oder 2. abgefragt werden.

4. Kommt zu Beispiel ein Fahrzeug auf Reed 1 so soll das Programm die Schleife (if (fahrtfreigabe == 1) beginnen und aber wenn ein Fahrzeug auch Reed 2 betätigt das sich merken.

Das Servo mit der Ampel funktioniert tadellos.

Nur die Reed (Button Funktion ) bekomme ich nicht hin.

mfg Rudi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.08.2014, 19:47
Beitrag #8
RE: Taster keine Funktion leider
Teste mal dies:
Code:
//#include <Servo.h>
// Reedkontakte
const int button_richtung1 = 2;                    // PIN INT0 löst Unterbrechung des Programmes aus
const int button_richtung2 = 3;                    // PIN INT1 löst Unterbrechung des Programmes aus
// LEDS für Ampel 1
const int led_richtung1_rot = 11;      //rot
const int led_richtung1_gelb = 12;     //orange
const int led_richtung1_gruen = 13;     //grün
// LEDs für Ampel 2 in der gegenrichtung
const int led_richtung2_rot = 8;         //rot
const int led_richtung2_gelb = 7;     //orange
const int led_richtung2_gruen = 6;     //grün
// Zuordnung der Servos
Servo servo_r1;
Servo servo_r2;
/******** definiere Festwerte    *************/
const int servo_stop = 0;
const int servo_go = 150;
/******** definiere die allgemein benötigten Variablen    *************/
// volatile muss davor stehen wenn die Variable in der Interruptroutine verändert wird !!!
volatile int autozaehler_richtung1 = 0;        // Festlegen einer Variablen im Integerformat (max. Zählerstand = 32767)
volatile int autozaehler_richtung2 = 0;        // Festlegen einer Variablen im Integerformat (max. Zählerstand = 32767)
int fahrtfreigabe = 0;            // 1 bedeutet Ampelzyklus1 freigegeben     2 bedeutet Ampelzyklus2 freigegeben
/******** Setup-Programm um Ein-/Ausgänge und alles sonstiges für den Start festzulegen  *************/
void setup () {
  // Legt die Unterbrechungsroutinen für die Interruptroutinen an INT0 und INT1 fest
  attachInterrupt(0, zaehle_richtung1, FALLING);    // Flanke High-Low (Low-High wäre RISING)
  attachInterrupt(1, zaehle_richtung2, FALLING);    // Flanke High-Low (Low-High wäre RISING)
  // Legt den Zugriff und die Anschlüsse für Servos fest
  servo_r1.attach(9);
  servo_r2.attach(10);
  // Legt die Anschlüsse als Eingänge fest
  pinMode(button_richtung1, INPUT_PULLUP);
  pinMode(button_richtung2, INPUT_PULLUP);
  // Legt die Anschlüsse als Ausgänge fest
  pinMode(led_richtung1_rot, OUTPUT);                // setze Ausgänge für Ampel 1
  pinMode(led_richtung1_gelb, OUTPUT);
  pinMode(led_richtung1_gruen, OUTPUT);
  pinMode(led_richtung2_rot, OUTPUT);                // setze Ausgänge für Ampel 2
  pinMode(led_richtung2_gelb, OUTPUT);
  pinMode(led_richtung2_gruen, OUTPUT);
  // fährt die Servos in Grundstellung
  servo_r1.write(servo_stop);                          // Servo in grundstellung zu
  servo_r2.write(servo_stop);                          // Servo in grundstellung zu
  // Grundstellung der Ampeln jeweils Rot ein sowie Gelb und Grün aus
  digitalWrite(led_richtung1_rot, HIGH);
  digitalWrite(led_richtung2_rot, HIGH);
  digitalWrite(led_richtung1_gelb, LOW);
  digitalWrite(led_richtung2_gelb, LOW);
  digitalWrite(led_richtung1_gruen, LOW);
  digitalWrite(led_richtung2_gruen, LOW);
}
/******** Hier beginnt das eigentliche Programm  *************/
void loop() {
  if (autozaehler_richtung1 > 0)                // es sind Autos über den Reedkontakt gefahren....
  {
    fahrtfreigabe = 1;                            // Richtung 1 darf fahren
    ampelzyklus();
    autozaehler_richtung1 = 0;                  // hier könnte man runterzählen wenn man auch die ausfahrenden erfasst6
    fahrtfreigabe = 0;                            //
  }
  if (autozaehler_richtung2 > 0)                // es sind Autos über den Reedkontakt gefahren....
  {
    fahrtfreigabe = 2;                            // Richtung 2 darf fahren
    ampelzyklus();
    autozaehler_richtung2 = 0;                  // hier könnte man runterzählen wenn man auch die ausfahrenden erfasst6
    fahrtfreigabe = 0;                            //
  }
}                                        // ende des Hauptgrogrammes
/******** kompletter Ampelzyklus für Ampel 1 oder 2 je nach fahrfreigabe    *************/
void ampelzyklus() {
  if (fahrtfreigabe = 1) {
    digitalWrite(led_richtung1_rot, HIGH);        // noch ist Grundsettlung    ==> nur ROT
    digitalWrite(led_richtung1_gelb, LOW);
    digitalWrite(led_richtung1_gruen, LOW);
    xdelay(10000);
    digitalWrite(led_richtung1_gelb, HIGH);        // jetzt kommt gelb dazu ==> ROT und Gelb
    xdelay(1000);
    digitalWrite(led_richtung1_gelb, LOW);      // jetzt geht rot und gelb aus und grün leuchtet und ...
    digitalWrite(led_richtung1_rot, LOW);
    digitalWrite(led_richtung1_gruen, HIGH);
    servo_r1.write(servo_go);                   // gleichzeitig Fahrfreigabe in Richtung 1
    xdelay(10000);
    digitalWrite(led_richtung1_gruen, LOW);     // grün geht aus und gleichzeitig kommt gelb
    digitalWrite(led_richtung1_gelb, HIGH);
    xdelay(15);
    servo_r1.write(servo_stop);                    // Servo geht etwas später auf halt, da die Fahrer auf gelb ja in echt erst reagieren müssen
    xdelay(1000);
    digitalWrite(led_richtung1_gelb, LOW);        // nun noch gelb aus und rot an, dann ist wieder Grundstellung
    digitalWrite(led_richtung1_rot, HIGH);
  }
  if (fahrtfreigabe = 2) {
    digitalWrite(led_richtung2_rot, HIGH);        // noch ist Grundsettlung    ==> nur ROT
    digitalWrite(led_richtung2_gelb, LOW);
    digitalWrite(led_richtung2_gruen, LOW);
    xdelay(10000);
    digitalWrite(led_richtung2_gelb, HIGH);        // jetzt kommt gelb dazu ==> ROT und Gelb
    xdelay(1000);
    digitalWrite(led_richtung2_gelb, LOW);      // jetzt geht rot und gelb aus und grün leuchtet und ...
    digitalWrite(led_richtung2_rot, LOW);
    digitalWrite(led_richtung2_gruen, HIGH);
    servo_r2.write(servo_go);                   // gleichzeitig Fahrfreigabe in Richtung 1
    xdelay(10000);
    digitalWrite(led_richtung2_gruen, LOW);     // grün geht aus und gleichzeitig kommt gelb
    digitalWrite(led_richtung2_gelb, HIGH);
    xdelay(15);
    servo_r2.write(servo_stop);                    // Servo geht etwas später auf halt, da die Fahrer auf gelb ja in echt erst reagieren müssen
    xdelay(1000);
    digitalWrite(led_richtung2_gelb, LOW);        // nun noch gelb aus und rot an, dann ist wieder Grundstellung
    digitalWrite(led_richtung2_rot, HIGH);
  }
}
/********************************   Hier kommen die beiden Interruptroutinen zum Autozählen ****************/
// Reedkontakt für Richtung 1 wird betätigt
void zaehle_richtung1()
{
  autozaehler_richtung1 = autozaehler_richtung1 + 1;        // Zähl die anzahl der Reedbetätigungen mit
}
// Reedkontakt für Richtung 2 wird betätigt
void zaehle_richtung2()
{
  autozaehler_richtung2 = autozaehler_richtung2 + 1;        // Zähl die anzahl der Reedbetätigungen mit
}
void xdelay(int i)
{
  unsigned long last = millis();
  while (millis() - last < i);
}
Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  mehrere Taster entprellen Kitt 15 532 24.10.2016 21:17
Letzter Beitrag: georg01
  Can-Bus Shield ok, aber keine Daten Clubsport 38 1.546 01.09.2016 14:17
Letzter Beitrag: Clubsport
Question Keine Verbindung via USB nach flashen des Programms chaoscrack 5 204 23.08.2016 14:58
Letzter Beitrag: hotsystems
  Taster für mehrere Funktionen matthias3579 5 353 16.08.2016 16:00
Letzter Beitrag: StephanBuerger
  Steuern von 4 Servo mittels eines Taster und eines Potis Jackie09 17 766 16.07.2016 11:43
Letzter Beitrag: Binatone
  Funktion mit Parameterübergabe - u8g torsten_156 8 404 22.06.2016 18:53
Letzter Beitrag: Pit
  Schwellwert mit Taster ändern malsehen 16 1.421 12.04.2016 20:11
Letzter Beitrag: malsehen
  3 Schrittmotoren, 2 LED's 1 Taster cichla 0 397 31.03.2016 15:21
Letzter Beitrag: cichla
  Arduino Alarmanlage mit Taster erweitern Vengance 0 529 22.03.2016 17:54
Letzter Beitrag: Vengance
  SD.open() erzeugt keine neue Datei! torsten_156 4 532 11.03.2016 17:31
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste