X

Kurs ESP - 1-Wire

Protokół OneWire

Interfejs OneWire został opracowany przez firmę Dallas Semiconductor. Do transmisji danych wykorzystuje tylko jeden przewód, przez co prędkość transmisji danych wynosi w trybie standardowym do 2,04Kb/s a w trybie overdrive 14,38.

Interfejs ten powstał z myślą o niewielkich urządzeniach, takich jak termometry cyfrowe, ładowarki czy czajniki ciśnienia. 
Do jednej linii OneWire może być podpiętych wiele czujników. Każdy posiada unikalny 64-bit adres zapisany w pamięci ROM. Sygnał ze względu na niską częstotliwość jest w stanie pokonać duże odległości. Protokół komunikacji pozwala na transmisję do 750m (suma długości wszystkich przewodów).

Transmisja danych inicjowany jest przez mastera. Dokonuje on zwarcie szyny danych do masu na 480 μs. Skutkuje to restartem urządzeń typu slave. Urządzenia potwierdzają obecność zwierają line danych do masy na 60 μs. Rozpoczyna się proces komunikacji urządzenia poprzez wbudowany zegar czekają określony czas na okno transmisji. Jeśli linia jest wolna odpowiadają po zakończeniu transmisji slave zwiera linię do masy na 60 μs. Gdy wszystkie czujniki wyślą dane proces zaczyna się na nowo.

 

Schemat podłączenia

Potrzebne Elementy:
- 3 x czujnik temperatury DS18B20,
- rezystor 4,7 K ohm.
 

Schemat ESP OneWire

Kod programu odczytujący adres czujników. 

Pierwszym Krokiem jest sporządzenie programu, który odczyta adresy czujników. Każdy czujnik posiada własny 64 bitowy adres.

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

#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Therm;

int deviceCount = 0;

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

    Serial.print("Znaleziono ");
    deviceCount = sensors.getDeviceCount();
    Serial.print(deviceCount, DEC);
    Serial.println("");

    Serial.println("Adresy:");
    for (int i = 0; i < deviceCount; i++)
    {
        Serial.print("DS18B20 ");
        Serial.print(i + 1);
        Serial.print(" : ");
        sensors.getAddress(Therm, i);
        printAddress(Therm);
    }
}

void loop(void)
{}

void printAddress(DeviceAddress device)
{
    for (uint8_t i = 0; i < 8; i++)
    {
        Serial.print("0x");
        if (device[i] < 0x10) Serial.print("0");
        Serial.print(device[i], HEX);
        if (i < 7) Serial.print(", ");
    }
    Serial.println("");
}

Monitor portu szeregowego.

Po uruchomieniu monitora portu szeregowego otrzymujemy adresy czujników.

Schemat ESP OneWire Reader

 

Program odczyt temperatury

Program odczytujący dane z 3 czujników DS18B20 podpiętych do jednej linii, która obsługującej standard komunikacji 1-Wide.

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

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 4

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

uint8_t sensor1[8] = { 0x28, 0x26, 0xE2, 0x9B, 0x33, 0x14, 0x01, 0x85 };
uint8_t sensor2[8] = { 0x28, 0xFF, 0xAA, 0xF1, 0x6B, 0x18, 0x01, 0x98 };
uint8_t sensor3[8] = { 0x28, 0xFF, 0x8D, 0xF5, 0x6B, 0x18, 0x01, 0x3F };

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

void loop(void)
{
  sensors.requestTemperatures(); // Aktualizacja danych z sensorów

  Serial.print("DS18B20 1: ");
  printTemperature(sensor1);
  
  Serial.print("DS18B20 2: ");
  printTemperature(sensor2);
  
  Serial.print("DS18B20 3: ");
  printTemperature(sensor3);
  
  Serial.println("");
  delay(6000);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress); // Odczyt temperatury sensor
  Serial.print(tempC);
  Serial.print("C\n");
}

Monitor portu szeregowego

Odczyt temperatury widoczny w monitorze portu szeregowego

odczyt dallas