Pages: [1]   Go Down
Author Topic: 2 x DS18S20 an Arduino, wie bekomme ich die 2te Temp angezeigt.  (Read 1008 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Liebe Arduino Gemeinde,

ich habe ein Verständnisproblem. Ich habe 2 mal den DS18S20 Sensor und möchte diese auf meinem 2 x 16 LCD ausgeben. Ich habe hierzu das DS18X20 Example geöffnet und an meine Bedürfnisse angepasst (OneWire Pin und LCD Konfig.). Nun wollte ich den Code so anpassen das ich in der 2ten Zeile die Temperatur des 2ten Sensors anzeige. Er ließt offensichtlich beide Temps ein, jedoch zeigt er in beiden Zeilen die selbe Temperatur, dafür aber abwechselt Sensor 1 und dann Sensor 2. Also so:

Temp1=23,61°C
Temp2=23,61°C

und anschließend

Temp1=23,22°C
Temp2=23,22°C

Ich hätte erwartet das er mir es so anzeigt:

Temp1=23,61°C
Temp2=23,22°C

Anbei meine Code:

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

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
OneWire  ds(8);  // on pin 10

void setup(void) {
  lcd.clear();
  lcd.begin(16, 2);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  float celsius2;

  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      type_s = 1;
      break;
    case 0x28:
      type_s = 0;
      break;
    case 0x22:
      type_s = 0;
      break;
    default:
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
 
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

 for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.9;
  celsius2 = (float)raw / 16.9;

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp1=");
  lcd.print(celsius);
  lcd.print((char(223)));
  lcd.print("C");
  lcd.setCursor(0, 2);
  lcd.print("Temp2=");
  lcd.print(celsius2);
  lcd.print((char(223)));
  lcd.print("C");
  delay(1000);


Ich hoffe Ihr Steinigt mich jetzt nicht beim ersten Post.... smiley-razz

Was muss ich wie umstellen damit ich das realisieren kann was ich möchte?

Desweiteren habe ich noch 2 Fragen:

1. Wie kann man die Ausgabe auf 1ne Stelle nach dem Komma begrenzen?
2. Wie kann erreicht werten das beide Sensoren mit einem Delay von 2s geupdated werden? Also Temp1 wird aktuallisiert und Temp2 erst nach 2s, der Wert von Temp1 soll dabei erhalten bleiben und wird erst 2s nach update von Temp2 wieder geupdated....


Hoffe das mir her jemand helfen kann. Ich habe einen Arduino Thermometer im Internet gesehen der mir so gut gefällt, das ich diesen unbedingt nachbauen möchte. Jedoch möchte ich den Code so gut es geht selbst zusammenstricken... smiley-wink

Leider weiß ich auch nicht ob ich den Link zur Videoportal oder zum Bilderdienst posten darf.

So, jetzt wünsche ich noch allen Vätern einen schönen Vatertags abend und bin gespannt auf eure Antworten.

Grüße Thomas
Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
lcd.setCursor(0, 2);

wenn du in zeile 2 willst dann muss das 0,1 sein

Quote
float celsius;

du mußt den datentyp ändern
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo ht81

ich hab da noch diesen Sketch rumliegen Versuchs mal damit:
Code:
// Laden der Libarys

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Verwendete Pins des Displays angeben

// Bedeutet wie folgt
// * LCD RS pin to digital pin 8
// * LCD Enable pin to digital pin 9
// * LCD D4 pin to digital pin 4
// * LCD D5 pin to digital pin 5
// * LCD D6 pin to digital pin 6
// * LCD D7 pin to digital pin 7


//Variablen Festlegen
float Temperatur_1;
float Temperatur_2;
float Temperatur_3;
float Temperatur_4;

// DS18B20

// Datendraht an Pin D3
#define ONE_WIRE_BUS 3

// Start Kommunikation mit den Datenteilnehmern
OneWire oneWire(ONE_WIRE_BUS);

// Eistellung vom Dallas Datenprotokoll
DallasTemperature sensors(&oneWire);


DeviceAddress Thermometer_1 = { 0x28, 0xFA, 0xC9, 0x96, 0x03, 0x00, 0x00, 0x7E };
DeviceAddress Thermometer_2 = { 0x28, 0xC0, 0x97, 0x96, 0x03, 0x00, 0x00, 0x6B };
DeviceAddress Thermometer_3 = { 0x28, 0x89, 0xA3, 0x96, 0x03, 0x00, 0x00, 0x13 };
DeviceAddress Thermometer_4 = { 0x28, 0xA6, 0xB7, 0x96, 0x03, 0x00, 0x00, 0xE2 };

void setup ()
{
Serial.begin(9600); //initialisieren serielle Schnittstelle auf 9600 Baud
Serial.println("Start"); //Start ausgeben

// Festlegen LCD Displaygröße
lcd.begin(16, 2);

//DS18B20Anfang

  // Starten der  library DS18B20
  sensors.begin();
  // Einstellung der Auflösung auf 10 bit
  sensors.setResolution(Thermometer_1, 10);
  sensors.setResolution(Thermometer_2, 10);
  sensors.setResolution(Thermometer_3, 10);
  sensors.setResolution(Thermometer_4, 10);

} //DS18B20 Ende


void loop()
{



//DS18B20 Anfang

  //Start Abfrage DS18B20
  sensors.requestTemperatures();
 
  //Temperaturen DS18B20 in Variable ablegen
  float Temperatur_1 = sensors.getTempC(Thermometer_1);
  float Temperatur_2 = sensors.getTempC(Thermometer_2);
  float Temperatur_3 = sensors.getTempC(Thermometer_3);
  float Temperatur_4 = sensors.getTempC(Thermometer_4);

// DS18B20 Ende

// Start Ausgabe Seriell
 
  Serial.print("1.Temperature ist: ");
  Serial.println(Temperatur_1);
  Serial.print("2.Temperature ist: ");
  Serial.println(Temperatur_2);
  Serial.print("3.Temperature ist: ");
  Serial.println(Temperatur_3);
  Serial.print("4.Temperature ist: ");
  Serial.println(Temperatur_4);
 
//Ende Ausgabe Seriell 
 
 




// Ausgabe auf Display
lcd.clear();
lcd.setCursor(0, 0);// 1.Zeichen, 1.Zeile (Beginnt immer bei 0,0)
lcd.print(Temperatur_1,1);// Ausgabe des Variablen Inhalt, die 1 sind die Anzahl der Stellen nach Komma
lcd.setCursor(0, 1); //// 1.Zeichen, 2.Zeile
lcd.print(Temperatur_2,2);
delay (1000);// Warten und dann die Sensoren 3 und 4
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(Temperatur_3,1);
lcd.setCursor(0, 1);
lcd.print(Temperatur_4,1);
 
//Ende

}

die Sensoradressen bekommste mit diesen Sketch raus:
Code:
// This sketch looks for 1-wire devices and
// prints their addresses (serial number) to
// the UART, in a format that is useful in Arduino sketches
// Tutorial:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

#include <OneWire.h>

OneWire  ds(3);  // Connect your 1-wire device to pin 3

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

void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
 
  Serial.print("Looking for 1-Wire devices...\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rFound \'1-Wire\' device with address:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC is not valid!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rThat's it.\r\n");
  ds.reset_search();
  return;
}

void loop(void) {
  // nothing to see here
}



Viel Glück
Logged

Pages: [1]   Go Up
Jump to: