temp.wert ds18b20 auf s65 anzeigen

thomas 2010-01-27 23:13:53 Link
hallo zusammen,
bin neu hier und hab da gleich mal eine frage.
ich würde gerne einen oder mehrere ds18b20 temperatursensoren auslesen und 
die temperatur auf einem S65 schild anzeigen lassen, ich bin nun schon ein
woche am probieren und komme einfach nicht weiter.
textaugabe funktionirt einwandfrei.

und noch etwas, wenn ich die arduino software starte und eine datei öffne 
kommt es sehr oft vor das sich sofort mehrere fenster öffnen. kann man das
irgendwie konfigurieren das nur ein fenster auf geht.

ich würde mich freuen wenn ihr ein paar ideen für mich hättet.

gruß thomas

Andreas Watterott 2010-01-28 16:20:19 Link
Hallo,

Zahlen muss man erst mit itoa() oder sprintf() in Zeichenketten umwandeln
bevor man sie auf dem S65-Display ausgeben kann.

Hier ein Bsp:
  int zahl = 99; //zahlenwert
  char text[16]; //textpuffer (array)

  sprintf(text, "%i", zahl); //umwandlung
  lcd.drawText(20, 20, text, 1, RGB(0,0,0), RGB(255,255,255)); //ausgabe

Gruß
Andreas

thomas 2010-02-14 19:44:47 Link
Hallo Andreas,
Danke fur die schnelle Antwort.
Mit sprintf() habe ich es leider nicht hinbekommen itoa() klappt hingegen
prima.
Ich kann jetzt mehrer ds18b20 Sensoren aulesen und auf dem S65 anzeigen.
Die Temperatur wird jetzt als ganze Zahl zb. 24 angezeigt. 
was muß ich tun um eine Anzeige mit 2Stellen hinter dem Komma zu bekommen?
Im Serial Monitor sind die beiden stellen hinter dem Komma vorhanden.
Hier mal meine Eingabe:

float tempRL = sensors.getTempC(RL);
Serial.print("RL Temp: ");
Serial.print(tempRL);

char Vorlauf [10];    
itoa (tempVL,  Vorlauf,  10);
lcd.drawText (90,  10,  Vorlauf, RGB (0,0,255),RGB(255,50,100)); 
lcd.drawTextPGM(5,10, PSTR("VL Temp:="), RGB(  0,  0,255), RGB(255,  0, 
0));

Gruß
Thomas

monte 2010-02-14 21:55:58 Link
Hallo Thomas hallo Andreas,

ich versuch nun auch schon einige Tage ein Thermometer mit dem DS18s20 und
dem S65 zu bauen, aber er zählt immer nur bis 32767 und dann -32767 und
wieder hoch. Ich kann int in short oder unsigned oder float es nützt alles
nicht warum??


 
void loop()
{
  int zahl; //zahlenwert
 // short zahl; //zahlenwert
  char text[16]; //textpuffer (array)

  for (zahl = 32500; zahl <= 35000; zahl++) {
    sprintf(text, "%d", zahl); //umwandlung
    lcd.drawText(20, 20, text, 1, RGB(20,40,60), RGB(255,255,255));
//ausgabe
  
  }

@Thomas würde es dir viel ausmachen deinen Code mit dem DS1820
preiszugeben?

Andreas Watterott 2010-02-14 22:15:14 Link
@Thomas:
Für float geht nicht itoa().
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1164927646

@monte:
Die Float-Unterstützung muss erst für printf eingeschaltet werden und man
muss den richtigen Platzhalter verwenden. %d steht für signed decimal
(16bit).
  %d %i -> int
  %l    -> long
  %x    -> hex
  %f    -> float

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1164927646

Gruß
Andreas

thomas 2010-02-15 16:18:58 Link
@monte:

hier mal ein Code, aber nur ohne kommastellen

#include <OneWire.h>
#include <DallasTemperature.h>
#include <S65Display.h>
int ledPin1 = 3;

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
 
DallasTemperature sensors(&oneWire);

S65Display lcd;

DeviceAddress VL;

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");
 
  Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
  
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
 
  if (!sensors.getAddress(VL, 0)) Serial.println("Unable to find address
for Device 0"); 
    
  Serial.print("Device 0 Address: ");
  printAddress(VL);
  Serial.println();
 
  sensors.setResolution(VL, 9);
 
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(VL), DEC); 
  Serial.println();

  lcd.init(4); 
 
  sei();
  
 lcd.clear(RGB(255,0,0));

}

void printTemperature(DeviceAddress deviceAddress)
{
   
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);

if(tempC>=26)

 {
   digitalWrite(ledPin1, HIGH);
  
 }
 
 if(tempC<=26)
 {
   digitalWrite(ledPin1, LOW);
 }

 char Vorlauf [30];    
  itoa (tempC,  Vorlauf,  10);
  lcd.drawText (90,  10,  Vorlauf, RGB (0,0,255),RGB(255,50,100)); 
  lcd.drawTextPGM(5,10, PSTR("VL Temp:="), RGB(  0,  0,255), RGB(255,  0, 
0));

}

void loop(void)
{ 
  
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); 
  Serial.println("DONE");
  
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin1, LOW);
  
  printTemperature(VL); 
}

void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

Gruß
Thomas

monte 2010-02-17 22:27:13 Link
Hallo, vielen Dank schon mal für den Code

was muss bei "DeviceAddress VL;" hin der HEX wert des DS?
kann das so etwas sein

R=10 A2 5E B5 1 8 0 33 P=1 27 0 4B 46 FF FF 6 10 8E  CRC=8E
Temperatur: 19.95 Grad Celsius 

wenn ich das Programm versuche zu compelieren 
kommt 
###############
 In function 'void printTemperature(uint8_t*)':
error: no matching function for call to 'S65Display::drawText(int, int,
char [30], int,
int)'C:\Programme\arduino-0018\libraries\S65Display/S65Display.h:92: note:
candidates are: uint8_t S65Display::drawText(uint8_t, uint8_t, char*,
uint8_t, uint16_t, uint16_t)

##################

ich kommentiere dann 
//lcd.drawText(90,  10,  Vorlauf, RGB (0,0,255),RGB(255,50,100)); 

dann erkennt er scheinbar ein Sensor -> Found 1 devices.

aber weiß scheinbar die Adresse nicht

Dallas Temperature IC Control Library Demo
Locating devices...Found 1 devices.
Parasite power is: ON
Unable to find address for Device 0
Device 0 Address: 0000000000000000
Device 0 Resolution: 0
Requesting temperatures...DONE
Temp C: 0.00Requesting temperatures...DONE


in dem Programm mit der Ausgabe von oben 
// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10
ist der Sensor an pin 10
woher weiß das Programm an welchem pin der DS1820 ist?

Fragen über Fragen ? DANKE für die Hilfe

thomas 2010-02-18 20:29:08 Link
@monte
Hallo,
schau dir den code mal genau an.

was muss bei "DeviceAddress VL;" hin der HEX wert des DS?

da kommt garnichts rein alles bleit so wie es ist.

VL ist die Variable


in dem Programm mit der Ausgabe von oben 
// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10
ist der Sensor an pin 10
woher weiß das Programm an welchem pin der DS1820 ist?

#define ONE_WIRE_BUS 2 //ds18b20 an digitalPin2
an welchen Pin hast du den Sensor angeschlossen?

ACHTUNG IN ZWEI ZEILEN IST EIN FEHLER!!!!!!!!!!!!!!

Bitte die zweite zeile dierekt hinten an die erste zeile setzen.
  if (!sensors.getAddress(VL, 0)) Serial.println("Unable to find address
for Device 0");  

 lcd.drawTextPGM(5,10, PSTR("VL Temp:="), RGB(  0,  0,255), RGB(255,  0, 
0));

die nachfolgenden zeilen kannst du löschen
sind nicht korrekt, haben aber nichts mit der anzeige zu tun.

if(tempC>=26)
 {
   digitalWrite(ledPin1, HIGH);
  }
  if(tempC<=26)
 {
   digitalWrite(ledPin1, LOW);
 }
 
viel Erfolg
Gruß Thomas

monte 2010-02-18 21:59:21 Link
@Thomas

Hurra es geht,

ich hatte mein Sensor an pin 10 aber damit hat es nicht Funktioniert

#define ONE_WIRE_BUS 10 => #define ONE_WIRE_BUS 2

an pin 2 gehts , warum nicht an 10 ??? weiss ich nicht

und 

hier ==================> hat die 1 für die Schriftgösse gefehlt
lcd.drawText (90,  10,  Vorlauf, 1, RGB (0,0,255),RGB(255,50,100)); 
lcd.drawTextPGM(5,10, PSTR("VL Temp: "), 1, RGB(0,0,255), RGB(255,0,0));

VIELEN Dank

ich versuche mal selbst noch was nach dem Komma zu bekommen und einen
weiteren Sensor anzuzeigen. Die findet er ja schon.

Dallas Temperature IC Control Library Demo
Locating devices...Found 3 devices.
Parasite power is: OFF
Device 0 Address: 280ACACE010000C9
Device 0 Resolution: 9
 Requesting temperatures...DONE
Temp C: 22.00 Requesting temperatures...DONE
Temp C: 22.00 Requesting temperatures...DONE


Gruss Monte

Thomas 2010-02-18 22:20:53 Link
@monte
Freut mich das ich Dir helfen konnte.
Schreib mal wenn du es hinbekommen hast mit den Nachkommastellen.

ein 2. Sensor braucht eine neue Variable.

Gruss Thomas

thomas 2010-02-19 20:34:44 Link
Hallo Andreas,

Mit Deiner Antwort komme ich nicht wirklich zurecht.

@Thomas:
Für float geht nicht itoa().
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1164927646

Mein Englisch ist leider nicht so Perfekt das ich daraus was lernen kann.

eine Antwort für Nichtprogrammierer währe nicht schlecht.

gruß
Thomas

Andreas Watterott 2010-02-19 22:25:05 Link
Hallo Thomas,

itoa() ist nur für Integer-Variablen (ganze Zahlen). Für float (Fließkomma)
benötigt man eine andere Umwandlungsfunktion ftoa() [1]. Die
Fließkomma-Unterstützung ist auch standardmäßig ausgeschaltet bei den
mitgelieferten Arduino Bibliotheksfunktionen (printf...).

[1] In Arduino Forum hat jemand eine ftoa() Funktion selbst geschrieben:
  char *ftoa(char *a, double f, int precision)
  {
    long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};

    char *ret = a;
    long heiltal = (long)f;
    itoa(heiltal, a, 10);
    while (*a != '\0') a++;
    *a++ = '.';
    long desimal = abs((long)((f - heiltal) * p[precision]));
    itoa(desimal, a, 10);

    return ret;
  }

Gruß
Andreas

Jean Herbes 2010-03-20 21:27:31 Link
Hey, ich hatte etwas ähnliches vor. Ich wollte Temperaturdaten vom DS18B20
auf einer SD-Karte im libelium SD-Modul speichern. Dazu brauchte ich auch
die ftoa Funktion. Der Code hat einmal funktioniert (mit einer 15Mb
hola.txt) und dann nie wieder, also liegt es warscheinlich nicht am Code
sondern an dem Modul, oder der Karte oder diesem dummen EXT Charakter ;)
Anyway, um die ftoa Funktion zu verstehen habe ich mir ein paar Grundlagen
in der Deklaration von Funktionen in C/C++ angeschaut, und dann die weiter
oben gepostete Funktion in meinen Code eingebaut. 
Ich würde jetzt gerne auf das S65 Shield als Anzeige- und Speicherlösung
umschwenken, habe dazu aber erst nächste Woche Zeit. Ich stelle mal meinen
Code für das libelium-Modul hier ein, da kann man ganz gut erkennen wie die
ftoa-Funktion angesprochen werden muss. 

Viele Grüße, Jean

Hier ist der Code, die Kommentare im Code sind zu lang für diese Textbox
und werden gebrochen, müssen also beim Übertrag in die Arduino-Umgebung
wieder zu einer Zeile zusammengeführt werden sonst läuft der Code nicht.

#include <OneWire.h>
#include <DallasTemperature.h>
#include "SDuFAT.h"

// Data wire is plugged into port 7 on the Arduino
#define ONE_WIRE_BUS 7

// Setup a oneWire instance to communicate with any OneWire devices (not
just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;

// variable used when reading from serial
byte inSerByte = 0;

void setup(void) 
{
  // start serial port
  Serial.begin(9600);

  // locate devices on the bus
  Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // assign address manually.  the addresses below will beed to be changed
  // to valid device addresses on your bus.  device address can be
retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

  // Method 1:
  // search for devices on the bus and assign based on an index.  ideally,
  // you would do this to initially discover addresses on the bus and then 
  // use those addresses and manually assign them (see above) once you know

  // the devices on your bus (and assuming they don't change).
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to
find address for Device 0"); 
  
  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();

  // set the resolution to 9 bit (Each Dallas/Maxim device is capable of
several different resolutions)
  sensors.setResolution(insideThermometer, 10);
 
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC); 
  Serial.println();

}


// function to print a device address
void printAddress(DeviceAddress deviceAddress) 
  {
    for (uint8_t i = 0; i < 8; i++)
    {
      if (deviceAddress[i] < 16) Serial.print("0");
      Serial.print(deviceAddress[i], HEX);   
    }
  }


// function to print the temperature for a device to serial
void printTemperature(DeviceAddress deviceAddress)
  {

    float tempC = sensors.getTempC(deviceAddress);
    Serial.print("Temp C: ");
    Serial.println(tempC);
    //Serial.print(" Temp F: ");
    //Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts
tempC to Fahrenheit
  }

 
// function to store temp-data on the card
void saveTemperature(DeviceAddress deviceAddress)
  {
    
    char float_conv[10];                                    // array to
hold the data for the ftoa fuction
    float temp1 = sensors.getTempC(deviceAddress);          // variable to
store temperature before converting
    SD.println("hola.txt", ftoa(float_conv, temp1, 2));    // saving the
directly converted temp1 to card 
  }
  
// function to convert the temperature (given in float) to a string 
// (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1164927646)
char *ftoa(char *a, double f, int precision)
  {
    long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};
    char *ret = a;
    long heiltal = (long)f;
    itoa(heiltal, a, 10);
    while (*a != '\0') a++;
    *a++ = '.';
    long desimal = abs((long)((f - heiltal) * p[precision]));
    itoa(desimal, a, 10);
    return ret;
  }



void loop(void) {
  
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  //Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  //Serial.println("Done");
  // It responds almost immediately. Let's print out the data
  
  printTemperature(insideThermometer); // Use a simple function to print
out the data
  delay(100);
  saveTemperature(insideThermometer); // use the above created function to
save the data to the card
  delay(4900);            //delay because of delay 
}

Reply

Name
eMail (not visible)
Subject (no text only in upper case; no HELP, URGENT...)
Text
HTML tags are not supported and links are generated automatically if they start with http or ftp.
Please submit long source code or log files as attachment (only registered users).
Please enter the number 2699