Arduino Due DAC mit Tasten selbst definieren

my_xy_projekt:
ICH würde das Komma nicht mit einpreisen in die Tastatur, sondern nur in der Anzeige verwenden.

Wie Du auf auf die Vor- und Nachkommastellen kommst, ist im folgenden Code dargestellt. (Hier mit 2VK/2NK)
Zur Anzeige dann die Zahl Vorkomma, das komma ansich und dann die Zahl Nachkomma.
Dann kannst Du ganz bequem mit der Ganzzahl rechnen und brauchst keine Zeichenketten/float Umstände.

int zahl = 0;

int lastzahl = 0;

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

void loop() {
 if (Serial.available() > 0)
 {
   char zeichen = Serial.read();
   if (isDigit(zeichen))
   {
     Serial.print(F("Digit erkannt: "));
     Serial.println(zeichen);
     if (zahl > 999)// zahl ist schon 4stellig?
     {
       zahl = zahl - (zahl / 1000) * 1000; // mache erste Stelle weg
     }
     zahl = zahl * 10 + (zeichen - 48); // Stelle hinzufügen und Ziffer addieren
     Serial.println(F("Neue Zahl: "));
     Serial.println(zahl);

}
   if (zahl != lastzahl)
   {
     if (zahl > 0)
     {
       Serial.println(F("Trennung Vor- und Nachkomma"));
       if (zahl > 99)
       {
         Serial.print(F("Vorkomma: "));
         Serial.println((zahl - zahl % 100) / 100);
       }
       Serial.print(F("Nachkomma: "));
       Serial.println(zahl % 100);
       lastzahl = zahl;
     }
   }
 }
}




Anstelle is(Digit) kannst Du später in einer switch/case verwenden, indem Du prüfst, ob das Zeichen 0..9 ist.
Dafür einen case und alles abgedeckt.
Dann einen case für zeichen löschen (von hinten nach vorne) und einen case fürs bestätigen der Ziffer.
Das wars.

Das klingt nach einer guten Lösung. Kann ich da einfach noch das Keypad dann ohne probleme miteinbinden?

skipzens:
Das klingt nach einer guten Lösung. Kann ich da einfach noch das Keypad dann ohne probleme miteinbinden?

Ja.
Du bekommst von dem dann etwas zurück. Das nimmst Du und machst daraus eine Ziffer
Mit dieser Zahl gehst Du in ein swicth /case wie von mir beschrieben.

Wenn Du die Ziffer hast, brauchst Du die Einleseroutine des SerMon und das char nicht, auch die "Umrechnung" in eine Ziffer entfällt.
Auch der ganze if zahl != lastzahl ist nur zur Verdeutlichung bei.
Zum Schluss werdens vielleicht 10 Zeilen sein....

my_xy_projekt:
Ja.
Du bekommst von dem dann etwas zurück. Das nimmst Du und machst daraus eine Ziffer
Mit dieser Zahl gehst Du in ein swicth /case wie von mir beschrieben.

Wenn Du die Ziffer hast, brauchst Du die Einleseroutine des SerMon und das char nicht, auch die "Umrechnung" in eine Ziffer entfällt.
Auch der ganze if zahl != lastzahl ist nur zur Verdeutlichung bei.
Zum Schluss werdens vielleicht 10 Zeilen sein....

nur 10 Zeilen? Das ist ja krass :smiley:
muss ich probieren umzusetzen

skipzens:
nur 10 Zeilen? Das ist ja krass :smiley:
muss ich probieren umzusetzen

Da geb ich dann gerne nochmal was zum Besten, bevor ich den Platz abgeben muss...
Ich hatte ja gehofft, das da noch was kommt...

Nu denn...

Der folgende Code kommt komplett ohne eine Variable aus, die vor dem setup() initialisiert werden muss.
Das von Dir eingesetzte Keypad habe ich nicht und mein TTP229 wollte ich nicht nun auch noch einbasteln.
Du wirst die lcd-Lib austauschen und den Aufruf ändern müssen. Alles andere kann so bleiben um das nachzustellen.

Tauscht Du die Abfrage der Eingabe (ist schon angemerkt) kannst Du das 1:1 übernehmen.

Ich habe alles schön in einzelne Funktionen ausgelagert, die können auch weiterverwendet werden.
Wenn ich das runterbreche, die seriellen Ausgaben wegnehme und auf "Standard" formatiere, dürften wohl um die 60+xZeilen insgesamt rauskommen.
Für alles, was Du derzeit abgefragt hast.

// Forensketch basiert auf: https://forum.arduino.cc/index.php?topic=730292.msg4914323#msg4914323
// und dem Hinweis: https://forum.arduino.cc/index.php?topic=730292.msg4914551#msg4914551 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  lcd.begin();
  lcd.backlight();
}

void loop()
{
  lcdSpannung(eingabeWert());
}

int eingabeWert()
{
  static unsigned int zahl = 0;
  unsigned int auswahl = readtastatur(); // readtastatur gibt eine Zahl zurück
  switch (auswahl)
  {
    case 0 ... 9:                        // Ziffern aneinanderreihen
      if (zahl > 999)                    // Zahl ist schon 4stellig?
      {
        zahl = zahl - (zahl / 1000) * 1000; // mache erste Stelle weg
      }
      zahl = zahl * 10 + auswahl;        // Stelle hinzufügen und Ziffer addieren
      Serial.println(F("Neue Zahl: "));
      Serial.println(zahl);
      break;
    case 10:                             // letzte Ziffer löschen
      Serial.println(F("Letzte Ziffer löschen"));
      if (zahl > 9)                      // mehr als eine Stelle?
      {
        zahl = zahl / 10;                // entferne letzte Stelle
      }
      else
      {
        zahl = 0;                        // oder schreib 0
      }
      Serial.print(F("neue Zahl: "));
      Serial.println(zahl);
      break;
    case 11:
      {
        // gesamte Zahl übergeben
        schreibeDAC(zahl);
        zahl = 0;
        break;
      }
    default:
      //Serial.println(F("Eingabe nicht erfasst"));
      break;
  }
  return zahl;
}

int readtastatur()                           // Diese Funktion gibt die Zahl für das switch-Konstrukt zurück
{ // Der Inhalt muss an das Keypad angepasst und umgeschrieben werden
  unsigned int taste = 17;                   // Vorbelegung - Wert der nicht ausgewertet wird
  char zeichen;
  if (Serial.available() > 0)
  {
    zeichen = Serial.read();
    if (isDigit(zeichen))
    {
      Serial.print(F("Digit erkannt: "));
      Serial.println(zeichen);
      taste = zeichen - 48;
    }
    else if (isAlpha(zeichen))
    {
      taste = zeichen - 55;
    }
  }
  while (Serial.available() > 0)Serial.read();
  return (taste);
}

void lcdSpannung(const unsigned int spannung) // Ausgabe auf dem lcd
{
  static unsigned int lastwert = 10000;
  if (lastwert != spannung)                   // Nur wenn sich der Wert geändert hat wird auf das LCD geschrieben - sonst nicht!
  {
    lcd.setCursor(0, 0 );
    lcd.print(F("Spannung: 00,00V"));
    if (spannung > 99)                        // mehr als 2 Stellen?
    {
      lcd.setCursor(10, 0);
      lcdvornull(vorkomma(spannung));
    }
    if (spannung > 0)                         // Es muss mindestens eine NK drin sein
    {
      lcd.setCursor(13, 0);
      lcdvornull(nachkomma(spannung));
    }
    lastwert = spannung;
  }
}

void lcdvornull(const unsigned int wert)
{
  if (wert < 10)
  {
    lcd.print(0);
  }
  lcd.print(wert);
}

int vorkomma(const unsigned int uebergabe)  // gibt die Stellen ab Ziffer 3 zurück
{
  return ((uebergabe - uebergabe % 100) / 100);
}

int nachkomma(const unsigned int uebergabe) // gibt die Stellen bis Ziffer 2 zurück
{
  return (uebergabe % 100);
}

void schreibeDAC(const unsigned int uebergabe) // Spässle..
{
  unsigned int dac = 0;
  dac = map(uebergabe, 0, 9999, 0, 4095);  // setzt den Eingabewert auf das DAC um -> hier 12 bit
  Serial.print(F("Schreibe auf den DAC: "));
  Serial.println(dac);
  Serial.println(F("ENDE!"));
  while (1);
}

Noch 'n Hinweis, da nicht als Komentar ...
  taste = zeichen - 55; 
Da frage ich nach dem grossen A und dem grossen B - wenn also im SerMon damit getestet werden soll: A - löscht die letzte Stelle, B schreibt virtuell DAC .. und beendet den Spuk, bis reset gedrückt wird... :wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.