Vytvoření seznamu DS18B20 do pole v C++

Zápisník experimentátora

Hierarchy: DS18B20 Senzor teploty

Pokud používáte více senzorů v jednom programu a potřebujete je od sebe jasně odlišit, nevyhnete se vytvoření seznamu adres jednotlivých senzorů. V tomto článku si vytvoříme program, který nám tuto činnost usnadní. Výsledkem bude pole adres v C ++, které můžete následně využívat v dalším kódu.

Použijeme zapojení podle následujícího obrázku, pouze si připojíme více senzorů. Zapojují se stejně, pouze do tří volných otvorů pod senzorem na obrázku přidejte ještě jeden senzor. Pokud jich máte více, poprepájajte jejich dalšími vodiči. Pull-up rezistor bude stále pouze jeden.

V souboru ds18b20array.ino se nachází program, který usnadňuje práci se senzory. Vyhledá všechny senzory na sběrnici a na sériový port pošle zdrojový kód, který lze snadno zahrnout do svých dalších programů. Výhodou je to, že výsledkem je pole adres pro senzory, které není nutné pak hledat na sběrnici.

Přináší to i nevýhody. Už není možné měnit jeden senzor za druhý. Na druhé straně ale ten, kdo pracuje najednou s více senzory, potřebuje přesně vědět, který senzor má jakou adresu a kam ho vývojář umístil.

#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ýsledkem je kód v C++, který snadno zkopírujete do svého 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 se nachází na GitHub.


08.03.2019


Menu