Не нашёл в эмуляторах Wokwi и Tinkercad датчика температуры DS18B20. Решил сымитировать его подменой библиотек OneWire и DallasTemperature на самодельные похожие классы. То есть, данные библиотеки не нужно подключать на стадии разработки, а добавить вместо них данный код. Функции сделал не все возможные, так что нужно доработать кому что надо. При необходимости можно подключить родную библиотеку OneWire, удалив одноимённый класс. В настройках нужно задать количество датчиков, адреса и базовые температуры, а также шаг и диапазон изменения температуры. Код (C++): //#include <OneWire.h> //#include <DallasTemperature.h> class OneWire { public: OneWire(uint8_t) {} }; typedef uint8_t DeviceAddress[8]; class DallasTemperature { public: DallasTemperature() {} DallasTemperature(OneWire* ow) {} void begin(void) {} uint8_t getDeviceCount(void) { return deviceCount; } void setResolution(uint8_t) {} void requestTemperatures() { static float count = 0; count += step; for (int i = 0; i < deviceCount; i++) temperatureC[i] += step; if (count <= -band || count >= band) step = -step; } // Convert float Celsius to Fahrenheit float toFahrenheit(float celsius) { return (celsius * 1.8f) + 32.0f; } // Convert float Fahrenheit to Celsius float toCelsius(float fahrenheit) { return (fahrenheit - 32.0f) * 0.555555556f; } float getTempCByIndex(uint8_t idx) { return temperatureC[idx]; } float getTempFByIndex(uint8_t idx) { return toFahrenheit(temperatureC[idx]); } bool isParasitePowerMode(void) { return false; } bool getAddress(uint8_t* deviceAddress, uint8_t index) { memcpy(deviceAddress, address[index], sizeof(DeviceAddress)); return true; } bool setResolution(const uint8_t*, uint8_t, bool skipGlobalBitResolutionCalculation = false) { return true; } private: // настройки static const uint8_t deviceCount = 2; // количество датчиков DeviceAddress address[deviceCount] = { // адреса, по 8 байт 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; float temperatureC[deviceCount] = {25, 30}; // базовые температуры, в градусах Цельсия float step = 0; // шаг изменения температуры (при 0 не меняется) float band = 5; // диапазон изменения температуры (плюс/минус) };
Наверно похвально, но хоть убей не догадываюсь зачем это надо. Если в Протеус - там есть модель этого датчика.