Имитация датчика ds18b20

Тема в разделе "Arduino & Shields", создана пользователем User248, 5 фев 2023.

  1. User248

    User248 Гик

    Не нашёл в эмуляторах 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; // диапазон изменения температуры (плюс/минус)
    };
     
     
    Последнее редактирование: 6 фев 2023
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Наверно похвально, но хоть убей не догадываюсь зачем это надо. Если в Протеус - там есть модель этого датчика.
     
  3. User248

    User248 Гик

     
  4. User248

    User248 Гик

    В симуляторе Wokwi появился датчик температуры DS18B20.
     
    Airbus и arkadyf нравится это.
  5. Airbus

    Airbus Радиохулиган Модератор

    Это Гуд! Я его уже нашол!
     
    Последнее редактирование: 11 апр 2023