3 graden te weinig

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 102
Geregistreerd: 26 Okt 2015, 16:07

3 graden te weinig

Berichtdoor Atwist » 25 Nov 2015, 12:14

Ben momenteel met een temperatuursensor (DS18B20) bezig maar deze geeft 3 graden te weinig aan is dit aan te passen in onderstaande code?

Code: Alles selecteren
#include <OneWire.h>
// DS18B20 op pin 2.
OneWire ds(10);
 
void setup() {
  // Start seriele poort.
  Serial.begin(9600);
}
 
void loop() {
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(5000);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1]<<8)+data[0];
  Temp = Temp>>4;
 
  // schrijf temperatuur naar console.
  Serial.print(" T = ");
  Serial.print(Temp);
  Serial.println("'C");
}
Ik ben niet de slimste maar doe wel mijn best.
Andreas

Advertisement

Gebruikers-avatar
Berichten: 136
Geregistreerd: 06 Jun 2012, 15:45

Re: 3 graden te weinig

Berichtdoor hmjswt » 25 Nov 2015, 15:31

Hallo,

Ik heb je code ingevoerd en geprobeerd.
Geeft bij mij 23 graden aan.
Een, gekalibreerde, thermistor geeft op het zelfde moment 22,35 graden.
Die 23 graden van jouw code is wel afgerond...
Je kunt er vanuit gaan dat je code goed werkt.
Zit hij wel in de goede poort?
Je geeft aan dat hij op pin 2 zit.
Maar in je code staat ds(10).
Dus heb ik hem in pin 10 gestopt...

Waarom gebriuk je niet een bestaande library voor de DS18B20.
Kun je ook de decimalen uitlezen.

Groet,
Henk Siewert

Gebruikers-avatar
Berichten: 136
Geregistreerd: 06 Jun 2012, 15:45

Re: 3 graden te weinig

Berichtdoor hmjswt » 25 Nov 2015, 16:19

Hallo,

Probeer dit eens.
NU WEL IN PIN 2 STOPPEN!

Geeft bij mij 23,87 graden.
Mijn Thermistor geeft 22,52 graden.
Iets meer dan één graad verschil.
Maar ik heb nog nooit 2 sensoren meegemaakt die het helemaal met elkaar eens waren.
Dit kun je wel kalibreren.

Afbeelding

Code: Alles selecteren
/*
  ThermistorVWK
  Auteur      : Henk Siewert
  Datum      : 25 november 2015
  Sensor      : Maxim ( Dallas ) DS18B20
  Versie      : 001
  MCU      : Arduino Uno
  Language   : Arduino C++
  Compiler   : EArduino 1.6.6
  Editor      : NotePad++
  WWW      : http://www.swtcomp.com
*/

#include <OneWire.h>

int DS18S20_Pin = 2;       // DS18S20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18S20_Pin);    // on digital pin 2

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

void loop()
{
  float temperature = getTemp();
  Serial.println(temperature);
  delay(1000);
}

float getTemp()
{
  // Returns the temperature from one DS18S20 in DEG Celsius
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr))
  {
    // No more sensors on chain, reset search
    ds.reset_search();
    return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7])
  {
    Serial.println("CRC is not valid!");
    return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28)
  {
    Serial.print("Device is not recognized");
    return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);    // Start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);       // Read Scratchpad


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

  ds.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); // Using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;
}

Gebruikers-avatar
Berichten: 136
Geregistreerd: 06 Jun 2012, 15:45

Re: 3 graden te weinig

Berichtdoor hmjswt » 25 Nov 2015, 17:19

Hallo,

Ik heb de DS18B20 eens aangesloten op mijn Texas Instruments LaunchPad.
Hij geeft nu 22,6.
De thermistor geeft 22,61.
Lijkt me niet verkeert...
Maar de DS flippert af en toe wel naar 22,0 en weer terug.
De DS is niet zo'n erg stabiele sensor.
Bovendien duurt het wel lang, 750 milliseconden, voordat hij weer eens gaat meten.
Als je meer snelheid en een hogere resolutie wil kan ik je de LM35CZ aanraden.
Als je die dan in een 1 seconde loop zet en daar het gemiddelde van neemt heb je zeer betrouwbare uitkomsten.
Dat doe ik ook met mijn thermistor...

Het is bekent dat er nogal wat ruis op de ingangen van de Arduino staat.
Bovendien verdenk ik de opamp in de chip van een niet gecorrigeerde offset.

Eigenlijk zou je alle niet gebruikte ingangen aan massa moeten leggen.
Doe ik altijd met mijn LaunchPad's.

Succes,
Henk Siewert

Gebruikers-avatar
Berichten: 102
Geregistreerd: 26 Okt 2015, 16:07

Re: 3 graden te weinig

Berichtdoor Atwist » 25 Nov 2015, 18:38

Dank je wel Henk Siewert,

Wat een gedetailleerde uitleg, de decimalen zijn voor mij niet van belang en de temperatuur hoeft maar 1 keer per uur worden uitgelezen.
Alleen de waarde zou wel correct moeten zijn met +- 1 graad.
De tip om de niet gebruikte ingangen aan de GND leggen ga ik zeker gebruiken.

Wat voor sensor zou ik voor de correctheid kunnen gebruiken?
Ik ben niet de slimste maar doe wel mijn best.
Andreas

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 3 graden te weinig

Berichtdoor shooter » 25 Nov 2015, 21:25

staat de resolutie wel goed, etc. probeer het volgende eens

cpp code
/ This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Tutorial:
// http://www.hacktronics.com/Tutorials/ar ... orial.html

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

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/ar ... inder.html

DeviceAddress insideThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };

void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);
sensors.setResolution(dogHouseThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
Serial.print("C: ");
Serial.print(tempC);
Serial.print(" F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}

void loop(void)
{
delay(2000);
Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();

Serial.print("Inside temperature is: ");
printTemperature(insideThermometer);
Serial.print("\n\r");
Serial.print("Outside temperature is: ");
printTemperature(outsideThermometer);
Serial.print("\n\r");
Serial.print("Dog House temperature is: ");
printTemperature(dogHouseThermometer);
Serial.print("\n\r\n\r");
}
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 136
Geregistreerd: 06 Jun 2012, 15:45

Re: 3 graden te weinig

Berichtdoor hmjswt » 25 Nov 2015, 21:38

Hallo,

Als je met 'correctheid' precisie en betrouwbaarheid bedoelt dan zou ik je de Texas Instruments LM35CZ aanraden.
Goed en betrouwbaar. Resolutie ongeveer 0,5 graden.
Ik weet niet waarvan hij de temperatuur moet meten.
Maar als absolute topper geldt de PT100. Maar een echt goede kan heel veel Euro's kosten.
Maar misschien is een thermokoppel beter.
Hangt van de toepassing af.
Het is ook belangrijk of je onder het vriespunt moet meten.

Dus laat even weten wat je aan het meten bent.

Groet,
Henk Siewert

Gebruikers-avatar
Berichten: 102
Geregistreerd: 26 Okt 2015, 16:07

Re: 3 graden te weinig

Berichtdoor Atwist » 26 Nov 2015, 09:37

Code: Alles selecteren
Getting temperatures...

Inside temperature is: C: 0.00 F: 32.00

Outside temperature is: C: 0.00 F: 32.00

Dog House temperature is: C: 0.00 F: 32.00


Dit is wat ik krijg als ik de code van Shooter gebruik.

Wat ik aan het meten ben is water in een bak met dus DS18B20 een huis tui en keuken thermometer digitaal en een lab thermometer die niet meer is geijkt digitaal tussen deze 2 meters zit een verschil van 0,2 graden.
Ik ben niet de slimste maar doe wel mijn best.
Andreas

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 3 graden te weinig

Berichtdoor shooter » 26 Nov 2015, 10:37

je moet wel even het adres aanpassen natuurlijk, want dat weet ik niet.
elke ds heeft een ander getal daarvoor.
dat stuur je er naar toe en dan krijg je antwoord van de ds.

0,2 C is toegestaan bij calibratie bij ijswater.
als je ijsklontjes pakt, liefst in een geisoleerde beker (een soepbeker bijv.) dan er water bij doet tot het ijs net gaat drijven, dan 15 min uten wachten tot het allemaal stabiel is, dan is de garantie 0.02 Celsius.
kokend water is 100 C (maar daar kan een ds niet tegen.
ik doe heel veel Pt100 calibreren voor USDA.

Je zult je wel even moeten verdiepen in die ds want het is geen eenvoudige sensor wat een pt100 wel is, maar die heeft een omzetter nodig.
koop ik op ebay, want dat is goedkoper dan de losse chip kopen.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 102
Geregistreerd: 26 Okt 2015, 16:07

Re: 3 graden te weinig

Berichtdoor Atwist » 26 Nov 2015, 10:53

Het verdient geen schoonheidsprijs maar ik heb het even zo opgelost.
Code: Alles selecteren
 
  // schrijf temperatuur naar console.
  Serial.print(" T = ");
  Serial.print(Temp +2);    // een +2 erachter gezet
  Serial.println("'C");
}



@Shooter
Bedoel je DeviceAddress??
Hoe kan ik daar achter komen?
Ik ben niet de slimste maar doe wel mijn best.
Andreas

Volgende

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten