Hallo,
ich möchte auf meiner Modelbahn die Häuser mit WS2182b Ledstrips beleuchten. Das ganze soll über einen Arduino uno gesteuert werden.
Ich habe jedoch das Problem, dass ich die jeweiligen Häuser gerne einzeln programmieren möchte, diese aber im Loop gleichzeitig ablaufen sollen. Also Haus 1 und Haus 2 beginnen ihre Schleife zur gleichen Zeit.
Meine Beispielprogrammierung (2 LEDs) sieht bis jetzt folgendermaßen aus:
löse deine blockierenden delay() auf.
Mach das mal am Beispiel discreter LEDs so wie in "BlinkWithoutDelay".
Wenn du das für 2, 3 LEDs hast, dann kannst du das auch einfach auf die Neopixel übertragen.
Ähnliches Thema haben wir hier öfters, aber ich befürchte, das ist noch etwas zu schwierig für dich und daher eher mal den Weg über BlinkWithout Delay gehen.
Hallo,
mit delay wird das nichts, da legt der Arduino eine Pause ein. Schau dir mal millis() an und den Nachtwächter. Ein Beipiele in der IDE dazu ist blinkWithoutDelay.
Heinz
Danke ich muss die Komponenten glaube ich erstmal nachvollziehen. Es sollen am Ende ja dann mehrere LEDs für ein Haus sein. kann man das wie in meinem Beispiel auch in einzelne Überblicksmäßige Abschnitte untergliedern also ein Bereich zu Haus 1 dann einen seperaten zu Haus 2?
Oder etwas diese Idee erweitert: Die grundlegenden Zeiten lassen, aber darauf eine kleine Verschiebung per Zufall überlagern. Auf Startzeit- und/oder Länge.
vielen Dank ich denke damit muss ich mich später befassen. Ich frage mich noch wie man in meinem Beispiel bei Haus 1 das Delay durch eine millis Funktion ersetzen kann und das gleiche dann in dem Void für Haus 2.
das hat dir agmue doch schon in #6 gezeigt. dort ist es die Zeile
if (jetzt - vorhin[haus] >= zeit[haus])
wenn du das mit dem IDE Beispiel "BlinkWithoutDelay" vergleichst, dann ist das genau das wie du deine delay los wirst.
Und hier boch was für 3 Häuschen und die Häuschen individuell mit mehreren Räumen:
/*
Use pixels in a strip as separate objects
by noiasca
2020-03-02 https://forum.arduino.cc/index.php?topic=668289.15
https://forum.arduino.cc/index.php?topic=668125
2020-12-31 https://forum.arduino.cc/index.php?topic=720583.0
2022-01-08 houses: https://forum.arduino.cc/t/ws2182b-arduino-steuerung-modelbahn/944662/3
*/
#include <Adafruit_NeoPixel.h>
const byte ledPin = 12; // Which pin on the Arduino is connected to the NeoPixels?
const uint16_t ledCount = 128;
Adafruit_NeoPixel strip(ledCount, ledPin, NEO_GRB + NEO_KHZ800);
class House {
private:
byte state = 1; // 0 Effect off, 1 Effect on
unsigned long previousMillis; // used for timekeeping
uint16_t on = 200; // intervall
uint32_t colorOn = 0xAAFF44;
uint32_t colorOff = 0x000000;
int8_t actual = 0;
uint16_t rnd = 10; // the higher the less changes
Adafruit_NeoPixel& obj;
const byte id; // first pixel of this group
const byte leds; // how many leds
public:
House(Adafruit_NeoPixel& obj, byte id, byte leds):
obj(obj),
id(id),
leds(leds)
{}
void setInterval(uint16_t _on) // modify on/off times during runtime
{
on = _on;
}
void setRandom(uint16_t _rnd) // frequency of changes
{
rnd = _rnd;
}
void setState(byte _state) // 0 switch off Effect; 1 Switch on effect;
{
state = _state;
if (state == 0)
{
for (int i = 0; i < leds; i++)
obj.setPixelColor(id + i, colorOff);
}
}
void setColor(uint32_t newColorOn, uint32_t newColorOff = 0x000000)
{
colorOn = newColorOn;
colorOff = newColorOff;
}
void update()
{
if (state)
{
uint32_t currentMillis = millis();
if (currentMillis - previousMillis >= on) {
previousMillis = currentMillis; // save the last time we changed some LED
if (random(rnd) == 0)
{
if (obj.getPixelColor(id + actual) == colorOff)
obj.setPixelColor(id + actual, colorOn);
else
obj.setPixelColor(id + actual, colorOff);
}
actual++;
if (actual >= leds) actual = 0;
obj.show();
}
}
}
};
House house[]
{
// strip,start, used pixels
{strip, 0, 1}, // house starting at pixel 0, with one room/LED
{strip, 1, 6}, // house starting at pixel 1, with 6 rooms/LEDs
{strip, 7, 4} // house starting at pixel 7, with 4 rooms/LEDs
};
void setup() {
Serial.begin(115200);
Serial.println(F("\nStart"));
randomSeed(A7);
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
house[0].setInterval(300); // speed of changes
house[0].setRandom(10); // frequence of changes
//house[0].setState(0); // switch off
house[1].setColor(0xFFFFFF); // cold white
house[2].setColor(0xFFFF33); // white
}
void loop() {
for (auto &i : house) i.update();
}
Das System ist wieder das gleiche: es ist ein "BlinkWithoutDelay".
Sollte ich es noch nicht erwähnt haben:
Schau dir das Beispiel "BlinkWithoutDelay" an - es ist die Mutter aller deiner künftigen Sketche.
Vielen Dank. Ich dachte das Ganze wäre für unerfahrene etwas leichter in der Aneignung. Das Beispiel Blinkwithout Delay kann ich soweit nachvollziehen. Da es jedoch mit einer LED funktioniert und nicht mit einem WS 2812 habe ich Schwierigkeiten die if (ledState == LOW) Bedingung auf den LED Strip zu übertragen und in euren fertigen Programmierungen nachzuvollziehen. Danke trotzdem für eure Bemühungen.