Show Posts
Pages: 1 2 [3] 4 5 ... 39
31  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: January 27, 2014, 08:10:59 am
Hi, die Funktion sorgt nur dafür das LCDML.checkButtons() funktioniert.
Es wird quasi das benötigte Bit in der Variable LCDML.button gesetzt.
32  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: January 25, 2014, 03:44:44 am
Hi,

die Funktion LCDML.checkButtons ist nur für 6 Buttons ausgelegt, daher werden deine eigenen nicht unterstützt. Die Zeile kann daher so direkt nicht funktionieren. Man könnte die Funktion aber Manuel setzen z.B:

Code:
//Gloable Variable, diese sollte irgendwo oberhalb der setup() stehen
char   g_save_keypad = 0;
/* callback function - FUNC_LED_standard */
uint8_t g_lightsetting_current_pos = 0;
/* falls noch keine globale timer variabel existiert, muss diese verwendet werden */
unsigned long g_timer_1 = 0;    /* timer variable */



/* serial menu control */
void LCDMenuLib_control_keypad()
{
    if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time))
    {
         /* minimal verändern */
         char l_key = kpd.getKey();   // das l_  steht für lokale variabel
      switch(l_key)
      {
        case 'E': LCDML.Button_enter(); break;
        case 'U': LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); break;
        case 'D': LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); break;
        case 'L': LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); break;
        case 'B': LCDML.Button_up_down_left_right(_LCDMenuLib_button_right); break;      
        case 'S': LCDML.Button_quit(); break;

        /* neu */
       case 'deine_zahl':  
          // Button Check setzen
          bitWrite(LCDML.button, _LCDMenuLib_button, 1);
          g_save_keypad = l_key;
      break;

      //.. weitere abfragen nach dem gleichen schema      
        default: break;
      }
    }


Anschließend folgt in deiner Menu Funktion folgendes:
Code:

void FUNC_Lightsetting(void)
{  
/* setup function */      
if(!LCDML.FuncInit())
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Startzeit: ");
lcd.print(erste_Null(g_hour_start));  
lcd.print(":");
lcd.print(erste_Null(g_minute_start));  
  
lcd.setCursor(0,1);
lcd.print("Stoppzeit: ");
lcd.print(erste_Null(g_hour_stopp));  
lcd.print(":");
lcd.print(erste_Null(g_minute_stopp));  
lcd.setCursor(11,0);
lcd.blink();
}

// Die while schleife ist hier eine dumme lösung, da alle anderen funktionen nun darauf warten
// Weitere verbesserung, du führst die key-48 operation an mehreren stellen aus, an einer wäre angenehmer oder ?
 
// g_save_keypad >= '0'  liefert einen vergleich mit der zahl 48 die in ascii 0 enspricht
// g_Save_keypad <= '9'  liefert einen vergleich mit der zahl 57 die in ascii 9 enspricht
if(LCDML.checkButtons() && g_save_keypad >= '0' && g_save_keypad <= '9' && g_lightsetting_current_pos < 8)
{
Serial.println("Button");

Serial.print(g_lightsetting_current_pos+1);
Serial.print(". Stelle");



switch(g_lightsetting_current_pos)
{
//1. Ziffer///////////////////////////////////////////Eingabe Stunde Start////////
case 0:  
              if(g_save_keypad-48 <=2)
                {
                  lcd.print(g_save_keypad);
                  g_hour_start = 10 * (g_save_keypad-48);
                  lcd.setCursor(12,0);
 g_lightsetting_current_pos++;
                }        

break;

case 1://2. Ziffer
              
              lcd.print(g_save_keypad);
              g_hour_start = g_hour_start + (g_save_keypad-48);  
              if(g_hour_start<=24) {
 lcd.setCursor(14,0);
 g_lightsetting_current_pos++;
 }
            
              break;/////////////////////////////////////////////////////////////////////////////////
              
             case 2://3. Ziffer//////////////////////////////////Eingabe Minute Start////////////////
            
              if(g_save_keypad-48 <=5)
                {
                  lcd.print(g_save_keypad);
                  g_minute_start = 10 * (g_save_keypad-48);
                  lcd.setCursor(15,0);
 g_lightsetting_current_pos++;
                }
            
              break;
              
             case 3://4. Ziffer
            
              lcd.print(g_save_keypad);
              g_minute_start = g_minute_start + (g_save_keypad-48);              
              if(g_minute_start<=59) {
 lcd.setCursor(11,1);
 g_lightsetting_current_pos++;
 }
            
              break;/////////////////////////////////////////////////////////////////////////////////
 
             case 4://1. Ziffer///////////////////////////////////////////Eingabe Stunde Stopp////////
            
              if(g_save_keypad-48 <=2)
                {
                  lcd.print(g_save_keypad);
                  g_hour_stopp = 10 * (g_save_keypad-48);
                  lcd.setCursor(12,1);
 g_lightsetting_current_pos++;
                }
            
              break;
              
             case 5://2. Ziffer
              
              lcd.print(g_save_keypad);
              g_hour_stopp = g_hour_stopp + (g_save_keypad-48);  
              if(g_hour_stopp<=24) {
 lcd.setCursor(14,1);
 g_lightsetting_current_pos++;
 }
            
              break;/////////////////////////////////////////////////////////////////////////////////
              
             case 6://3. Ziffer//////////////////////////////////Eingabe Minute Stopp////////////////
            
              if(g_save_keypad-48 <=5)
                {
                  lcd.print(g_save_keypad);
                  g_minute_stopp = 10 * (g_save_keypad-48);
                  lcd.setCursor(15,1);
 g_lightsetting_current_pos++;
                }
            
              break;
              
             case 7://4. Ziffer              
              lcd.print(g_save_keypad);
              g_minute_stopp = g_minute_stopp + (g_save_keypad-48);              
              if(g_minute_stopp<=59) {
 lcd.setCursor(11,2);
 g_lightsetting_current_pos++;
 }
            
              break;/////////////////////////////////////////////////////////////////////////////////

 default: break;
          
             }  


}



if(g_lightsetting_current_pos >= 8)
{
// Damit das lcd nicht zuschnell blinkt
if(LCDML.Timer(g_timer_1, 1000))
{
lcd.print("OK!");
Serial.println(g_hour_start);
Serial.println(g_minute_start);
}

// Abbruch erst erlauben, wenn die 8 Ziffern eingegeben wurden
/* end function for callback */
 if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1))  /* (direct, up, down, left, right) */
 {
lcd.noBlink();
 }
}
}

Ich konnte den Code nicht testen, daher sind vermutlich noch kleine Fehler drin. Die While Schleife hab ich entfernt, da sie nicht mehr benötigt wird.

Im Normalfall sollte man mit Quit die Funktion trotz Zahleneingabe verlassen können.
33  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: January 02, 2014, 05:38:19 am
Hi,
diese Funktionalität wird so leider nicht unterstützt. Man kann sich alles selber so schreiben und anpassen, aber da es jeder dann anders haben will ist das so nicht vorgesehen und auch mit einigem Arbeitsaufwand verbunden.
34  International / Deutsch / Re: 2 Loops auf einmal. Ist das möglich ??? on: January 02, 2014, 03:57:03 am
Falls man ein paar mehr Funktionen haben will und eine Struktur bei der man nicht den überblick verliert kann man auch dies hier nutzen.

simpleThreads
35  International / Deutsch / Re: Menüstruktur UTFT on: January 02, 2014, 03:38:44 am
Du könntest die Funktion in der du bist zwischenspeichern und immer erneut aufrufen. Dieses Verfahren verwende ich in der LCDMenuLib.
Alternative könntest du im Menu nur Variablen (siehe weiter unten unter Edit1) setzen und diese in der Loop Funktion abfragen und dann den Inhalt ausführen. Beide Varianten sind möglich.

Eine andere Möglichkeit wäre die Lib  simpleThreads.
In jedem Menupunkt schreibst du dann:
- simpleThread_group_stop(thread_group_name); // alle alten menufunktionen stoppen
- simpleThread_start(thread_name); // neue menufunktion starten

Dieses muss wie jetzt auch nur einmal ausgeführt werden. Der Menupunktinhalt befindet sich dann im Thread.

Thread => Funktion die Kontinuierlich nach x Millisekunden aufgerufen wird. Mehr dazu hier:
http://forum.arduino.cc/index.php?topic=165552.0


Edit 1:
Dann noch etwas zu deinem Code.
Du benötigst in der Loop Funktion keine while(true)  da die Loop Funktion ja schon in der Schleife läuft.

Du könntest die Loop Funktion auch wie folgt aufbauen:

Code:
void loop()

{
  //while (true)  diese Zeilen löschen
  //{
      //menu immer erneut aufrufen
      switch(menu) {
        case 1:
           Menu1();
           break;

        case 2:
           Menu2();
           break;

        case .....
           .....
        
         default:
            //menu nicht aktiv
            break;
        }

        //.. ab hier der restliche code der das touch display auswertet und neue menufunktionen startet


36  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: December 28, 2013, 04:19:37 am
Vielleicht auch noch ein anderer Fehler:

Code:
LCDMenuLib_element(5  , Item         , Item_3        , "Sp\365lung"         , FUNC);                // Bereich_4  Spülung
LCDMenuLib_element(6  , Item_3       , Item_3_1      , "Intervalsp\365len"  , FUNC);                // Submenü Intervalspülen
LCDMenuLib_element(7  , Item_3       , Item_3_1_1    , "Zeit"               , FUNC);                // Spülen nach Uhrzeit
LCDMenuLib_element(8  , Item_3       , Item_3_1_2    , "Wochentag"          , FUNC);                // Spülen nach Wochentag
LCDMenuLib_element(9  , Item_3       , Item_3_1_3    , "Zur\365ck"          , FUNC_back);           // Zurück

Sollte vermutlich so aussehen

Code:
LCDMenuLib_element(5  , Item         , Item_3        , "Sp\365lung"         , FUNC);                // Bereich_4  Spülung
LCDMenuLib_element(6  , Item_3       , Item_3_1      , "Intervalsp\365len"  , FUNC);                // Submenü Intervalspülen
LCDMenuLib_element(7  , Item_3_1       , Item_3_1_1    , "Zeit"               , FUNC);                // Spülen nach Uhrzeit
LCDMenuLib_element(8  , Item_3_1       , Item_3_1_2    , "Wochentag"          , FUNC);                // Spülen nach Wochentag
LCDMenuLib_element(9  , Item_3_1       , Item_3_1_3    , "Zur\365ck"          , FUNC_back);           // Zurück

da ansonsten die eine Ebene wegfällt.
37  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: December 23, 2013, 11:05:33 am
Ich kann mir das gerade nicht erklären.
Vor allem, da es bei anderen Displays läuft. (20x4). Nur der Versatz von 4 Zeichen ist so auffällig, dass ich einen Bug nicht ausschließen kann.

In der Lib wird mit
Code:
lcd->_LCDML_lcd_setCursor(0,i-scroll);
lcd->_LCDML_lcd_write(0x20);                        
lcd->_LCDML_lcd_print(buffer);

Der Inhalt geschrieben. Da der Cursor vorher explizit auf 0 gesetzt wird versteh ich nicht wieso er bei 4 anfängt. Naja, man lernt immer dazu.

Muss nun aber auch los. Nach Weihnachten kann ich tiefer suche. Ich habe im Moment keinen Arduino und kein Display in der Nähe.
38  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: December 23, 2013, 10:53:12 am
Ich habe gerade nochmal in den Quelltext geschaut. Es wird nicht überprüft ob die Zeichenlänge des Textes auch in das Display passt.

Kannst du sicher sein, dass der Text der Menuelemente nicht zu lang ist  und wird der Scrollbalken und der Kursor an der richtigen stelle angezeigt ?
39  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: December 23, 2013, 10:45:08 am
Das passt trotzdem, die Lib arbeitet mit 4.5.6.7.   Nur es gab mal fragen wieso die Nummerierung erst bei 4 beginnt, darauf hin habe ich die Nummerierung von 0 - 3 gemacht. Dies ist mit 4 - 7  gleichzusetzen.

Ich schau gerade mal in den Quellcode, ein Display mit 16x4 hab ich bisher noch nie gesehen und konnte es auch nicht testen. Vielleicht liegt hier der Fehler. Muss aber nicht.

Wo kann man denn 16x4 Displays kaufen ?  Ich kenne nur 16x2, 20x4, 40x4

Sind eventuell die Strings in der Namensgebung zu lang, so dass diese bis in die nächste Zeile gehen ?
40  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: December 19, 2013, 12:52:40 pm
Quote
Edit 2: Nachdem ich es eingefügt habe und erfolgreich kompiliert wurde, hab ichs wieder gelöscht und es wurde wieder erfolgreich kompiliert.

Hmm, sprachlos  smiley

Ohne I2C kannst du auch einfach die Standard LiquidCrystal Lib verwenden.

41  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: December 19, 2013, 04:30:47 am
Ich hab es gerade nochmal getestet.

1. alte LiquidCrystal Lib aus dem Lib Verzeichnis entfernen. Z.B. einen Ordner nach oben kopieren.
   Umbennen funktioniert hier nicht, da die Lib ansonsten immer noch gefunden wird.

2. Diese Lib herunterladen und ins Libverzeichnis kopieren
     https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

3. In der ___config.h  die Zeile 46 auskommentieren (Wert 0) und die Zeile 57 (Wert 10) einkommentieren
     Wenn es mit der Zeile 57 geht geht es auch mit allen anderen

4. Die Arduino Software sollte ganz geschlossen werden. Da ansonsten die neue Lib nicht erkannt wird.

5. Beispielsketch compelieren

So treten bei mir keine Fehler auf.

Edit 1:
Vielleicht noch eine andere Sache.
Wenn man aus versehen den das normale Beispiel geladen hat anstatt das I2C Beispiel könnte der Fehler eventuell bedeuten das die "#include <Wire.h>"  nicht  im Sketch eingebunden wird so wie es beim I2C Beispiel der Fall ist.
42  International / Deutsch / Re: COMPort Monitor on: December 07, 2013, 09:50:05 am
Das sieht gut aus.

Ich mach es auch immer so wie du, sobald mir irgendetwas zu lästig wird entsteht eine Lib oder ein Programm, welches das vorhandene Problem löst. So denkt man als Ingenieur  smiley
Geht nicht gibt es nicht, und wenn doch wird eine modifizierte Lösung gefunden.
43  International / Deutsch / Re: Led-Run Stripes Problem on: December 07, 2013, 08:26:31 am
Ich heiß zwar nicht Uwe, fühl mich aber, da du in einem öffentlichen Forum mit vielen tausend Nutzern fragst, ausnahmsweise, heute mal auch angesprochen.

Wenn die Leds einfach nur ein wenig leuchten und das vereinzelt in unterschiedlichen Farben deutet das darauf hin, das entweder die Strip falsch herum angeschlossen ist, also "Data Out" hängt am Mikrocontroller, und "Data In" ist auf der anderen Seite offen. Oder die Anschlusskabel für die Datenleitung keinen richtigen Kontakt haben und offen liegen.

Normalerweise sollten LED Strips auch mit langen ungeschirmten Leitungen noch Funktionieren.

Gruß
Jomelo
44  International / Deutsch / Re: Arduino Homecontrol - kurze Projektvorstellung on: December 06, 2013, 08:51:14 am
Hi,
schau dir auch mal diesen Beitrag an:

http://forum.arduino.cc/index.php?topic=191827.0

Die Sicherheit bei so einem System welches eventuell auch von außen (aus dem Internet) erreichbar sein soll, sollte nicht als letzter Punkt betrachtet werden. In dem Beispiel habe ich eine Verbindung zwischen einem Arduino und einem Webserver welcher auf dem Raspberry Pi läuft hergestellt.
45  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: December 06, 2013, 03:28:30 am
Dort stehen die fehlenden Konstanten:
Jedes Display braucht unterschiedliche, daher befinden sich nicht alle mit im Beispiel.

Code:
//Liquidcrystal 4Bit Mode    
#define _LCDMenuLib_LCD_rs                        4
#define _LCDMenuLib_LCD_e                         5
#define _LCDMenuLib_LCD_dat0                      8
#define _LCDMenuLib_LCD_dat1                      9
#define _LCDMenuLib_LCD_dat2                      7
#define _LCDMenuLib_LCD_dat3                      11
//read write
#define _LCDMenuLib_LCD_rw                        0
//8bit mode
#define _LCDMenuLib_LCD_dat4                      0    
#define _LCDMenuLib_LCD_dat5                      0    
#define _LCDMenuLib_LCD_dat6                      0      
#define _LCDMenuLib_LCD_dat7                      0
//backlight
#define _LCDMenuLib_LCD_backlight                 0
#define _LCDMenuLib_LCD_backlight_pol             0
//i2c address
#define _LCDMenuLib_LCD_addr                      0x20

Desweiteren sollte diese Lib für I2C verwendet werden:
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

Teste erst ob du eine Ausgabe mit der Lib ohne das Menü bekommst.
Anschließend kannst du in der LCDMenuLib___config.h  deine Konfigurationsmöglichkeit auswählen.
Danach solltest du auch eine Ausgabe mit der LCDMenuLib bekommen.

Das normale Beispiel und das Beispiel mit I2C unterscheiden sich nur in den I2C Einstellungen, der Rest ist gleich.
Einige andere hier konnten ohne Problem I2C einsetzen. Daher bin ich ein wenig verwundert.
Pages: 1 2 [3] 4 5 ... 39