AquariumController Menütasten reagieren nicht.

Hallo,

da ich mich schon länger damit beschäftige mir einen AquaController mit nen Arduino zu bauen, steh ich nach anfänglichen Schwierigkeiten des Sketches vor dem Problem, dass er das 4x4 Keypad bei Tastendruck einfach ignoriert.

In dem Sketch ist ein Menu enthalten, dieses über 5 Taster zu steuern sein soll.
Sowas wie

UP 2
DOWN 8
RIGHT 6
LEFT 4
SELECT 5

Außerdem gibt das Programm nichts im Serial Monitor aus trotz den serial.println Befehlen.

Hier mal der Sketch:

//#include <math.h>
#include <LiquidCrystal_I2C.h>
//#include <LiquidCrystal.h>
#include <Wire.h> 
#include <DS1307.h>
#include <EEPROMex.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <AFMotor.h>
#include <Keypad.h>

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ H A R D W A R E +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//Initialisierung
#define ONE_WIRE_BUS 2       // Data wire is plugged into port 8 on the Arduino
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) 
OneWire oneWire(ONE_WIRE_BUS); 

// Pass our oneWire reference to Dallas Temperature.  
DallasTemperature sensors(&oneWire); 

// arrays to hold device address
DeviceAddress wasserThermometer, raumThermometer;

//DS1307 rtc(16, 17); //Uno
DS1307 rtc(56, 57);   //Mega
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 20 chars and 4 line display, Backlight PWM PIN 10

//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//  Erstellung eines Fish-Symbols das nach rechts schaut
byte newChar[8] = {
	B00000,
	B00000,
	B10001,
	B11011,
	B11111,
	B11111,
	B11001,
	B10000
};

byte newChar1[8] = {
	B00001,
	B00010,
	B11101,
	B11010,
	B11111,
	B11110,
	B11100,
	B00000
};
//  Erstellung eines Fish-Symbols das nach links schaut
byte newChar2[8] = {
	B00000,
	B00000,
	B10001,
	B11011,
	B11111,
	B11111,
	B10011,
	B00001
};
byte newChar3[8] = {
	B10000,
	B01000,
	B10111,
	B01011,
	B11111,
	B01111,
	B00111,
	B00000
};

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ K O N S T A N T E N +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
const int DISPLAY_LETZTE_SEITE = 6;
const int DISPLAY_WARTEZEIT = 4;
const long HOUR = 60 * 60;
const long MINUTE = 60;
const int MAXPWMSTEPS = 4096;

const byte rows = 4;
const byte cols = 4;

char keys[rows][cols] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[rows] = {22,23,24,25};
byte colPins[cols] = {26,27,28,29};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

//Hier werden die Tasten des Keyboards festgelegt und müssen je nach Keypad angepasst werden
#define RIGHTKEY 6
#define UPKEY 2
#define DOWNKEY 8
#define LEFTKEY 4
#define SELECTKEY 5

Im Anhang befindet sich der komplette Sketch.

Hat jemand eine Idee warum er auf keine Tasten reagiert?

display.ino (4.3 KB)

Dosierpumpe_20131104_V1_4.ino (33.8 KB)

functions.ino (22.4 KB)

menuWerte.ino (15 KB)

menuWerteAuswahl.ino (21.8 KB)

menuWerteSetzen.ino (38.9 KB)

Hallo liebe Community,

ich bin natürlich gleich mal mit der Tür ins Haus gefallen :cold_sweat:

Dies ist mein erster Beitrag, diesen ich mit euch teilen möchte.
Seit gut einem halben Jahr versuche ich mir mit elektronischen Steuerungen mein Aquaristikhobby zu erleichtern.
Dies ist mein erstes Projekt mit einem Arduino Mega 2560 dieser 4 Dosierpumpen, 2 Temperatursensoren und einen Schwimmschalter Steuern soll.

Im ersten Post habe ich ja Schon den Sketch mit euch geteilt.

Was mein Layout angeht, ich habe leider keins.
Ich versuche es mal mit einer Pinbelegungsliste.

EraserPlayer:
Hat jemand eine Idee warum er auf keine Tasten reagiert?

Keine Ahnung, aber warum versuchst Du zwei verschiedene LCDs unterderselben Objektinstanz "lcd" zu deklarieren?

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 20 chars and 4 line display, Backlight PWM PIN 10

//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Die erste Deklaration sieht aus als wenn Du ein I2C-LCD-Modul verwenden möchtest.

Und die zweite Deklaration sieht nach einem sogenannten "LCD Keypad Shield" aus.
Was für Hardware verwendest Du tatsächlich?

Ich benutze das

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 20 chars and 4 line display, Backlight PWM PIN 10

Das andere ist nur ne Option diese offen gehalten wird wenn man kein LCD Shield verwendet

//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Wenn die Taster nicht reagieren, dann liegt es daran das das Programm irgendwo in einer Schleife festhängt. Dies kann an "delay", "while", "for" liegen.

Bedenke das der Button von deinem Keypad solange gedruckt sein muss, bis dein Programm den Pin abfragt.

Bezüglich der Seriellen Schnittstelle. Bekommst du da garkeine Ausgabe, also auch die Ausgaben aus der Setup Rotine nicht ?
Oder kommt irgendwann nichts mehr ?

Mir ist aufgefallen das du extrem viel Ram belegst z.B. mit:

lcd.print("                ");

Die ganzen Leerzeichen werden im Ram abgelegt. Schau dir mal das F() Makro an:

lcd.print(F("                "));

Vielleicht hast du Lust dein Projekt mit dieser Lib ( LCDMenuLib )umzusetzen, ich könnte dir dabei helfen die Aufgaben sinnvoll in der Lib Struktur unter zu bringen.

Die Schleife schau ich mir mal an ob das Programm da irgendwo hängen bleibt.

Die Taster habe ich auch schon sehr lange ca. 15 Sek. gedrückt gehalten, ohne Erfolg.

Auf dem Serial Monitor kommt rein gar nichts auch nicht die Setup Rotine.

Das mit dem RAM hab ich nicht beachtet werde aber mal drüber schauen was ich da weg lassen kann.
Wegen den Leerzeichen, hast du eine Idee was ich da sonst nehmen könnte?

Gerne können wir zusammen auf Basis der LCDMenuLib das Projekt zusammen vervollständigen.

Du musst nichts weglassen. Du musst nur ein F() (für Flash) um das String Literal schreiben. Dann wird es nicht ins RAM kopiert.

Hier ist eine Funktion die dir den freien Speicher in Bytes liefert (aber auch nur wenn überhaupt noch genug frei ist):

int getFreeRAM() 
{
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

Kann natürlich auch an was anderem liegen

So, hab jetzt bei allen lcd.print ein F() geschrieben.
Er hat die hälfte des Speichers belegt 4097 Bytes.

Jetzt ist nochmal so viel des Speichers frei.
Der Fehler besteht nach wie vor, dass auf dem Display "Dosierer V1.4 EraserPlayer" steht und auf keine Tasteneingabe reagiert.

Vorher hatte ich ein 5 Tasten Shield eingebaut dieses über den Analog Port A0 ausgelesen wurde.
Leider ging das Tasten Shield kaputt und auf die schnelle habe ich jetzt einfach das 4x4 Keypad benutzt und versucht den Sketch umzuschreiben auf das 4x4 Keypad, leider ohne Erfolg.

Müssen die Tasten nicht am Anfang deklariert werden, was UP, DOWN, RIGHT, LEFT, SELECT ist?
Das habe ich zwar gemacht aber mir kommt es so vor als würde an der Stelle noch etwas fehlen.

Was meint ihr, bin fast am verzweifeln.

Was meint ihr, bin fast am verzweifeln.

Kriegst du das keypad alleine ( mit Serial.print - Testausgaben ) ans laufen ?
Danach, mit lcd - Testausgaben ?
Danach, mit Uhr ?

usw: Problem separieren, erst danach deine zig Libraries eine nach der andern dazu.

Wenn du an einem kleinen Problem verzweifelst, kann man dir viel leichter helfen als bei einem großen :wink:

An die Spannungsversorgung und die Pullup Widerstände für das Keypad hast du gedacht? Welches verwendest du genau?

wenn er an unbekannter Stelle hängen bleibt, gibt es ja nen einfachen Trick um die stelle zu finden.

setz hier und da nen durchnummerierten Punkt
Serial.println("Checkpoint 1");

nicht 100 Stück sondern verschieb einfach 3-4 stück im Code und grenz das Problem ein.

nützlich wär natürlich erstmal nur das Keypad in einem eigenen Sketch richtig auszutesten,
langt ja Serial.println(key); ohne lcd

hab ein vergleichbares Projekt in der mache, evtl komm ich mal auf dich zurück :slight_smile:

michael_x:
Kriegst du das keypad alleine ( mit Serial.print - Testausgaben ) ans laufen ?
Danach, mit lcd - Testausgaben ?
Danach, mit Uhr ?

usw: Problem separieren, erst danach deine zig Libraries eine nach der andern dazu.

Wenn du an einem kleinen Problem verzweifelst, kann man dir viel leichter helfen als bei einem großen :wink:

Also das Keypad hab ich alleine schon ans laufen gebracht mit nem simplen Sketch.
Da bekomme ich im Serial Monitaor sowie im LCD die Zahlen und Buchstaben wie im Sketch deklariert beio Tastendruck angezeigt.
Das funktioniert problemlos.

Nur mit meinem anderen Sketch, da ist ihm vollkommen egal was ich drücke, es kommt über den Serial Monitor sowie über das LCD einfach gar nichts.

Scherheinz:
An die Spannungsversorgung und die Pullup Widerstände für das Keypad hast du gedacht? Welches verwendest du genau?

Eine separate Spannungsversorgung für das Keypad? Denke bei diesem brauch ich da keine. Pull up Widerstände hab ich keine drin.
Im Anhang ist ein Bild des Keypads.

Keypad 4x4.jpg

Pullup-Widerstände braucht man auch normal nicht. Die Keypad Library verwendet die internen

Hallo Community,

es wird immer besser, ich habe versucht eins der Beispiele von der LCDMenuLib zu kompilieren, leider ohne Erfolg :confused:

Ich hab folgenden Bsp. Sketch verwendet:

LCDML_002_lcd_i2c

Es kommen beim kompilieren sehr viele Fehler:

C:\Users\TimKa\AppData\Local\Temp\arduino_modified_sketch_243307\LCDML_002_lcd_i2c.ino: In function 'void setup()':

LCDML_002_lcd_i2c:99: error: no matching function for call to 'LiquidCrystal_I2C::begin(int, int)'

     lcd.begin(_LCDML_DISP_cols,_LCDML_DISP_rows);

                                                ^

C:\Users\TimKa\AppData\Local\Temp\arduino_modified_sketch_243307\LCDML_002_lcd_i2c.ino:99:48: note: candidate is:

In file included from C:\Users\TimKa\AppData\Local\Temp\arduino_modified_sketch_243307\LCDML_002_lcd_i2c.ino:13:0:

C:\Users\TimKa\Documents\Arduino\libraries\Arduino_LiquidCrystal_I2C_library/LiquidCrystal_I2C.h:76:7: note: void LiquidCrystal_I2C::begin()

  void begin();

       ^

C:\Users\TimKa\Documents\Arduino\libraries\Arduino_LiquidCrystal_I2C_library/LiquidCrystal_I2C.h:76:7: note:   candidate expects 0 arguments, 2 provided

C:\Users\TimKa\AppData\Local\Temp\arduino_modified_sketch_243307\LCDML_CONTROL.ino: At global scope:

LCDML_CONTROL:307: error: expected primary-expression before '=' token

   #define _LCDML_CONTROL_keypad_rows = 4; // Four rows

                                      ^

C:\Users\TimKa\AppData\Local\Temp\arduino_modified_sketch_243307\LCDML_CONTROL.ino:310:13: note: in expansion of macro '_LCDML_CONTROL_keypad_rows'

   char keys[_LCDML_CONTROL_keypad_rows][_LCDML_CONTROL_keypad_cols] = { 

             ^

LCDML_CONTROL:307: error: expected ']' before ';' token

   #define _LCDML_CONTROL_keypad_rows = 4; // Four rows

                                         ^

C:\Users\TimKa\AppData\Local\Temp\arduino_modified_sketch_243307\LCDML_CONTROL.ino:310:13: note: in expansion of macro '_LCDML_CONTROL_keypad_rows'

   char keys[_LCDML_CONTROL_keypad_rows][_LCDML_CONTROL_keypad_cols] = { 

             ^

LCDML_CONTROL:310: error: expected unqualified-id before ']' token

   char keys[_LCDML_CONTROL_keypad_rows][_LCDML_CONTROL_keypad_cols] = { 

                                       ^

LCDML_CONTROL:310: error: expected unqualified-id before ']' token

   char keys[_LCDML_CONTROL_keypad_rows][_LCDML_CONTROL_keypad_cols] = { 

                                                                   ^

exit status 1
no matching function for call to 'LiquidCrystal_I2C::begin(int, int)'

Was mach ich denn falsch?
Ein Beispiel Sketch sollte doch funktionieren?

Könnt ihr mir bitte weiterhelfen?

Im Anhang hab ich noch den Bsp. Sketch geladen.

Hi, welche I2C Lib verwendest du ?

Die Fehler Meldung sagt aus, dass die I2C Lib nicht gefunden wird:

"no matching function for call to 'LiquidCrystal_I2C::begin(int, int)"

Ich hab die LCDMenuLib mit folgender I2C Lib getestet und erhalte keine Fehler:

https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

Edit:
Falls du eine andere Lib verwendest musst du die Initialisierung anpassen. Sprich folgende Zeilen:

// lcd object
  //LiquidCrystal_I2C lcd(0x27);  // Set the LCD I2C address
  //LiquidCrystal_I2C lcd(0x27, BACKLIGHT_PIN, POSITIVE);  // Set the LCD I2C address
  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

....
// LCD Begin
    lcd.begin(_LCDML_DISP_cols,_LCDML_DISP_rows);

Und eventuell die LCD Funktionen im LCDML_DISP Tab, lcd.home(), lcd.setCursor(..), lcd.print(..)

Jomelo:
Hi, welche I2C Lib verwendest du ?

Die Fehler Meldung sagt aus, dass die I2C Lib nicht gefunden wird:

"no matching function for call to 'LiquidCrystal_I2C::begin(int, int)"

Ich hab die LCDMenuLib mit folgender I2C Lib getestet und erhalte keine Fehler:

https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

Edit:
Falls du eine andere Lib verwendest musst du die Initialisierung anpassen. Sprich folgende Zeilen:

// lcd object

//LiquidCrystal_I2C lcd(0x27);  // Set the LCD I2C address
  //LiquidCrystal_I2C lcd(0x27, BACKLIGHT_PIN, POSITIVE);  // Set the LCD I2C address
  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

....
// LCD Begin
    lcd.begin(_LCDML_DISP_cols,_LCDML_DISP_rows);




Und eventuell die LCD Funktionen im LCDML_DISP Tab, lcd.home(), lcd.setCursor(..), lcd.print(..)

Ich verwende diese lib:

Die I2C lib ist drin.
Wie bekomme ich meine LCD I2C Adresse raus und wo muss ich die da eintragen?

Wie hast du denn bisher das I2C Display angesteuert. Du musst dort ja schon eine Adresse vergeben haben.

Meine Lib bindet eine externe I2C Lib ein. Die ist nicht in der LCDMenuLib enthalten.

Jomelo:
Wie hast du denn bisher das I2C Display angesteuert. Du musst dort ja schon eine Adresse vergeben haben.

Meine Lib bindet eine externe I2C Lib ein. Die ist nicht in der LCDMenuLib enthalten.

Ich binde auch eine externe Lib ein, diese hier:

// include libs
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LCDMenuLib.h>

Angesteuert habe ich das LCD über

LiquidCrystal_I2C lcd(0x27,16,2);

Dann musst du das ganze mit der LCDMenuLib genauso machen

Folgende Zeilen ersetzt du mit diesen Werten

  #define _LCDML_DISP_cols             16 // alt 20
  #define _LCDML_DISP_rows             2  // alt 4
// alt
// lcd object
  //LiquidCrystal_I2C lcd(0x27);  // Set the LCD I2C address
  //LiquidCrystal_I2C lcd(0x27, BACKLIGHT_PIN, POSITIVE);  // Set the LCD I2C address
  //LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

// neu
LiquidCrystal_I2C lcd(0x27,_LCDML_DISP_cols,_LCDML_DISP_rows);

usw.

PS: 0x27 ist deine Adresse

Edit:
Es ist einfacher wenn du die von mir oben angegeben Lib Verwendest und diese mit der folgenden Zeile initialisierst.

LiquidCrystal_I2C lcd(0x27);

Dazu musst du dann noch die cols auf 16 setzen und die rows auf 2.

Ansonsten suchst du jetzt überall im Programm die Stellen raus, bis es mit der lib von dir läuft.

Das Problem liegt übrigens nicht an der LCDMenuLib sondern an der Vielfalt and I2C Libs die unter dem gleichen Namen existieren. Man kann keine Beispiel schreiben welches mit allen existierenden I2C Lib fehlerfrei läuft. Da es bei dir gerade nicht läuft ist etwas pech, aber eigenlicht kein Problem wenn du die Lib tauschst.