Hi, Ich hab diesen kurzen Code, um zu testen, ob er funktioniert:
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
char question[15] = "frage_000_0.txt";
question[7] += random(5);
question[8] += random(8);
Serial.print(question);
}
void loop() {
// put your main code here, to run repeatedly:
}
Output im Serial Monitor: frage_021_0.txt
Eingebaut in meinen Code (155 - 159 markiert mit <=======):
// SD CARD ===============================================================
#include <SD.h>
#include <SPI.h>
const int chipSelect = 9;
// KEYBOARD ==============================================================
#include <SoftPathElectronics.h>
CustomKeyboard keyboard;
// LCD ===================================================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
// LEDs ==================================================================
#include <FastLED.h>
#define NUM_LEDS 16
#define DATA_PIN 5
#define CLOCK_PIN 13
CRGB leds[NUM_LEDS];
// VARIABLEN =============================================================
int player = 0; // Zeigt an, welcher Spieler dran ist
int playerS; // playerSelect, damit man während der Auswahl in der while-Schleife bleibt
int playerN; // playerNumber, Anzahl der Spieler
int r = 1; // round, Nummer der Runde
int i = 0; // index, sorgt dafür, dass unsigned long nicht überschritten wird (9 Nummern max.)
int qC = 0; // questionCheck
unsigned long a; // answer, Antwort nach eingabe
int cursorX = 5; // cursorXVariable, um den Cursor bei der Eingabe zu steuern
int old_inp[9]; // Array, der die vorherige Eingabe speichert, sodass man löschen kann
int ledC = 0; // ledCound, steuert dei LEDs
// a als Antwort auf die Frage
int ans = 1000;
// y für Serial.print Zwecke
int y = 0;
// SETUP =================================================================
void setup() {
delay(1000);
Serial.begin(115200);
// LEDS ====================
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
// KEYBOARD ================
String key = "3 12 6 1 1022 315 186 511 241 158 340 195 136 255 164 120 0 0 0 0";
keyboard.setupKey(key);
// LCD =====================
lcd.init();
lcd.backlight();
// SD ======================
if (!SD.begin(chipSelect)) {
lcd.setCursor(3, 1);
lcd.print(F("Keine SD-Karte"));
lcd.setCursor(4, 2);
lcd.print(F("gefunden ://"));
delay(10000);
}
// WELCOME =================
lcd.setCursor(0, 0); // Welcome LCD
lcd.print(F("--------------------"));
lcd.setCursor(3, 1);
lcd.print(F("Willkommen bei"));
lcd.setCursor(4, 2);
lcd.print(F("Trivia Guess"));
lcd.setCursor(0, 3);
lcd.print(F("--------------------"));
for (;ledC < 32; ledC ++) { // Welcome LED
if (ledC < 4) {leds[ledC] = CRGB::Blue;}
else if (ledC < 8) {leds[ledC] = CRGB::Red;}
else if (ledC < 12) {leds[ledC] = CRGB::Green;}
else if (ledC < 16) {leds[ledC] = CRGB::Yellow;}
else if (ledC < 20) {leds[ledC -4] = CRGB::Black;}
else if (ledC < 24) {leds[ledC -12] = CRGB::Black;}
else if (ledC < 28) {leds[ledC -20] = CRGB::Black;}
else if (ledC < 32) {leds[ledC -28] = CRGB::Black;}
if (ledC == 3 || ledC == 7 || ledC == 11 || ledC == 15 || ledC == 19 || ledC == 23 || ledC == 27 || ledC == 31) {
FastLED.show();
delay(150);
}
}
ledC = 0;
}
// LOOP ==================================================================
void loop() {
int lcdP[4] = {0,-7,8,-15};
lcd.clear();
lcd.setCursor(2, 1);
lcd.print(F("Spieleranzahl:"));
lcd.blink();
while (playerN == 0) {
int inp = keyboard.getKeyPressed();
if (inp > 0) {
if (inp < 5) {
lcd.setCursor(16, 1);
lcd.print(inp);
playerS = inp;
delay(250);
}
if (inp == 12 && playerS > 0) {
playerN = playerS;
delay(250);
}
}
}
lcd.clear();
lcd.setCursor(cursorX,3);
long solution[playerN]; // Array um Lösungen besser zu testen
int points[4] = {0,0,0,0};
while (r < 2) {
int inp = keyboard.getKeyPressed();
if (qC == 0) {
char question[15] = "frage_000_0.txt"; // <==========
question[7] += random(5); // <==========
question[8] += random(8); // <==========
Serial.print(question);
for (y = 1; y < 4; y++) {
File text = SD.open(question, FILE_READ);
}
qC = 1;
}
if (inp >= 0) {
if (inp < 10 && i < 9 || inp == 11 && i < 9) {
if (inp == 11) {
inp = 0;
}
lcd.setCursor(cursorX, 3);
lcd.print(inp);
Serial.print(a);
Serial.print(" * 10 + ");
Serial.print(inp);
a = a * 10 + inp;
cursorX ++;
Serial.print(" = ");
Serial.println(a);
old_inp[i] = inp;
i ++;
delay(250);
}
if (inp == 10 && cursorX > 0) {
cursorX --;
lcd.setCursor(cursorX, 3);
lcd.print(" ");
i --;
a = (a - old_inp[i]) / 10;
delay(250);
}
if (inp == 12 && i > 0) {
solution[player] = a;
// Reset
i = 0;
a = 0;
cursorX = 5;
memset(old_inp, 0, sizeof(old_inp));
lcd.clear();
lcd.setCursor(cursorX ,3);
for(y = 0; y < 9; y++){
Serial.print(old_inp[y]);
Serial.print(",");
}
if (player +1 == playerN) {
lcd.noBlink();
for (; i < playerN; i++) {
lcd.setCursor(0,i);
lcd.print(F("S"));
lcd.print(i +1);
lcd.print(F(": "));
lcd.print(solution[i]);
delay(1000); // Maybe verlängern, nach Testen
solution[i] = abs(ans - solution[i]);
}
for (i = 0; i < playerN; i++) {
lcd.setCursor(4,i);
lcd.print(F(" "));
lcd.setCursor(4,i);
lcd.print(solution[i]);
}
Serial.println(solution[3]);
delay(1000); // Maybe verlängern, nach Testen
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("A: "));
lcd.print(ans);
delay(1000); // Maybe verlängern, nach Testen
lcd.setCursor(0,1);
int check = 0;
int minV = solution[0];
for (y = 0; y < sizeof(points); y++) {
Serial.print(points[y]);
Serial.print(", ");
}
for (; check < playerN; check++) {
minV = min(solution[check], minV);
}
Serial.println(minV);
for (check = 0; check < playerN; check++) { // Punktevergabe
if (minV == solution[check]) { // Falls der Kleinste Wert des Arrays an Position 0(1,2,3) ist...
points[check] +1; // Im Punkte-Array an dieser Stelle +1
Serial.println("points: ");
Serial.print(points[check]);
if (points[check] == 4) {
r++;
}
if (check == 0) {
leds[abs(lcdP[check])] = CRGB::Blue; // Je nach Spieler wird die enstprechende LED angesteuert
lcdP[check] ++;
}
if (check == 1) {
leds[abs(lcdP[check])] = CRGB::Red;
lcdP[check] ++;
}
if (check == 2) {
leds[abs(lcdP[check])] = CRGB::Green;
lcdP[check] ++;
}
if (check == 3) {
leds[abs(lcdP[check])] = CRGB::Yellow;
lcdP[check] ++;
}
FastLED.show();
}
}
delay(2500);
//Reset
lcd.clear();
lcd.setCursor(cursorX ,3);
lcd.blink();
player = 0;
}
else {
player ++;
}
delay(250);
}
}
}
playerN = 0;
}
Serial Output: Error: Key string does not have enough values.
Woran könnte das liegen?
