Hallo
ich habe folgenden Code für ein Feuer
{
digitalWrite(ledPin1, random(1220) + 135);
digitalWrite(ledPin2, random(920) + 135);
digitalWrite(ledPin3, random(720) + 135);
delay(random(100));
}
der funtioniert.
Nun will ich aber mit 2 REEDkontakten die Sache ein und ausschalten. Dh. Feuerwehrauto schaltet beim Fahren ein und dann aus.
Das funktioniert auch.
// LED Feuer Kiosk //
int ledPin1 = 3;
int ledPin2 = 4;
int ledPin3 = 5;
const int reedfeueran = 10;
const int reedfeueraus = 7;
bool tasterstatus1, tasterstatus2;
void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(reedfeueran, INPUT_PULLUP);
pinMode(reedfeueraus, INPUT_PULLUP);
}
void loop() {
tasterstatus1 = digitalRead(reedfeueran);
tasterstatus2 = digitalRead(reedfeueraus);
if (tasterstatus1 == 0)
{
digitalWrite(ledPin1, random(1220) + 135);
digitalWrite(ledPin2, random(920) + 135);
digitalWrite(ledPin3, random(720) + 135);
delay(random(100));
}
else
if (tasterstatus2 == 0)
{
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
}
}
Nun tritt aber der Effekt auf das alle 3 LED nur noch dauernd leuchten.
Was übersehe ich?
probier mal:
// LED Feuer Kiosk //
const byte feuerPin[3] = {3, 4, 5};
const byte reedfeueran = 10;
const byte reedfeueraus = 7;
bool feuer = false;
void setup()
{
for (byte b = 0; b < sizeof(feuerPin); b++)
{
digitalWrite(feuerPin[b], LOW);
pinMode(feuerPin[b], OUTPUT);
}
pinMode(reedfeueran, INPUT_PULLUP);
pinMode(reedfeueraus, INPUT_PULLUP);
}
void loop()
{
if (!digitalRead(reedfeueran)) feuer = true;
if (feuer && !digitalRead(reedfeueraus)) feuer = false;
if (feuer)
{
digitalWrite(feuerPin[0], random(1220) + 135); // den versteh ich nicht
digitalWrite(feuerPin[1], random(920) + 135);
digitalWrite(feuerPin[2], random(720) + 135);
delay(random(100));
}
else
{
for (byte b = 0; b < sizeof(feuerPin); b++)
{
digitalWrite(feuerPin[b], LOW);
}
}
}
danke erstmal,
ist immer noch ein Dauerbrenner.
Ich kontrolliere morgen erstmal noch die Leiterplatte, nicht das da ein Hui drauf ist.
Dann mal nen Kontrollsketch:
// LED Feuer Kiosk //
const byte feuerPin[3] = {3, 4, 5};
const byte reedfeueran = 10;
const byte reedfeueraus = 7;
bool feuer = false;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
for (byte b = 0; b < sizeof(feuerPin); b++)
{
digitalWrite(feuerPin[b], LOW);
pinMode(feuerPin[b], OUTPUT);
}
pinMode(reedfeueran, INPUT_PULLUP);
pinMode(reedfeueraus, INPUT_PULLUP);
}
void loop()
{
if (!feuer)
{
if (!digitalRead(reedfeueran))
{
feuer = true;
Serial.println(F("feuer EIN gefunden!"));
}
}
if (feuer && !digitalRead(reedfeueraus))
{
feuer = false;
Serial.println(F("feuer AUS gefunden!"));
}
if (feuer)
{
digitalWrite(feuerPin[0], random(1220) + 135); // den versteh ich nicht
digitalWrite(feuerPin[1], random(920) + 135);
digitalWrite(feuerPin[2], random(720) + 135);
delay(random(100));
}
else
{
for (byte b = 0; b < sizeof(feuerPin); b++)
{
digitalWrite(feuerPin[b], LOW);
}
}
}
Drauf achten, das der Serielle Monitor richtig eingestellt ist (115200) oder Du änderst das im Code)
Was bekommst Du auf dem SerMon ausgegeben?
Hallo
Probier mal diese Änderung aus:
// diese Änderung einfügen und ersetzen
digitalWrite(feuerPin[0], random(0,2));
digitalWrite(feuerPin[1], random(0,2));
digitalWrite(feuerPin[2], random(0,2));
Ich wünsche einen geschmeidigen Anend und viel Spass beim Programmieren in C++.
p.s.
oder so
analogWrite(ledPin1, random(120)+135);
analogWrite(ledPin2, random(120)+135);
analogWrite(ledPin3, random(120)+135);
p.p.s. ledPin1 bis ledPin3 müssen an PWM Ports angeschlossen werden
erstmal Leiterplatte und LEDs kontrolliert, passt.
Ausgabe mit Monitor muss ich erstmal mit beschäftigen, hab ich so noch nicht gemacht.
Nicht so schlimm...
In der IDE Werkzeuge - Serieller Monitor aufrufen.
Dann unten rechts auf 115200 setzen und meinen Sketch einfach hochladen
Hallo
Ich habe mal bei Instructables eine Anleihe gemacht und einen Taster eingebaut. Einfach mal testen und Anpassungen vornehmen bis es passt und die Feuerwehr kommt.
// LED Fire Effect
constexpr byte ledPin1 = {3}; // portPin o---|220|---|LED|---GND
constexpr byte ledPin2 = {5}; // portPin o---|220|---|LED|---GND
constexpr byte ledPin3 = {6}; // portPin o---|220|---|LED|---GND
constexpr byte ButtonPin = {A0}; // portPin o---|button|---GND
void setup() {
pinMode (ButtonPin, INPUT_PULLUP);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
}
void loop() {
if (!digitalRead(ButtonPin)) {
analogWrite(ledPin1, random(120) + 135);
analogWrite(ledPin2, random(120) + 135);
analogWrite(ledPin3, random(120) + 135);
delay(random(100));
} else {
analogWrite(ledPin1, LOW);
analogWrite(ledPin2, LOW);
analogWrite(ledPin3, LOW);
}
}
Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren in C++.
Vieles probiert geht leider nix. Dein letztes auch nicht. bei betätigen des Tasters im Moment des Drückens nur Dauerlicht sonst aus. Bei meinem ursprünglichen Codes geht es an bei Betätigen Reedan an und aus bei Betätigen Reedaus aus. Während des Betätigen Reedan ist der Feuereffekt vorhanden sonst bei Ein Dauerlicht. Merkwürdig.
Das ist leider nichts, was verwertet werden kann...
Es fehlt eine Aussage, welches Board Du benutzt und was Du ausprobiert hast.
Du schreibst oben:
autonowe:
ich habe folgenden Code für ein Feuer
{
digitalWrite(ledPin1, random(1220) + 135);
digitalWrite(ledPin2, random(920) + 135);
digitalWrite(ledPin3, random(720) + 135);
delay(random(100));
}
der funtioniert.
Das kann ich nicht nachvollziehen. Siehe bei Stummi
Die LEDPins können nur angehen. Aus geht nie.
Zeig mal den Code vollständig, der Dein brennendes Feuer macht - dann schaun wa weiter.
noiasca
December 25, 2021, 12:10pm
11
Das macht wenig Sinn.
digitalWrite nimmt LOW oder HIGH - nicht eine Zufallszahl zwischen 135 und 1220+135
Evtl. macht ein analogWrite Sinn. Aber auch nur für PWM fähige Pins
Auf dem Arduino aber auch nur bis inklusive 255.
Wenn man das Random machen will dann eben 256.
Bitte lies das: [url]https://www.arduino.cc/reference/de/language/functions/analog-io/analogwrite/[/url]
und das: [url]https://www.arduino.cc/reference/de/language/functions/random-numbers/random/[/url]
Nach dem Lesen und verinnerlichen, probier mal das und berichte genau was bei dir passiert.
Funktionen helfen dir ein wenig ordnung in dein Programm zu bringen.
Außerdem ergibt sich damit schon ein nachvollziehbarer Ablauf für die Nachweilt.
Beachte die Ausgabe auf der Seriellen Schnittstelle.
// LED Feuer Kiosk //
// https://forum.arduino.cc/t/modellbahn-feuer-im-kiosk/938814/10
const byte ledAPin = 3; // PWM Pins am Uno/Nano/Mini: 3, 5, 6, 9, 10, 11
const byte ledBPin = 4; // Achtung das ist kein PWM Pin
const byte ledCPin = 5;
const byte reedFeuerAn = 10;
const byte reedFeuerAus = 7;
bool feuer = false;
void setup()
{
Serial.begin(115200);
pinMode(ledAPin, OUTPUT);
pinMode(ledBPin, OUTPUT);
pinMode(ledCPin, OUTPUT);
pinMode(reedFeuerAn, INPUT_PULLUP);
pinMode(reedFeuerAus, INPUT_PULLUP);
}
void feuerRun()
{
analogWrite(ledAPin, random(135, 255 + 1)); // pwm geht am Arduino von 0..255. höhere Werte machen keinen Sinn
analogWrite(ledBPin, random(135, 255 + 1));
analogWrite(ledCPin, random(135, 255 + 1));
delay(random(100)); // dirty delay
}
void feuerAus()
{
analogWrite(ledAPin, 0);
analogWrite(ledBPin, 0);
analogWrite(ledCPin, 0);
}
void loop()
{
if (digitalRead(reedFeuerAn) == LOW )
{
Serial.println(F("Feuer ein"));
feuer = true;
}
if (digitalRead(reedFeuerAus) == LOW )
{
Serial.println(F("Feuer aus"));
feuer = false;
feuerAus();
}
if (feuer == true) feuerRun();
}
Wenn die angesprochenen Punkte verstanden worden sind, kann man auch noch das schmutzige Delay loswerden. Aber erst mal die Basics.
1 Like
Danke,
soweit verstanden. Jetzt funzt es .
okay, danke für den Hinweis.
Eine kleine Frage hätte ich doch noch:
was ist der Unterschied zwischen "void loop" und nur "void" ?
Ist es der Durchlauf? Im "void loop" ständig und einmalig in "void"?
Danke
noiasca
December 27, 2021, 8:08am
16
vermutlich verwechselst du was.
void loop()
heißt nur dass die Funktion loop() keinen Rückgabewert hat.
Macht ja auch Sinn, loop() wird "nie" beendet.
Bei Funktionen die etwas zurückliefern, deklarierst du den Variablentyp
int zufall()
{
return random(42);
}
Funktionen die nichts zurückgegeben bekommen das void.
void machWas()
{
Serial.println("Hallo Welt");
}
system
Closed
June 25, 2022, 8:31am
18
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.