Библиотека wire для arduino для работы с шиной i2c. копаем глубже

Пример использования

Устройства 1-Wire доступны в различных корпусах: интегральные схемы , транзистор в стиле TO-92 и портативная форма, называемая iButton или Dallas key, которая представляет собой небольшой корпус из нержавеющей стали, напоминающий батарейку для часов . Производители также производят устройства более сложные, чем отдельный компонент, которые используют шину 1-Wire для связи.

Устройства 1-Wire могут размещаться в разных местах системы. Это может быть один из многих компонентов на печатной плате продукта. Это также может быть отдельный компонент в устройстве, таком как датчик температуры. Он может быть подключен к контролируемому устройству. Некоторые лабораторные системы подключаются к устройствам 1-Wire с помощью кабелей с модульными разъемами или кабеля CAT-5 . В таких системах популярны ( модульные разъемы 6P2C или 6P4C , обычно используемые для телефонов).

Системы датчиков и исполнительных механизмов могут быть построены путем соединения множества компонентов 1-Wire. Каждый компонент 1-Wire содержит всю логику, необходимую для работы на шине 1-Wire. Примеры включают регистраторы температуры , таймеры, датчики напряжения и тока, мониторы батарей и память . Их можно подключить к ПК с помощью преобразователя шины. Интерфейсы последовательного порта USB , RS-232 и параллельного порта являются популярными решениями для подключения MicroLan к главному компьютеру. Устройства 1-Wire также могут напрямую подключаться к микроконтроллерам различных производителей.

iButton подключаются к системам шины 1-Wire с помощью розеток с контактами, которые касаются «крышки» и «дна» контейнера. В качестве альтернативы соединение может быть полупостоянным с помощью гнезда, в которое защелкивается iButton, но из которого он легко извлекается.

Каждая микросхема 1-Wire имеет уникальный идентификационный код. Эта особенность делает микросхемы, особенно iButton, подходящими электронными ключами. Некоторые виды использования включают в себя замки, охранную сигнализацию, компьютерные системы, одобренные производителем аксессуары и часы. iButtons использовались в качестве смарт-билетов Akbil для общественного транспорта в Стамбуле .

Источники питания

Блоки питания, дисплеи и ноутбуки Mac с разъемом Apple MagSafe и MagSafe 2 используют протокол 1-Wire для отправки и получения данных с подключенного ноутбука Mac через средний контакт разъема. Данные включают модель источника питания, мощность и серийный номер; и команды ноутбука для передачи полной мощности и включения красных или зеленых светодиодов в разъеме.

Подлинные блоки питания Dell для портативных компьютеров используют протокол 1-Wire для передачи данных по третьему проводу на портативный компьютер о номинальной мощности, токе и напряжении. Ноутбук откажется от зарядки, если адаптер не соответствует требованиям.

Программа 3

Следующая задача – опросить два термометра и вывести их текущие показания и разность.

  • Для начала прошьём пример address_read из библиотеки microDS18B20
  • Поочерёдно подключим два датчика, увидим их адреса и скопируем в блокнот

Далее аналогично примеру one_pin_many_sensors записываем полученные адреса в массивы и создаём два датчика. Дальнейшая работа ведётся с двумя датчиками:

#include <LiquidCrystal_I2C.h>      // подключаем библу
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк

// полученные адреса
uint8_t s1_addr[] = {0x28, 0xE1, 0x57, 0xCF, 0x4E, 0x20, 0x1, 0x3D};
uint8_t s2_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};

#include <microDS18B20.h>
MicroDS18B20<2, s1_addr> sensor1;  // Создаем термометр с адресацией
MicroDS18B20<2, s2_addr> sensor2;  // Создаем термометр с адресацией

void setup() {
  lcd.init();           // инициализация
  lcd.backlight();      // включить подсветку
}

void loop() {
  // запрашиваем температуру
  sensor1.requestTemp();
  sensor2.requestTemp();

  // ждём
  delay(1000);

  // получаем и записываем в переменные
  float t1 = sensor1.getTemp();
  float t2 = sensor2.getTemp();
  
  lcd.home();
  lcd.print(t1, 1);     // температура 1
  lcd.write(223);       // градус
  lcd.print('-');       // "минус"
  lcd.print(t2, 1);     // температура 2
  lcd.write(223);       // градус
  lcd.print('=');       // "равно"
  lcd.print(t1 - t2, 1);  // ищем разность и выводим
  lcd.write(223);       // градус
}

Встроенные библиотеки в Arduino IDE

Вместе с дистрибутивом интегрированной среды разработки Arduino IDE поставляются встроенные библиотеки. Установка и подключение библиотек в Arduino IDE — это отдельный процесс, которому мы посвятили отдельную статью.

Многие разделяют все библиотеки на 3 основных группы:

  • Встроенные.
  • Дополнительные.
  • Зависимые.

Остановимся немного подробнее на данной терминологии.

Встроенные библиотеки

Встроенные библиотеки — наборы файлов, которые уже идут вместе со средой разработки Arduino IDE. Можно сказать, что они сразу установлены в среде.

Такие библиотеки не нужно отдельно искать и скачивать. Как только вы запустили среду Ардуино — вы можете их начать использовать в своих проектах.

Дополнительные библиотеки

Дополнительные библиотеки отдельно скачивают и устанавливают. Эти библиотеки идут с различными модулями, которые помогают создавать более сложные устройства. Среди таких модулей разные датчики, сенсоры, а иногда и более сложные гаджеты.

Как правило, такие библиотеки скачивают на сайтах производителей модулей. Некоторые основные библиотеки вы можете скачать в этом разделе.

Зависимые библиотеки

Без таких библиотек не могут работать основные установленные библиотеки. Изредка такое может встретиться при создании какого-то проекта.

Но как правило производители в один архив помещают всё что необходимо.

Список встроенных библиотек

На официальном сайте производителя Ардуино arduino.cc можно найти список встроенных библиотек.

Вместе с Arduino IDE на данный момент идут:

  • EEPROM
  • Ethernet / Ethernet 2
  • Firmata
  • GSM
  • LiquidCrystal
  • SD
  • Servo
  • SPI
  • SoftwareSerial
  • Stepper
  • TFT
  • WiFi
  • Wire

Подготовка IDE Arduino

Существует дополнение для Arduino IDE, которое позволяет программировать ESP8266 NodeMCU. Чтобы подготовить вашу Arduino IDE к работе с ESP8266, следуйте инструкциям, приведенным ниже.

Обзор платы NodeMCU ESP8266 и ее использование в Arduino IDE

Установка библиотеки для DS18B20

Протокол Dallas 1-Wire несколько сложен и требует много кода для парсинга связи. Чтобы скрыть эту ненужную сложность, мы установим библиотеку DallasTemperature.h, чтобы мы могли выполнять простые команды для получения показаний температуры от датчика.

Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управление библиотеками…». Подождите, пока менеджер библиотеки загрузит индекс библиотек и обновит список установленных библиотек.

Чтобы отфильтровать результаты поиска, введите «ds18b20». Там должна быть пара записей. Ищите DallasTemperature от Miles Burton. Нажмите на эту запись, а затем выберите Установка.

Рисунок 3 – Установка библиотеки DallasTemperature в Arduino IDE

Эта библиотека DallasTemperature является аппаратно-зависимой библиотекой, которая обрабатывает функции более низкого уровня. Она должна быть связана с библиотекой OneWire для связи с любым устройством 1-Wire, а не только с DS18B20. Установите и эту библиотеку.

Рисунок 4 – Установка библиотеки OneWire в Arduino IDE

Опрос датчиков DS18B20

#include &lt;OneWire.h>
#include &lt;DallasTemperature.h>

// Data wire is connected to GPIO15
#define ONE_WIRE_BUS 15
// Setup a oneWire instance to communicate with a OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&amp;oneWire);

DeviceAddress sensor1 = { 0x28, 0xB1, 0x13, 0x46, 0x92, 0xD, 0x2, 0xA7 };

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

void loop(void)
{ 
  //Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  //Serial.println("DONE");
  
  Serial.print("Sensor 1: ");
  Serial.print(String(sensors.getTempC(sensor1)) + " C, "); 
  Serial.println(String(sensors.getTempF(sensor1)) + " F"); 

  //  tempSensor.requestTemperaturesByIndex(0);
  //Get single sensor value
  Serial.print("Temperature: ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print(" C, ");
  Serial.print(sensors.getTempFByIndex(0));
  Serial.println(" F");
  delay(1000);
}

Если на одной шине висит несколько сенсоров, код будет несколько посложнее. В данном случае тестируется два DS18B20 датчиков подключенных к GPIO32 микроконтроллера ESP32.

#include "OneWire_Scanner.h"
#include &lt;OneWire.h>
#include &lt;DallasTemperature.h>

#define OneWire_PIN 32

OneWire ds(OneWire_PIN);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&amp;ds);

// count of DS18xxx Family devices on bus
uint8_t devices = 0; // Reset the number of devices when we enumerate wire devices
uint8_t ds18Count = 0; // Reset number of DS18xxx Family devices

void setup()
{
  sensors.begin();

  ScanOneWireDevicesAndShowTemp();

  // выведем общее количество найденных устройств
  Serial.println("Found  DS18XXX sensors of  iWare devices.");
  //Serial.print(sensors.getDeviceCount(), DEC);
  //Serial.print(sensors.getDS18Count(), DEC);

  // проверяем способ подключения питания
  Serial.print("Parasite power is: ");
  Serial.println(sensors.isParasitePowerMode() ? "ON" : "OFF");
}

void loop()
{
  ScanOneWireDevicesAndShowTemp();
  delay(1000);
}

String getSensorModel(uint8_t modelByte)
{
  //deviceAddress
  String res = "";
  switch (modelByte) 
  {
    case DS18S20MODEL:
      return "DS18S20";
    case DS18B20MODEL:
      return "DS18B20";
    case DS1822MODEL:
      return "DS1822";
    case DS1825MODEL:
      return "DS1825";
    case DS28EA00MODEL:
      return "DS28EA00";
    default:
      return "Unknown";
  }
}

void ScanOneWireDevicesAndShowTemp()
{
    DeviceAddress deviceAddress;
  
    while (ds.search(deviceAddress)) 
    {
      if (sensors.validAddress(deviceAddress)) 
      {
        //bitResolution = max(bitResolution, sensors.getResolution(deviceAddress));
        devices++;
        if (sensors.validFamily(deviceAddress)) 
        {
          sensors.requestTemperatures(); // Send the command to get temperatures
          Serial.print("Sensor ");
          printAddress(deviceAddress);
          Serial.println(". Temp: " + String(sensors.getTempC(deviceAddress)) + " oC with resolution " + String(sensors.getResolution(deviceAddress)) + " bit. Sensor " + getSensorModel(deviceAddress) + "."); 
          ds18Count++;
        }
      }
    }
}

void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i &lt; 8; i++)
  {
    if (deviceAddress &lt; 16) Serial.print("0");
    Serial.print(deviceAddress, HEX);
  }
}

Результат работы кода опроса датчиков DS18B20:

11:42:18.863 -> Sensor 28B11346920D02A7. Temp: 24.19 oC with resolution 12 bit. Sensor DS18B20.
11:42:18.999 -> Sensor 28FF6C7997090341. Temp: 28.12 oC with resolution 12 bit. Sensor DS18B20.
11:42:20.022 -> Found  DS18XXX sensors of  iWare devices.
11:42:20.022 -> Parasite power is: OFF

Подключение библиотеки

Подключить любую библиотеку можно одной командой:

<файл.h> – это и есть имя той библиотеки, которую вы хотите подключить.

Например, в статье Wi-Fi WebServer на WeMos D1 R2 мы подключаем библиотеку ESP8266WiFi.h следующим образом:

Дополнительные примеры подключения библиотек:

Кроме того, есть вариант размещения библиотеки в одной папке проекта со скетчем, т.е. файл библиотеки располагается рядом с файлом .ino.

Тогда для подключения библиотеки мы используем кавычки:

В таком варианте подключения компилятор сперва проверит наличие библиотеки в паке со скетчем. Такой вид подключения нужен только в том случае, если в код библиотеки вносятся изменения, необходимые только для этого проекта.

Но важно понимать — такой способ не подходит для библиотек со множеством файлов

Интерфейс 1-Wire

В этой статье я попытаюсь рассказать о потрясающей вещи – интерфейсе 1-Wire. Что в нем потрясающего? В нем данные передаются всего по одному проводу! Только вдумайтесь, куча датчиков может быть подключена к однопроводной шине.

Интерфейс One-Wire (встречается и такая нотация) был разработан компанией Dallas Semiconductor и применен в виде огромного количества устройств изготовленной данной компанией. Думаю практически все знают температурные датчики c 1-Wire интерфейсом – DS18B20.

Каждое устройство 1-Wire имеет собственный уникальный идентификатор, что обуславливает применение данных устройств в качестве устройств идентификации личности, маркировки оборудования и пр.

Как же передаются данные по однопроводной шине в обе стороны?

Данный вопрос очень удобно (и практично) рассмотреть на примере работы с датчиком температуры DS18B20.Вот так выглядит схема его подключения:

Есть еще вариант с питанием датчика от линии данных, в таком случае вы получаете рабочий датчик температуры подключенный всего при помощи двух проводов!

Первым делом при работе с шиной 1-Wire необходимо её инициализировать, послать сигнал сброса.

https://youtube.com/watch?v=9VehXIhJIOo

Как видно из временной диаграммы (я позаимствовал её из даташита на датчик), мастер (т.е. контроллер устанавливает на шине нулевой потенциал на временя не менее 480 мкс, после чего устанавливает её в единичный потенциал.

После чего необходимо подождать 15-60мкс, чтобы датчик получил передний фронт и отправил импульс присутствия (presence pulse) длиной 60-240мкс.

Если данный импульс не получен, значит на шине нет датчиков готовых к обмену данными.

Теперь рассмотрим процедуру отправки и приема бита.

Операция чтения бита очень похожа на операцию записи. Мы также должны установить шину в низкий потенциал, по крайней мере на 1мкс.

После чего переводим ножку микроконтроллера в режим приема данных и ожидаем 14мкс. После этого можно считать состояние линии. Она будет в высоком состоянии если передается “1” и в никзом, если “0”.

Наконец мы должны подождать ещё 45мкс до окончания периода в 60мкс.

Операция отправки/приема байта производиться в цикле, путем отправки/приема бита и сдвигов операнда.

Также существует режим работы с шиной 1-Wire при помощи USART:

Такой режим намного удобнее для stm32 контроллеров. Там проблем с нехваткой USART’ов нет, да ножек хоть отбавляй.

Описание датчика DS18B20 для Arduino

DS18B20 – это цифровой температурный датчик, обладающий множеством полезных функций. По сути, DS18B20 – это целый микроконтроллер, который может хранить значение измерений, сигнализировать о выходе температуры за установленные границы (сами границы мы можем устанавливать и менять), менять точность измерений, способ взаимодействия с контроллером и многое другое. Все это в очень небольшом корпусе, который, к тому же, доступен в водонепроницаемом исполнении.

Микросхема имеет три выхода, из которых для данных используется только один, два остальных – это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.

Где купить датчик

Влагозащищенный датчик температуры DS18B20 с длиной провода 1 м от надежного магазина Комплект из 10 микросхем DS18B20 TO92 Модуль DS18B20 для удобного подключения к Ардуино от Keyestudio
Беспроводной модуль DS18B20 на ESP8266 ESP-01 ESP-01S для проектов умного дома Шилд датчика DS18B20 для платы D1 MINI – беспроводная передача данных Датчик DS18B20 с модулем для подключения к Ардуино

Особенности цифрового датчика DS18B20

Погрешность измерения не больше 0,5 С (для температур от -10С до +85С), что позволяет точно определить значение температуры. Не требуется дополнительная калибровка.
Температурный диапазон измерений лежит в пределах от -55 С до +125 С.
Датчик питается напряжением от 3,3В до 5В.
Можно программно задать максимальную разрешающую способность до 0,0625С, наибольшее разрешение 12 бит.
Присутствует функция тревожного сигнала.
Каждое устройство обладает своим уникальным серийным кодом.
Не требуются дополнительные внешние элементы.
Можно подключить сразу до 127 датчиков к одной линии связи.
Информация передается по протоколу 1-Wire.
Для присоединения к микроконтроллеру нужны только 3 провода.
Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода

Важно, что в этом режиме не гарантируется корректная работа при температурах выше 100С. Режим паразитного питания удобно обычно применяется для приложений с удаленным температурным датчиком.

Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM. В последнюю записываются регистры конфигурации и регистры TH, TL, которые могут использоваться как регистры общего назначения, если не используются для указания диапазона допустимых значений температуры.

Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности – 9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.

Во время включения питания датчик находится в состоянии покоя. Для начала измерения контроллер Ардуино выполняет команду «преобразование температуры». Полученный результат сохранится в 2 байтах регистра температуры, после чего датчик вернется в первоначальное состояние покоя. Если схема подключена в режиме внешнего питания, микроконтроллер регулирует состояние конвертации. Во время выполнения команды линия находится в низком состоянии, после окончания программы линия переходит в высокое состояние. Такой метод не допустим при питании от паразитной емкости, так как на шине постоянно должен сохраняться высокий уровень сигнала.

Полученные температурные измерения сохраняются в SRAM датчика. 1 и 2 байты сохраняют полученное значение температуры, 3 и 4 сохраняют пределы измерения, 5 и 6 зарезервированы, 7 и 8 используются для высокоточного определения температуры, последний 9 байт хранит устойчивый к помехам CRC код.

Подключение нескольких датчиков DS18B20 ESP8266 NodeMCU

Подключить датчики DS18B20 к ESP8266 NodeMCU довольно просто.

Рисунок 1 – Распиновка датчика температуры DS18B20 в корпусе TO-92 и в водонепроницаемом корпусе

Начните с параллельного соединения всех датчиков DS18B20, то есть соединения всех выводов GND, затем всех выводов VDD, и последнее, всех сигнальных выводов. Затем подключите VDD к выходу 3.3V на NodeMCU, GND – к GND на NodeMCU, и сигнальных выводов к цифровому выводу D2 на ESP8266 NodeMCU.

Затем, чтобы обеспечить стабильность передачи данных, необходимо добавить один подтягивающий резистор 4,7 кОм между сигнальной шиной и шиной питания.

Рисунок 2 – Подключение нескольких датчиков температуры DS18B20 к ESP8266

Interfacing with the 1-wire bus

The 1-Wire bus can be connected directly to the IO pins of Raspberry Pi or by using a dedicated interface adapter, for example
DS9490R or adapters based on DS2482-100 that can be directly attached to the IO pins on the Raspberry Pi.

It is also possible for this platform to interface with a remote 1-wire host over a network connection using owfs and owserver.

Raspberry Pi set up

In order to setup 1-Wire support on Raspberry Pi, you’ll need to edit . This file can not be edited through ssh. You have to put your SD card to a PC, and edit the file directly.
To edit on the Home Assistant Operating System, use this documentation to enable SSH and edit via .

If you use an external pull-up resistor and the default GPIO 4 for the data line, add the following line:

If you don’t want to use an external resistor, you can use a built-in one using the following line:

It is also possible to use a different GPIO pin like this to change it to pin 15:

Furthermore, it is also possible to have multiple GPIOs as one-wire data channel by adding multiple lines like this:

You can read about further parameters in this documentation: .

When using the GPIO pins on Raspberry Pi directly as a 1-wire bus, the description above uses two kernel modules. , that implements the 1-wire protocol, and , that understands the DS18B20 (family 28) components inner structure and reports temperature.
There is no support for other device types (families) and hence this onewire platform only supports temperature measurements from family 28 devices.

Raspberry Pi checking connected devices via ssh

If you set up ssh, you can check the connected one-wire devices in the following folder: /sys/bus/w1/devices
The device IDs begin with .

Протокол 1-Wire

Протокол 1-Wire – это протокол, используемый для управления устройствами, которые производятся компанией Dallas Semiconductor (ныне Maxim). Хотя 1-Wire является приприетарным протоколом и торговой маркой Dallas, программисты, использующие драйверы 1-Wire, не обязаны делать за это никаких выплат.

Сеть 1-Wire, которую Dallas называет MicroLan (торговая марка), состоит из одного ведущего устройства, к которому при помощи единственной линии передачи данных подключено одно или несколько ведомых устройств. Эту линию, помимо прочего, можно использовать для электропитания ведомых устройств (ситуацию, когда устройства подпитываются через шину 1-Wire, называют «паразитным питанием»).

Среди прочих устройств, работающих через протокол 1-Wire, особенно популярны температурные датчики – они недороги, просты в использовании и позволяют напрямую считывать откалиброванные цифровые температурные данные. Кроме того, они терпимы к длинным проводам, которыми часто приходится пользоваться при создании цепи с Arduino. Один из примеров ниже демонстрирует, как работать с 1-Wire на примере цифрового термометра DS18S20. Многие чипы 1-Wire могут работать и через паразитное, и через нормальное питание.

Аппаратный модуль TWI

Смотрите следующую схему потока для записи на шину I2C:

Взаимодействие приложения с шиной TWI (I2C) во время типовой передачи

Ссылаясь на таблицу регистров, приведенную выше, операция записи I2C с использованием аппаратного модуля TWI вкратце будет выглядеть следующим образом:

  • Библиотека конфигурирует микросхему ATmega так, что внутренний аппаратный модуль TWI использует свои выводы, которые жестко привязаны к двум аналоговым выводам (4 и 5 на Duemilanove).
  • Библиотека устанавливает значение регистра TWCR для создания состояния .
    • Сначала она проверяет шину I2C, чтобы убедиться, что она свободна. Шина свободна, когда на обеих линиях и SDA, и SCL установлен высокий логический уровень (потому что устройство по умолчанию устанавливает выводы на шине в третье состояние «не подключено». Общий резистор подтягивает сигнал на шине к высокому уровню).
    • Что такое состояние ? Линия тактового сигнала SCL остается в состоянии логической 1, а мастер в это время меняет состояние на линии SDA на логический 0. Это уникальный момент, поскольку во время обычной передачи данных линии SDA изменяет состояние только тогда, когда на линии SCL установлен низкий логический уровень. Момент, когда сигнал на линии данных изменяется на логический 0, а на SCL логическая 1, является сигналом для всех устройств на шине I2C, с которыми мастер собирается начать взаимодействовать.
  • Аппаратный модуль TWI при завершении выполнения действия вызывает прерывание процессора.
  • Библиотека e проверяет состояние по регистру . Предположим, что всё хорошо.
  • Библиотека загружает в регистр адрес ведомого устройства плюс бит «запись». Вместе это значение известно как «SLA+W» («SLave Address plus Write»).
  • Библиотека устанавливает значение регистра для передачи .
  • В случае успеха, библиотека загружает данные в регистр , устанавливает , и данные передаются.
  • Библиотека проверяет состояние по регистру . Предположим, что всё хорошо.
  • Библиотека устанавливает значение регистра для передачи состояния . В состоянии линия SCL освобождается (переходит в высокий логический уровень), и затем линия SDA переходит в состояние логической 1. Обычно линия SDA должна оставаться неизменной, когда на линии SCL установлен высокий логический уровень.

Операция чтения выполняется похожим образом.

Поиск библиотек

Искать библиотеки можно вручную или через среду разработки Ардуино IDE (Integrated development environment).

Переходим в меню среды:

Скетч -> Подключить библиотеку -> Управлять библиотеками

Выглядите это так:

Мы откроем «Менеджер библиотек», о котором мы говорили выше.

Здесь мы увидим поле поиска и два выпадающих меню с названиями Тип и Тема. Введя в поисковое поле нужное название библиотеки нам Менеджер покажет подходящие варианты библиотек.

Выбираем библиотеку и видим появления кнопок Версия и Установка:

Далее жмем Установка и потом уже подключаем библиотеку в скетч нашего проекта:

Architecture details

The class provides public interface for 1-wire service. Object of this class
isn’t constructed directly rather than casted from a derived class object
implementing platform specific details.

As an example:

#include "OneWireNg_CurrentPlatform.h"

static OneWireNg *ow = nullptr;

void setup()
{
    OneWireNg::Id id;
    OneWireNg::ErrorCode ec;

    ow = new OneWireNg_CurrentPlatform(10);

    do
    {
        ec = ow->search(id);
        if (ec == OneWireNg::EC_MORE || ec == OneWireNg::EC_DONE) {
            // `id' contains 1-wire address of a connected slave
        }
    } while (ec == OneWireNg::EC_MORE);
}

creates 1-wire service interface for current platform and performs search on
the bus. The bus is controlled by MCU pin number 10.

NOTE: If heap allocation is inadvisable use in-place operator:

#include "platform/Platform_New.h"
#include "OneWireNg_CurrentPlatform.h"

static OneWireNg *ow = nullptr;
PTR_ALIGNED static uint8_t OneWireNg_buf;

void setup()
{
    ow = new (OneWireNg_buf) OneWireNg_CurrentPlatform(10);
    // ...
}

The class is derived from and implements the 1-wire interface basing
on GPIO bit-banging. Object of this class isn’t constructed directly rather than
the class is intended to be inherited by a derived class providing protected
interface implementation for low level GPIO activities (set mode, read, write).

Are family of classes providing platform specific implementation (
states for a platform name e.g. provides AVR implementation
for Arduino environment).

The platform classes implement interface directly (via direct
class inheritance) or indirectly (e.g. GPIO bit-banging implementation
bases on , which provides GPIO bit-banging 1-wire service
implementation leaving the platform class to provide platform specific low-level
GPIO activities details).

Platform classes have a public constructor allowing to create 1-wire service for
a particular platform (see ).

NOTE: For the convenience there has been provided
header which tries to detect platform the compilation is proceeded and:

  • include proper platform class header,
  • assign macro-define to the detected platform class.

Доступ к веб-серверу

После загрузки скетча откройте монитор последовательного порта со скоростью 115200 бит/с и нажмите кнопку RST на NodeMCU. Если всё в порядке, он выведет динамический IP адрес, полученный от вашего маршрутизатора, и покажет сообщение о том, что HTTP сервер запущен.

Рисунок 6 – Монитор последовательного порта – сервер запущен

Затем загрузите браузер и введите IP адрес, указанный в мониторе последовательного порта. ESP8266 NodeMCU должен выдать веб-страницу, показывающую температуры со всех датчиков DS18B20.

Рисунок 7 – Показания с нескольких датчиков DS18B20 на странице веб-сервера ESP8266 (без CSS)

Обращение к устройствам типа 1-Wire

Каждое устройства типа 1-Wire обладает уникальным 64-битным ROM-адресом, который состоит из 8-битного кода, обозначающего семейство, 48-битного серийного кода и 8-битного CRC. CRC используется для проверки целостности данных. К примеру, код ниже проверяет, является ли устройство, к которому обращается скетч, температурным датчиком DS18S20 – путем проверки кода, обозначающего семейство, т.е. «0x10». Чтобы использовать этот скетч с более новым DS18B20, вам нужно будет указать проверку по коду «0x28», а если с DS1822, то по коду «0x22».

Команды к одному устройству

Перед тем, как отправлять команду к одному устройству, ведущее устройство должно выбрать адресата при помощи его уникального ROM-адреса. Если это устройство будет обнаружено, то все последующие команды тоже будут отправлены к нему.

Команды к нескольким устройствам

Вы также можете отправить команду сразу всем ведомым устройствам, воспользовавшись командой 0xCC (она означает «Skip ROM» или «пропустить ROM-адрес»)

Впрочем, перед использованием важно знать, какие эффекты это может повлечь. Иногда это очень удобный метод – к примеру, если дать команду 0xCC, а следом за нею 0x44 (она означает «Convert T» или «выполнить температурную конверсию»), то все устройства в сети начнут выполнять, собственно, температурную конверсию

То есть в данном случае использование 0xCC может сберечь вам немного времени. С другой стороны, если воспользоваться командой 0xBE (она означает «Read Scratchpad» или «прочитать данные из оперативной памяти»), то все девайсы в сети начнут одновременно передавать эти данные ведущему устройству. Также при использовании «Skip ROM» нужно учитывать энергопотребление всех устройств, подключенных к сети (это актуально, к примеру, в случае температурной конверсии).

Что такое библиотеки?

При создании проектов с помощью микроконтроллеров Ардуино и аналогов есть возможность для разных целей использовать готовые Библиотеки.

Библиотека — это готовый набор файлов, в которых представлен готовый код для правильной работы разных сенсоров, датчиков и модулей.

Большая часть библиотек зарегистрирована в Менеджере Библиотек Ардуино (Arduino Library Manager). Дополнительно существуют встроенные библиотеки в Arduino IDE.

Библиотеки отдельно подключаются к проектам с использованием Ардуино и в них уже заложена логика и структура обработки разных данных, что сильно упрощает и сокращает время создания устройств. Все официальные библиотеки в большинстве случаев предоставляются бесплатно.

Для работы вам необходимо скачать и установить на компьютер среду разработки Arduino IDE.

OneWire compatibility

class provides compatibility interface between
OneWireNg and OneWire library.
The main purpose of this class is to provide fast and effortless mechanism for
developers experiencing issues with OneWire and eager to give OneWireNg a try.
Finally, it’s strongly recommended to switch into OneWireNg interface rather
than stay with the OneWire due to OneWireNg’s more mature and feature-rich API
(search filtering, OD mode, touch support).

DallasTemperature library

As an example of usage of the compatibility interface there has been created
the following fork
of DallasTemperature
library ported with OneWireNg.

Асинхронный опрос пачки датчиков

// пример компактного асинхронного опроса датчиков на программном таймере
// https://alexgyver.ru/lessons/time/

// количество датчиков для удобства
#define DS_SENSOR_AMOUNT 5

// создаём двухмерный массив с адресами
uint8_t addr[] = {
  {0x28, 0xFF, 0x78, 0x5B, 0x50, 0x17, 0x4, 0xCF},
  {0x28, 0xFF, 0x99, 0x80, 0x50, 0x17, 0x4, 0x4D},
  {0x28, 0xFF, 0x53, 0xE5, 0x50, 0x17, 0x4, 0xC3},
  {0x28, 0xFF, 0x42, 0x5A, 0x51, 0x17, 0x4, 0xD2},
  {0x28, 0xFF, 0xCD, 0x59, 0x51, 0x17, 0x4, 0xFE},
};

#include <microDS18B20.h>
// указываем DS_ADDR_MODE для подключения блока адресации
// и создаём массив датчиков на пине D2
MicroDS18B20<2, DS_ADDR_MODE> sensor;

void setup() {
  Serial.begin(9600);
  // устанавливаем адреса
  for (int i = ; i < DS_SENSOR_AMOUNT; i++) {
    sensor.setAddress(addr);
  }
}

void loop() {
  // конструкция программного таймера на 1c
  static uint32_t tmr;
  if (millis() - tmr >= 1000) {
    tmr = millis();

    // выводим показания в порт
    for (int i = ; i < DS_SENSOR_AMOUNT; i++) {
      Serial.print(sensor.getTemp());
      Serial.print(',');
      //delay(5); // возможно понадобится дилей, у меня работает без него
    }
    Serial.println();

    // запрашиваем новые
    for (int i = ; i < DS_SENSOR_AMOUNT; i++) {
      sensor.requestTemp();
      //delay(5); // возможно понадобится дилей, у меня работает без него
    }
  }
}