Temperatur Parameter über Folientastatur eingeben

Hallo Zusammen,

Ich habe mir vor kurzem einen Arduino geholt und habe ein paar Dinge damit umgesetzt (nichts Großes ehr spielerein und Übungen:-)).

Der Grund meines Eintrags ist folgender, ich Studiere Lebensmittelwissenschaften und wollte mit einem Kommilitonen in einem Semester Projekt ein Fleisch reife Kühlschrank bauen.

Der Aufbau sollte wie folgt sein im Kühlschrank soll die Temperatur und die Luftfeuchtigkeit mittels DHT22 gemessen werden. Bei Abweichung sollte der Kühlschrank, der Verdampfer oder die Lüfter über Relais an bzw. ausgeschaltet werden. Das hat auch in einem Ersten Sample soweit geklappt.

Jetzt wollte ich aber, dass ich die min und max. Temperatur nicht nur im Programm Kode eingeben kann und der diese abgleicht, sondern diese über eine Folien Tastatur bei jedem neuen beginn (eine Reifung dauert ca. 4 Wochen) individuell auf die Größe usw. einstellen kann. zunächst über seriell Monitor später über lcd.

Und da ist mein Problem, hab versucht mir was aus Beispielen zusammen zu bauen aber irgendwie funktioniert das nicht so ganz :-). Hab die Initialisierung hinbekommen aber dann hört es auch leider auf.

Meine Frage ist kann mir jemand helfen einen Code zu schreiben der Werte aus einer 4x4 Matrix (bzw. Folien Tastatur) aufnimmt und diesen als int speichert. Wobei Temperatur und Luftfeuchte zwei stellig angeben werden sollen.

Über jede Art von Hilfe wäre ich zutiefst dankbar!
Vielen dank schonmal im vorraus.

Hallo,
"...Code zu schreiben der Werte aus einer 4x4 Matrix"

Wie weit bist Du denn mit der Tastatur?
Wenn Du eine Eins drückst, dann wird einmal- eine Eins ausgegeben...?
Wenn Du eine Vier drückst, dann wird einmal- eine Vier ausgegeben...?
Gruß und Spaß
Andreas

Entschuldige das ich das nicht so doll formuliert habe.

Also das ist mein bisheriger Code (wollte erstmal die tastatur hinbekommen bevor es weiter geht):

/4x4 Matrix Keypad connected to Arduino
This code prints the key pressed on the keypad to the serial port
/

#include <Keypad.h>

const byte numRows= 4; //number of rows on the keypad
const byte numCols= 4; //number of columns on the keypad

//keymap defines the key pressed according to the row and columns just as appears on the keypad
char keymap[numRows][numCols]=
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

//Code that shows the the keypad connections to the arduino terminals
byte rowPins[numRows] = {6,7,8,9}; //Rows 0 to 3
byte colPins[numCols]= {2,3,4,5}; //Columns 0 to 3

//initializes an instance of the Keypad class
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

int Tempzahl1, Tempzahl2, Tempzahl3, Tempzahl4, Humzahl1, Humzahl2, Humzahl3, Humzahl4;
int GesamtT1, GesamtT2;
char keypressed;

void setup()
{
Serial.begin(9600);

Serial.print("Bitte geben sie die Parameter ein\n");
Serial.println("Temperatur: ");
}

//If key is pressed, this key is stored in 'keypressed' variable
//If key is not equal to 'NO_KEY', then this key is printed out
//if count=17, then count is reset back to 0 (this means no key is pressed during the whole keypad scan process

void loop()
{

keypressed = myKeypad.getKey();
if(keypressed != NO_KEY)
{
Serial.write(keypressed);

}
}

Er gibt die Zahlen aus die ich drücke. Ich würde diese gerne zusammenfassen sprich 1 und 2 wird 12. und als in einer variablen speichern.

Ich weiß ist noch nicht viel sitze aber da schon etwas dran und alles hat nicht so funktioniert wie gedacht, daher nur dieser Grundstock.

Zudem wäre es sehr schön wenn na eine Abfrage bekommt, sprich geben sie jetzt die Temperatur min und dann max. und dann die nächste Aufforderung kommt geben sie die Luftfeuchte ein.

Ich hoffe du kannst meine Ausführungen folgen und ich rede nicht komplett wirr

Da hast du noch einiges an Arbeit vor dir. Das löst du besser in Teilaufgaben.

  1. Teilaufgabe ist, die Zahlen einzugeben. Ich würde das lösen, und in ein char array eingabe[3] die keypressed auf pos[0] und dann auf [1] schreiben, immer abwechselnd. pos [2] ist immer 0, um zu terminieren.
    Mir z.B. # wird bestätigt. und mit atoi in int umgewandelt

  2. Endlicher Automat für die Menüstruktur
    Die Routine aus 1. kannst du auch für die Luftfeuchtigkeit nehmen

Hallo,
das ihr nicht auf die Frage antworten könnt…

Wenn Du eine Eins drückst, dann wird einmal- eine Eins ausgegeben...?
Wenn Du eine Vier drückst, dann wird einmal- eine Vier ausgegeben...?

Ich gehe mal davon aus, das dem so ist.
Du tastes die "1" und über den seriellenMonitor wir eine (1Stck) "1"
ausgegeben.
Du hälst die Taste "1" gedrückt- und über den seriellenMonitor wir eine
(1Stck) "1" ausgegeben.

Das ist eine zwingende Bedingung- DIE ERFÜLLT SEIN MUSS!
Wenn dem nicht so ist, brauchst Du hier nicht weiter machen.

Für den Wert einer Taste brauchst Du eine Speicherstelle, ich würde das
mit einem Array und einem Zähler machen.

int WertTaste[10] // ein Array mit dem Index 10 für 9 Werte.
int ZählerTaste;

dann

 if(keypressed != NO_KEY)
      {
      Serial.write(keypressed);
     WertTaste[ZählerTaste] = keypressed;
ZählerTaste++
     }

Damit schreibst Du einen TastenWert an einen bestimmten Index ins Array.

Nehmen wir an, Du tastes "4711"

Taste 4 gedrückt, ZählerTaste = 0, Index Array = 0
An Index 0 ist die 4 geschrieben.

Taste 7 gedrückt, ZählerTaste = 1, Index Array = 1
An Index 1 ist die 7 geschrieben.

Taste 1 gedrückt, ZählerTaste = 2, Index Array = 2
An Index 2 ist die 1 geschrieben.

Taste 1 gedrückt, ZählerTaste = 3, Index Array = 3
An Index 3 ist die 1 geschrieben.

Nun weißt Du, das Du 4x eine Taste betätigt hast. D.h. Deine Zahl ist eine,
die in die X-Tausend geht.

Nun liest Du über eine Schleife Deine Array aus. Hier bis Index 3.

an ArrayIndex 0 ist eine 4 geschrieben- also 4 * 1000 = 4000
an ArrayIndex 1 ist eine 7 geschrieben- also 7 * 100 = 700
an ArrayIndex 2 ist eine 1 geschrieben- also 1 * 10 = 10
an ArrayIndex 3 ist eine 1 geschrieben- also 1 * 1 = 1

das ist dann- 4000 + 700 + 10 + 1 = na, rate mal…

Das geht bestimmt noch einfacher und eleganter, aber das hier sollte jeder
Anfänger begreifen. Das hat den großen Vorteil, das man versteht was im
Sketch abläuft.
Eleganter kannst Du das machen, wenn es läuft.
Viel Spaß dabei
Gruß
Andreas

Array damit habe selbst ich begriffen wie es geht.

SkobyMobil:
Hallo,
das ihr nicht auf die Frage antworten könnt…

Das geht alles nicht so schnell bei Studenten, da ist ab Freitag mittag Party .... :slight_smile: :slight_smile: :slight_smile:

  1. Teilaufgabe ist, die Zahlen einzugeben. Ich würde das lösen, und in ein char array eingabe[3] die keypressed auf pos[0] und dann auf [1] schreiben, immer abwechselnd. pos [2] ist immer 0, um zu terminieren.
    Mir z.B. # wird bestätigt. und mit atoi in int umgewandelt

Man kann auch direkt aufaddieren. Aktuellen Wert mit 10 Multiplizieren. Dann den Tasten-Code (der ASCII ist) Minus '0' darauf addieren

value *=10;
value += (keypressed - '0');

Natürlich nur wenn keyPressed zwischen '0' und '9' liegt

Das so lange bis bestätigt wird und man hat sofort die Zahl

Ich meinte mit meinem Vorschlag, dass man solange man kein # eingibt, nach jeder Eingabe die Stelle (einer, zehner) wechselt, somit ist kein extra navigieren im array nötig. Das geht bei zweistelligen Zahlen gut

Hallo zusammen,

da mich dieses Thema auch umtreibt wollte ich nachfragen, ob es hier inzwischen Fortschritte gibt?

Willst du wissen, ob (und wie) Seppel sich zwischen "2 Ziffern im Wechsel" und "fortlaufende Zahleneingabe mit beliebig vielen Ziffern" entschieden hat ?
Was treibt dich bei dieser Frage um ?

newarduinosmith:
Hallo zusammen,

da mich dieses Thema auch umtreibt wollte ich nachfragen, ob es hier inzwischen Fortschritte gibt?

Der Fortschritt dieses Threads ist wie bei vielen hundert anderen auch:

Ein Seppel hat vom 12. August (erster Beitrag) bis zum 12.August (letzter Beitrag) irgendwas machen wollen, und dann offenbar die Lust verloren, nachdem seine Aufmerksamkeitsspanne (die der Aufmerksamkeitsspanne einer Eintagsfliege entspricht), abgelaufen war.

So beginnen und enden hier hunderte, wenn nicht tausende von Threads.

Irgendein Threadstarter startet irgendeinen Thread, und das war's dann.

Den Threadstarter kümmert es einen Scheißdreck.

Zum Thema 4x4 Tastenmatrix kann ich nur sagen:

Zur Abfrage von Tastencodes auf 3x4 und 4x4 Matrix Keypads gibt es die Keypad Library.

http://playground.arduino.cc/Code/Keypad

Damit kann man viele schöne Dinge machen.

Mal angenommen, man möchte vier verschiedene Temperaturparameter auf einer 4x4 Matrix eingeben, dann könnte man den Funktionswechsel auf die vier Buchstaben legen:
A-gib Temperatur A ein
B-gib Temperatur B ein
C-gib Temperatur C ein
D-gib TemperaturD ein

Wobei man sich die Programmierarbeit vereinfachen könnte, wenn man auf Gleitkommazahlen verzichten und sich auf die Eingabe ganzer Zahlenwerte beschränken könnte.

Wenn man unbedingt "krumme" Werte mit Zehnteln braucht, könnte man es so definieren, dass Temperaturen generell als Zehntelgrade eingetragen werden.

Also z.B. statt 27.3°C trägt man ein 273 oder statt 19.0°C einfach nur 190.

Damit vermeidet man sowohl Eingabeprobleme im Zusammenhang mit dem Dezimalpunkt, als auch Ungenauigkeiten im Zusammenhang mit "float" TGleitkommazahlen.

Eingabelogik dann unter Verwendung der zwei Sonderzeichen * und # etwa wie folgt:

  • = Sonderfunktion "bisherige Eingabe löschen

= Sonderfunktion" eingegebenen Wert übernehmen und speichern

Das läßt sich mit Hilfe der Keypad-Library leicht realisieren.

@jurs:

Ja, das ist leider so.

Viele unterschätzen auch die Schwierigkeiten des Programmierens.

Immerhin weicht die Programmiersprache doch erheblich von unserer Muttersprache ab...

Der Hinweis auf die Keypad-Lib kam ja schonmal. Ich seh mir das mal an.

Das könnte viel einfacher werden als z.B. Telefonnummern mit Tastern einzugeben.

Hallo,

läßt sich dieser Topic nochmal wiederbeleben ???

Habe es mit der Werteingabe wie Scoby Mobil versucht,

aber statt der 4711 kriege ich immer -18874 als Ergebnis.

Ab hier läuft augenscheinlich etwas verkehrt ...

if (key == '*') {
int myInts[4]; // Array für 4 stellen initialisieren
int counter = 0; // Zähler initalisieren
while (counter <= 3) { // solange ausführen bis wir 4 stellen haben (Es wird ab 0-3 gezählt)
myInts[counter] = key; //array an der stelle von counter befüllen
counter++; //zähler inkrementieren
}

int Endwert = myInts[0] * 1000 + myInts[1] * 100 + myInts[2] * 10 + myInts[3];

Serial.println(Endwert);
}
}

}

Ab hier läuft augenscheinlich etwas verkehrt ...

   if (key == '*') { // '*' ist das Zeichen 0x2A oder 42

int myInts[4]; // Array für 4 stellen definieren aber nicht initialisieren
      int counter = 0; // Zähler initalisieren
      while (counter <= 3) { // solange ausführen bis wir 4 stellen haben (Es wird ab 0-3 gezählt) 
        myInts[counter] = key; //myInts array befüllen: Jedes Element erhält den Wert 42
        counter++; //zähler inkrementieren
      }
  int Endwert = myInts[0] * 1000 + myInts[1] * 100 + myInts[2] * 10 + myInts[3];
  // 42000+4200+420+42 =  46662. Bei int16_t ist das -18874

Das ist also genau richtig.
Dass es nicht das ist, was du eigentlich willst, glaube ich dir schon.
Hat aber auch wenig mit Skobis Werteingabe zu tun. (Daher wäre ein neuer Thread eigentlich nicht verkehrt)

In diesem Thread wurden auch einige andere Tips gegeben...

@ michael_x

Vielen Dank für die Erklärung über die Entstehung der ominösen Zahl -18874.

Zumindest weiß ich erst einmal, dass das Array richtig zusammen gerechnet ,

jedoch völlig verkehrt "befüllt" wird.

Ich möchte einen vierstelligen Wert, eingegeben über Tastatur, im Arduino verwenden können.

Deswegen erschien mir nach langem suchen dieser Thread am Nächsten.

Werde mich befleißigen, das Problem zu lösen.

Es ist geschafft.

Knackpunkt war echt die Tatsache, dass ich annahm, aus dem Sketch vom Keypad bekomme ich die

Zahlenwerte entsprechend der Tasten 0...9 raus.

Habe mit dem beigefügten Sketch aus den Werten (char) die Werte (int) hergeleitet und konnte mich langsam

an die gewünschte Lösung vorarbeitet.

Frage: Wie hätte jemand der Ahnung vom Programmieren hat, diesen Sketch umgesetzt?

if( keypressed == 48 ) { wert = 0; } // Wandeln von char in int
if( keypressed == 49 ) { wert = 1; }
if( keypressed == 50 ) { wert = 2; }
if( keypressed == 51 ) { wert = 3; }
if( keypressed == 52 ) { wert = 4; }
if( keypressed == 53 ) { wert = 5; }
if( keypressed == 54 ) { wert = 6; }
if( keypressed == 55 ) { wert = 7; }
if( keypressed == 56 ) { wert = 8; }
if( keypressed == 57 ) { wert = 9; }
if( keypressed == 35 ) { ZaehlerTaste = -1; } // # - Taste
if( keypressed == 42 ) { ZaehlerTaste = -1; } // * - Taste

Wünsche ein schönes Wochenende.

Knackpunkt war echt die Tatsache, dass ich annahm, aus dem Sketch vom Keypad bekomme ich die
Zahlenwerte entsprechend der Tasten 0...9 raus.

Nein. Du bekommst den ASCII-Wert. Mal einen Blick in die ASCII Tabelle werfen dann wird es klar

Wie hätte jemand der Ahnung vom Programmieren hat, diesen Sketch umgesetzt?

if (keypressed >= '0' && keypressed <= '9')
   wert = keypressed - '0';
else
 ....

Habe den Code in meinen Sketch implementiert. Funktioniert.

Zum Verständnis dessen, was ich da eingebaut habe nochmal nachgefragt...

&& ist eine Boolsche Operation, deren Ergebnis wahr ist, wenn beide Seiten wahr sind (UND)

zum Ersten, der Wert von" keypressed" ist gößer gleich 0 (char)

zum Zweiten , der Wert von "keypressed" ist kleiner gleich 9 (char)

Das ist die Abfrage der Tasten 0...9

Ist für "if" diese Bedingung erfüllt, dann ergibt sich "wert" aus dem Wert von "keypressed" (48...57) abzüglich

dem Wert für 0 (char), das sind 48

Hoffe, ich habe es richtig verstanden.

Genial, ich wäre nie darauf gekommen...

Genial, ich wäre nie darauf gekommen...

Hast du doch selber so programmiert:

//keymap defines the key pressed according to the row and columns just as appears on the keypad

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

Wer will, kann auch andere Werte nehmen, sollte nur den Normal-Fall (keine Taste gedrückt) auch berücksichtigen.
Für andere und den Compiler ist es übrigens besser, statt deiner Schreibweise 0 (char) die richtige Syntax

** **'0'** **

zu verwenden. Dass dies das gleiche wie 48 ist, brauchst du dir sogar im Prinzip gar nicht zu merken.

Das Char-Muster vom keypad und der ganze Sketch zur Auswertung stammt vom Themenstarter bzw. aus dem

Internet. Nicht von mir !!!

Ich habe ausgehend von diesem Sketch meine Lösung gesucht.

Für mich war alles Neuland.

Danke an alle, die mir auf die Sprünge geholfen haben.