Go Down

Topic: Tasten und U8g2-lib (Read 679 times) previous topic - next topic

synth1203

So, ich hab mich mal über das Thema heute in der Pause her gemacht ...
ich versuch es mal abzureissen in kurz und würde Euch mal darum bitten zu sagen,
ob ich richtig liege, oder es falsch verstanden habe.

Ich habe folgendes:
3 Zustände = Funktionen des Triggers

1 BULB
2 Zeitraffer
3 HDR

Hier würde ich aber diese aussen vor lassen ...
... nächster Schritt wäre wenn eine dieser Funktionen ausgeführt wird,
dort habe ich dann

1 Dauerschleife (Warteposition) wie bei einem Beispiel mit der Fußgänger/Autoampel, die Autoampel bleibt die ganze Zeit grün, die Fußgängerampel rot.
2 Eingabe/Änderung zu ändernder Variabel: bei Betätigung von zwei möglichen Tastern (ggf. je nach Funktion)
3 Eingabe/Änderung von Variableninhalt: bei Betätigung von anderen zwei möglichen Tastern
4 Auslösung bei Betätigung von Auslösetaster
5 Abbruch der Schleife, somit Rückkehr zum Menü

Senn ich das Ganze jetzt wie folgt programmiere:
Code: [Select]
void loop()
menüabfrage
switch(menüpunkt)
 case menüpunkt1:
  while abbruch== false {
  Tastenabfrage
  switch(Tastenabfrage):
   case 2:
     Eingabe/Änderung von zu ändernder Variable
   break;
   case 3:
     Eingabe/Änderung von Variableninhalt (Zeit) (je nach Ergebnis von case2)
   break;
   case 4:
     Auslösung, zurück zur Tastenabfrage
   break;
   case 5:
     Abbruch, zurück zur Menüabfrage : abbruch = TRUE
   break;
  }
 break;
 case menüpunkt2:
   [...]
 break;
[...]
:smiley-confuse:

Das ist die einzige Umsetzung, die für mich passen könnte ... glaube ich, richtig? Falsch?
Hier müsste ich dann ja wie schon beschrieben eine Schleife einbauen, die gemeinsam mit Case5 abbricht, oder?

Danke, LG Ralf aka synth1203

agmue

#16
Jun 24, 2018, 10:30 am Last Edit: Jun 24, 2018, 10:50 am by agmue
Kann mir jemand eine gute Beschreibung/Erklärung zur State-Machine in Deutsch geben?
Wenn Du hier im Forum nach "agmue anleitung" suchst, stößt Du auf von mir verfaßte Texte. Ob die für Dich "gut" sind, wird sich dann herausstellen. "Anleitung: Endlicher Automat mit millis()" enthält auch ein schönes Programm von Rudi.

... glaube ich, richtig? Falsch?
Die Richtung dürfte stimmen. Etwas irritiert mich while, das sollte nicht nötig sein und ist zusätzlich blockierend.

Der schon erwähnte Rudi hat sich in jedes Programm eine Herzschlag-LED eingebaut. Nur wenn die ohne merkliche Rhythmusstörungen blinkt, läuft das Programm gut, also ohne Blockaden. Ausnahmen bestätigen diese Regel.

Ich hänge nochmal den kompletten Code als Datei an.
Ich sehe da nur Menüpunkte bis "5) Blitz", siehst Du mehr?



Bei Seeluft könnte Korrosion ein Thema werden, besonders bei den kleinen Spannungen. Aber da hast Du sicherlich Erfahrung.

synth1203

#17
Jun 24, 2018, 10:20 pm Last Edit: Jun 25, 2018, 11:37 am by synth1203
@agmue danke für den Link, werde es mir morgen aufm Tablet speichern und dann die Tage mal durch arbeiten.

Wenn Du bei Dir die Taste "nach oben" oder mehrfach die Taste "nach unten" betätigst dann siehst Du die restlichen Menüpunkte. ;) Schön zu sehen, wie es auf einem funktionstüchtigen Display aussieht, meines hat leider einen Defekt und einen weißen Streifen am Rand.

While weil: das Menü von U8g2 übernimmt alles davor. Erst in den einzelnen Bereichen benutze ich die State-Machine, die normale Hauptprogrammschleife muss ich also hier ersetzen für die State-Machine.
Beim letzten Status = betätigen der Taste "cancel" wird die Do-While-Schleife direkt beendet, theoretisch sollte es also passen.

Ich hab das heute früh schon so weit mal umgesetzt, nur für den BULB-Modus, habe allerdings noch bei der Tasten-Abfrage irgendwo ein Problem. Sobald ich mit dem Notebook online komme poste ich den aktuellen/neuen Quelltext, kann aber noch dauern.

Seeluft macht im Schiff zum Glück relativ wenig aus ... plane aber das Gehäuse wenn wirklich alles passt auch abzudichten, so weit möglich.

LG Ralf aka synth


EDIT: Problem mit der Tasten-Abfrage ist behoben. Muss mich echt noch an die Groß-/kleinschreibung gewöhnen, komplett anders wie gewohnt.

Jetzt mach ich mich über millis her ... aktuell ist die Auslösung noch mit delay(x) gelöst ...
damit ich auch auf dem Display einen Countdown anzeigen kann, wie lange die Auslösung noch dauert, oder schon dauert.

EDIT2: So, ich hab erstmal angefangen ein paar Funktionen einzusetzen, damit es übersichtlicher wird und bin dabei auf ein Problem gestoßen ... sorry, nur Code-Schnipsel weil abgeschrieben ...
Es handelt sich um eine Ausgabe-Funktion für das Display, damit ich nicht immer die Positionierungen und Co. mit setzen muss.
Code: [Select]
void DisplayOutput(String line1, String line2){
  u8g2.clearBuffer();
  u8g2.setCursor(5,15);
  u8g2.print(line1);
  u8g2.setCursor(5,25);
  u8g2.print(line2);
  u8g2.sendBuffer();
}


Aufrufen tue ich jetzt wie folgt:
Code: [Select]
mode = "BULB";
ZeitInMS = 1000;
DisplayOutput(mode, String(ZeitInMS/1000) + " s");

Ergebnis: leerer Bildschirm

Wenn ich in der Funktion "DisplayOutput" direkt bei u8g2.print() das "line1" durch einen String ersetze funktioniert alles.

Ich kann doch Strings übergeben oder hab ich was verpasst?
THNX, LG Ralf aka synth1203

Tommy56

Lass Dir doch einfach mal in DisplayOutput die Werte auf den seriellen Monitor ausgeben.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

agmue

#19
Jun 27, 2018, 02:21 pm Last Edit: Jun 27, 2018, 02:24 pm by agmue
Wenn Du bei Dir die Taste "nach oben" oder mehrfach die Taste "nach unten" betätigst dann siehst Du die restlichen Menüpunkte. ;)
Yep!

Seeluft macht im Schiff zum Glück relativ wenig aus ... plane aber das Gehäuse wenn wirklich alles passt auch abzudichten, so weit möglich.
An der Küste und auf den Inseln sehe ich halt viel V4A.

Ich kann doch Strings übergeben oder hab ich was verpasst?
Kannst Du und ein kleines Testprogramm zeigt es:

Code: [Select]
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

// U8g2 Contructor List (Frame Buffer)
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected
// U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R2, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// End of constructor list                U8G2_R2 = 180° gedreht

int ZeitInMS;
String mode;

void setup(void) {
  u8g2.begin();
  u8g2.enableUTF8Print();    // enable UTF8 support for the Arduino print() function
  u8g2.setFont(u8g2_font_6x12_tr);
}

void loop(void) {
  mode = "BULB";
  ZeitInMS = 1000;
  DisplayOutput(mode, String(ZeitInMS / 1000) + " s");
  delay(1000);
  mode = "Zeitraffer";
  ZeitInMS = 2000;
  DisplayOutput(mode, String(ZeitInMS / 1000) + " s");
  delay(1000);
}

void DisplayOutput(String line1, String line2) {
  u8g2.clearBuffer();
  u8g2.setCursor(5, 15);
  u8g2.print(line1);
  u8g2.setCursor(5, 25);
  u8g2.print(line2);
  u8g2.sendBuffer();
}


Übrigens auf dem UNO: Globale Variablen verwenden 74% des dynamischen Speichers.

Go Up