Перейдем к практике.
Ждать получения данных после запроса 750 милисекунд - значит блокировать работу микроконтроллера на это время.
Здесь я приведу пример простой работы с одним датчиком в неблокирующем режиме. В этом случае при обращении к датчику мы считываем температуру, которая была пролучена на предыдущий запрос и тут же даем датчику команду на очередное преобразование. Его результат будет считан при следующем обращении. Таким образом работа микроконтроллера во время преобразования температуры датчиком блокироваться не будет, правда, ценой некоторого запаздывания изменений температуры.
Для работы с датчиком понадобится скачать и установить библиотеку OneWire - GitHub - PaulStoffregen/OneWire: Library for Dallas/Maxim 1-Wire Chips
#include <OneWire.h> // https://github.com/PaulStoffregen/OneWire
const byte DS18B20_PIN = 8; // пин датчика DS18b20
byte addr[8]; // адрес датчика температуры
float temperature = 0; // переменная, в которую записываются показания датчика
const uint32_t temp_interval = 3000; // интервал между обращениями к датчику
OneWire ds(DS18B20_PIN);
// функция обращения к датчику - считывание показаний и команда на следующую конвертацию данных
void getTemperature()
{
// считываем показания датчика после предыдущей конвертации
int temp;
ds.reset();
ds.select(addr);
ds.write(0xBE); // Считывание значения с датчика
temp = (ds.read() | ds.read() << 8); // Принимаем два байта температуры
temperature = (float)temp / 16.0;
// даем команду на конвертацию для следующего запроса
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
}
void setup()
{
Serial.begin(9600);
// инициализация датчика
ds.reset(); // сброс шины
ds.write(0x7F); // установить точность измерения: 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F;
ds.search(addr);
// команда на конвертацию для первого запроса температуры
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
}
void loop()
{
static uint32_t timer = 0;
// опрос датчика; здесь вызывается один раз в три секунды; при слишком частом опросе микросхема датчика может вносить искажения в температуру за счет собственного разогрева
if (millis() - timer >= temp_interval)
{
timer = millis();
getTemperature();
}
Serial.println(temperature);
}
Первые три секунды в монитор порта будет выводиться 0,00 градусов.