mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arduino Menü erstellen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tobias M. (tobi100)


Bewertung
-4 lesenswert
nicht lesenswert
Hallo,
ich habe folgendes Problem. Ich habe ein 16x2 Lcd Display und möchte 
dafür gerne ein Menü, welches ich über einen Taster steuern kann.
Folgende Funktionen soll es haben:

Wenn ich den Taster zum ersten mal drücke, soll die Lcd Hintergrund 
Beleuchtung angehen.
Beim Zweiten mal drücken, soll es von der Uhrzeit anzeige zur Temperatur 
anzeige überspringen.
Und in jedem Fall, soll die Lcd Hintergrund Beleuchtung wieder in 10 
sek. ausgehen.

Hier nochmal die beiden Sketche:

Uhrzeit:

#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(void)
{
    lcd.begin(16, 2);
    setSyncProvider(RTC.get);
    if(timeStatus() != timeSet)
        lcd.println("Unable to sync with the RTC");
    else
        lcd.println("RTC has set the system time");
}

void loop(void)
{
    digitalClockDisplay();
    delay(1000);
}

void digitalClockDisplay(void)
{
    lcd.begin(16, 2);
    lcd.print(hour());
    printDigits(minute());
    printDigits(second());
    lcd.print(' ');
    lcd.setCursor(0, 2);
    lcd.print(day());
    lcd.print(' ');
    lcd.print(month());
    lcd.print(' ');
    lcd.print(year());
}

void printDigits(int digits)
{
    lcd.print(':');
    if(digits < 10)
        lcd.print('0');
    lcd.print(digits);
}






Temperatur:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include "DHT.h"

#define DHTPIN 6
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  lcd.begin(16, 2);
  lcd.print("DHT22 - Test!");

  dht.begin();
  lcd.clear();
}

void loop()
{
  delay(1000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();


  if (isnan(t) || isnan(h))
  {
    lcd.println("DHT22 konnte nicht ausgelesen werden");
  }
  else
  {
    lcd.clear();
    lcd.print(h);
    lcd.print(" %");
    lcd.setCursor(0, 2);
    lcd.print(t);
    lcd.print(" C");
  }
}




Ich bedanke mich schon mal im voraus für jegliche Hilfe ;)

Lg Tobi

von Dieter S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und was ist jetzt deine Frage ?

von Cyblord -. (cyblord)


Bewertung
1 lesenswert
nicht lesenswert
Tobias M. schrieb:
> Hallo,
> ich habe folgendes Problem. Ich habe ein 16x2 Lcd Display und möchte
> dafür gerne ein Menü, welches ich über einen Taster steuern kann.
> Folgende Funktionen soll es haben:

Dann musst du das halt programmieren. Sind wir hier bei "Wünsch dir 
was"?

Jetzt wurde dir schon 1-Wire, DHT Ansteuerung und LCD Ansteuerung 
KOMPLETT abgenommen. Jetzt müsstest du tatsächlich SELBER mal was 
programmieren, oh Schreck, gleich ins Forum und fragen.
Irre, einfach nur Irre.

: Bearbeitet durch User
von Tobias M. (tobi100)


Bewertung
-7 lesenswert
nicht lesenswert
Vielleicht weiß ich nicht wie man so etwas Programmiert !!!!!

Ich habe ja auch nicht gesagt das ihr mir sowas Programmieren müsst.

Ich habe gelegentlich um die Hilfe gebeten mir dabei zu Helfen.

Oder wo für ist sonst ein Forum da ?????

von Tobias M. (tobi100)


Bewertung
-7 lesenswert
nicht lesenswert
Dieter S. schrieb:
> Und was ist jetzt deine Frage ?

Ich weiß nicht genau wie man so etwas Programmiert und wollte wissen ob 
es da schon irgendwelche Liberiers oder Beispiel Sketche gibt ?

von Cyblord -. (cyblord)


Bewertung
1 lesenswert
nicht lesenswert
Tobias M. schrieb:
> Vielleicht weiß ich nicht wie man so etwas Programmiert !!!!!

Dann lerne. Am besten in dem du schon mal anfängst.

> Ich habe ja auch nicht gesagt das ihr mir sowas Programmieren müsst.
Sondern du erwartest was?

von Bastler (Gast)


Bewertung
4 lesenswert
nicht lesenswert
Hört sich anfangs blöd an, ist aber so:

Programmieren tut man mit einem Stift und Papier.

Skizziere dir den Ablauf auf, dann erkennst du auch schnell kleine 
Denkfehler. Mach ich auch so.
Danach die einzelnen Blöcke in Code umsetzten.

von Tobias M. (tobi100)


Bewertung
-6 lesenswert
nicht lesenswert
Denn sagen sie mir doch bitte, wo ich das programmieren von Menüs leren 
könnte ?

von Bastler (Gast)


Bewertung
2 lesenswert
nicht lesenswert
Wie DEIN Menü aussehen soll weißt nur DU!

Du musst den Ablauf einfach mal aufzeichen.
Niemand weiß ob du einen oder 100 Untermenüs benötigst oder was auch 
immer.

von Tobias M. (tobi100)


Bewertung
-6 lesenswert
nicht lesenswert
Bastler schrieb:
> Hört sich anfangs blöd an, ist aber so:
>
> Programmieren tut man mit einem Stift und Papier.
>
> Skizziere dir den Ablauf auf, dann erkennst du auch schnell kleine
> Denkfehler. Mach ich auch so.
> Danach die einzelnen Blöcke in Code umsetzten.

Ja, hört sich schon mal gut an. Allerdings wüsste ich denn nicht, wie 
ich das  mit einem Taster ansteuern könnte.

von Markus S. (acepilot)


Bewertung
0 lesenswert
nicht lesenswert
Soll die Hintergrundbeleuchtung 10 Sekunden nach dem ersten Tastendruck 
oder 10 Sekunden nach dem letzten Tastendruck ausgehen? Was passiert 
wenn der Taster ein drittes mal gedrückt werden soll? Soll bei erneutem 
drücken des Tasters wieder auf die Uhrzeit gesprungen werden?

Hast du dich schonmal ansatzweise mit der Programmierung in Arduiono 
auseinander gesetzt? Oder kopierst du seid beginn einfach irgendwelche 
Codeschnipsel zusammen und hoffst das sie funktionieren?

Es wäre mit Sicherheit ratsam, wenn du dich erstmal mit den Grundlagen 
beschäftigst. Led ein und ausschalten auf Tastendruck. Das ganze 
vielleicht noch zeit gesteuert. Auch Zustandsautomaten ist ein Stichwort 
das du ergoogeln und verstehen lernen kannst. Einfach alles aus dem 
Forum vorgesagt bekommen ohne richtig selber zu werkeln ist doch auch 
langweilig, oder?

von Bastler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe meine Menüs immer gesplittet.
Menü_Handling();
Menü_Anzeige();

In der einen Routine bearbeite ich die Tasteneingaben und ändere meine 
Zustandsautomaten. In der Anderen mach ich die Ausgabe entsprechend zu 
den Zustandsautomaten.

Das Handling wird nur aufgerufen wenn eine Taste gedrückt wurde bzw. 
Zeit abgelaufen ist und die Anzeige erfolgt zyklisch (z.B. alle 100ms / 
300ms / ...).

von Cyblord -. (cyblord)


Bewertung
2 lesenswert
nicht lesenswert
Tobias M. schrieb:
> Ja, hört sich schon mal gut an. Allerdings wüsste ich denn nicht, wie
> ich das  mit einem Taster ansteuern könnte.

Mach doch mal ein Programm welches beim Druck auf einen Taster eine LED 
blinken lässt. Ganz ohne fertigen Code und libs.

Dann machst du ein Programm welches beim 1. Druck das Blinken 
einschaltet und bei 2. Druck wieder aus. Schon hast du Zustände gelernt.

Und so weiter.

Dann kommst du wieder mit LCD und Menüs.

von DoctorKnowItAll (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
>Arduino Menü erstellen

Ich nehm das Arduino Maxi mit Pommes und nem elektrolytischen Getränk

Ich programmier lieber python, das bringt spaß.
Für uC nehm ich auch das Forum XD

von Paul S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Tobias M. schrieb:
> Wenn ich den Taster zum ersten mal drücke, soll die Lcd Hintergrund
> Beleuchtung angehen.
> Beim Zweiten mal drücken, soll es von der Uhrzeit anzeige zur Temperatur
> anzeige überspringen.
> Und in jedem Fall, soll die Lcd Hintergrund Beleuchtung wieder in 10
> sek. ausgehen.

Wie schon gesagt wurde, wird dir keiner hier den Code vorprogrammieren. 
Das kannst du selbst können.
Arbeite nach dieser Struktur:
Deklariere eine Tastervariable als Integer mit dem Wert 0
Wenn der Taster gedrückt wird, 
   erhöhe diese Variable um 1
   Wenn sie dann 1 ist
      dann mach die Beleuchtung über einen IO-Pin an
      und setze einen Timer, der nach 10 Sekunden diesen Pin wieder ausschaltet
   Sonst
      Wenn sie dann 2 ist
         dann rufe die Funktion zur Uhrzeitumstellung auf

von Tobias M. (tobi100)


Bewertung
-1 lesenswert
nicht lesenswert
Markus S. schrieb:
> Soll die Hintergrundbeleuchtung 10 Sekunden nach dem ersten
> Tastendruck
> oder 10 Sekunden nach dem letzten Tastendruck ausgehen? Was passiert
> wenn der Taster ein drittes mal gedrückt werden soll? Soll bei erneutem
> drücken des Tasters wieder auf die Uhrzeit gesprungen werden?
>
> Hast du dich schonmal ansatzweise mit der Programmierung in Arduiono
> auseinander gesetzt? Oder kopierst du seid beginn einfach irgendwelche
> Codeschnipsel zusammen und hoffst das sie funktionieren?
>
> Es wäre mit Sicherheit ratsam, wenn du dich erstmal mit den Grundlagen
> beschäftigst. Led ein und ausschalten auf Tastendruck. Das ganze
> vielleicht noch zeit gesteuert. Auch Zustandsautomaten ist ein Stichwort
> das du ergoogeln und verstehen lernen kannst. Einfach alles aus dem
> Forum vorgesagt bekommen ohne richtig selber zu werkeln ist doch auch
> langweilig, oder?


Ja, ich habe mich schon damit auseinander gesetzt. Das Display Timeout 
könnte ich ja auch selber schreiben, nur ich weiß halt nicht wie ich ein 
Menü erstellen soll. Da würde mir halt schon ein einfachen Beispiel 
helfen. Die beiden Sketche sind aus dem Internet, Ja, allerdings habe 
ich sie umgeschrieben. Nun möchte ich allerdings einen neues Kapitel 
aufschlagen. Und das wäre halt das mit dem Menü.

Soll die Hintergrundbeleuchtung 10 Sekunden nach dem ersten Tastendruck
oder 10 Sekunden nach dem letzten Tastendruck ausgehen?

Nach dem letzten Tastendruck

Was passiert
wenn der Taster ein drittes mal gedrückt werden soll? Soll bei erneutem
drücken des Tasters wieder auf die Uhrzeit gesprungen werden?

Ja, es soll denn wieder von Anfang an los gehen.

von Samuel C. (neoexacun)


Bewertung
1 lesenswert
nicht lesenswert
Tobias M. schrieb:
> Ja, ich habe mich schon damit auseinander gesetzt. Das Display Timeout
> könnte ich ja auch selber schreiben, nur ich weiß halt nicht wie ich ein
> Menü erstellen soll. Da würde mir halt schon ein einfachen Beispiel
> helfen. Die beiden Sketche sind aus dem Internet, Ja, allerdings habe
> ich sie umgeschrieben. Nun möchte ich allerdings einen neues Kapitel
> aufschlagen. Und das wäre halt das mit dem Menü.
>
> Soll die Hintergrundbeleuchtung 10 Sekunden nach dem ersten Tastendruck
> oder 10 Sekunden nach dem letzten Tastendruck ausgehen?
>
> Nach dem letzten Tastendruck
>
> Was passiert
> wenn der Taster ein drittes mal gedrückt werden soll? Soll bei erneutem
> drücken des Tasters wieder auf die Uhrzeit gesprungen werden?
>
> Ja, es soll denn wieder von Anfang an los gehen.

Könntest du selber schreiben? Dann schreib es selber. Für das Menü 
kannst du dir den Artikel zu State-Machines anschauen, da steht alles 
erforderliche drin. Generell würde das Benutzen der Suchfunktion oder 
Google ziemlich helfen. Sketche kannst du scheinbar auch finden.

Ok, jetzt hast du die Fragen beantwortet. Gut. Jetzt kannst du sie nach 
und nach in ein Programm umwandeln.

Wenn du denkst, hier mit Forderungen und Beschwerden weiterzukommen, 
bist du falsch gewickelt. Jeder der dir hier antwortet stand schonmal 
vor den selben Problemen wie du und hat es gelöst ohne andere den Code 
schreiben zu lassen.

Du willst nicht, dass dir jemand den Code schreibt? Doch, genau das ist 
es was du willst. Du willst ein Beispiel haben, in dem du nur hier noch 
eine Variable umbenennen musst und hier noch einen Fall hinzufügen 
musst. Ein solches Beispiel wird dir hier niemand schreiben und mit 
weniger wirst du nicht zufrieden sein.

Du bist es gewohnt, einen passenden Sketch zu suchen und anzupassen. Nur 
muss ich dich da enttäuschen, das ist nicht Programmieren, das ist 
Copy&Paste. Wenn du programmieren willst, dann setze dich mit deinem 
Problem auseinander und schreib den Code. Wenn dir dein Problem bisher 
zu hoch ist, setze dir Zwischenziele. Anders lernt man Programmieren 
nicht.

: Bearbeitet durch User
von Draco (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ganz einfach gesagt:

Wenn Tastenvariable 0 -> Display im Normalzustand
Wenn Tastenvaribale 1 -> Display im Menü 1
Wenn Tastenvariable 2 -> Display im Menü 2
Wenn Tastenvariable 3 -> Tastenvariable 0
Wenn Lichttimer 10 -> Lichtaus

-> Tastendruck
   Beleuchtung ein - LichtTimer setzen
   Tastenvariable + 1


Nimm dir ein Stift zur Hand und mal dir das im Ablauf auf, wie du es 
haben willst - als Ablaufdiagramm.

https://de.wikipedia.org/wiki/Programmablaufplan


Poste das dann hier, du bekommst Hilfe, aber nichts fertiges Vorgekaut!

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Bastler schrieb:
> Programmieren tut man mit einem Stift und Papier.
>
> Skizziere dir den Ablauf auf,

ganz genauso!

Ich bin ja auch gerade dabei, ich skizziere mal den Weg:

man erstellt ein struct screen

struct screen
{ char zeile1[17];
  char zeile2[17];
}

man erstellt ein Array aus screens

oder so
char menu[MAX_SCREEN][MAX_LINES][MAX_CHAR+1];

ein Screen hat 2 Zeilen a 16 Zeichen die füllt man erst mal mit 
Leerzeilen aus 16 SPACE (dez=32) -> memcpy

Dann kann man locker zu jeder Zeit in den Screen MEM schreiben

Damit das LCD nicht das "flattern" bekommt wird das LCD nur 4x pro 
Sekunde aktualisiert (Timer)

Welcher Screen gerade angezeigt wird wählst du ja aus aus dem Array

von Draco (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@Joachim... er bekommt nicht mal nen Ablauf hin. :-D Lass ihn erstmal 
die Statemachine mit dem Ablauf machen. Egal ob er erstmal auf das 
Screen bloß ne 1-2-3 schreibt. Das überfordert ihn sicherlich gleich 
wieder.

von princess (Gast)


Bewertung
0 lesenswert
nicht lesenswert
LOL ihr seid aber auch gemein! Ich habe wirklich spaß gehabt.

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>@Joachim... er bekommt nicht mal nen Ablauf hin.

Macht nichts. Mit dem Ansatz von Joachim B.(jar) auch nicht.

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.