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
  SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield Bikandajyo 14 830 Heute 09:55
Letzter Beitrag: Bikandajyo
  Arduino Mega mit TFT Shield Diskusguppy 4 109 15.12.2017 02:04
Letzter Beitrag: Diskusguppy
  nano, micro oder? für LAN Shield sepp01 10 616 12.11.2017 11:30
Letzter Beitrag: sepp01
  Steckertyp von SD Card Shield V4.0? alpenpower 7 653 10.11.2017 10:04
Letzter Beitrag: SkobyMobil
  RESET für zwei Pegel & Pegel wandeln Wampo 20 1.149 25.10.2017 17:04
Letzter Beitrag: ardu_arne
  Display für ATMega 2560 mit Shield lion88 8 1.073 08.10.2017 18:27
Letzter Beitrag: SkobyMobil
  Direkte Datenübertragung zwischen Unos Binary1 20 1.231 05.09.2017 11:59
Letzter Beitrag: Bitklopfer
  TC35 mit NPN und PNP schalten bergfrei 8 690 15.07.2017 22:47
Letzter Beitrag: georg01
  CAN-Shield iVm 3,3V Arduino Pro Mini Clubsport 12 1.097 13.04.2017 22:56
Letzter Beitrag: Bitklopfer
  Zu HC-06 zwei Werte gleichzeitig senden und auswerten milirp 3 1.050 11.03.2017 13:29
Letzter Beitrag: Binatone

Gehe zu:


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