Hallo zusammen,
Für Einige wahrscheinlich eine Kleinigkeit, für mich aber eine
Herausforderung.
Ich habe mir etwas aus youtube nachgebaut und auch zum Laufen gebracht -
alles gut. https://www.youtube.com/watch?v=Nhc9MvOH0Gs&t=276s
Dabei geht es darum, mittels Arduino zwei LED-Stripes (WS2812B) zum
Laufen zu bringen und "Sound reactive" zu machen.
Mit einem Taster kann man immer zur nächsten "Szene" bzw. Effekt
weiterschalten.
Drückt man diesen Taster mind. 500ms, dann wird ein automatisches
Weiterschalten alle 20 Sekunden aktiviert.
So weit so gut.
Ich habe nun vor, weitere "Szenen" zu implementieren, die aber nicht im
Automatikmodus vorkommen sollen. Diese Szenen sind alle in eigenen Tabs
und werden entsprechend aufgerufen.
Ich verstehe zwar grob, was in dem Programm passiert, mir fehlt es aber
an Tiefe, um das passend umzuprogrammieren.
Daher habe ich folgenden Ansatz:
Ich lasse den grundsätzlichen Programmablauf so, wie er ist. Der loop
wird zu loop_0.
Dann füge ich eine Kopie davon darunter und nenne es loop_1. Dieser ruft
entsprechend andere Szenen auf.
Mit einem Kippschalter möchte ich entscheiden, welcher Loop laufen soll.
Das sieht dann im Prinzip so aus, natürlich auf das wesentliche
eingekürzt:
1 | # define BTN_PIN 3 // Push button on this pin [3]
|
2 | # define DEBOUNCE_MS 20 // Number of ms to debounce the button [20]
|
3 | # define SWITCH_PIN 4 // Kippschalter zur Loopauswahl
|
4 |
|
5 | //----------Definitionen/Verhalten des Buttons
|
6 | uint8_t state = 0;
|
7 | int buttonPushCounter = 0;
|
8 | bool autoChangeVisuals = false;
|
9 | Button modeBtn(BTN_PIN, DEBOUNCE_MS);
|
10 |
|
11 | void incrementButtonPushCounter() {
|
12 | buttonPushCounter = (buttonPushCounter + 1) %16;
|
13 | EEPROM.write(1, buttonPushCounter);
|
14 | }
|
15 | //--------Ende-----------
|
16 |
|
17 | void setup();
|
18 |
|
19 | //-----Button------------
|
20 | modeBtn.begin();
|
21 | Serial.begin(57600);
|
22 |
|
23 | buttonPushCounter = 0;
|
24 | buttonPushCounter = (int)EEPROM.read(1); // load previous setting
|
25 | Serial.print("Starting pattern ");
|
26 | Serial.println(buttonPushCounter);
|
27 |
|
28 | //--------Kippschalter
|
29 | pinMode(SWITCH_PIN,INPUT);
|
30 |
|
31 |
|
32 | void loop_0() {
|
33 | // der ursprüngiche Loop hier komplett rein
|
34 | // Read button
|
35 | modeBtn.read();
|
36 | switch (state) {
|
37 | case 0:
|
38 | if (modeBtn.wasReleased()) {
|
39 | Serial.print("Short press, pattern ");
|
40 | Serial.println(buttonPushCounter);
|
41 | incrementButtonPushCounter();
|
42 | autoChangeVisuals = false;
|
43 | }
|
44 | else if (modeBtn.pressedFor(LONG_PRESS))
|
45 | state = 1;
|
46 | break;
|
47 |
|
48 | case 1:
|
49 | if (modeBtn.wasReleased()) {
|
50 | state = 0;
|
51 | Serial.print("Long press, auto, pattern ");
|
52 | Serial.println(buttonPushCounter);
|
53 | autoChangeVisuals = true;
|
54 | }
|
55 | break;
|
56 | }
|
57 |
|
58 | // Switch pattern if on auto
|
59 | if(autoChangeVisuals){
|
60 | EVERY_N_SECONDS(PATTERN_TIME) {
|
61 | incrementButtonPushCounter();
|
62 | Serial.print("Auto, pattern ");
|
63 | Serial.println(buttonPushCounter);
|
64 | }
|
65 | }
|
66 |
|
67 | // Run selected pattern
|
68 | switch (buttonPushCounter) {
|
69 | case 0:
|
70 | red_dots();
|
71 | break;
|
72 |
|
73 | case 1:
|
74 | ambilight ();
|
75 | break;
|
76 |
|
77 | // und so weiter
|
78 |
|
79 | void loop_1() {
|
80 | // der kopierte und modifizierte Loop
|
81 |
|
82 | void loop () {
|
83 | if (digitalRead(SWITCH_PIN)==0) loop0();
|
84 | if (digitalRead(SWITCH_PIN)==1) loop1();
|
85 | }
|
86 |
|
87 | //hier folgen dann noch weitere Funktionen
|
Den originalen Sketch habe ich mal angehangen.
Leider funktioniert das nicht so, wie laienhaft von mir gedacht.
Zum Einen funktioniert die Umschaltung nicht sauber und zum anderen wird
die LED Darstellung träge und flackert teilweise...
Macht man das evtl. besser über eine zweite "switch" Auswahl?
Könnte mir das bitte jemand erklären?
Für jeden Hinweis dazu wäre ich Euch dankbar...