const byte rotPin = 5;
const byte gruenPin = 3;
const byte smokePin = 13;
bool smoker = false;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
pinMode(rotPin, OUTPUT);
pinMode(gruenPin, OUTPUT);
pinMode(smokePin, OUTPUT);
}
void loop()
{
static unsigned long lastmillis = 0;
if (millis() - lastmillis > 2) // Wenn Zeit abgelaufen ist...
{
glut(); // ... rufe Funktion auf ...
lastmillis = millis(); // ... merke Zeit
}
rauch();
}
void rauch() // Es soll Rauch aufgehen
{
static bool smokeStart = false; // Merker für den Start der Sequenz
static unsigned long startZeit = 0; // StartZeit
if (smoker == true) // Wenn die Glut ausgelöst hat ...
{
if (smokeStart == false) // ... und bisher nicht ausgelöst war ...
{
startZeit = millis(); // ... Zeit merken ...
smokeStart = true; // ... vermeidet, das die Zeit wieder gestellt wird ...
}
if (millis() - startZeit > 1000) // ... Zeit abgelaufen ...
{
digitalWrite(smokePin, HIGH); // ... dann las Rauch aufsteigen ...
}
if (millis() - startZeit > 1100) // ... noch mehr Zeit abgelaufen ...
{
digitalWrite(smokePin, LOW); // ... kein Rauch mehr
smoker = false; // setze Variablen zurück
smokeStart = false;
}
}
}
void glut() // Diese Funktion wird nur aufgerufen, wenn oben die Zeit abgelaufen
{
const unsigned long dunkelPause = 3000; // Zeit in ms die der PIN LOW ist
const unsigned long hellPause = 500; // Zeit in ms die der PIN Dauerhaft HIGH ist
static unsigned long lastmillis = 0; // Die Variable gilt nur lokal
const byte minRot = 30; // kleinster Rot-Wert
const byte minGruen = 0; // kleinster Gruen-Wert
static bool heller = true; // diese Variable bestimmt die Richtung: ob heller(true) oder dunkler(false) werden soll
static byte rotWert = minRot; // Startwert
if ((millis() - lastmillis > dunkelPause) && heller) // Wenn Dunkelpause abgelaufen UND die Richtung heller ist...
{
rotWert++; // ... Increment ...
if (rotWert > 254) // ... Am oberen Ende? ...
{
heller = false; // ... dann soll es dunkler werden ...
lastmillis = millis(); // ... merke die Zeit, wann es am hellsten war
Serial.print(millis()); Serial.print('\t');
Serial.print("R: "); Serial.print(rotWert);
Serial.print("\tG: "); Serial.print(rotWert / 5);
Serial.println(); // Und hier ist die Funkltion einmal durchlaufen
}
}
if ((millis() - lastmillis > hellPause) && !heller) // Wenn Hellpause abgelaufen ist UND die Richtung dunkler ist...
{
rotWert--; // ... decrement ...
if (rotWert < minRot) // ... am unteren Ende? ...
{
rotWert = minRot; // ... setze kleinsten Rotwert ...
heller = true; // ... wechsle Richtung ...
smoker = true; // ... Jetzt darf der Rauch aufsteigen
lastmillis = millis(); // ... merke Umschaltzeit
Serial.print(millis()); Serial.print('\t');
Serial.print("R: "); Serial.print(rotWert);
Serial.print("\tG: "); Serial.print(rotWert / 5);
Serial.print("\nSTOP"); // Diese beiden Zeilen nur
Serial.println(); // Und hier ist die Funkltion einmal durchlaufen
while (1); // zum Durchlauftest
}
}
analogWrite(rotPin, rotWert); // schreibe auf Pin
if (rotWert > 180) // Hier ist der Einsatz, ab wann der Farbraum verändert wird ...
{
analogWrite(gruenPin, (rotWert - 180) * 3); // ... der Gruenwert errechnet sich aus dem rotWert ...
}
else analogWrite(gruenPin, minGruen); // ... Wenn der rotWert nicht erreicht, schreibe kleinsten GruenWert
} // der nächste Durchlauf ist erst wieder, wenn im loop die Zeit abgelaufen ist