Show Posts
Pages: 1 [2] 3 4 ... 44
16  International / Deutsch / Re: Zeitscheiben für Ereignisse vernünftig programmieren on: July 23, 2014, 07:21:52 am
Hi,
zu deinem Delay Problem schau dir mal dieses Thema an:
http://forum.arduino.cc/index.php?topic=165552.0

Stell es dir einfach als ganz viele Loop Schleifen vor, nur das diese nicht immer Aufgerufen werden, sondern zu einem Intervall (alle x Milli-/Mikrosekunden/Minuten/...). Genauso können diese gestoppt und neu gestartet werden.
17  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: July 23, 2014, 03:18:59 am
Hi,
irgendwie haben damit mehrere Leute ab und zu Probleme. Ab und zu läuft es auch ohne Probleme.
Es gibt eine debounce Lib die sich um das Entprellen von Tastern / Schaltern kümmert.

Kommentier in der Loop mal LCDMenuLib_control_digital aus und binde direkt die Lib ein mit den Funktionen die du benötigst.

Pseudocode:
Code:
if(debounce_dein_button_enter() ...)
   LCDML.Button_enter();

if (...)
   LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);

if ..
   LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);

// oder einen dieser virtuellen Menu Buttons
LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
LCDML.Button_quit();

Ich hoffe das führt zum Ziel.
Falls du eine Lauffähige Version hast, würde ich mich über die Lösung freuen und den Code bei mir integrieren.
18  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: July 22, 2014, 04:04:07 pm
Was heißt: "unzuverlässig direkt nach dem einschalten".
Beschreib mal genauer was passiert und was wann unzuverlässig ist.
Welchen Arduino verwendest du ?
In welcher Form hast du die Lib verändert, weil du ja sagtest, du hättest alle Versionen ausprobiert ? Welche Versionen ?
19  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: July 22, 2014, 06:18:52 am
Es scheint als sei deine g_LCDMenuLib_press_time Zeit zu klein. Wie hast du den Wert eingestellt ?

Hast du direkt das Beispiel getestet oder schon modifikationen am Code vorgenommen ?
20  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: July 04, 2014, 01:24:02 am
Hi,
das ist nur der letzte Ausschnit der Fehlermeldung, kannst du bitte auch einen Screenshot vom Anfang hochladen ?

Mögliche Fehler:
- Falsche I2C Lib eingebunden benötigt wird: (LiquidCrystal_new Version 1.2.1)
- In der LCDMenuLib___config.h  darf nur eine Zeile aktive sein, alles andere sollte auskommentiert sein.
- Ist das richtige Beispiel geladen ?
21  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: July 01, 2014, 10:15:53 am
@m6m7m9

Dann ist das schon eher möglich. Also mit diesem code kann ich die letzte Ebene Auslesen, insofern es nicht die Rootebene ist. Ich denke wenn du damit etwas "rumspielst" bekommst du damit deine Lösung umgesetzt. Der "Back" Button wird auch noch nicht utnerstützt, aber die Werte kann man auch wohl so irgendwie zurücksetzen.

Code:
//....
uint8_t g_last = _LCDMenuLib_NO_FUNC;

void loop()
{  
 // hier noch so anpassen, das es bei dir läuft
  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_serial();        /* lcd menu control */  
  LCDMenuLib_loop();                  /* lcd function call */


  
  uint8_t num = LCDML.getFunction();
  
  
  if(num != _LCDMenuLib_NO_FUNC) {    
    if(g_last != num) {
      if(g_last != _LCDMenuLib_NO_FUNC) {
        // Auslesen
        char name[20];
        strcpy_P(name, (char*)pgm_read_word(&(g_LCDMenuLib_lang_table[g_last])));
        Serial.println(name);
      }
      g_last = num;
    }
  }
}
22  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: July 01, 2014, 09:55:54 am
@AndiBar

Ich hab mir deinen Code mal angeschaut, dort gibt es noch einiges an Optimierungspotenzial. Zudem hast du dir die Beispiele des Menüs nicht richtig angeschaut, da dort schon ein Timer mit millis verwendet wird, der fast genau das macht was du vor hast.

Dein Code angepasst zum lernen:  WICHTIG: schau dir das genau an
Code:
// Konstanten kannst du auch mit #define schreiben. Die Bezeichnung #define wird beim übersetzen der Software
// vom Preprozessor im Programmcode ersetzt. Sieh es einfach als Platzhalter an, die du zu Laufzeit des Programms
// nicht verändern kannst
const int kompressorMax = 405;
const int kompressorMin = 610;

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  lcd.begin(16,2);
  // das auslesen des Sensors macht hier keinen sinn, da die Variable sensorValue in dieser Funktion angelegt wird
  // Normale Variablen in Funktionen sind nur solange gesetzt, wie die funktion geöffnet ist.
  int sensorValue = analogRead(A1);
  int vari;
  // Den LED Pin kannst du auch per #define anlegen, da dieser ja Fest ist bzw sich die angeschlossene Hardware in den
  // seltensten Fällen ohne neue Softwareanpassung einfach ändert
  int led = 2;
  pinMode(led, OUTPUT);
 
}

// the loop routine runs over and over again forever:
void loop() {
  // siehe oben
  int led = 2;


  int sensorValue = analogRead(A1);
  int vari;
  
// Die Abfrage lässt sich wesentlich kürzer darstellen, wenn du die ersten beiden Abfragen mit einem "ODER" verknüpfst
 if (sensorValue < kompressorMax) {
   digitalWrite(led, LOW);
 }
 else if (sensorValue > kompressorMin) {
   digitalWrite(led, LOW);
  
 }
 else {
   digitalWrite(led, HIGH);
 }
  // print out the value you read:
vari = (100 - ((100 / 1023.0) * sensorValue));

// Jegliche Speicherung von Strings,  z.b. "Poti" wird im Ram des Kontrollers abgelegt. Da der Ram sehr sehr klein ist, solltest
// du darauf achten, nicht zu viel mit unnützen Strings zu verschwenden. Eine Alternative ist das F Makro. Mit diesem werden
// Strings im Flashspeicher abgelegt, davon ist meistens genug vorhanden.     F("Poti")
Serial.print("Poti ");
Serial.print(vari);
Serial.print( "%");
Serial.println("...");
Serial.print(sensorValue);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Poti");
lcd.setCursor(5,1);
lcd.print(vari);
lcd.print("%");

// Verwende niemals delay in deinen Programmen, außer du weißt 110% was du machst, wieso du das machst und
// das es keine andere Lösung gibt
delay(1000);
}

So nun zu der Funktion im Menü. Diese ist nun nicht mehr erklärt, da die Erklärungen oben im Code stehen
Code:
#define LED  2
#define KOMPRESSOR_MAX 405
#define KOMPRESSOR_MIN 610

uint8_t g_func_timer_DEIN_NAME = 0;  /* time counter */
unsigned long g_timer_DEIN_NAME = 0;    /* timer variable */

/* callback function - FUNC_information */
void FUNC_DEIN_NAME(void)
{
  /* setup function */       
  if(!LCDML.FuncInit())
  {
    /* clear the display and init the time counter value */         
    lcd.clear();
    lcd.print(F("x sec warten"));     
         
  }
     
  if(LCDML.Timer(g_timer_1, 1000)) {      /* init a timer with 1000ms */
   
    unsigned int sensorValue = analogRead(A1);
   
 
    if (sensorValue < KOMPRESSOR_MAX || sensorValue > KOMPRESSOR_MIN) {
      digitalWrite(LED, LOW);   
    } else {
      digitalWrite(LED, HIGH);
    }
   
    // print out the value you read:
    unsigned char vari = (100 - ((100 / 1023.0) * sensorValue));
   
    Serial.print(F("Poti "));
    Serial.print(vari);
    Serial.print(F("%"));
    Serial.println(F("..."));
    Serial.print(sensorValue);
   
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(F("Poti"));
    lcd.setCursor(5,1);
    lcd.print(vari);
    lcd.print(F("%"));
  }   
 
 
  /* end function for callback */
  if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0)) /* (direct, enter, up, down, left, right) */ 
  {
    /* do something bevor this function is closed */     
  } 
   
 
}


23  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: July 01, 2014, 09:30:15 am
@m6m7m9
Ich habs gerade mal ausprobiert, das klappt so nicht, da das Menü nur neu aufgebaut wird, wenn Enter gedrückt wird oder der Kursor aus den sichtbaren Bereich heraus bewegt wird. Bei der Scrollbewegung wird nur der Kursor bewegt, ansonsten ändert sicht erstmal nichts in der Lib. Die Änderung wäre somit nur mit einem größerem umschreiben der Lib möglich und zudem belegt das noch mehr Speicher, da Variablen zwischengespeichert werden müssen.

Wozu brauchst du das denn genau ? Eigentlich weißt du doch in welcher Funktion sich das Menü gerade befindet und kannst eine Variable passend beschreiben, das geht deutlich schneller als alles umzuschrieben.

24  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: July 01, 2014, 04:31:26 am
@AndiBar, das umsetzen ist nicht so kompliziert, ich kann dir heute abend noch Tipps geben. Schau dir doch mal in der zwischenzeit an, wie man ein Programm ohne DELAYs aufbaut.

@m6m7m9
Das ist so nicht direkt vorgesehen. Probier mal diese Zeile. Ich habs noch nicht testen können:

Code:
// Funktioniert nicht
Um die Zeile zu verstehen sind tiefere c Kenntnisse nötig und der Umgang mit dem Speichern und Laden von Variablen die im Flash abgelegt werden. Ich werde es auch heute Abend mal testen.
25  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: June 29, 2014, 02:54:27 pm
Hi,
so im Moment ist es nicht vorgesehen in der Lib. Die Menü Inhalte werden im Flashspeicher des Programms abgelegt, daher können die Einträge nicht dynamisch verändert werden.

Aber:
Du kannst natürlich die Werte überschreiben solange du im Hauptmenü bist. Ich hab nun im Moment keinen Aufbau hier um es direkt zu testen. Aber ich kann Tipps und Ideen geben.

In der LCDMenuLib.h muss unter public: folgende Zeile eingefügt werden:
Code:
// zb nach dieser Funktion:
/* get the init screen enable bit */
uint8_t getInitScreenActive();
// diese Zeile einfügen
uint8_t getCursorPos();

In der LCDMenuLib.cpp muss ans Ende der Datei folgendes eingefügt werden:
Code:
uint8_t LCDMenuLib::getCursorPos()
{
return curloc; //in dieser Variable steht die aktuelle Cursor Position
}

So, nun können wir mit  LCDML.getCursorPos die aktuelle Cursor Position auslesen

Der folgende Code muss in der Loop Funktion untergebracht werden, hinter der Funktion die das Menu läd, so dass es regelmäßig überschrieben wird. Der Code ist nicht getestet und besteht teilweise aus Pseudocode


Code:
//globale variable als speicher
uint8_t refresh_menu = 0;
uint8_t status_heizung = 0;
uint8_t status_time = 30;

void loop()
{
  //so anpassen wie bei dir
  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_serial();        /* lcd menu control */  
  LCDMenuLib_loop();                  /* lcd function call */

  //pseudocode, nicht getestet
  
  // Herausfinden ob man im Hauptmenu ist, kein Initscreen aktiv ist und keine Funktion
  if(LCDMenuLib_getActiveFuncId() == _LCDMenuLib_NO_FUNC && LCDML.getLayer() == 0 && getInitScreenActive == false) {
    // Abfragen wo der Cursor gerade steht, Buttons müssen noch irgendwie entprellt werden.
    if(button links oder rechts gedrückt, z.B. mit digitalRead oder analogRead(xx) == xxx)
    {
     // auslesen welcher button gedrückt wurde
       uint8_t left_or_right = 0;  //0 = left, 1 = right

      switch(LCDML.getCursorPos())
      {    
          case 1:  // oder eine andere Zahl für Heizung
            if(left_or_right == 0 && status_heizung == 1) { //left
              status_heizung = 0;
            } else if(left_or_right == 1 && status_heizung == 0) { //right
              status_heizung = 1;
            }
            refresh_menu = 1;
            break:

     case 2: // oder anders für Time
       if(status_time > 0 && left_or_right == 0) { //left
         status_time--;
       } else if(status_time < maximum && left_or_right == 1) { //right
         status_time++;
        }
        refresh_menu = 1;
       break;
      }
   }

    if(refresh_menu == 1) {
       refresh_menu = 0;
      // root ebene
      // ab hier folgt pseudocode
      lcd.setCursor(xxxx);
      lcd.print(status_heizung);
      lcd.setCursor(xxxx);
      lcd.print(status_time);
 
    }
  }


}

Ich weiß nun nicht ob ich alle Klammern geschlossen habe. Ich hab das nur eben hier geschrieben und nirgendwo getestet. Das ganze funktioniert auch nur, wenn auf der Root Ebene nicht gescrollt werden kann, da ansonsten die Positionen immer angepasst werden müssen. Wäre auch möglich, ist aber mehr Aufwand.

Ich hoffe das Hilft dir weiter deine Lösung umzusetzen.

26  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: June 24, 2014, 05:07:32 am
Anfängerfragen kann man immer stellen  smiley-razz. Irgendwoher muss ja das Wissen kommen
27  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: June 24, 2014, 03:46:59 am
Das befindet sich ganz am Anfang in der LCDML_control:
Code:
void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         1   
  #define _BUTTON_digital_up            2
  #define _BUTTON_digital_down          3
  //optional
  #define _BUTTON_digital_enable_quit   1
  #define _BUTTON_digital_quit          4
  //optional
  #define _BUTTON_digital_enable_lr     1
  #define _BUTTON_digital_left          5
  #define _BUTTON_digital_right         6
...

Dann musst du noch in der Haupdatei folgendes ändern:
Code:
void loop()

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_serial();        /* lcd menu control */ 
  LCDMenuLib_loop();                  /* lcd function call */

  //other function ... for example simple threads ..   
}

Aber das sind wirklich die Grundlagen, wenn man von der Materie noch garkeine Ahnung hat, sollte man nicht gleich mit etwas komplizierten Anfangen, sondern erst die ganzen Beispiele probieren und sich langsamm vortasten.
28  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: June 23, 2014, 08:13:43 am
Privatenachricht:
Hey Jomelo,
als erstes Mal vielen dank für dein Projekt. Sieht einfach großartig aus!

Ich bin gelernter Elektroniker für Geräte und Systeme und habe leider nur Programmier Kenntnisse in Assembler (PIC). Ich versuche mich seit einiger Zeit an dem Arduino und bin begeistert. Was es hier für ein Forum und somit auch Unterstützung gibt, kannte ich so noch gar nicht...

naja, wie dem auch sei. ich will dein Menü über einfache Taster steuern. Ich stehe vermutlich einfach nur auf dem schlauch, aber ich raff einfach nicht wie das gehen soll... Das Menü dreht jedes mal durch wenn ich was an der Control ändere. So als hätte ich lauter offene oder nicht definierte Eingänge.
Ich kann mir aber nicht erklären wo das her kommt.

Hast du da vil eine Idee oder kannst mir vil einen tipp geben wie ich eine solche Steuerung bei deinem Projekt realisieren kann  (ich vermute mal das es so was schon iwo gibt, ich einfach nur zu doof bin das zu finden. Falls es so sein sollte, entschuldige ich mich hiermit gleich schon mal vorne weg)…

Wie sind deine Taster denn angeschlossen ?
Hast du Pullup / -down Widerstände an den Eingängen falls der Taster nicht gedrückt ist.
Normalerweise sind die Taster über den Timer (Software)  entprellt, aber dein beschriebenes Verhalten deutet wie du schon sagtest auf offene Eingänge hin.
Funktioniert das Menü wenn du es über die Tastatur bedienst ?
29  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: June 17, 2014, 04:07:36 pm
Hallo Roberto,

wenn du delay(100) verwendest wirst du in naher Zukunft probleme bekommen. Schau dir mal das Beispiel "Blink without delay" an und setzt dieses bei dir um. Erst wenn kein delay mehr im Code vorkommt ist es eine gute ("bessere") Lösung.
30  International / Deutsch / Re: Serial Monitor on: June 14, 2014, 03:52:28 am
Die vier Werte addieren und dann durch 4 teilen.

Gruß,
Ralf

Das ist aber langsam. Besser ist es, den Wert um zwei Stellen nach rechts zu verschieben. Sprich:

Wert_durch_vier = (Wert>>2)

Division die mit dem Faktor  2^x durchgeführt werden, lassen sich am schnellsten durch verschieben der Bits dividieren. Ähnlich geht es beim Multiplizieren mit 1,2,4,8,... 2^n | {n=0,1,2,3,4 ... N}
Pages: 1 [2] 3 4 ... 44