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
  Float array über NRF24L01 senden und empfangen Flo3107 6 527 04.09.2019 21:55
Letzter Beitrag: Tommy56
  Fern-Programmierung über Ethernet passra 14 1.299 09.04.2019 20:01
Letzter Beitrag: amithlon
  Blynk app über eduroam laufen lassen? WLAN Hanno 6 650 06.04.2019 22:03
Letzter Beitrag: Hilgi
  Steuerung Lüftungsanlage über Temperatursensoren roller64 7 880 06.04.2019 10:26
Letzter Beitrag: rkuehle
  Variablen über Eingabe im Setup beschreiben heini320 3 713 30.12.2018 11:37
Letzter Beitrag: Tommy56
  2 Pt1000 über externen AD wandler auslesen Noob63 16 2.581 15.11.2018 20:10
Letzter Beitrag: ardu_arne
  PHP WINDOWS XAMPP ARDUINO UNO SERVO steuern über Serielle Verbindung tr3 1 860 21.08.2018 21:59
Letzter Beitrag: georg01
  UDP Paket über UART senden (nicht SPI) Wampo 9 4.637 04.03.2018 18:49
Letzter Beitrag: Tommy56
  Variablenname über Schleife deklarieren golden_eagle 9 2.594 12.02.2018 22:36
Letzter Beitrag: golden_eagle
  Led über ethernet schalten dahans 2 1.450 06.02.2018 20:01
Letzter Beitrag: hotsystems

Gehe zu:


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