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
Per Keypad Shield zwischen zwei Programmen schalten
04.03.2016, 16:26
Beitrag #1
Per Keypad Shield zwischen zwei Programmen schalten
Ich hätte da mal eine Frage.

Ich habe ein Keypad Shield und zwei Programme dazu. Die Laufen auch einzeln für sich. Dabei werden die Taster aber nicht verwendet. Es werden nur ein Druckwert und ein Temperaturwert angezeigt.

Jetzt ist meine Frage, wie kann ich beide Programme so zusammenführen, dass mir das eine Programm angezeigt wird, wenn ich den einen Taster drücke und wenn ich den anderen Taster drücke mir das andere Programm angezeigt wird auf dem Display?
Es sollen sozusagen beide Programme parallel laufen und per Tasterdruck das jeweilige dann dauerhaft angezeigt werden so, dass es life ist.

Ich hoffe mir kann jemand auf die Sprünge helfen.

MfG Rob
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2016, 16:32
Beitrag #2
RE: Per Keypad Shield zwischen zwei Programmen schalten
Hast du dir schon mal die Basics in der IDE angesehen, da wird mittels eines Beispiels gezeigt, wie ein Button abgefragt wird.

Dann kommt da noch eine "if-Anweisung" rein, die bei gedrücktem Button eine Funktion ausführt, bei nicht gedrücktem, die andere. Die Funktionen sind dann jeweils deine Programme.

Sieh dir alle Beispiele an, da kann man sehr viel lernen.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2016, 16:43
Beitrag #3
RE: Per Keypad Shield zwischen zwei Programmen schalten
Ja das habe ich nicht, ich habe aber das gesammte Tutorial durch von meinem Hersteller, da war das auch erklärt. Ich habe halt nur das Problem, dass ich irgendwie nicht auf einen Nenner komme mit den beiden Programmen. ich dachte mir, dass ich das Programm nach der IF-Abfrage einfügen müsste. dies funktioniert aber irgenwie nicht. Oder muss ich den Befehl Void Loop da vor dem Programm weglassen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2016, 16:53
Beitrag #4
RE: Per Keypad Shield zwischen zwei Programmen schalten
(04.03.2016 16:43)Rob-LE schrieb:  Ja das habe ich nicht...
Solltest du aber machen. Ohne die Basics kommst du nicht weiter. Auch verstehst du nicht, was wir dir als Tipp geben.

Zitat:Oder muss ich den Befehl Void Loop da vor dem Programm weglassen?
Lies dir die Fehlermeldung durch, die beim Kompilieren angezeigt wird.

Ja!
Es gibt im Sketch nur eine Loop und ein Setup.
Über dem Setup die Deklaration.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2016, 18:16 (Dieser Beitrag wurde zuletzt bearbeitet: 04.03.2016 18:34 von Rob-LE.)
Beitrag #5
RE: Per Keypad Shield zwischen zwei Programmen schalten
Wie gesagt, ich habe ja die Basics von einer anderen Seite durchgearbeitet.

Ich bin inzwischen auch an einem Anderen Punkt, nämlich dabei, dass das Programm immer wieder sagt, dass eine Variable nicht deklariert ist. Problem an der Sache ist, dass in dem Ursprungsprogramm, welches ja nun in das Programm des KPS eingearbeitet werden soll, diese deklariert ist.

Hier mal der Code:
Code:
#include <OneWire.h>
#include <LiquidCrystal.h>

OneWire ds(3); // 1Wire Instance on Arduino digital pin 3
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD instance
// Define some values used by the panel and buttons:

byte i;
byte present = 0;
byte data[3];
byte addr[8];
float Temp;

// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
//if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result

if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;

//return btnNONE; // when all others fail, return this...
}

void setup(void) {
Serial.begin(9600); // Start serial interface with 9600 Baud
lcd.begin(16, 2); // Start the LCD library for 2x16 display
lcd.setCursor(0,0);
lcd.print(" TESTPROGRAMM ");
lcd.setCursor(0,1);
lcd.print(" Dallas DS18B20 ");
delay(3000);
lcd.clear();
}

void loop(void)
{
digitalWrite (2, HIGH);
lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) // depending on which button was pushed, we perform an action
{
case btnRIGHT:
{
lcd.print("Robert ");
digitalWrite (2, LOW);
break;
}
case btnLEFT:
{
lcd.print("Christian");
break;
}
case btnUP:
{
Serial.println();
display_1WSensor();
break;
}
case btnDOWN:
{
lcd.print("Tille ");
break;
}
case btnSELECT:
{
lcd.print("Fabi ");
break;
}
case btnNONE:
{
lcd.print("Bereit ");
break;

}
}
}

if ( !ds.search(addr)) {
// No more Dallas chips present:
Serial.print("No more addresses.\n");
ds.reset_search();
delay(250);
return;
}

// Output 64 Bit hardware id of Dallas Chip:
Serial.print("R=");
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(" ");
}

// Check for invalid CRC in address:
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;
}

// Check for family code which is not DS18B20:
if ( addr[0] != 0x28) {
Serial.print("Device is not a DS18B20 family device.\n");
return;
}

// The DallasTemperature library can do all this work for you!
ds.reset();
ds.select(addr);
ds.write(0x44,0); // start conversion, with parasite power off

delay(1000); // maybe 750ms is enough, maybe not

// Check whether chip is present:
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

Serial.print("P="); // Present = 1
Serial.print(present,HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes of data
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print( OneWire::crc8( data, 8), HEX);
// Calculate temperature. data[1] High Byte, data[0] Low Byte.
Temp = ((data[1] << 8) + data[0] ) * 0.0625; // 12Bit = 0,0625 C per Bit
Serial.print( " T=");
Serial.print( Temp, 2);
Serial.print( " C");
Serial.println();
display_1WSensor();
}

void display_1WSensor(){
// display Sensor data on LCD:
char line[17];
// Hardware ID:
sprintf(line, "%02X%02X%02X%02X%02X%02X%02X%02X", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]);
lcd.setCursor(0,0); // move to the begining of the second line
lcd.print(line);
// Temperature in Hex:
lcd.setCursor(0,1);
sprintf(line, "D=%02X%02X", data[1], data[0]);
lcd.print(line);
// Temperature as Degree Celsius:
lcd.setCursor(7,1);
//sprintf(line, "T=%f C", Temp); funktioniert nicht, Fehler in Compiler?
dtostrf(Temp, 5, 2, line); // funktionierende Alterntative?
lcd.print("T=");
lcd.print(line);
lcd.print(" C");
}
Es geht immer darum, dass die Variable display_1WSensor() nicht deklariert ist, aber die wird doch weiter unten im voidteil deklariert oder nicht?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2016, 18:25
Beitrag #6
RE: Per Keypad Shield zwischen zwei Programmen schalten
(04.03.2016 18:16)Rob-LE schrieb:  Ich bin inzwischen auch an einem Anderen Punkt, nämlich dabei, dass das Programm immer wieder sagt, dass eine Variable nicht deklariert ist. Problem an der Sache ist, dass in dem Ursprungsprogramm, welches ja nun in das Programm des KPS eingearbeitet werden soll, diese deklariert ist.

Dann musst du diese Variable auch hier deklarieren. Und zwar am Anfang.
Aber bei dir ist es keine Variable, sondern die Funktion.
Da wird sicher ein Klammerfehler sein. Nur dein Sketch ist schlecht lesbar:

Und besser ist es, wenn du deinen Sketch in Code-Tags setzt. Dann wird er für uns auch lesbar. So ganz ohne Formatierung ist das schwierig.

Code-Tags erreichst du mit der Schaltfläche "#". Oder vor den Sketch [*code] und nach dem Sketch [*/code], jeweils ohne den *Stern, einfügen.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2016, 20:25
Beitrag #7
RE: Per Keypad Shield zwischen zwei Programmen schalten
Also ich bin jetzt bei folgendem Code angekommen:

Code:
//Sample using LiquidCrystal library

#include <LiquidCrystal.h>
#include <OneWire.h>



// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
OneWire  ds(3);                      // 1Wire Instance on Arduino digital pin 3


byte i;
byte present = 0;
byte data[3];
byte addr[8];
float Temp;

// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
//if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result

if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;

//return btnNONE; // when all others fail, return this...
}
int Temperaturanzeige()
{
  

  // The DallasTemperature library can do all this work for you!
  ds.reset();
  ds.select(addr);
  ds.write(0x44,0);          // start conversion, with parasite power off

  delay(1000);               // maybe 750ms is enough, maybe not

  // Check whether chip is present:
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);             // Read Scratchpad

  Serial.print("P=");         // Present = 1
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {   // we need 9 bytes of data
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print( OneWire::crc8( data, 8), HEX);
  // Calculate temperature. data[1] High Byte, data[0] Low Byte.
  Temp =  ((data[1] << 8) + data[0] ) * 0.0625;  // 12Bit = 0,0625 C per Bit
  Serial.print( " T=");
  Serial.print( Temp, 2);
  Serial.print( " C");
  Serial.println();
}


int Temperaturumrechnung()


  {
  // display Sensor data on LCD:
  char line[17];
  // Hardware ID:
  sprintf(line, "%02X%02X%02X%02X%02X%02X%02X%02X", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]);
  lcd.setCursor(0,0);         // move to the begining of the second line
  lcd.print(line);
  // Temperature in Hex:
  lcd.setCursor(0,1);
  sprintf(line, "D=%02X%02X", data[1], data[0]);
  lcd.print(line);
  // Temperature as Degree Celsius:
  lcd.setCursor(7,1);
  //sprintf(line, "T=%f C", Temp); funktioniert nicht, Fehler in Compiler?
  dtostrf(Temp, 5, 2, line);  // funktionierende Alterntative: http://dereenigne.org/electronics/arduino/arduino-float-to-string
  lcd.print("T=");
  lcd.print(line);
  lcd.print(" C");
}



void setup()
{
lcd.begin(16, 2); // start the library
lcd.setCursor(0, 0);
lcd.print("Der Osten Rollt"); // print a simple message
pinMode (2, OUTPUT);
}

void loop()
{
digitalWrite (2, HIGH);
//lcd.setCursor(12,1); // move cursor to second line "1" and 12 spaces over
//lcd.print(millis()/1000); // display seconds elapsed since power-up


lcd.setCursor(0,1); // move to the begining of the second line
lcd_key = read_LCD_buttons(); // read the buttons

switch (lcd_key) // depending on which button was pushed, we perform an action
{
case btnRIGHT:
{
lcd.clear();
lcd.print("Robert   ");
digitalWrite (2, LOW);
break;
}
case btnLEFT:
{
lcd.clear();
lcd.print("Christian");
break;
}
case btnUP:
{
lcd.clear();
lcd.print("Ronny    ");
break;
}
case btnDOWN:
{
lcd.clear();
Temperaturumrechnung();
break;
}
case btnSELECT:
{
lcd.clear();
lcd.print("Fabi     ");
break;
}
case btnNONE:
{
lcd.clear();
lcd.print("Bereit   ");
break;

}
}
}

Das problem ist nun, dass bei Tastendruck zwar etwas angezeigt wird, auch in der Formatierung des Temperaturprogramms, allerdings nur Nullen. Irgendwo fehlt also eine Variable, ich weis aber nicht, wie ich diese definieren soll bzw. an welcher Stelle.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2016, 22:25
Beitrag #8
RE: Per Keypad Shield zwischen zwei Programmen schalten
Sorry, aber bei deinem Sketch komm ich nicht weiter.
Aus meiner Sicht machst du es sehr kompliziert.

Um zu prüfen, ob etwas angezeigt werden kann, kannst du die Daten auch auf den SerialMonitor schicken. Und die Adressübergabe an den Sensor finde ich auch sehr merkwürdig.

Du kannst es dir mit der Dallas-Library sehr viel einfacher machen und dann funktioniert es auch.

https://github.com/milesburton/Arduino-T...ol-Library

Diese setze ich ein und da musst du nicht selber berechnen.
Die beiliegenden Beispiel sind sehr aufschlussreich und helfen garantiert.
Auf jeden Fall funktioniert es.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino NANO mit zwei 1.8 SPI-tfts Thandor 2 104 15.11.2016 23:18
Letzter Beitrag: Thandor
  Unterschied zwischen DVI 24+1 und einem DVI 24+5 Adapter Pit 2 140 17.10.2016 15:49
Letzter Beitrag: Pit
  Schrittmotor ruckelt beim Start und im laufenden Betrieb - Arduino+Motor Shield grt35a 3 274 21.09.2016 06:56
Letzter Beitrag: Bitklopfer
  Steuerung eines Schrittmotor und eines Lüfters auf einem Shield phischmi 7 281 18.08.2016 20:58
Letzter Beitrag: phischmi
  Avr NetIO als Arduino mit Ethernet-Shield amithlon 2 534 18.08.2016 17:42
Letzter Beitrag: amithlon
  Welches WiFi-Shield? alpenpower 1 345 14.07.2016 11:19
Letzter Beitrag: alpenpower
  Uno gehen zwei digital Pins nicht edlosijagen 15 595 07.07.2016 19:22
Letzter Beitrag: Bitklopfer
  Motor Shield wird Heiß erwin 8 1.131 24.03.2016 11:29
Letzter Beitrag: hotsystems
  Multi functional Expansion Board Sensor Shield Astropikus 5 787 03.03.2016 22:32
Letzter Beitrag: hotsystems
  Arduino DUE mit W5100 Shield crissy-98 15 1.518 15.02.2016 15:57
Letzter Beitrag: crissy-98

Gehe zu:


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