LCD.print Ausgabe mehrer Zeichen

Hallo,

mein Name ist Armin ich lese jetzt schon ein paar Jahre mit und konnte auch alles bis jetzt ohne nachfragen lösen.

Bis jetzt......

In meinem Code habe ich folgende Zeile:

mydisp.print(schicht==1?"SS":"FS");

wenn "schicht" ne 1 ist wird FS angezeigt wenn "schicht" ne 2 ist dann SS

Jetzt würde ich gerne noch den Wochentag ausgeben die Variable dafür ist WD

Ausgegeben werden solls in der . : mydisp.print(irgendwas"Mo":"Di":"Mi":"Do":"Fr":"Sa":"So")

kann das gehen?

Da ich Wechselschichter bin habe ich mir einen Wecker gebastelt.

Weckt mit Licht und Melodie. Ist Akkugepuffert.

Hier mein Code. Aber wehe es lacht einer, es Funktioniert.

Da die Maximale länge von 9000 zeichen überschritten wäre hab ich das Programm als Datei angehängt.

Wecker_Dallas_Digole_v2.1.7.ino (11.5 KB)

Bestimme den Wochentag und mache einfach ein mydisp.print hinterher.

char *wochentage[] = {" SO"," MO"," DI"," MI"," DO"," FR"," SA"}
int wochentag;
...
wochentag = den bestimmst Du in Deinem Sketch hier 0 = Sonntag
mydisp.print(schicht==1?"SS":"FS");
mydisp.print(wochentage[wochentag];

Gruß Tommy

Tommys Tip ist der bessere Tip!

So ginge es aber auch:

uint8_t day = 0;

void setup()
{
  Serial.begin(115200);
  randomSeed(analogRead(0));
}

void loop()
{
  Serial.print(day == 0 ? "SO" : \
               day == 1 ? "MO" : \
               day == 2 ? "DI" : \
               day == 3 ? "MI" : \
               day == 4 ? "DO" : \
               day == 5 ? "FR" : "SA");
  delay(1500);
  day = random(7);
}

schicht==1?"SS":"FS" entspricht in diesem Fall einem IF ELSE

Darum kann man nicht mehr als 2 Werte haben.

Auch wenn ich kein guter Programmierer bin ziehe ich als Lösung das Array mit dem index des Wochentags den Du von der RTC bekommst, vor.

Grüße Uwe

Beides ist richtig, aber mein Sketch ist getestet und funktioniert.
Das sind einfach viele Short-If hintereinander ... nicht schick aber geht.
Ich sagte aber auch, die Array-Variante ist definitiv die beste Lösung!

kann das gehen?

Na ja, so einfach mit 6 Doppelpunkten natürlich nicht. ( Du könntest wie FlyingEagle 6 true/false Bedingungen verschachteln, wenn du unbedingt willst. )

Sinnvoller wäre sicher Tommys Vorschlag

const char* wtag[7] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};

...
byte wd = x%7; // 0.. 6,  wird irgendwie je nach Wochentag gesetzt
Serial.print(wtag[wd]);

Noch eine Sparfuchs-Variante dazu:

const byte wtag[] = "SoMoDiMiDoFrSa"; // 15 Byte statt 35  (7* (3 Byte Text + 2 Byte Zeiger))
...
Serial.write(wtag+2*wd, 2); // zwei Buchstaben ausgeben

Super, vielen Dank.

Wird ich im laufe der nächsten Woche alles mal testen.

Armin

Ich hatte mal Lust die 3 Varianten gegeneinander zu prüfen.

Meine Variante aus Post 2:

Der Sketch verwendet 2236 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 130048 Bytes.
Globale Variablen verwenden 209 Bytes (1%) des dynamischen Speichers, 16175 Bytes für lokale Variablen verbleiben. Das Maximum sind 16384 Bytes.

uint8_t day = 0;

void setup()
{
  Serial.begin(115200);
  randomSeed(analogRead(0));
}

void loop()
{
  Serial.print(day == 0 ? "SO" : \
               day == 1 ? "MO" : \
               day == 2 ? "DI" : \
               day == 3 ? "MI" : \
               day == 4 ? "DO" : \
               day == 5 ? "FR" : "SA");
  delay(1500);
  day = random(7);
}

Tommys Variante aus Post 1:

Der Sketch verwendet 2230 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 130048 Bytes.
Globale Variablen verwenden 230 Bytes (1%) des dynamischen Speichers, 16154 Bytes für lokale Variablen verbleiben. Das Maximum sind 16384 Bytes.

char *wochentage[] = {"SO", "MO", "DI", "MI", "DO", "FR", "SA"};
int wochentag = 0;

void setup()
{
  Serial.begin(115200);
  randomSeed(analogRead(0));
}

void loop()
{
  Serial.print(wochentage[wochentag]);
  delay(1500);
  wochentag = random(7);
}

Michael_X Varaiante aus Post 5:

Der Sketch verwendet 2176 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 130048 Bytes.
Globale Variablen verwenden 202 Bytes (1%) des dynamischen Speichers, 16182 Bytes für lokale Variablen verbleiben. Das Maximum sind 16384 Bytes.

const byte wtag[] = "SoMoDiMiDoFrSa"; // 15 Byte statt 35  (7* (3 Byte Text + 2 Byte Zeiger))

void setup()
{
  Serial.begin(115200);
  randomSeed(analogRead(0));
}

void loop()
{
  byte wd = random(7) % 7;
  Serial.write(wtag + 2 * wd, 2);
  delay(1500);
}

Wo bleibt mein Karma ? 8) :wink:           :stuck_out_tongue:

Übrigens: Wenn man wirklich RAM sparen möchte, bleibt noch die Möglichkeit, "SoMoDiMiDoFrSa" in den Flash zu legen. ( 202 byte RAM -> 188 byte RAM )

Meine Variante verwendet übrigens kein Serial.print, was den Flash-Vergleich etwas verfälscht (zu meinen Gunsten).
Aber so ist das nunmal mit Benchmark-Tests. Im wahren Leben sind die Unterschiede meist geringer.

Und: wenn der Platz ausreichend ist, sollte man die Variante verwenden, die man am leichtesten lesen kann
(und nach einem halben Jahr noch versteht).
Denn so ist das nunmal mit Benchmark-Tests. Im wahren Leben sind die Unterschiede meist egal.

Done.

Mir ging es auch weniger um einen Benchmark, als vielmehr um das simple Interesse
a) ob wirklich alle 3 Methoden das gleiche bringen
b) und Flash/Ram-Verbrauch

Well done, Sir.