INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Menüführung über LCD!!!
21.02.2015, 15:13 (Dieser Beitrag wurde zuletzt bearbeitet: 21.02.2015 15:40 von Wampo.)
Beitrag #9
RE: Menüführung über LCD!!!
Probier mal :
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

keine Ahnung ob das was bringt, aber einfach probieren, hatte mit 0x27 auch so meine Probleme keine Anung warum?!

Zwecks programmstruktur über LCD, hab ich da was, allerdings eine andere richtung und mit einem Rotary Encoder. Vielleicht kannst du das ja als Menüstruktur brauchen.

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

int s = 00;
int m = 00;
int h = 00;

    long startneu;
    long startalt;

//PINBELEGEUNG
//DIGITAL
#define FOCUS_PIN 12
#define SHUTTER_PIN 13

//ANALOG
int LDR, LS, SOUND, PIR;
int LDRSCHW, LSSCHW, SOUNDSCHW, PIRSCHW, INTERVALZEIT, BULBTIME;
unsigned long counterldr, countersound, counterls, counterpir, counterinterval, counterbulb;
int shotdelay = 1000;
int tp;
int timesetting;



//ROTARY
#define PINA 2
#define PINB 7
#define PUSHP 3
#define INTERRUPT 0  // PIN 2
#define INTERRUPTB 1  // PIN 3

volatile boolean turned;   // rotary was turned
volatile boolean fired;    // knob was pushed
volatile boolean up;  // true when turned cw

int CursorLine = 0;
int DisplayFirstLine = 0;
char* MenueLine[] = {" Lichtsensor        "," Lichtschranke      ",
" Soundsensor        "," Bewegungssensor    "," Speed Shot         ",
" Intervall          "," Bulb               "," Systemtest         "," Einstellungen      "};
int MenueItems;

byte BUZ_PIN = 11;    // Buzzer
byte BUZ = 1;


// Anzeige der Sonderzeichen
byte darrow[8] = {
  B00100,
  B00100,
  B00100,
  B00100,
  B10101,
  B01110,
  B00100,
};

byte uarrow[8] = {
  B00100,
  B01110,
  B10101,
  B00100,
  B00100,
  B00100,
  B00100,
};

byte rarrow[8] = {
  B00000,
  B00100,
  B00010,
  B11111,
  B00010,
  B00100,
  B00000,
};

byte larrow[8] = {
  B00000,
  B00100,
  B01000,
  B11111,
  B01000,
  B00100,
  B00000,
};

byte fullblock[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};

byte button[8] = {
  B11111,
  B10001,
  B10001,
  B10101,
  B10001,
  B10001,
  B11111,
};

// Interrupt Service Routine for a change to pushpin
void isrp ()
{
  if (!digitalRead (PUSHP))
    fired = true;
}  // end of isr

// Interrupt Service Routine for a change to encoder pin A
void isr ()
{
  if (digitalRead (PINA))
    up = digitalRead (PINB);
  else
    up = !digitalRead (PINB);
  turned = true;
}  // end of isr


void setup ()
{
  pinMode(FOCUS_PIN, OUTPUT);
  pinMode(SHUTTER_PIN, OUTPUT);
  pinMode(BUZ_PIN, OUTPUT);
  
  digitalWrite (PINA, HIGH);     // enable pull-ups
  digitalWrite (PINB, HIGH);
  digitalWrite (PUSHP, HIGH);
  attachInterrupt (INTERRUPT, isr, CHANGE);   // interrupt 0 is pin 2
  attachInterrupt (INTERRUPTB, isrp, FALLING);   // interrupt 5 is pin 18
  

  lcd.begin (20,4);
  lcd.backlight();

  lcd.createChar(0, darrow);
  lcd.createChar(1, uarrow);
  lcd.createChar(2, larrow);
  lcd.createChar(3, rarrow);
  lcd.createChar(4, fullblock);
  lcd.createChar(5, button);

   /*lcd.setCursor(0,0);
   lcd.print("  DSLR Trigger Box  ");
   lcd.setCursor(0,1);
   lcd.print("Software Version 2.2");
   lcd.setCursor(0,2);
   lcd.print("     15-12-2013     ");
   lcd.setCursor(0,3);
   lcd.print("Written by Daniel A.");
   delay(3000);
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("INFO @ 0171/1798546");
  
   lcd.setCursor(0, 2);
   lcd.print("Starting EOS TRIGGER");
   lcd.setCursor(0, 3);
   for (int i=0; i<20; i++){
   lcd.write((byte)4);
   delay(150);}*/

  MenueItems = sizeof(MenueLine)/sizeof(MenueLine[0]);
  lcd.clear();
  print_menue();

}  // end of setup

void loop ()
{
  if (turned)
  {
    if (up)
      move_up();
    else
      move_down();
    turned = false;
  }
  else if (fired)
  {
    selection();
    fired = false;
  }  // end if fired
}  // end of loop

void print_menue() {
  
  tp = 0;
  for (int i=0;i<4;i++) {
    lcd.setCursor(0,i);
    lcd.print(MenueLine[DisplayFirstLine + i]);
  }
  lcd.setCursor(0,(CursorLine-DisplayFirstLine));
  lcd.write((byte)3);
}

void move_down() {
  if (CursorLine == (DisplayFirstLine+4-1)) {
    DisplayFirstLine++;
  }
  if (CursorLine == (MenueItems-1)) {
    CursorLine = 0;
    DisplayFirstLine = 0;
  }
  else {
    CursorLine=CursorLine+1;
  }
  print_menue();
}

void move_up() {
  if ((DisplayFirstLine == 0) & (CursorLine == 0)) {
    DisplayFirstLine = MenueItems-4;  
  }
  else if (DisplayFirstLine == CursorLine) {
    DisplayFirstLine--;
  }
  if (CursorLine == 0) {
    CursorLine = MenueItems-1;
  }
  else {
    CursorLine=CursorLine-1;
  }
  print_menue();
}



void selection() {

/*  lcd.clear();
   lcd.print("Menueauswahl Nr: ");
   lcd.print(CursorLine);
   lcd.setCursor(4,1);
   lcd.write((byte)0);
   lcd.print("        ");
   lcd.write((byte)0);
   delay(100);
   while(digitalRead(PUSHP)); */

  switch (CursorLine) {
  case 0:
    light_flashset();
    break;
  case 1:
    lsset();
    break;  
  case 2:
    soundset();
    break;  
  case 3:
    pirset();
    break;  
  case 4:
    manuell();
    break;  
  case 5:
    intervallset();
    break;  
  case 6:
    bulbset();
    break;
case 7:
    screentest();
    break;
case 8:
    settings();
    break;      
  default:
    break;
  }
  print_menue();
}

//MENÜS UND SUBMENÜS

void intervallset(){
  
  delay(150);
  lcd.clear();
  lcd.setCursor(0, 0);  
  lcd.print("Interval Set");
  lcd.setCursor(0, 1);  
  lcd.print("Set 1 sec - 9999 sec");
  do{
       if (turned){
    if (up){
      counterinterval--;}
    else{
      counterinterval++;
    }
    turned = false;
  }
  
    INTERVALZEIT = counterinterval;
    lcd.setCursor(0, 3);
    lcd.print("Interval: ");
    lcd.print(INTERVALZEIT);
    lcd.print(" sec ");
    
  }
  while(digitalRead(PUSHP));
  {
    interval();
  }
}

void interval(){
  delay(150);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Interval Mode");
    lcd.setCursor(0,1);
      lcd.print("Intervaltime: ");
      lcd.print(INTERVALZEIT);
      lcd.print(" sec");
      
  do{

      startneu  = (millis() - startalt) / 1000;
   if ( startneu >= INTERVALZEIT){
     shutter();
     startalt = millis();
  }
      lcd.setCursor(0,2);
      lcd.print("Passed: ");
      lcd.print(startneu +1);
      lcd.print("  ");
      lcd.setCursor(0,3);
      lcd.print("Pics: ");
      lcd.print(tp);
      lcd.print(" ");
    }
    while(digitalRead(PUSHP));
{
  print_menue();
}
}



void light_flashset(){
  
  delay(150);
  lcd.clear();
  lcd.setCursor(0, 0);  
  lcd.print("Blitzsensor Set");
  lcd.setCursor(0, 1);  
  lcd.print("Setting von 0 - 1020");
  do{
       if (turned){
    if (up){
    counterldr-=20;}
    else{

     counterldr+=20;}
    }
    turned = false;
  
    LDRSCHW = counterldr;
    lcd.setCursor(0, 3);
    lcd.print("Ist: ");
    lcd.print(analogRead(A0));
    lcd.print(" ");
    lcd.setCursor(10, 3);
    lcd.print("Soll: ");
    lcd.print(LDRSCHW);
    lcd.print(" ");
    lcd.setCursor(12, 3);
  }
  while(digitalRead(PUSHP));
  {
    light();
  }
}


void light(){
  delay(150);
  lcd.clear();
lcd.setCursor(0,0);
    lcd.print("Light laeuft");
do{
  lcd.setCursor(0,1);
  lcd.print("Ist: ");
  lcd.print(analogRead(A0));
  lcd.print(" ");
  lcd.setCursor(10,1);
  lcd.print("Soll: ");
  lcd.print(LDRSCHW);
  lcd.print(" ");
  lcd.setCursor(0,2);
  lcd.print("Pics: ");
  lcd.print(tp);
  lcd.print(" ");
  if (analogRead(A0) >= LDRSCHW){
  shutter();
}
}
while(digitalRead(PUSHP));
{
print_menue();
tp = 0;
}
}


void soundset(){
  delay(150);
  lcd.clear();
  lcd.setCursor(0, 0);  
  lcd.print("Sound Set");
  lcd.setCursor(0, 1);  
  lcd.print("Setting von 0 - 1023");
  do{
       if (turned){
    if (up){
      countersound-=10;}
    else{
      countersound+=10;
    }
    turned = false;
  }
  
    SOUNDSCHW = countersound;
    lcd.setCursor(0, 2);
    lcd.print("Ist:   ");
    lcd.print(analogRead(A2));
    lcd.print("    ");
    lcd.setCursor(0, 3);
    lcd.print("Soll:  ");
    lcd.print(SOUNDSCHW);
    lcd.print("    ");
    lcd.setCursor(12, 3);
  }
  while(digitalRead(PUSHP));
  {
    sound();
  }
}

void sound(){
  delay(150);
  lcd.clear();
lcd.setCursor(0,0);
    lcd.print("Sound laeuft");
do{
  lcd.setCursor(0,1);
  lcd.print("Ist: ");
  lcd.print(analogRead(A2));
  lcd.print(" ");
  lcd.setCursor(10,1);
  lcd.print("Soll: ");
  lcd.print(SOUNDSCHW);
  lcd.print(" ");
  lcd.setCursor(0,2);
  lcd.print("Pics: ");
  lcd.print(tp);
  lcd.print(" ");
  if (analogRead(A2) >= SOUNDSCHW){
  shutter();
}
}
while(digitalRead(PUSHP));
{
print_menue();
tp = 0;
}
}

void pirset(){
  
}

void bulbset(){
  delay(150);
  lcd.clear();
  lcd.setCursor(0, 0);  
  lcd.print("Bulb Set");
  do{
    if (turned){
    if (up){
      counterbulb--;}
    else{
      counterbulb++;
    }
    turned = false;
  }
  
    BULBTIME = counterbulb;
    lcd.setCursor(0, 2);
    lcd.print("Time Set: ");
    lcd.print(BULBTIME);
    lcd.print(" sec   ");
  }
  while(digitalRead(PUSHP));
  {
   timesetting = BULBTIME;
    bulb();
  }
}


void bulb(){
delay(150);
  lcd.clear();
  lcd.setCursor(0, 0);  
  lcd.print("Bulb Mode");
  do{
     delay(1000);
        s = s+1;
        if(s>59){m=m+1; s=00;}
        if(m>59){h=h+1; m=00;}

  lcd.setCursor(0, 3);  
  lcd.print("Time: ");
  lcd.print(h);
  printDigits(m);
  printDigits(s);

  }
  while(digitalRead(PUSHP));
  {
    print_menue();
  }
}


void manuell(){
shutter();
}



void lsset(){
  delay(150);
  lcd.clear();
  lcd.setCursor(0, 0);  
  lcd.print("Lichtschranke Set");
  do{
       if (turned){
    if (up){
      counterls-=10;}
    else{
      counterls+=10;
    }
    turned = false;
  }
  
    LSSCHW = counterls;
    lcd.setCursor(0, 2);
    lcd.print("Ist:   ");
    lcd.print(analogRead(A1));
    lcd.print("    ");
    lcd.setCursor(0, 3);
    lcd.print("Soll:  ");
    lcd.print(LSSCHW);
    lcd.print("    ");
    lcd.setCursor(12, 3);
  }
  while(digitalRead(PUSHP));
  {
    ls();
  }
}

void ls(){
delay(150);
  lcd.clear();
lcd.setCursor(0,0);
    lcd.print("Lichtschranke");
do{
  lcd.setCursor(0,1);
  lcd.print("Ist: ");
  lcd.print(analogRead(A1));
  lcd.print(" ");
  lcd.setCursor(10,1);
  lcd.print("Soll: ");
  lcd.print(LSSCHW);
  lcd.print(" ");
  lcd.setCursor(0,2);
  lcd.print("Pics: ");
  lcd.print(tp);
  lcd.print(" ");
  if (analogRead(A1) <= LSSCHW){
  shutter();
}
}
while(digitalRead(PUSHP));
{
print_menue();
tp = 0;
}
}

  
void mainscreen(){
  lcd.clear();
  lcd.setCursor(0,0);
    for (int i=0; i<20; i++){
  
      lcd.write((byte)4);
   delay(50);}
   lcd.setCursor(2,1);
   lcd.write((byte)0);
   lcd.print("Push The Button");
   lcd.setCursor(2,2);
   lcd.write((byte)5);
   while(digitalRead(PUSHP));
  lcd.noBlink();
  {
    print_menue();
  }
}

void screentest(){
       for (int i=0; i<80; i++){
     lcd.write((byte)4);
     delay(50);}
for (int t=0; t<5; t++){
     lcd.noBacklight();
     delay(250);
     lcd.backlight();
     delay(250);
        
   lcd.setCursor(2,1);
   lcd.write((byte)0);
   lcd.print("Push The Button");
   lcd.setCursor(2,2);
   lcd.write((byte)5);}
  while(digitalRead(PUSHP));

    print_menue();
  }





void shutter(){
  
   digitalWrite(SHUTTER_PIN, HIGH);
    if (BUZ == 1) {
    digitalWrite(BUZ_PIN,HIGH);
    delay(30);
    digitalWrite(BUZ_PIN, LOW);
    delay(60);
    digitalWrite(BUZ_PIN,HIGH);
    delay(30);
    digitalWrite(BUZ_PIN, LOW);
  } else {
     digitalWrite(BUZ_PIN, LOW);              
  }
    digitalWrite(SHUTTER_PIN, LOW);
          
         delay(shotdelay);
       tp++;
}
  
  
  void settings(){
  delay(100);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Shotdelay: ");
  lcd.setCursor(0, 3);
  lcd.print("Buzzer: ");  
  do{
       if (turned){
    if (up){
      shotdelay-=100;}
    else{
      shotdelay+=100;
    }
    turned = false;
  }
  
    lcd.setCursor(11,0);
    lcd.print(shotdelay);
    lcd.print(" ");
  }
  while(digitalRead(PUSHP));
  delay(150);
  do{
       if (turned){
    if (up){
      BUZ=0;}
    else{
      BUZ=1;
    }
    turned = false;
  }
  lcd.setCursor(11,3);
    lcd.print(BUZ);
    lcd.print("");
  }
    while(digitalRead(PUSHP));
    print_menue();
  }



void printDigits(int digits)
{
    // utility function for digital clock display: prints preceding colon and leading 0
    lcd.print(':');
    if(digits < 10)
        lcd.print('0');
    lcd.print(digits);
}
Greez
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 16:22
Beitrag #10
RE: Menüführung über LCD!!!
Also das mit der Adresse (0x27) stimmt schon. Laut I2C-Scanner ist das die richtige. Danke für deine Menüstruktur. Will aber versuchen meine iwie zum laufen zu bringen. Muss ja möglich sein.
Hab das jetzt mal so geändert. Stimmen tut aber nicht. Steh wohl auf dem Schlauch.
Code:
void lcd_Ausgabe (prog_char*a,prog_char*b,prog_char*c,prog_char*d)
{  
  lcd.setCursor ( 0, 0 );
  lcd.print(a);
  lcd.setCursor ( 0, 1 );
  lcd.print(b);
  lcd.setCursor ( 0, 2 );
  lcd.print(c);
  lcd.setCursor ( 0, 3 );
  lcd.print(d);
}
....
Code:
if(i==1)
    {
      lcd_Ausgabe (Serial.println(F("Hahnenschwanz v1.0")),Serial.println(F(" ")),
                   Serial.println(F("-> Cocktails")),Serial.println(F("  Fuellstaende ")));
    }
Wenn ich das so machen kommt die Fehlermeldung:
Zitat:Cocktail_v1.0.ino:94: error: invalid conversion from 'size_t' to 'prog_char*'
Cocktail_v1.0.ino:94: error: initializing argument 1 of 'void lcd_Ausgabe(prog_char*, prog_char*, prog_char*, prog_char*)'
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 18:19
Beitrag #11
RE: Menüführung über LCD!!!
Hi,
nein, so:
Code:
lcd_Ausgabe (F("Hahnenschwanz v1.0"),F(" "),F("-> Cocktails"),F("  Fuellstaende "));
Serial.println würde es ja auf die serielle Schnittstelle ausgeben.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 18:39
Beitrag #12
RE: Menüführung über LCD!!!
Hallo tomstem,

mit Bezug auf deinen Sketch im 1. Post würde ich die möglichen Werte in Arrays im PROGMEM ablegen. Zum auslesen dann die Adressen der Arrayelemente in den SRAM lesen und mittels dieser Adressen dann auf die Elemente zugreifen.
WIe das geht steht hier: http://www.mikrocontroller.net/articles/...erzugriffe sehr gut beschrieben (ab Abschnitt Array aus Strings).
Damit hört das Gehampel im Variablenstack der Funktionen auf und die Gefahr das strcpy einfach Speicher überschreibt wird wesentlich geringer. Ganz nebenbei dürfte der Code kleiner werden.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2015, 13:35
Beitrag #13
RE: Menüführung über LCD!!!
Hi,
wollte mich noch mal für das schnell und tolle Feedback bedanken. Hab mein Programm mit PROGMEM geschrieben und alles funktioniert bestens. Keine Fehler mehr.
Danke nochmalWink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Servo über Temperatur steuern querkopf71 3 70 07.12.2016 19:21
Letzter Beitrag: hotsystems
  Kommunikation über das WiFi-Shield Flap 3 234 07.11.2016 20:20
Letzter Beitrag: hotsystems
  Menü über Bluetooth Eingabe abwarten anwo 4 504 18.10.2016 08:59
Letzter Beitrag: Lolliball
  Daten über USB verarbeiten Felix91 10 326 12.10.2016 13:00
Letzter Beitrag: Tommy56
  Code mit Verifikation über Keypad & LCD machnetz 5 215 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Arduino Steuern über eigne Homepage b3ta 8 401 16.08.2016 11:07
Letzter Beitrag: Pit
  DUE-MEGA über I2C Verbinden HTO 0 222 22.05.2016 10:16
Letzter Beitrag: HTO
  Serial Monitor Eingabe über Code Maxi290997 4 522 12.05.2016 18:57
Letzter Beitrag: SkobyMobil
  "WORT" über die serielle Schnittstelle auslesen hannes77 1 536 08.03.2016 12:13
Letzter Beitrag: Binatone
  Über Pin43 den Pin42 steuern, ist das so richtig? arduinofan 5 490 01.02.2016 21:01
Letzter Beitrag: ardu_arne

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste