Zápisník experimentátora
Hierarchy: DS18B20 Senzor teploty
Ak používate viac senzorov v jednom programe a potrebujete ich od seba jasne odlíšiť, nevyhnete sa vytvoreniu zoznamu adries jednotlivých senzorov. V tomto článku si vytvoríme program, ktorý nám túto činnosť uľahčí. Výsledkom bude pole adries v C++, ktoré môžete následne využívať v ďalšom kóde.
Použijeme zapojenie podľa nasledovného obrázku, iba si pripojíme viac senzorov. Zapájajú sa rovnako, iba do troch voľných otvorov pod senzorom na obrázku pridajte ešte jeden senzor. Ak ich máte viac, poprepájajte ich ďalšími vodičmi. Pull-up rezistor bude stále iba jeden.
V súbore ds18b20array.ino sa nachádza program, ktorý uľahčuje prácu so senzormi. Vyhľadá všetky senzory na zbernici a na sériový port pošle zdrojový kód, ktorý možno ľahko zahrnúť do svojich ďalších programov. Výhodou je to, že výsledkom je pole adries pre senzory, ktoré nie je nutné potom hľadať na zbernici.
Prináša to aj nevýhody. Už nie je možné meniť jeden senzor za druhý. Na druhej strane ale ten, kto pracuje naraz s viac senzormi, potrebuje presne vedieť, ktorý senzor má akú adresu a kam ho vývojár umiestnil.
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// 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);
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
///
/// setup of paremeters
///
void setup()
{
Serial.begin(9600);
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
int numberOfDevices = sensors.getDeviceCount();
Serial.println("DeviceAddress da[]={");
// Loop through each device, print out address
for (int i = 0; i < numberOfDevices; i++)
{
// Search the wire for address
if (sensors.getAddress(tempDeviceAddress, i))
{
Serial.print(" {");
for (uint8_t i = 0; i < 8; i++)
{
Serial.print("0x");
if (tempDeviceAddress[i] < 16) Serial.print("0");
Serial.print(tempDeviceAddress[i], HEX);
if (i < 7)
Serial.print(",");
}
if (i < numberOfDevices-1)
Serial.print("}, // sensor ");
else
Serial.print("} // sensor ");
Serial.print(i, DEC);
Serial.println("");
}
}
Serial.println("};");
Serial.println("");
Serial.println("const int dacount=sizeof(da)/sizeof(DeviceAddress);");
}
///
/// main loop
///
void loop()
{
// nothing to do
}
Výsledkom je kód v C++, ktorý ľahko skopírujete do svojho programu.
DeviceAddress da[]={
{0x28,0x8C,0x6E,0x45,0x06,0x00,0x00,0x8A}, // sensor 0
{0x28,0x49,0xBD,0x44,0x06,0x00,0x00,0x61} // sensor 1
};
const int dacount=sizeof(da)/sizeof(DeviceAddress);
Zdrojový text programu sa nachádza na GitHub.
17.09.2016