Vytvorenie zoznamu DS18B20 do poľa v C++

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ýstup z programu

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

Zdrojový text programu sa nachádza na GitHub.


17.09.2016


Menu