Mit RC Empfänger Arduino steuern

Moin, hab mal versucht das ins Programm zu bringen.

#include <Servo.h>

const byte PulseInCh1 = 4;
const byte PulseInCh2 = 5;
Servo ServoRauch;
Servo Motor;
Servo Servo1;
const byte ENDSCAHLTER1 = 9;
const byte ENDSCAHLTER2 = 10;

const int AUFHEIZEN = 3000;
const int ABKUEHLEN = 3000;
unsigned long rauchMillis;
unsigned long rauchIntervall;

enum RAUCH {warteAufStart,servo90Grad,warteBisAufheizenFertig,servoHalbZurueck,servo0Grad};
byte RAUCH = warteAufStart;

void setup() 
{
   pinMode(PulseInCh1, INPUT);
   pinMode(PulseInCh2, INPUT);
   pinMode(ENDSCAHLTER1, INPUT);
   pinMode(ENDSCAHLTER2, INPUT);
   ServoRauch.attach(6);
   Motor.attach(7);
   Servo1.attach(8);
}


void loop() 
{
    switch (RAUCH) {

  case warteAufStart:;
    if (PulseInCh1 > 1500) {
      RAUCH = servo90Grad;
    }
    break;
  
  case servo90Grad:;
    ServoRauchPos = 90;
    servoRauch.write(ServoRauchPos);
    StartZeitVorheizen = millis();
    RAUCH = warteBisAufheizenFertig;
    break;
  
  case warteBisAufheizenFertig:
    if (millis() - StartZeitVorheizen >= AufheizZeit) {
      RAUCH = servo180Grad;
    }
    break;
  
  case servo180Grad:
    ServoRauchPos = 180;
    servoRauch.write(ServoRauchPos);
    RAUCH = warteAufCh1_1100;
    break;
  
  case warteAufCh1_1100:
    if (PulseInCh1 < 1500) {
      RAUCH = servoRauch_halbZurueck;
    }
    break;
  
  case servoRauch_halbZurueck:
    ServoRauchPos = 90;
    servoRauch.write(ServoRauchPos);
    StartAbkuehlung = millis();
    RAUCH = warteBisAbgekuehlt:
    break;
  
  case warteBisAbgekuehlt:
    if (millis() - StartAbkuehlung >= AbkuehlZeit) {
      RAUCH = servo0Grad;
    }
    break;
  
  case servo0Grad:
    ServoRauchPos = 0;
    servoRauch.write(ServoRauchPos);
    RAUCH = warteAufstart;
    break;
}
}

Sind aber noch etliche Fehlermeldungen drin, die ich nicht lösen kann.

Der einfachste Fehler schlummert hier:

Das enum und eine Variable vom Typ byte dürfen nicht denselben Bezeichner (Namen) haben.
Es hat sich eingebürgert, Variablennamen immer mit Kleinbuchstaben zu beginnen. Weit verbreitet ist dann "CamelCase" weiterzuschreiben.

Hallo Apro,

also aus der Art wie du das switch case in die function loop eingesetzt hast,
kann man schlussfolgern das du - am Ende - in der Programmierung sehr viel schneller vorankommst würdest wenn du dir zuerst die wichtigsten Grundlagen des Programmiererens mit kleinen Lernprogrammen aneignest.

Um mal Beispielzahlen zu verwenden:

Copy & Paste-Methode

Im internet suchen um ein Programm zu finden mit einem ähnlichen Stichwort
0,5 Stunden
Programm nach Pi mal Nebel (oder auch Rauch) anpassen
0,5 Stunden
200 Programmzeilen nach 1,5 Stunden. Wow das ging schnell.
Bloß macht das Programm auch das was du willst???

Frage "Warum läuft es nicht?" im Forum posten
0,25 Stunden

Auf eine erste Antwort warten
12 Stunden

Eine Kleinigkeit korrigieren
0,25 Stunden

zweite Frage "Warum läuft es nicht?" im Forum posten
0,25 Stunden

Auf eine zweite Antwort warten
12 Stunden

Das ganze drei Monate lang. Und dann immer noch nicht programmieren können.

Methode Grundlagen lernen:

Demo-Programme laden und ausprobieren
2 Stunden
Lernen wie man Debug-Output ins Programm einbaut
2 Stunden

Demo-Programm mit zusätzlichem Debug-Output versehen
2 Stunden

Demo-Programme abändern und ausprobieren
5 Stunden

Das drei Wochen lang. Das heißt jeweils 8 bis 16 Stunden pro Woche

Dann so viel Grundlagen draufhaben um eigene Programme im groben schreiben zu können
und dann spezifische Fragen im Forum stellen können.

Die Beschreibung trifft nur gaanz ungefähr auf dich zu. Es verdeutlicht aber trotzdem um was es geht.
vgs

Da ich aber kein Programmierer bin und arduino nur sporadisch nutze, ist es für mich recht schwierig damit zurecht zu kommen. Ich versuche die Grundlagen zu verstehen. Alles was in die Tiefe geht ist problematisch. Ich möchte ja kein fertigs Skript haben, aber da wo es hakt bräuchte ich Unterstützung. Und wie du sehen kannst, wurden über 35 posts benötigt, bis die Funktion, die ich beabsichtige, von allen Verstanden wurde. Und dann habe ich nen Ansatz, der sofort über den Haufen geworfen wird. Bitte versteht mich nicht falsch, ich bin über jeden Rat dankbar. Aber es gibt nun mal die "Handwerker", die "Theoritiker" und die "Programmierer". Möchte mal sehen wie der ein oder andere eine elektro Hausinstalation macht.
Gruß Andre

Ha ha - Hausinstallation mache ich gar nicht, weil mir der Nachweis über die Fachkunde fehlt :slightly_smiling_face:

Andre, du könntest uns damit helfen, dass du die verbliebenen Fehlermeldungen (als Code) hier postest. Da kann man häufig schon die wesentlichen Probleme identifizieren. Nicht jeder kann oder will die IDE anwerfen, eine Servolib installieren und den Sketch selbst kompilieren.

Und wenn Du einen Nagel (Arduino) verwenden willst, solltest du ein wenig mit dem Hammer (C++) umgehen können - da gibt es leider keinen Umweg außer fertig kaufen.

Eben, genau das meine ich. Man kann nicht alles können.
Werde den fehlercode morgen mal posten. Habe gerade keine Zeit dafür.

Um einen arduino mit nem Hammer in die Wand zu schlagen, reichen meine programmier skills völlig aus :grin:.

Moin, jetzt nochmal zum Thema. Habe gerade ca. 2h rumgetüftelt und auch die ein oder andere Fehlermeldung wegbekommen. Habe aber immer noch einige Probleme.
Hier mein Sketch:

#include <Servo.h>

const byte PulseInCh1 = 4;
const byte PulseInCh2 = 5;
Servo servoRauch;
Servo motor;
Servo servo1;
const byte endschalter1 = 9;
const byte endschalter2 = 10;

const int aufheizen = 3000;
const int abkuehlen = 3000;
unsigned long rauchMillis;
unsigned long rauchIntervall;

enum RAUCH {warteAufStart, servo90Grad, warteBisAufheizenFertig, serco180Grad, servoHalbZurueck, servo0Grad};
byte rauch = warteAufStart;

void setup()
{
  pinMode(PulseInCh1, INPUT);
  pinMode(PulseInCh2, INPUT);
  pinMode(endschalter1, INPUT);
  pinMode(endschalter2, INPUT);
  servoRauch.attach(6);
  motor.attach(7);
  servo1.attach(8);
}


void loop()

{
  switch (rauch);
  {

  case warteAufStart:
    if (PulseInCh1 > (1500))
      rauch = servo90Grad;

    switch (rauch)
    case (servo90Grad):

    servoRauch.write(90);
    aufheizen = millis();
    rauch = warteBisAufheizenFertig;

  case (warteBisAufheizenFertig):
    if (millis() - StartZeitVorheizen >= AufheizZeit) {
      rauch = servo180Grad;
    }

  case (servo180Grad):

    servoRauch.write(180);
    rauch = warteAufCh1_1100;

  case warteAufCh1_1100:
    if (PulseInCh1 < 1500) {
      rauch = servoRauch_halbZurueck;
    }

  case (servoHalbZurueck):

    servoRauch.write(90);
    abkuehlung = millis();
rauch = warteBisAbgekuehlt:

          case (warteBisAbgekuehlt):
    if (millis() - StartAbkuehlung >= AbkuehlZeit) {
      rauch = servo0Grad;
    }

  case (servo0Grad):
    servoRauch.write(0);
    rauch = warteAufstart;
  }
}

Und nun die Fehlerliste:

C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino: In function 'void loop()':
Wrecker:37:5: error: case label 'warteAufStart' not within a switch statement
     case warteAufStart:
     ^~~~
Wrecker:45:24: error: assignment of read-only variable 'aufheizen'
     aufheizen = millis();
                        ^
Wrecker:48:3: error: case label 'warteBisAufheizenFertig' not within a switch statement
   case (warteBisAufheizenFertig):
   ^~~~
Wrecker:49:20: error: 'StartZeitVorheizen' was not declared in this scope
     if (millis() - StartZeitVorheizen >= AufheizZeit) {
                    ^~~~~~~~~~~~~~~~~~
Wrecker:49:42: error: 'AufheizZeit' was not declared in this scope
     if (millis() - StartZeitVorheizen >= AufheizZeit) {
                                          ^~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:49:42: note: suggested alternative: 'aufheizen'
     if (millis() - StartZeitVorheizen >= AufheizZeit) {
                                          ^~~~~~~~~~~
                                          aufheizen
Wrecker:50:15: error: 'servo180Grad' was not declared in this scope
       rauch = servo180Grad;
               ^~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:50:15: note: suggested alternative: 'serco180Grad'
       rauch = servo180Grad;
               ^~~~~~~~~~~~
               serco180Grad
Wrecker:53:9: error: 'servo180Grad' was not declared in this scope
   case (servo180Grad):
         ^~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:53:9: note: suggested alternative: 'serco180Grad'
   case (servo180Grad):
         ^~~~~~~~~~~~
         serco180Grad
Wrecker:53:3: error: case label '<expression error>' not within a switch statement
   case (servo180Grad):
   ^~~~
Wrecker:56:13: error: 'warteAufCh1_1100' was not declared in this scope
     rauch = warteAufCh1_1100;
             ^~~~~~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:56:13: note: suggested alternative: 'warteAufStart'
     rauch = warteAufCh1_1100;
             ^~~~~~~~~~~~~~~~
             warteAufStart
Wrecker:58:3: error: case label 'warteAufCh1_1100' not within a switch statement
   case warteAufCh1_1100:
   ^~~~
Wrecker:60:15: error: 'servoRauch_halbZurueck' was not declared in this scope
       rauch = servoRauch_halbZurueck;
               ^~~~~~~~~~~~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:60:15: note: suggested alternative: 'servoHalbZurueck'
       rauch = servoRauch_halbZurueck;
               ^~~~~~~~~~~~~~~~~~~~~~
               servoHalbZurueck
Wrecker:63:3: error: case label 'servoHalbZurueck' not within a switch statement
   case (servoHalbZurueck):
   ^~~~
Wrecker:66:5: error: 'abkuehlung' was not declared in this scope
     abkuehlung = millis();
     ^~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:66:5: note: suggested alternative: 'abkuehlen'
     abkuehlung = millis();
     ^~~~~~~~~~
     abkuehlen
Wrecker:67:9: error: 'warteBisAbgekuehlt' was not declared in this scope
 rauch = warteBisAbgekuehlt:
         ^~~~~~~~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:67:9: note: suggested alternative: 'warteBisAufheizenFertig'
 rauch = warteBisAbgekuehlt:
         ^~~~~~~~~~~~~~~~~~
         warteBisAufheizenFertig
Wrecker:74:3: error: case label 'servo0Grad' not within a switch statement
   case (servo0Grad):
   ^~~~
Wrecker:76:13: error: 'warteAufstart' was not declared in this scope
     rauch = warteAufstart;
             ^~~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:76:13: note: suggested alternative: 'warteAufStart'
     rauch = warteAufstart;
             ^~~~~~~~~~~~~
             warteAufStart
exit status 1
case label 'warteAufStart' not within a switch statement

Wobei es sich Warscheinlich immer um die gleichen Fehler handeln wird. Hoffe ihr könnt mir einen Tipp geben.

Gruß Andre

Ja. Fehlerliste Stück für Stück abarbeiten (blöder Tipp, ich weiß).
Fangen wir mal zusammen an:

Also muss irgendwas passiert sein, was es verhindert, dass dieser case innerhalb des switch liegt. Schauen wir nach:

  switch (rauch);
  {

  case warteAufStart:

Und siehe da: Am Ende von Zeile 34 findet sich ein Semikolon: switch (rauch);
Der Switch ist damit zu Ende.
Also das Semikolon weg und - schwupps - ist auch die erste Fehlermeldung verschwunden.

Musst jetzt erstmal alleine weitermachen; werde noch ein wenig Geld verdienen müssen...


Gruß Walter

Hallo apro,

ich habe mal eine ganz andere Frage:

Was schätzt du denn wie viele Stunden du bräuchtest um wenigstens so weit programmieren zu können, dass du solche Fehlermeldungen selbst beheben könntest?

nur eine grobe Schätzung:

10 Stunden?
100 Stunden?
1000 Stunden?

Wie viel Cent wäre dir denn die Programmiererstunde Wert wenn jemand nach deinen Vorgaben etwas programmiert?

Ich meine das ernst mit den Cent. Nicht Euro. Cent.
1 Cent pro Stunde?
5 Cent pro Stunde?
10 Cent pro Stunde?
50 Cent pro Stunde?
500 Cent pro Stunde?

Oder ich könnte auch mal so herum fragen:
Wenn es ein fertiges "Steuer-mir-dir-Raucherzeugungs-Gerät" gäbe
Bei welchem Preis würdest du sagen "Kein Schäppchen mehr aber den Preis ist es mir Wert"

vgs

Ich glaube Zeile 45 (aufheizen = millis():wink: hat da überhaupt nix zu suchen...
Zeile 63 (case (servoHalbZurueck):slight_smile: ebenso...
Und Zeile 66 (abkuehlen = millis();)...
Noch ein paar Tippfehler beseitigt. Und schon sind viele Fehlermeldungen weg.
Nochmal der überarbeitete Sketch:

#include <Servo.h>

const byte PulseInCh1 = 4;
const byte PulseInCh2 = 5;
Servo servoRauch;
Servo motor;
Servo servo1;
const byte endschalter1 = 9;
const byte endschalter2 = 10;

const int aufheizen = 3000;
const int abkuehlen = 3000;
unsigned long rauchMillis;
unsigned long rauchIntervall;

enum RAUCH {warteAufStart, servo90Grad, warteBisAufheizenFertig, servo180Grad, servoHalbZurueck, warteBisAbgekuehlt, servo0Grad};
byte rauch = warteAufStart;

void setup()
{
  pinMode(PulseInCh1, INPUT);
  pinMode(PulseInCh2, INPUT);
  pinMode(endschalter1, INPUT);
  pinMode(endschalter2, INPUT);
  servoRauch.attach(6);
  motor.attach(7);
  servo1.attach(8);
}


void loop()

{
  switch (rauch)
  {

    case warteAufStart:
      if (PulseInCh1 > (1500))
        rauch = servo90Grad;

      switch (rauch)
      case (servo90Grad):

      servoRauch.write(90);
      //  aufheizen = millis();
      rauch = warteBisAufheizenFertig;

    case (warteBisAufheizenFertig):
      if (millis() - rauchIntervall >= aufheizen) {
        rauch = servo180Grad;
      }

    case servo180Grad:

      servoRauch.write(180);
      rauch = servoHalbZurueck;

    case servoHalbZurueck:
      if (PulseInCh1 < 1500) {
        rauch = servoHalbZurueck;
      }

      //case (servoHalbZurueck):

      servoRauch.write(90);
      // abkuehlen = millis();
        rauch = warteBisAbgekuehlt;

            case (warteBisAbgekuehlt):
      if (millis() - rauchIntervall >= abkuehlen) {
        rauch = servo0Grad;
      }

    case (servo0Grad):
      servoRauch.write(0);
      rauch = warteAufStart;
  }
}

Mit der neuen Fehlerliste:

C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino: In function 'void loop()':
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:46:13: warning: this statement may fall through [-Wimplicit-fallthrough=]
       rauch = warteBisAufheizenFertig;
       ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:48:5: note: here
     case (warteBisAufheizenFertig):
     ^~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:49:7: warning: this statement may fall through [-Wimplicit-fallthrough=]
       if (millis() - rauchIntervall >= aufheizen) {
       ^~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:53:5: note: here
     case servo180Grad:
     ^~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:56:13: warning: this statement may fall through [-Wimplicit-fallthrough=]
       rauch = servoHalbZurueck;
       ~~~~~~^~~~~~~~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:58:5: note: here
     case servoHalbZurueck:
     ^~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:67:15: warning: this statement may fall through [-Wimplicit-fallthrough=]
         rauch = warteBisAbgekuehlt;
         ~~~~~~^~~~~~~~~~~~~~~~~~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:69:13: note: here
             case (warteBisAbgekuehlt):
             ^~~~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:70:7: warning: this statement may fall through [-Wimplicit-fallthrough=]
       if (millis() - rauchIntervall >= abkuehlen) {
       ^~
C:\Users\User\Documents\Arduino\Wrecker\Wrecker.ino:74:5: note: here
     case (servo0Grad):
     ^~~~
Der Sketch verwendet 2078 Bytes (6%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 57 Bytes (2%) des dynamischen Speichers, 1991 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Sind das nun Fehlermeldungen oder Hinweise? Was muss ich machen um die auch noch loszuwerden?

Das ist schwer zu sagen, bin immer mal wieder zugange. Habe aber gerade viele Fehlermeldungen selbst wegbekommen. Ob es funktioniert kann ich aber noch nicht sagen.

Da ich davon ausgehe, dass es für die meisten von euch eine Kleinigkeit ist, dies zu programmieren... Aber dann lerne ich nichts darüber. Und etwas ausprobieren möchte ich schon gerne.

Kannst du als mini Gegenleistung fürs weiterhelfen mal diese beiden Fragen beantworten?

Was schätzt du denn wie viele Stunden du bräuchtest um wenigstens so weit programmieren zu können, dass du solche Fehlermeldungen selbst beheben könntest?

nur eine grobe Schätzung:

10 Stunden?
100 Stunden?
1000 Stunden?

Wenn es ein fertiges "Steuer-mir-dir-Raucherzeugungs-Gerät" gäbe
Bei welchem Preis würdest du sagen "Kein Schäppchen mehr aber den Preis ist es mir Wert"
?

Nein eine Kleinigkeit ist es nicht mehr.
Man musste dir schon mit so und so viel nachfragen eine präzise Beschreibung der Funktionalität entlocken.

Und diese Funktionalität zu programmieren dauert länger als eine halbe Stunde.
Und es ist zu befürchten, dass dann nach ersten Tests an der Funktionalität noch einmal so und so viel geändert werden muss.

Was heisst das jetzt genau

Du schreibst ein paar Zeilen Programm und dann "probierst" du es zu compilieren?
Und wenn dann Fehlermeldungen auftauchen dann postest du die Fehlermeldungen?

Also mit Verlaub das ist anderer Leute Zeit verbraten fast ohne etwas dabei zu lernen.
Der Lerneffekt bei dieser Methode ist minimal.

vgs

Grundsätzlich: Auch Warnings sollten beseitigt werden. In der Regel steckt dahinter ein Problem.

Zitat aus dem von mir noch nicht verfassten Buche (bin alt genug, um Fan der Feuerzangenbowle zu sein):

fall through bedeutet, dass von diesem (aktuellen) case direkt mit dem nächsten case weitergemacht wird. Dieser "Nächste" wird mit der Notiz here dann vom Compiler identifiziert. In der Regel fehlt da am Ende vom case das break. Das kann man in sehr seltenen Ausnahmefällen machen, wenn man ganz genau weiß was man tut. Ich empfehle das nicht.

Du solltest den Code nochmal aufmerksam auf Sinnhaftigkeit überprüfen. So auf die Schnelle fällt mir auf:

switch (rauch)

In Zeile 34 und dann gleich wieder in Zeile 41 aber ohne Klammern { ... } - ob das so gewollt ist?

Ansonsten bin ich zu gewissen Teilen auch bei Stefan.
Den 3-Wege-Switch für den Rauch nachzubilden ist eine im Prinzip überschaubare Aufgabe, aber bis es genau das tut was Du Dir vorstellst, gehen gerne mal 1-3h ins Land; dazu kommt dann noch die Kommunikation, die mindestens in derselben Größenordnung liegt. Und dann war da ja noch was mit Motorshield...
Nur nebenbei: Ich weiß zufällig, was externe Entwicklungsdienstleistungen pro Stunde kosten; das willst Du aber gar nicht wissen...

Lieber Stefan,

ich zwinge niemanden, mir hier im Forum zu helfen. Wenn dir deine Zeit zu kostbar ist, dann biete deine Hilfe nicht an. Nach einer Gegenleistung zu fragen (wieviel wäre dir ein fertiger Sketch Wert), ist bestimmt nicht der Sinn eines (Hilfe)forums. Aber bedenke bitte, das du bei anderen Sachen auch auf Hilfe anderer angewiesen sein könntest. Kein Mensch kann alles. Und dann bist du auch froh über jeden Tipp oder jede helfende Hand. Ich beschäftige mich mit diesem Projekt jetzt vielleicht 20 bis 30h. Es ist mein insgesamt 3 Projekt mit arduino in den letzten 2,5 Jahren. Ich bin (und werde bestimmt auch nicht) kein Profi.

In Zeile 34 und dann gleich wieder in Zeile 41 aber ohne Klammern { ... } - ob das so gewollt ist?

Heißt das, dass Zeile 41 überflüssig ist?
Und das break; hatte ich vorher drin und bekam dort immer eine Fehlermeldung. Dies hatte mich im übrigen auch gewundert, da es in allen Skripts vorhanden war, die ich mir angeschaut hatte.

Ja, ist überflüssig.

Dann die break; wieder einfügen und einmal STRG-T drücken. Dann siehst an den Einrückungen schon, ob irgendwas grundsätzlich daneben gegangen ist.

Danke an alle die mir geholfenhaben. Nun ist das Skript komplett ohne Fehlermeldung und hinweisen. Hoffe das es auch genau so funktioniert ,wenn ich es zusammen baue.
Noch ne Frage vorweg. Das ganze soll ja noch um eine weitere Funktion erweitert werden. Hoffe ich bekomme es alleine hin. Muss ich dann ein weiteres enum "enum2 funktion" benennen? Oder heißt das dann "enum funktion"? Ich vermute, dass das 2. richtig ist.
Noch ne Frage. Brauche ich diese Zeile unsigned long rauchMillis;irgendwo für. rauchMillis taucht nirgends sonst mehr auf.

Der ist nicht schick.. - ok, das weisst selber :wink:
Der fängt schon unkoordiniert an - abgesehen von den fehlenden break, die in #41 noch drinn standen, machst Du jetzt:

{
  switch (rauch);
  {
  case warteAufStart:
    if (PulseInCh1 > (1500))
      rauch = servo90Grad;
    switch (rauch)
    case (servo90Grad):
    servoRauch.write(90);
    aufheizen = millis();
    rauch = warteBisAufheizenFertig;

Das wird nichts.
Das zweite switch sollte nicht da sein - das wäre Dein erstes break.
Du hattest doch in #41 alles richtig.

Dann der hier:

rauch = warteBisAbgekuehlt:

:wink:
Dann noch Bitten:
Die Klammern beim case um den jeweiligen Schritt weglassen.
Immer die gleiche Schreibweise benutzen. Während bei "warteAufStart" der Einzeiler nach der Bedingung ohne Klammern ist, ist das bei allen anderen nicht so -> ich empfehle die Schreibweise mit Klammern auch bei einem Einzeiler.

Die 1500 würde ich in eine Variable stecken - wenn Du das mal ändern willst, suchst Du den Code nach jedem Vorkommen durch. Vergisst oder übersiehst Du einen bist auf Fehlersuche.

Zeigen!

Wenn du eine Variable nicht benutzt, kannst du sie auch weglassen. Das gibt bei passenden Compilereinstellungen normalerweise auch eine Warnung.

Wenn die zweite Funktion eine eigene Schrittkette/Zustandsautomat hat (vollkommen unabhängig vom Rauch) bekommt sie auch ein eigenes enum FUNKTION (wenn du es denn wie beim RAUCH in Großbuchstaben schreiben willst).

Verbesserungspotential ist da reichlich (Konstaten usw.), aber das würde jetzt ausarten.

rauch wäre bei mir z.B. kein Byte, sondern vom Typ RAUCH.