3db DS18B20 digitális hőmérséklet mérő szenzor egy csatornán

A cél

leaf graphic
DS18B20 sensor

Egy napelem hőmérsékletét és a környezetét szeretném monitorozni, amihez 3 hőmérséklet szenzorra van szükségem, az egyik magát a napelem hőmérsékletét mérné, amit a hátuljára rögzítenék, a másik a napelem árnyékában lenne elhelyezve, míg a harmadikat közvetlen napfénynek tenném ki.

Az összeállítás

leaf graphic
Hook-up

Ennek megvalósításához a DS18B20 szenzor – Arduino kombót találtam a legmegfelelőbbnek. A három szenzor digitális kimenete az Arduino digitális bemenetére kapcsolódik egy vezetéken keresztül, a tápellátást pedig az 5V-os kimenet látja el.  A kapcsolást az 1-es ábrán láthatod. Az összeállítás pofon egyszerű, a kód az interneten elérhető (v. alább csekkolható). A kapcsolás összeállítása és a kód feltöltése után tökéletesen működik, a bejövő adatokat az adott COM portról olvashatjuk.

COM portról bejövő adatmentés

leaf graphic
Incoming data

Erre a CoolTerm programot használom. Itt a Connection –> Options –> Receive menüpont alatt az Add timestamps to received data funkciót kipipálva a COM portról jövő adatokhoz az aktuális időt tudjuk hozzárendelni, majd a Connection –> Capture to Textfile –> Start (CLTR + R) menüpont alatt elkezdjük az adatgyűjtést. Ami így néz ki (balra).

A bonyodalom

A program egyesével kiolvassa az egyes szenzorokhoz tartozó adatokat, majd kiküldi a portra, itt az egyes adatok egymás alá listázódnak Sensor 0, 1, 2, ami nagyban megnehezíti a kiértékelést.

A részleges megoldás Excellel

A text file-ba mentett adatokat beolvassuk Excel-be, amit az alábbi ábrán láthatunk, az A, B, C, D oszlopok a nyers adatokat tartalmazzák.

Dátum Idő Melyik szenzor? Hőmérséklet
2015.08.31 13:47:22 Sensor 0 38,69
2015.08.31 13:47:27 Sensor 1 24,56
2015.08.31 13:47:32 Sensor 2 7,19
2015.08.31 13:47:38 Sensor 0 40,75
2015.08.31 13:47:43 Sensor 1 24,56
2015.08.31 13:47:48 Sensor 2 7,88

 

Első lépésként az F oszlopba a =HA(B6=””;””;((A6-$A$1)*24)-(($B$1-B6)*24)) függvény segítségével kilistázzuk az eltelt időt, ami az x-tengelyen fog megjelenni. A második lépésben az egyes hőmérséklet adatokat külön oszlopokban jelenítjük meg a =INDEX($D$3:$D$1514; SOROK(J$1:J1)*3) függvény segítségével. Így az egyes szenzorokból jövő adatok külön oszlopokban jelennek meg, a kiértékelés így már könnyen kivitelezhető.

 

temp_grafikon

 

Az 1-es szenzor a szoba hőmérsékletét mutatja, a 2-es szenzort egy jeges vízzel telt pohár alatt helyeztem el, a 0-ik egy forróvizes pohár alatt volt. A grafikonon jól látható, hogy 2 óra elteltével a szenzorok közel azonos hőmérsékleti értékeket mutattak.  A gyári specifikáció szerint a szenzor pontossága ±0,5oC -10°C és +85°C között. A három szenzorból jövő utolsó hőmérsékleti értékek 24,56°C; 24,63°C; 24,38°C voltak. A különbség a legkisebb és a legnagyobb érték között 0,25°C volt, ami nem a szenzor pontosságát mutatja, de jól reprezentálja, hogy a mért értékek közel azonosak.

Excel file az adatokkal
One wire temperature sensor data

A kód

#include <DallasTemperature.h>

#include <OneWire.h>

#include <DallasTemperature.h>

#include <stdio.h>

#define ONE_WIRE_BUS 2

char buffer[25];

byte maxlines = 2;

char line1[16];

char line2[16];

byte x = 0;

byte y = 1;

byte maxsensors = 0;

/* DS18S20 Temperature chip i/o */

OneWire ds(ONE_WIRE_BUS);

DallasTemperature sensors(&ds);

void flashled(void)

{

digitalWrite(13, HIGH);

delay(1);

digitalWrite(13, LOW);

}

void scanSensors(void)

{

byte i;

byte present = 0;

byte data[12];

byte addr[8];

while (ds.search(addr))

{

Serial.print("R=");

for( i = 0; i < 8; i++) {

Serial.print(addr[i], HEX);

Serial.print(" ");

}

if ( OneWire::crc8( addr, 7) != addr[7]) {

Serial.print("CRC is not valid!\n");

return;

}

if ( addr[0] == 0x10) {

Serial.print("Device is a DS18S20 family device.\n");

maxsensors++;

}

else {

if (addr[0] == 0x28) {

Serial.print("Device is a DS18B20 family device.\n");

maxsensors++;

}

else {

Serial.print("Device is unknown!\n");

Serial.print("Device ID: ");

Serial.print(addr[0],HEX);

Serial.println();

return;

}

}

// The DallasTemperature library can do all this work for you!

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

Serial.print("P=");

Serial.print(present,HEX);

Serial.print(" ");

for ( i = 0; i < 9; i++) { // we need 9 bytes

data[i] = ds.read();

Serial.print(data[i], HEX);

Serial.print(" ");

}

Serial.print(" CRC=");

Serial.print( OneWire::crc8( data, 8), HEX);

Serial.println();

flashled();

}

Serial.print("No more addresses.\n");

ds.reset_search();

delay(250);

}

void setup(void) {

Serial.begin(9600);

pinMode(13, OUTPUT);

byte i, j;

for (j=0;j<16;j++)

{

line1[j] = 32;

line2[j] = 32;

}

line1[16] = 0;

line2[16] = 0;

x = 0;

y = 1;

sensors.begin();

scanSensors();

}

void loop(void) {

sensors.requestTemperatures(); // minden eszköztől kérjük a hőmérséklet mérést...

for (int i=0;i<maxsensors;i++)

{

flashled();

float f = sensors.getTempCByIndex(i); // egyesével kiolvassuk a mért értéket

Serial.print("Sensor ");

Serial.print(i,DEC);

Serial.println(dtostrf(f, 6, 2, buffer));
delay(5000);
}

}

A hozzá tartozó könyvtárak:

#include <DallasTemperature.h>

https://github.com/milesburton/Arduino-Temperature-Control-Library

#include <OneWire.h>

http://playground.arduino.cc/Learning/OneWire

Az elegánsabb megoldás

Ez igazából a kérdésem lesz. Hogy tudom megoldani, hogy a kimenő adatokhoz az eltelt időt hozzárendeljem és az egyes adatok különböző oszlopban jelenjenek meg? Ezzel el lehetne kerülni az Excelben történő bűvészkedést.

Válasz 1.

delay(5000); előtt

Serial.print("\t");

if (i > 1){

Serial.print("\t");

Serial.print("\t");

}

if (i > 0){

Serial.print("\t");

Serial.print("\t");

}

 

Felhasznált irodalom

http://bildr.org/2011/07/ds18b20-arduino/
Dallas Semiconductor’s 1-Wire Protocol
Dallas Temperature Control Library
alsoikonelkepzeles

 

Share This:

 
Loading Facebook Comments ...

COMMENTS

Leave a Comment