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
  Motor Steuerung durch Sensoren Werte Zerebrator 14 603 12.06.2017 14:36
Letzter Beitrag: Franz54
  Zählerstand nur einmal ausgeben Fliega 11 597 21.02.2017 11:21
Letzter Beitrag: SkobyMobil
  Unterschiedliche Programme durch Switch/ Case SpeedShifter 26 1.209 04.10.2016 15:29
Letzter Beitrag: SpeedShifter
  4 Tasten für 4 Laufzeiten des gleichen Programms Nimes 8 678 18.07.2016 16:32
Letzter Beitrag: Scheams
  Altes Digitales Display mit Text/Bits durch Genuino Micro versorgen - SPI-Bibliothek? RollingStone 0 364 25.06.2016 17:46
Letzter Beitrag: RollingStone
  2 Tasten drücken damit licht angeht tjard 11 830 19.06.2016 12:24
Letzter Beitrag: hotsystems
  Deckel offen erkennung durch Temperaturabfall MarkoM 3 432 08.06.2016 14:18
Letzter Beitrag: hotsystems
  [Suche] Library Programmierer/in für privates Projekt avoid 8 1.000 19.05.2016 15:01
Letzter Beitrag: avoid
  nur ein URL aufruf ohne PHP toto1975 3 1.021 05.04.2016 08:26
Letzter Beitrag: iks77
  Suche LCD.h Zip bojojo 4 2.161 11.02.2016 17:31
Letzter Beitrag: bojojo

Gehe zu:


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