Hallo,
ich habe hier ein kleines Problem mit meinem Code für eine MAX7219 Matrix. Per Push Button sollen einzelnen Programme gewählt werden. Funktioniert auch alles soweit ohne Probleme. Ein Counter wird mit millis() gesteuert.
include "LedControl.h"
#define BUTTON_PIN 2
LedControl lc = LedControl(12,11,10,1);
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
unsigned long previous_millis = 0;
byte counter = 0;
byte program = 0;
byte squares[5][8] =
{
{0b11111111,0b10000001,0b10000001,0b10000001,0b10000001,0b10000001,0b10000001,0b11111111},
{0000000000,0b01111110,0b01000010,0b01000010,0b01000010,0b01000010,0b01111110,0b00000000},
{0000000000,0b00000000,0b00111100,0b00100100,0b00100100,0b00111100,0b00000000,0b00000000},
{0000000000,0b00000000,0b00000000,0b00011000,0b00011000,0b00000000,0b00000000,0b00000000},
{0000000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},
};
void testing(uint16_t interval, byte arr[0][8])
{
if (millis() - previous_millis >= interval)
{
previous_millis += interval;
for (byte row = 1; row < 9; row++)
{
lc.setRow(0, row-1, arr[counter][row - 1]);
}
counter++;
if (counter == 5)
counter = 0;
}
}
void debounce()
{
int reading = digitalRead(BUTTON_PIN);
if (reading != lastButtonState)
{
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay)
{
if (reading != buttonState)
{
buttonState = reading;
if (buttonState == HIGH)
{
lc.clearDisplay(0);
program++;
counter = 0;
}
}
}
lastButtonState = reading;
}
void setup()
{
lc.shutdown(0,false);
lc.setIntensity(0,1);
lc.clearDisplay(0);
pinMode(BUTTON_PIN, INPUT);
Serial.begin(9600);
}
void loop()
{
debounce();
Serial.println(counter);
switch(program)
{
case 1:
testing(1000, squares);
break;
case 2:
testing(500, squares);
break;
default:
counter = 0;
program = 0;
break;
}
}
Anstatt
if (millis() - previous_ms >= interval)
{
previous_ms = millis();
}
habe ich folgendes probiert: (wie in dem beispiel ganz unten,
, Modifikation für exakte Intervalle)
if (millis() - previous_ms >= interval)
{
previous_ms += interval;
}
Funktioniert auch soweit, jedoch wird die counter variable nach jedem Tastendruck teilweise nicht wieder auf 0 gesetzt, also manchmal nach dem ersten Durchlauf (also case wieder auf 1)
, startet der counter bei 3 oder 4 ( laut Serial Monitor) , obwohl er eigentlich bei 0 starten sollte.
woran kann das liegen?
vielen Dank schonmal im Voraus
gruß
Hendrik