1 (2018-05-30 11:15:00 отредактировано TorAllex)

Тема: Простая автоматика управления клапаном отбора

Доброго всем всего!
Будучи вдохновлён прекрасным TMAS и оторванным (временно!) от возможности заниматься винокурением собрал на досуге вариант, который предлагаю вашему вниманию.
Концепт: максимально просто, максимально автономно, управление одной рукой.
Функционал:
- DS18b20 раз в секунду читает температуру пара в голове колонны;
- BMP180 раз в полминуты читает атмосферное давление;
- вращением энкодера (таки да – одной рукой) оператор задаёт температуру закрытия клапана (справочную, для нормальных условий), шаг изменения 0,05 ºC;
- программа вносит поправку к заданной температуре с учётом атм. давления и,;
- сравнивая результат с показаниями DS18b20, закрывает или открывает клапан;
На дисплей выводятся: заданная температура, расчётная температура, измеренная температура, атмосферное давление.
Важный момент (забыл сразу написать) – для изменения температуры энкодер надо вращать в нажатом положении. Дело в том, что пока кнопка энкодера не нажата, приоритет отдан другим задачам. Если вращать не нажатый энкодер, поворот не считывается (либо несёт ахинею).
Состав:
- плата Arduino (у меня была Nano под руками)
- датчик BMP180
- датчик DS18b20 и резистор 4.7 кОм к нему
- дисплей 16х2 I2C
- реле для работы клапана
- энкодер

За код просьба больно не пинать, это в принципе первая моя попытка. Всё работает, но буду благодарен за советы по оптимизации:

#include <OneWire.h>                      // Библиотеки для DS18b20
#include <DallasTemperature.h>            // ----------------------
#define ONE_WIRE_BUS 10                   // D10 пин для DS18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);      //Создаём объект sensors для работы с ds18b20

#include <Adafruit_BMP085.h>              // Подключаем библиотеку для работы с датчиками BMP180 или BMP280
Adafruit_BMP085 bmp;                      // Создаём объект bmp для работы с датчиком адрес которого на шине I2C установлен по умолчанию.

#include <Wire.h>                         // библиотека для управления устройствами по I2C 
#include <LCD_1602_RUS.h>                 // подключаем русскую библиотеку для LCD, 
                                          // LiquidCrystal_I2C.h должна быть установлена в системе 
LCD_1602_RUS lcd(0x3F,16,2);              // присваиваем имя lcd для дисплея 16х2 на адресе 0x3F
    
                    //--ПИНЫ ЭНКОДЕРА--
#define CLK 5                             // D5
#define DT 6                              // D6
#define SW 7                              // D7
                    //--ПИНЫ ЭНКОДЕРА--

#define VLV 2       //--ПИН КЛАПАНА--     // D2
    
    #define  INTERVAL  1000UL             // 1 секунда, базовый интервал
    
    float actual;                         // расчётная температура с учётом атмосферного давления
    float press;                          // атмосферное давление
    float vape;                           // температура пара
    float counter = 78.40;                // переменная заданной (табличной, для Н.У.) темературы, °C
    boolean DT_now, DT_last, SW_now;      // состояния энкодера


    void setup() {
      sensors.begin();

      pinMode (CLK, INPUT);
      pinMode (DT, INPUT);
      pinMode (SW, INPUT);
      pinMode (VLV, OUTPUT);
      DT_last = digitalRead(CLK);         // читаем начальное положение CLK

  if (!bmp.begin()) {                     // инициализация датчика BMP180
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  }
   
      lcd.init();                             // инициализация LCD дисплея
      lcd.backlight();                        // включение подсветки дисплея
   
      lcd.setCursor(5,0);                     // ставим курсор на 5 символ первой строки
      lcd.print("° <=");                      // печатаем

      lcd.setCursor(10,0);                    // ставим курсор на 10 символ первой строки
      lcd.print(counter);                     // печатаем

      lcd.setCursor(15,0);                    // ставим курсор на 15 символ первой строки
      lcd.print("°");                         // печатаем
  
      lcd.setCursor(5,1);                     // ставим курсор на 5 символ второй строки
      lcd.print("°C");                        // печатаем
      
      lcd.setCursor(8,1);
      lcd.print(bmp.readPressure()*0.007500616827042);      
      
      lcd.setCursor(14,1);                    // ставим курсор на 14 символ второй строки
      lcd.print("мм");                        // печатаем

      press = bmp.readPressure();             // считываем атм. давление на старте


    }
      
    void loop() {
      SW_now = digitalRead(SW);               // проверяем, не нажата ли кнопка энкодера
      if (SW_now == HIGH) {                   // если нажата, то
        encoderTick();                        // считаем щелчки поворота
      } else {
        static unsigned long previousMillis = 0;        // храним время последнего измерения
        if(millis() - previousMillis > 30*INTERVAL) {   // проверяем, не истек ли интервал. если да, то
        previousMillis = millis();                      // сохраняем время последнего измерения и
        psensorMeasure();                               // слушаем датчик атмосферы
        } else {                              
          dallas();                           // все остальное время выполняем отработку температуры
        }
      }
    }
    
    void encoderTick() {
      DT_now = digitalRead(CLK);          // читаем текущее положение CLK
      if (DT_now != DT_last) {            // если предыдущее и текущее положение CLK разные, значит был поворот
        if (digitalRead(DT) != DT_now) {  // если состояние DT отличается от CLK, значит крутим по часовой стрелке
          counter += 0.05;                // прибавить счётчик
        } else {                          // если совпадают, значит против часовой
          counter -= 0.05;                // убавить счётчик
        }
        lcd.setCursor(10,0);              // ставим курсор на 10 символ первой строки
        lcd.print(counter);               // печатаем заданную температуру
      }
      DT_last = DT_now;                   // обновить значение
    }

    void psensorMeasure() {
      press = bmp.readPressure();
      lcd.setCursor(8,1);
      lcd.print(press*0.007500616827042);
    }
    
    void dallas() {
      actual = (press*0.007500616827042-760)*0.034+counter;
      static unsigned long previousMillis = 0;        // храним время последнего измерения
      if(millis() - previousMillis > INTERVAL) {      // проверяем, не истек ли интервал. если да, то
      previousMillis = millis();                      // сохраняем время последнего измерения и      
      sensors.requestTemperatures();                  // опрашиваем датчик температуры
      vape = sensors.getTempCByIndex(0);              // обновляем значение переменной температуры пара
      lcd.setCursor(0,1);
      lcd.print(vape);                                // печатаем расчётную температуру
      lcd.setCursor(0,0);
      lcd.print(actual);                              // печатаем текущую температуру пара
        if (vape > actual) {
        digitalWrite (VLV, HIGH);                     // закрываем клапан при температуре пара больше расчётной
        } else {
          digitalWrite (VLV, LOW);
        }
      }
    }
  • Light-VLV.jpg
    size: 141.08Кб type: jpg
  • Light-VLV screen.jpg
    size: 57.74Кб type: jpg

2

Re: Простая автоматика управления клапаном отбора

почему датчик на пар а не 2/3 ?
перед открытием клапана добавь задержку на 5-10 сек. - время стабилизации колонны после закрытия клапана чтобы успела накопиться правильная фракция.
мне не хватает такой опции на термостате.

никогда не опускай руки - пропустишь в бороду
с водкой все идет хорошо... кроме ног

3

Re: Простая автоматика управления клапаном отбора

Konster ©:

почему датчик на пар а не 2/3 ?

Почему-то я думаю, что нас в первую очередь интересует температура пара в голове. ИМХО, датчик на 2/3 лишь сигнализирует о подходе следующей фракции - разве не так?

Konster ©:

перед открытием клапана добавь задержку на 5-10 сек. - время стабилизации колонны после закрытия клапана

Подумаю, как это воплотить (не обещаю быстро, ибо кодер я новорождённый).

4 (2018-05-30 11:23:47 отредактировано )

Re: Простая автоматика управления клапаном отбора

TorAllex ©:

Почему-то я думаю, что нас в первую очередь интересует температура пара в голове.

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

TorAllex ©:

Подумаю, как это воплотить

 //********Управление клапаном по датчику 2/3************
  if (sensors.getTempCByIndex(1) > klapanTmp + 0.4) // если температура датчика 2/3, подросла на 0,4
  {
    pauseKlapan = millis() / 1000;
    if (pauseKlapan >= 5)   // если прошло больше 5 секунд
    {
      digitalWrite(KLAPAN, HIGH);  // закрываем клапан отбора
      digitalWrite(LED_KLAPAN, HIGH);  // зажигаем индикатор клапана отбора
    }
  }
  if (sensors.getTempCByIndex(1) <= klapanTmp)
  {
    digitalWrite(KLAPAN, LOW);  // открываем клапан отбора
    digitalWrite(LED_KLAPAN, LOW);  // гасим индикатор клапана отбора
  }

Можно так, только переменные свои прописать.


Для временной переменной, использовать нужно unsigned long
unsigned long pauseKlapan ;

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

5 (2018-05-31 17:58:00 отредактировано Kusnezov Oleg)

Re: Простая автоматика управления клапаном отбора

А зачем абсолютную температуру выставлять?
У меня стоит одна кнопка.
Вывожу колонну на стабильный режим.  Нажимаю кнопку (2 секунды) - фиксируется текущая температура 2/3 как "эталонная", начинаю отбор. Если температура увеличилась на 0,1 градуса клапан закрывается, если после закрытия клапана прошло более 7 секунд и температура стала равна или ниже "эталонной", клапан открывается.
В процессе обора температура стабильной работы у меня часто уползает вверх на 0,1 - 0,2 градуса. Нажимаю кнопку - фиксируется новая "эталонная" температура и порог 0,1 градуса определяется уже относительно новой температуры.
Если текущая температура отличается от "эталонной" более, чем на 0,2 градуса - включается сигнал тревоги.

С уважением, Олег Кузнецов.

6

Re: Простая автоматика управления клапаном отбора

Kusnezov Oleg ©:

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

В моих проектах изначально такая реализация

Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)

Ленивые всё делают быстро, что бы скорее отделаться от работы и делают хорошо, чтобы не переделывать.
С уважением, Николай.
Моё оборудование : → Винокурня Николя

7

Re: Простая автоматика управления клапаном отбора

Николя, посмотрел, точно  *THUMBSUP*

С уважением, Олег Кузнецов.

8 (2018-06-01 12:40:53 отредактировано TorAllex)

Re: Простая автоматика управления клапаном отбора

Kusnezov Oleg ©:

А зачем абсолютную температуру выставлять?

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

Konster ©:

перед открытием клапана добавь задержку на 5-10 сек. - время стабилизации колонны после закрытия клапана чтобы успела накопиться правильная фракция.
мне не хватает такой опции на термостате.

Ок. Датчик задействован один, куда его ставить – дело добровольное.
В текущем варианте добавлено:
- Закрытие клапана по подъёму температуры на 0,4º (Kusnezov Oleg прав, надо будет её вынести в шапку скетча);
- Задержка открытия клапана 7 секунд. Если во время обратного отсчёта задержки температура снова поднялась (фантастика, но вдруг?) - задержка увеличится обратно до 7;
- Индикация по центру верхней строки >O< - клапан открыт, >X< - клапан закрыт, >5< - обратный отсчёт до открытия клапана.

В архиве https://cloud.mail.ru/public/3XGj/FwqcTxsTY скетч и библитеки

#include <OneWire.h>                      // Библиотеки для DS18b20
#include <DallasTemperature.h>            // ----------------------
#define ONE_WIRE_BUS 10                   // D10 пин для DS18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);      //Создаём объект sensors для работы с ds18b20

#include <Adafruit_BMP085.h>              // Подключаем библиотеку для работы с датчиками BMP180 или BMP280
Adafruit_BMP085 bmp;                      // Создаём объект bmp для работы с датчиком адрес которого на шине I2C установлен по умолчанию.

#include <Wire.h>                         // библиотека для управления устройствами по I2C 
#include <LCD_1602_RUS.h>                 // подключаем русскую библиотеку для LCD, 
                                          // LiquidCrystal_I2C.h должна быть установлена в системе 
LCD_1602_RUS lcd(0x3F,16,2);              // присваиваем имя lcd для дисплея 16х2 на адресе 0x3F
    
                    //--ПИНЫ ЭНКОДЕРА--
#define CLK 5                             // D5
#define DT 6                              // D6
#define SW 7                              // D7
                    //--ПИНЫ ЭНКОДЕРА--

#define VLV 2       //--ПИН КЛАПАНА--     // D2
    
    #define  INTERVAL  1000UL             // 1 секунда, базовый интервал
    
    float actual;                                 // расчётная температура с учётом атмосферного давления
    float press;                                  // атмосферное давление
    float vape;                                   // температура пара
    float counter = 78.00;                        // переменная заданной (табличной, для Н.У.) темературы, °C
    boolean DT_now, DT_last, SW_now, VLV_now;     // состояния пинов энкодера и клапана


    void setup() {
      sensors.begin();

      pinMode (CLK, INPUT);
      pinMode (DT, INPUT);
      pinMode (SW, INPUT);
      pinMode (VLV, OUTPUT);
      DT_last = digitalRead(CLK);         // читаем начальное положение CLK

  if (!bmp.begin()) {                     // инициализация датчика BMP180
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  }
   
      lcd.init();                             // инициализация LCD дисплея
      lcd.backlight();                        // включение подсветки дисплея
   
      lcd.setCursor(5,0);                     // ставим курсор на 5 символ первой строки
      lcd.print("°>");                        // печатаем
      lcd.setCursor(7,0);                     // ставим курсор на 5 символ первой строки
      lcd.print("O");                         // печатаем      
      lcd.setCursor(8,0);                     // ставим курсор на 8 символ первой строки
      lcd.print("<");                         // печатаем

      lcd.setCursor(10,0);                    // ставим курсор на 10 символ первой строки
      lcd.print(counter);                     // печатаем

      lcd.setCursor(15,0);                    // ставим курсор на 15 символ первой строки
      lcd.print("°");                         // печатаем
  
      lcd.setCursor(5,1);                     // ставим курсор на 5 символ второй строки
      lcd.print("°C");                        // печатаем
      
      lcd.setCursor(8,1);
      lcd.print(bmp.readPressure()*0.007500616827042);      
      
      lcd.setCursor(14,1);                    // ставим курсор на 14 символ второй строки
      lcd.print("мм");                        // печатаем

      press = bmp.readPressure();             // считываем атм. давление на старте


    }
      
    void loop() {
      SW_now = digitalRead(SW);               // проверяем, не нажата ли кнопка энкодера
      if (SW_now == HIGH) {                   // если нажата, то
        encoderTick();                        // считаем щелчки поворота
      } else {
        static unsigned long previousMillis = 0;        // храним время последнего измерения
        if(millis() - previousMillis > 30*INTERVAL) {   // проверяем, не истек ли интервал. если да, то
        previousMillis = millis();                      // сохраняем время последнего измерения и
        psensorMeasure();                               // слушаем датчик атмосферы
        } else {                              
          dallas();                           // все остальное время выполняем отработку температуры
        }
      }
    }
    
    void encoderTick() {
      DT_now = digitalRead(CLK);          // читаем текущее положение CLK
      if (DT_now != DT_last) {            // если предыдущее и текущее положение CLK разные, значит был поворот
        if (digitalRead(DT) != DT_now) {  // если состояние DT отличается от CLK, значит крутим по часовой стрелке
          counter += 0.05;                // прибавить счётчик
        } else {                          // если совпадают, значит против часовой
          counter -= 0.05;                // убавить счётчик
        }
        lcd.setCursor(10,0);              // ставим курсор на 10 символ первой строки
        lcd.print(counter);               // печатаем заданную температуру
      }
      DT_last = DT_now;                   // обновить значение
    }

    void psensorMeasure() {
      press = bmp.readPressure();
      lcd.setCursor(8,1);
      lcd.print(press*0.007500616827042);
    }
    
    void dallas() {
      VLV_now = digitalRead (VLV);
      actual = (press*0.007500616827042-760)*0.034+counter;
      static unsigned int cntdwn;                     // обратный отсчёт для задержки открытия
      static unsigned long previousMillis = 0;        // храним время последнего измерения
      if(millis() - previousMillis >= INTERVAL){      // проверяем, не истек ли интервал. если да, то
      previousMillis = millis();                      // сохраняем время последнего измерения и      
      sensors.requestTemperatures();                  // опрашиваем датчик температуры
      vape = sensors.getTempCByIndex(0);              // обновляем значение переменной температуры пара
      lcd.setCursor(0,1);
      lcd.print(vape);                                // печатаем расчётную температуру
      lcd.setCursor(0,0);
      lcd.print(actual);                              // печатаем текущую температуру пара
        if (vape > actual+0.4) {                      // если температура на датчике превысила расчётную на заданную дельту
        digitalWrite (VLV, HIGH);                     // закрываем клапан
        lcd.setCursor(7,0);                           // ставим курсор на 7 символ первой строки
        lcd.print("X");                               // печатаем         
        cntdwn = 7;                                   // взводим обратный отсчёт
        } else {
          if  (VLV_now == HIGH && vape <= actual && cntdwn > 0){  // если температура на датчике = расчётной или ниже, а клапан ещё закрыт и обратный отсчёт не закончен
          cntdwn -= 1;                                            // уменьшаем обратный отсчёт на 1      
          lcd.setCursor(7,0);                         // ставим курсор на 7 символ первой строки
          lcd.print(cntdwn);                          // печатаем          
          }
          if  (VLV_now == HIGH && vape <= actual && cntdwn == 0){ 
            digitalWrite (VLV, LOW);                  // открываем клапан
            lcd.setCursor(7,0);                       // ставим курсор на 5 символ первой строки
            lcd.print("O");                           // печатаем
          }
        }
      }
    }

9

Re: Простая автоматика управления клапаном отбора

Лучше константы, например 0.4 (это, как мне кажется. катастрофически много, но НЕ В ЭТОЙ ТЕМЕ надо обсуждать) определять в голове программы - использовать числа в теле программы крайне неудобно для отладки и модификаций.

С уважением, Олег Кузнецов.

10

Re: Простая автоматика управления клапаном отбора

Kusnezov Oleg ©:

Лучше константы… определять в голове программы

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

11 (2019-01-15 11:03:29 отредактировано Konster)

Re: Простая автоматика управления клапаном отбора

подскажите, какая точность  у датчиков ds18b20 при таком снятии показаний ?

никогда не опускай руки - пропустишь в бороду
с водкой все идет хорошо... кроме ног

12 (2019-01-15 13:15:35 отредактировано )

Re: Простая автоматика управления клапаном отбора

Konster, при каком - "таком"?

Точность датчика, по документации, 0.5°C в диапазоне от –10°C до +85°C.
Это про абсолютную температуру. С какой точность измеряется изменение температуры в диапазоне 73 - 99, не документировано. По моим ощущениям - где-то 0.1 градуса.
"... показания снимаются", вроде, всегда одинаково: программный запрос на измерение - датчик измеряет и записывает температуру (на это нужно время) - через некоторое время чтение памяти датчика.


Разрешающая способность по умолчанию установлена 12-бит. То есть шаг 0.0625 градуса.

С уважением, Олег Кузнецов.

13

Re: Простая автоматика управления клапаном отбора

Kusnezov Oleg ©:

Разрешающая способность по умолчанию установлена 12-бит

попадались датчики с настройкой с шагом 0.5С

никогда не опускай руки - пропустишь в бороду
с водкой все идет хорошо... кроме ног

14

Re: Простая автоматика управления клапаном отбора

Kusnezov Oleg ©:

Разрешающая способность по умолчанию установлена 12-бит. То есть шаг 0.0625 градуса.

Сколько раз видел что датчик прописанный как 12-бит точности, сбрасывался в 9-бит... Почему - хз...

15

Re: Простая автоматика управления клапаном отбора

Konster, d.styler, есть такая проблема. У меня из пучка 10 штук датчиков с гильзами 2 страдали "сбрасыванием" в 9 бит.
Ну я решил побороться - всякий раз, когда датчик выдавал температуру кратную 0.5 градуса, я перед следующим запросом принудительно устанавливал разрешение 12 бит.
И даже помогло... на некоторое время :( . Потом датчик перестал реагировать и показывал с шагом 0.5 градуса всегда. Смирился...

С уважением, Олег Кузнецов.

16 (2019-01-15 15:19:55 отредактировано kvic)

Re: Простая автоматика управления клапаном отбора

Konster, d.styler, Kusnezov Oleg, в DS18B20 есть EEPROM, откуда при включении читаются настройки.
Простая установка разрешения 12-бит не записывается в EEPROM.
Туда надо принудительно пихать свои настройки.
Может в этом причина ?
Ниже кусочек кода из моего термометра.

; ----------------------------------------------------------------------------------------
.equ    SearchROM          = $F0
.equ    ReadROM            = $33
.equ    MatchROM           = $55
.equ    SkipROM            = $CC
.equ    AlarmSearch        = $EC

.equ    ConvertT             = $44
.equ    WriteScratchpad    = $4E
.equ    ReadScratchpad    = $BE
.equ    CopyScratchpad    = $48
.equ    RecallE2        = $B8
.equ    ReadPowerSupply    = $B4
; ----------------------------------------------------------------------------------------
        ; -- определяемся с температурными датчиками
            call GetPresence
            ; -- принудительно ставим 12-бит
            ldi r16,SkipROM
            call WriteByte
            ldi r16,WriteScratchPad
            call WriteByte
            ldi r16,$05                          ;TH
            call WriteByte
            ldi r16,$50                          ;TL
            call WriteByte
            ldi r16,0b01111111             ;12-bit
            call WriteByte
            ; -- и записываем в EEPROM DS
                call GetPresence
                ldi r16,SkipROM
                call WriteByte
                ldi r16,CopyScratchPad
                call WriteByte
                M_DELAY_US 10000        ; задержка 10 мс
            ; -- запускаем на измерение
            call GetPresence
            ldi r16,SkipROM
            call WriteByte
            ldi r16,ConvertT
            call WriteByte
; ------------------------------------------------------------------------
РК 35х1600

17 (2019-01-15 17:28:11 отредактировано Kusnezov Oleg)

Re: Простая автоматика управления клапаном отбора

kvic ©:

Простая установка разрешения 12-бит не записывается в EEPROM

А вот эта запись из библиотеки OneWire.h

ds.write(0x60)

Это не в EEPROM ?

UPD  Сам сейчас посмотрел, действительно, это не в EEPROM. Но..., жаль, чот это, по-видимому, не важно - ведь разрядность, у меня, во всяком случае, при каждом  RESET устанавливается.

С уважением, Олег Кузнецов.

18 (2019-01-23 07:37:01 отредактировано Konster)

Re: Простая автоматика управления клапаном отбора

Kusnezov Oleg ©:

ведь разрядность, у меня, во всяком случае, при каждом  RESET устанавливается.

так -  sensors10.setResolution(0, 12); ?
Николя,  использовал сначала опрос по паразитному питанию, потом перешел на библиотеки ?
Если все датчики на одной шине их опрос быстрее идет ? повесил 4 датчика на 4 вывода. без дополнительной задержки цикл опроса полторы-2 секунды. Не критично.
Если все датчики на одной ноге, то надо знать их номера и потом обращаться по номеру, чтобы ардуина помнила какой где стоит?
попалил дисплей 20х4 - прицепил 0,91 . 2 шрифтом 3 строки в 2 столбца.. мелко но для экспериментов пойдет, а потом из него градусник с оповещением сделаю. 0,96 экраны в пути.
При отключении вывода в serial компилятор перестает ругаться на недостаточность памяти.

посмотрел таблицу зависимости t кипения спирта от давления и получилась такая строчка коррекции температуры срабатывания клапана
при изменении давления на 1.0 изменяем температуру на 0.038 С.

if (abs(ustPrs-tekPrs)>=1){ustTmp=ustTmp + (tekPrs-ustPrs)*0.038; ustPrs = tekPrs;}

никогда не опускай руки - пропустишь в бороду
с водкой все идет хорошо... кроме ног

19 (2019-01-23 09:28:59 отредактировано )

Re: Простая автоматика управления клапаном отбора

Konster ©:

sensors10.setResolution(0, 12); ?

Так наверное тоже можно.
Но я вот так делал:
ds.reset();
ds.write(0xCC);
ds.write(0x4E);
ds.write(0x7F); // Th контроль температуры
ds.write(0xFF); //Tl контроль температуры
ds.write(0x60); // 0x60 12-бит разрешение

У меня тоже на каждой шине один датчик. Так вроде, без разницы, как подключать - с точки зрения затрат времени. Сначала всем датчикам команда - "измерять" потом, если не гемороится с проверкой готовности, через примерно 0,75 (1,0) секунды, для 12 бит можно считывать.

С уважением, Олег Кузнецов.

20

Re: Простая автоматика управления клапаном отбора

Kusnezov Oleg ©:

Но я вот так делал:
ds.reset();
ds.write(0xCC);
ds.write(0x4E);
ds.write(0x7F); // Th контроль температуры
ds.write(0xFF); //Tl контроль температуры
ds.write(0x60); // 0x60 12-бит разрешение

После можно попробовать добавить:
ds.reset()
ds.write(0XCC)
ds.write(0X48);// Запись настроек в EEPROM
Из даташита:
Copy Scratchpad [48h]
This command copies the contents of the scratchpad
TH, TL and configuration registers (bytes 2, 3 and 4) to
EEPROM.

РК 35х1600