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
  RGB Animation über Serial Steuern Medolino 5 61 20.02.2017 16:14
Letzter Beitrag: Medolino
  Arduino-UNO LED über Taster digital zum leuchten zu bringen IvKriz 9 210 18.02.2017 08:33
Letzter Beitrag: renid55
  Servo-Ansteuerung über einen Push-Button Aubergine83 1 90 16.02.2017 19:49
Letzter Beitrag: georg01
  LED langsam über 15 Minuten dimmen Kriskind 14 427 09.02.2017 13:26
Letzter Beitrag: Kriskind
  Display über I2-Bus betreiben mfri 22 565 23.01.2017 11:06
Letzter Beitrag: renid55
  Messdatenausgabe auf Webserver über NanoESP RivaDynamite 10 519 10.01.2017 15:49
Letzter Beitrag: renid55
  Über drei Taster zwei externe Timer steuern Sidamo 23 503 09.01.2017 20:12
Letzter Beitrag: Tommy56
  LED Dimmen über Bewegungsmelder Jens040774 8 243 05.01.2017 19:07
Letzter Beitrag: renid55
  Variable über EEPROM in ein Script einbinden... Badger1875 5 538 01.01.2017 15:08
Letzter Beitrag: Tommy56
  Servo über Temperatur steuern querkopf71 3 259 07.12.2016 19:21
Letzter Beitrag: hotsystems

Gehe zu:


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