Loading...
Pages: [1]   Go Down
Author Topic: Temperaturmessung mit DS18B20 und LCD Keypad Shiel  (Read 437 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Forum,

ich habe mir das LCD Keypad Shield bestellt und versuche nun die gemessene Temperatur über das Display auszugeben. Lieder bekomme ich immer nur den Wert +85° abgezeigt.

Kann mir jemand eine Tip geben was da falsch laufen kann?

Ich benutze den Beispielcode LCD4Bit_mod

//example use of LCD4Bit_mod library

#include <LCD4Bit_mod.h>
#include <stdio.h>

#define TEMP_PIN 3
//create object to control an LCD.  
//number of lines in display=1
LCD4Bit_mod lcd = LCD4Bit_mod(2);

void getCurrentTemp(char *temp);

//Key message
int  adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;

void setup() {
  pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat

   // initialize DS18B20 datapin
    digitalWrite(TEMP_PIN, LOW);
    pinMode(TEMP_PIN, INPUT);      // sets the digital pin as input (logic 1)
  lcd.init();
  //optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
  //lcd.commandWrite(0x0F);//cursor on, display on, blink on.  (nasty!)
   lcd.clear();
  lcd.printIn("Temperature is");
    
}

void loop() {

  char temp_string[10];
  adc_key_in = analogRead(0);    // read the value from the sensor  
  key = get_key(adc_key_in);                    // convert into key press
      
 if (key != oldkey)                            // if keypress is detected
 {
    delay(50);            // wait for debounce time
    adc_key_in = analogRead(0);    // read the value from the sensor  
    key = get_key(adc_key_in);                    // convert into key press
    if (key != oldkey)                        
    {                  
      oldkey = key;
      getCurrentTemp(temp_string);
      lcd.cursorTo(2, 0);  //line=2, x=0
      lcd.printIn(temp_string);
    }
 }
 
  
  
}

// Convert ADC value to key number
int get_key(unsigned int input)
{
      int k;
    
      for (k = 0; k < NUM_KEYS; k++)
      {
            if (input < adc_key_val[k])
            {
          
    return k;
        }
      }
  
    if (k >= NUM_KEYS)
        k = -1;     // No valid key pressed
    
    return k;
}


void OneWireReset(int Pin) // reset.  Should improve to act as a presence pulse
{
     digitalWrite(Pin, LOW);
     pinMode(Pin, OUTPUT); // bring low for 500 us
     delayMicroseconds(500);
     pinMode(Pin, INPUT);
     delayMicroseconds(500);
}

void OneWireOutByte(int Pin, byte d) // output byte d (least sig bit first).
{
   byte n;

   for(n=8; n!=0; n--)
   {
      if ((d & 0x01) == 1)  // test least sig bit
      {
         digitalWrite(Pin, LOW);
         pinMode(Pin, OUTPUT);
         delayMicroseconds(5);
         pinMode(Pin, INPUT);
         delayMicroseconds(60);
      }
      else
      {
         digitalWrite(Pin, LOW);
         pinMode(Pin, OUTPUT);
         delayMicroseconds(60);
         pinMode(Pin, INPUT);
      }

      d=d>>1; // now the next bit is in the least sig bit position.
   }
  
}

byte OneWireInByte(int Pin) // read byte, least sig byte first
{
    byte d, n, b;

    for (n=0; n<8; n++)
    {
        digitalWrite(Pin, LOW);
        pinMode(Pin, OUTPUT);
        delayMicroseconds(5);
        pinMode(Pin, INPUT);
        delayMicroseconds(5);
        b = digitalRead(Pin);
        delayMicroseconds(50);
        d = (d >> 1) | (b<<7); // shift d to right and insert b in most sig bit position
    }
    return(d);
}


void getCurrentTemp(char *temp)
{  
  int HighByte, LowByte, TReading, Tc_100, sign, whole, fract;

  OneWireReset(TEMP_PIN);
  OneWireOutByte(TEMP_PIN, 0xcc);
  OneWireOutByte(TEMP_PIN, 0x44); // perform temperature conversion, strong pullup for one sec

  OneWireReset(TEMP_PIN);
  OneWireOutByte(TEMP_PIN, 0xcc);
  OneWireOutByte(TEMP_PIN, 0xbe);

  LowByte = OneWireInByte(TEMP_PIN);
  HighByte = OneWireInByte(TEMP_PIN);
  TReading = (HighByte << smiley-cool + LowByte;
  sign = TReading & 0x8000;  // test most sig bit
  if (sign) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  whole = Tc_100 / 100;  // separate off the whole and fractional portions
  fract = Tc_100 % 100;

/*
      if(sign) temp[0]='-';
      else              temp[0]='+';
      
      temp[1]= whole%100+'0';
      temp[2]= (whole-100*temp[1])%10 +'0' ;
      temp[3]= whole-100*temp[1]-10*temp[2] +'0';
      
      temp[4]='.';
      temp[5]=fract%10 +'0';
      temp[6]=fract-temp[5]*10 +'0';
      
      temp[7] = '\0';
*/

      sprintf(temp, "%c%3d%c%2d", (sign==0)?'+':'-', whole, '.', fract);
      
}      

Regards Kirk
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 149
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

scheint so, als ob immer der Temperaturwert, der nach Power-On im Scratchpad steht gelesen wird, also keine Temperaturmessung stattfindet. Laut Datenblatt sollte auch während der Wandelzeit die Datenleitung auf 1 gehalten werden (bzw. bei externer Versorgung solange Bits gelesen werden, bis ein '1'-Bit gelesen wird) und dann erst der Temperaturwert gelesen werden. Du erzeugst aber direkt einen Reset und liest dann den Temperaturwert. Vielleicht liegt es daran.
#
Gruß
Michael


Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Michael,

danke das du mal über den Code geschaut hast (hört sich irgendwie komisch an ;-) )

Nun ja, der Code ist nicht von mir sondern von dem Hersteller des LCD´s.

Das Auslesen der Temp funktioniert mit der Dallas 250 lib übrigens super. Am Sensor kanns also nicht liegen.

Danke schon mal
Logged

CH
Offline Offline
God Member
*****
Karma: 19
Posts: 703
Book Writer "Arduino Praxiseinstieg"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würde die beiden Codeteile, Ausgabe auf LCD und Temperaturmessung separat testen.

Prüfe ob getCurrentTemp(char *temp) einen gültigen Wert ausgibt. Andernfalls ist der Fehler in dieser Funktion zu suchen. Den Messwert kann im Seriellen Monitor ausgegeben und geprüft werden.
Mache das selbe mit der LCD-Ausgabe. Zum Test festen Wert auf Display ausgeben.

Quote
Dallas 250 lib übrigens
Im Sketch vom LCD-Anbieter ist aber keine solche Bibliothek verwendet.
Dein Test hat aber als Resultat dass dein Sensor funktioniert.

Im Fehlerfall muss einfach jeder Codeteil einzeln geprüft werden. Zuviel Code und Funktionen zusammen testen, machen es speziell für Beginner umso schwerer.


Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So ein Mist!

Der Code funzt ja mal garnicht....und sowas als Beispiel mitzuliefern *grrrrrrr*
Logged

Pages: [1]   Go Up
Print
 
Jump to: