Tabelle und Verknüpfungen

Was der Code macht:
Bei erstem Start - und nur da - musst Du einmal im setup() das updateEEprom aktivieren. Sketch raufspielen.
Dann wieder auskommentieren und Sketch raufspielen.

Es sind jetzt 2 Spalten und 5 Zeilen vorgesehen.
Im ersten zustand sind alle Inhalte 0. Wenn Du wieder von vorn anfangen willst, kannst das im setup() wieder einmal einkommentieren und so weiter...

Ich war etwas sparsam mit den Ausgaben
Mit 'A' kommst Du ins editieren.
Er fängt mit Zeile 1 / Spalte links an.
Der jeweilieg Eintrag wird auf 0 gesetzt.
Drückst Du eine Ziffer, wird die in die Variable genommen.
Drückst Du '*' wird die auch in den EEprom geschrieben und es wird die nächste Spalte ausgewählt. Es ist eine Sperre drin, das Du nicht z.B. Spalte 3 auswählen kannst. Da wird dann wieder Spalte 1 draus und der rutscht eine Zeile weiter.
Bist Du am Ende der Zeilen, geht es oben wieder los.

Drückst Du '#' wird die Spalte übersprungen. Änderungen gehen verloren.

Und mit 'A' gehts wieder raus.
Alles auf dem Seriellen Monitor - ist nicht jedermanns ding, aber musste durch...

Vollständig Kommentarlos - Du musst unbedingt schauen, das Du erst das Keypad richtig verkabelt hast und die Ausgaben auch funktionieren.

// Forensketch: Testcode für KeyMatrix
// https://forum.arduino.cc/t/tabelle-und-verknupfungen/991376/24 (1)
#include <Keypad.h>

const byte spalten = 4;
const byte zeilen  = 4;
char zeichen[zeilen][spalten] =
{
  {'D', '#', '0', '*'},
  {'C', '9', '8', '7'},
  {'B', '6', '5', '4'},
  {'A', '3', '2', '1'}
};
byte spaltenPin[spalten] = { 9, 8, 7, 6 };
byte zeilenPin[zeilen]   = { 5, 4, 3, 2 };
Keypad tasten = Keypad(makeKeymap(zeichen), zeilenPin, spaltenPin, zeilen, spalten);
char key;

void setup()
{
  Serial.begin(115000);
  Serial.println(F("Start..."));
}

void loop()
{
  key = tasten.getKey();
  if (key) Serial.println(key);
}

Und wenn der richtige Key immer rauskommt, dann den hier:

// Forensketch: Wertetabelle mit Matrixkey füllen
// https://forum.arduino.cc/t/tabelle-und-verknupfungen/991376/24 (2)


#include <EEPROM.h>
#include <Keypad.h>

const byte spalten = 4;
const byte zeilen  = 4;
char zeichen[zeilen][spalten] =
{
  {'D', '#', '0', '*'},
  {'C', '9', '8', '7'},
  {'B', '6', '5', '4'},
  {'A', '3', '2', '1'}
};
byte spaltenPin[spalten] = { 9, 8, 7, 6 };
byte zeilenPin[zeilen]   = { 5, 4, 3, 2 };
Keypad tasten = Keypad(makeKeymap(zeichen), zeilenPin, spaltenPin, zeilen, spalten);
char key;
char auswahl[4] = {'\0'};

const byte tabMaxSpalten = 2;
const byte tabMaxZeilen  = 5;
struct werte
{
  uint16_t grad;
  uint16_t zeit;
};
werte ablauf[tabMaxZeilen];
byte spalte, zeile;

void setup()
{
  Serial.begin(115000);
  Serial.println(F("Start..."));
  // updateEEprom();
  readEEprom(true);
}

void loop()
{
  editWerte();
}


void editWerte()
{
  static bool edit = false;
  key = tasten.getKey();
  if (spalte >= tabMaxSpalten) {spalte = 0; zeile++;}
  if (zeile >= tabMaxZeilen) {zeile = 0;}
  if (!edit)
  {
    if (key == 'A')
    {
      Serial.println(F("Edit true"));
      if (spalte == 0) {ablauf[zeile].grad = 0;}
      else if (spalte == 1) {ablauf[zeile].zeit = 0;}
      edit = true;
    }
  }
  else
  {
    if (isDigit(key))
    {
      Serial.println(key);
      if (spalte == 0)
      {
        if (ablauf[zeile].grad >= 10000)
        {ablauf[zeile].grad = 0;}
        ablauf[zeile].grad *= 10;
        ablauf[zeile].grad += key - 48;
      }
      else if (spalte == 1)
      {
        if (ablauf[zeile].zeit >= 10000)
        {ablauf[zeile].zeit = 0;}
        ablauf[zeile].zeit *= 10;
        ablauf[zeile].zeit += key - 48;
      }
    }
    if (key == '*')
    {
      Serial.println(F("Wert gespeichert"));
      updateEEprom();
      spalte++;
    }
    if (key == '#')
    {
      Serial.print(F("überspringe Zeile "));
      Serial.print(zeile);
      Serial.print(F(" Spalte "));
      Serial.println(spalte);
      spalte++;
      readEEprom(false);
    }
    if (key == 'A')
    {
      Serial.println(F("Ende Edit"));
      edit = false;
      spalte = 0;
      zeile = 0;
    }
    ausgabe(zeile);
  }
}
//
void ausgabe(uint8_t z)
{
  static char lastZeile[21] = "\0";
  char buf[21];
  snprintf( buf, sizeof(buf), "%u Grad %u Minuten", ablauf[z].grad, ablauf[z].zeit);
  if (strcmp(lastZeile, buf) != 0)
  {
    Serial.print(F("Zeile: ")); Serial.print(z); Serial.print(F(" geändert in: "));
    Serial.println(buf);
    memcpy(lastZeile, buf, sizeof(lastZeile));
  }
}
//
void updateEEprom()
{
  uint16_t speicherPosition = 0;
  EEPROM.put(speicherPosition, ablauf);
  /*
    Serial.println(F("Im EEprom gespeicherte Werte:"));
    for (byte b = 0; b < tabMaxZeilen; b++)
    {
    Serial.print(ablauf[b].grad);
    Serial.print(F(" Grad\t"));
    Serial.print(ablauf[b].zeit);
    Serial.println(F(" Minuten"));
    }
  */
  readEEprom(true);
}
void readEEprom(const bool anzeige)
{
  uint16_t speicherPosition = 0;
  EEPROM.get(speicherPosition, ablauf);
  if (anzeige)
  Serial.println(F("Aus EEprom gelesene Werte:"));
  
  {
    for (byte b = 0; b < tabMaxZeilen; b++)
    {
      Serial.print(F("Eintrag Nummer "));
      Serial.print(b + 1);
      Serial.print(": ");
      Serial.print(ablauf[b].grad);
      Serial.print(F(" Grad "));
      Serial.print(ablauf[b].zeit);
      Serial.println(F(" Minuten "));
    }
  }
}
1 Like