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
Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
28.12.2014, 22:39 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2014 22:41 von Marlox.)
Beitrag #41
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Ok, jetzt lüppt das Big Grin Vielen Dank für die tolle Hilfe!
Wie das mit dem && funktioniert, habe ich zwar noch herausgefunden, aber mit dem else hätte ich noch ewig suchen müssen Big Grin

So schauts jetzt aus:

Code:
// Warmlaufprogramm für Frässpindel
// 27.12.2014

int out1 = 11;
int out2 = 12;
int out3 = 13;
int knopfA = 2;
int knopfB = 3;
int knopfC = 4;
int knopfD = 7;
int knopfE = 6;
int Analog5 = 5;

// Zeitkonstanten
#define lzPhase1     5*1000UL   // 120*1000ms = 120 Sekunden
#define lzPhase2     10*1000UL   // 120*1000ms = 120 Sekunden
#define lzPhase3     15*1000UL   //  60*1000ms =  60 Sekunden

// Variablen für Programmablauf
int mode                   = 0;   // 0 = nichts ausgewählt
                                  // 1 = Phase 1 ausgewählt
                                  // 2 = Phase 2 ausgewählt
                                  // 3 = Phase 3 ausgewählt
                                  // 4 = kompletter Warmlauf ausgewählt
                                  // 5 = Abbruch ausgewählt
                    
int modeAkt                = 99;  // 0 = nichts aktiv
                                  // 1 = Phase 1 aktiv
                                  // 2 = Phase 2 aktiv
                                  // 3 = Phase 3 aktiv
                                  // 4 = kompletter Warmlauf aktiv
                                  // 5 = Abbruch aktiv
                                  // 99 = undefiniert, nach Programmstart

unsigned long aktStartzeit     = 0;      //aktuelle Startzeit
unsigned long sekundentakt     = 0;
boolean       sekundenimpuls   = false;
unsigned long Laufzeit         = 0;

// Funktionsprototypen (wird bei der Arduino IDE eigentlich nicht gebraucht)
void tastenAbfragen (void); // Taster einlesen
void mode0          (void); // Leerlauf
void mode1          (void); // Phase 1
void mode2          (void); // Phase 2
void mode3          (void); // Phase 3
void mode4          (void); // kompletter Warmlauf
void mode5          (void); // Abbruch


//-------------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);    
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(out3, OUTPUT);
  pinMode(knopfA, INPUT_PULLUP);
  pinMode(knopfB, INPUT_PULLUP);
  pinMode(knopfC, INPUT_PULLUP);
  pinMode(knopfD, INPUT_PULLUP);
  pinMode(knopfE, INPUT_PULLUP);
  pinMode(Analog5, OUTPUT);
  Serial.println(F("Testprogramm Spindel Warmlauf"));
}

//-------------------------------------------------------------------------
void loop()
{
  tastenAbfragen();

  switch(mode)
  {
    case  0:
      mode0();    
    break;    

    case  1:
      mode1();
    break;    

    case  2:
      mode2();    
    break;    

    case  3:
      mode3();    
    break;    

    case  4:
      mode4();    
    break;    

    case  5:
      mode5();    
    break;    


    default:
      mode = 0;
    break;    
  }  

// 1s Taktsignal bilden
if ( millis() - sekundentakt >= 1000 )
  {
    sekundentakt   = millis();
    sekundenimpuls = true;
  }
}

//-------------------------------------------------------------------------
// Taster einlesen
void tastenAbfragen (void)
{
  if ( !digitalRead(knopfA) && (mode != 1) )  mode = 1;
  if ( !digitalRead(knopfB) && (mode != 2) )  mode = 2;
  if ( !digitalRead(knopfC) && (mode != 3) )  mode = 3;
  if ( !digitalRead(knopfD) && (mode != 4) )  mode = 4;
  if ( !digitalRead(knopfE) && (mode != 5) )  mode = 5;
}

// Leerlauf - alles aus
void mode0 (void)
{
  if ( modeAkt != 0)
  {
    modeAkt = 0;
    Serial.println();
    Serial.print(F("Leerlauf - warte auf Tastendruck"));
  }
  digitalWrite(out1, LOW);  // Ausgang 1 AUS
  digitalWrite(out2, LOW);  // Ausgang 2 AUS
  digitalWrite(out3, LOW);  // Ausgang 3 AUS
  analogWrite(Analog5, 0);  // Ausgang Analog 5 auf NULL
}

// Warmlauf Phase 1
void mode1 (void)
{
  if ( modeAkt != 1)
  {
    modeAkt = 1;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 1"));
  }  

  if ( millis() - aktStartzeit < lzPhase1)
  {
    digitalWrite(out1, HIGH);  // Ausgang 1 EIN
    digitalWrite(out2, LOW);   // Ausgang 2 AUS
    digitalWrite(out3, LOW);   // Ausgang 3 AUS
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 1 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}

// Warmlauf Phase 2
void mode2 (void)
{
  if ( modeAkt != 2)
  {
    modeAkt = 2;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 2"));
  }  

  if ( millis() - aktStartzeit < lzPhase2)
  {
    digitalWrite(out1, LOW);   // Ausgang 1 AUS
    digitalWrite(out2, HIGH);  // Ausgang 2 EIN
    digitalWrite(out3, LOW);   // Ausgang 3 AUS
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 2 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}

// Warmlauf Phase 3
void mode3 (void)
{
  if ( modeAkt != 3)
  {
    modeAkt = 3;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 3"));
  }  

  if ( millis() - aktStartzeit < lzPhase3)
  {
    digitalWrite(out1, LOW);   // Ausgang 1 AUS
    digitalWrite(out2, LOW);   // Ausgang 2 AUS
    digitalWrite(out3, HIGH);  // Ausgang 3 EIN
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 3 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}


// Kompletter Warmlauf
void mode4 (void)
{
  if ( modeAkt != 4)
  {
    modeAkt = 4;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Kompletter Warmlauf"));
  }
  if ( millis() - aktStartzeit <= 12000)
  {
    analogWrite(Analog5, 128);
  }
  
  if ( (millis() - aktStartzeit > 12000) && (millis() - aktStartzeit <= 24000))
  {
    analogWrite(Analog5, 191);
  }
    
  if ( (millis() - aktStartzeit > 24000) && (millis() - aktStartzeit <= 30000))
  {
    analogWrite(Analog5, 255);
  }
  
  if ( (millis() - aktStartzeit > 30000))
  {
    Serial.println();
    Serial.println(F("Kompletter Warmlauf abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }  
}

// Not-Aus
void mode5 (void)
{
  if ( modeAkt != 5)
  {
    modeAkt = 5;
    Serial.println();
    Serial.print(F("Not-Aus"));
  }
  digitalWrite(out1, LOW);  // Ausgang 1 AUS
  digitalWrite(out2, LOW);  // Ausgang 2 AUS
  digitalWrite(out3, LOW);  // Ausgang 3 AUS
  mode = 0;
}

Jetzt werde ich noch versuchen, das mit Variablen zu lösen, statt direkt Zahlen rein zu schreiben. Damit man da auch mal etwas einfacher etwas ändern kann.
Und ein paar Anmerkungen schaden auch nichts Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 22:42 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2014 22:44 von ardu_arne.)
Beitrag #42
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Viele Wege führen nach Rom.
Die else if Kette ist auch einer davon.

Ich glaube du musst jetzt noch analogWrite(Analog5, 0); im mode5 einbauen sonst klappt das mit den Not_aus nicht.

Und ja, versuch das mit eigenen Kommentaren zu schmücken. Das hilft in einem Jahr und auch schon jetzt beim Programm verstehen.

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 22:49 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2014 22:51 von Marlox.)
Beitrag #43
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Das habe ich in mode0 mit unter gebracht Smile
So wird das nach jedem Modus automatisch ausgeführt
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Unterschiedliche Programme durch Switch/ Case SpeedShifter 26 604 04.10.2016 15:29
Letzter Beitrag: SpeedShifter
  4 Tasten für 4 Laufzeiten des gleichen Programms Nimes 8 365 18.07.2016 16:32
Letzter Beitrag: Scheams
  Altes Digitales Display mit Text/Bits durch Genuino Micro versorgen - SPI-Bibliothek? RollingStone 0 202 25.06.2016 17:46
Letzter Beitrag: RollingStone
  2 Tasten drücken damit licht angeht tjard 11 546 19.06.2016 12:24
Letzter Beitrag: hotsystems
  Deckel offen erkennung durch Temperaturabfall MarkoM 3 259 08.06.2016 14:18
Letzter Beitrag: hotsystems
  [Suche] Library Programmierer/in für privates Projekt avoid 8 577 19.05.2016 15:01
Letzter Beitrag: avoid
Sad Suche simplen Scetch für ESP8266-Modul torsten_156 14 1.119 19.04.2016 07:54
Letzter Beitrag: amithlon
  nur ein URL aufruf ohne PHP toto1975 3 602 05.04.2016 08:26
Letzter Beitrag: iks77
  Suche LCD.h Zip bojojo 4 853 11.02.2016 17:31
Letzter Beitrag: bojojo
  Aus While-Schleife durch Interrupt aussteigen Zill3 10 1.175 08.02.2016 16:28
Letzter Beitrag: ardu_arne

Gehe zu:


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