Moin, liebes Forum!
Folgendes Problem: ich habe eine 8x8 LED-Matrix und möchte nun mehrere bitmaps darauf anzeigen. Per Drehregler möchte ich die verschiedenen Frames anwählen, ohne dabei auf andere bitmaps zuzugreifen. Wenn man am letzten frame angekommen ist, soll man wieder den ersten Frame sehen. Mit modulo komme ich da nicht weiter. Wenn ich den Drehregler nach links drehe, habe ich den Maximalwert von 65535, und wenn ich über die frames des jeweiligen bitmap komme, erscheint das andere bitmap. Das möchte ich ja gerade nicht. Weiß jemand ne Lösung, ich komme nicht drauf :-/
Hier der code:
#include <ClickEncoder.h>
#include <TimerOne.h>
#define BRIGHTNESS=1 // 0=min, 15=max
#include <Adafruit_LEDBackpack.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include "anim.h"
#include "Knopf.h"
#include "zahlenschloss.h"
ClickEncoder *encoder;
int8_t last, value;
uint8_t buttoncounter;
uint8_t encoderValue;
uint32_t code1; // später soll ein code gespeichert werden
uint32_t code2;
uint32_t code3;
uint16_t i, j;
void timerIsr() {
encoder->service();}
//---------------------------------------------------------------------------------------------------------------------
Adafruit_8x8matrix matrix = Adafruit_8x8matrix();
void setup() {
Serial.begin(9600);
matrix.begin(0x70);
matrix.clear();
matrix.writeDisplay();
encoder = new ClickEncoder(A1, A0, A2, 1);
encoder->setAccelerationEnabled(false);
Timer1.initialize(1000);
Timer1.attachInterrupt(timerIsr);
last = -1;
}
//---------------------------------------------------------------------------------------------------------------------//---------------------------------------------------------------------------------------------------------------------
void loop() {
rotary_encoder();
if (buttoncounter == 3) {
anfang();
}
if (buttoncounter == 4) {
knopfposition();
}
if (buttoncounter == 5) {
zahlenschloss();
}
if (buttoncounter >= 6) { matrix.clear();
matrix.writeDisplay(); }
}
//---------------------------------------------------------------------------------------------------------------------
void rotary_encoder() {
value += encoder->getValue();
if (value/4 != last) {
encoderValue = value/4;
last = encoderValue;
j = encoderValue;
Serial.print("Encoder Value: ");
Serial.println(j);
}
ClickEncoder::Button b = encoder->getButton();
if (b != ClickEncoder::Open) {
buttoncounter++;
value=0;
Serial.print("Der Button wurde ");
Serial.print(buttoncounter);
Serial.println(" mal gedrueckt.");
#define VERBOSECASE(label) case label: Serial.println(#label); break;
switch (b) {
case ClickEncoder::Held:
anfang;
buttoncounter = 2;
}
}
}
void knopfposition() {
matrix.clear();
matrix.drawBitmap(0, 0, &knopf[j * 9], 8, 8, 1);
matrix.writeDisplay();
}
void zahlenschloss() {
matrix.clear();
matrix.drawBitmap(0, 0, &zahlen[j * 9], 8, 8, 1);
matrix.writeDisplay();
}
void anfang() {
for(int i=0; i<(sizeof(anim)/9); i++) { // For each frame...
matrix.clear();
matrix.drawBitmap(0, 0, &anim[i * 9], 8, 8, 1);
matrix.writeDisplay();
delay(100);
}
}