321

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

Endi ©:

Например, я читал:

Я тоже читал. столько читал, что всех и не вспомнить. Но какой прок от чтения, если вы не сможете повторить эксперимент Стабинкова?  Сможете?  Тогда повторите, потом можно говорить.

Endi ©:

а в чем заключался Ваш, неискаженный, способ?

Исключительно для очень коротких колонн типа обрубок на газовой плите.. это один из относительно вменяемых способов хоть что-то вытянуть из трубы. В случае от 1 метра (даже от 80см) смысла нет, совсем нет... есть куда более дешёвые и элегантные решения, в том числе без автоматики...совсем без автоматики.. Какие?  Так сама теория ректификации на это отвечает открыто без секретов :)

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Регистрация на форуме отключает почти всю рекламу.

322

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

Повторять эксперименты имеет смысл, если хочешь подтвердить или опровергнуть теорию. Я ни того ни другого не планирую, тем более что цитировал описание одного из существующих методов ведения ректификации, а не эксперименты. Да и вообще, повторюсь, что моя цель не опровергнуть ваше понимание алгоритма, а показать, что тема круто отклонилась от первоначального направления. И в результате, практически ее двигает только очень мною уважаемый gena 69.

323

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

Endi ©:

а показать, что тема круто отклонилась от первоначального направления

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

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Регистрация на форуме отключает почти всю рекламу.

324 (2016-12-28 09:13:43 отредактировано Endi)

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

Ну, желаю удачи .

325

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

Endi ©:

Жить в новом - это хорошо, но тема, все-таки, начиналась иначе.

Моя вина что в начале темы описал использование блока с задержкой на клапан. Однако многократно писал что сразу отказался от него.

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

326

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

Не понял восторгов по датчику DS18B20. Сегодня подключил два датчика к Ардуине, замерил.

Видна серьезная разница в температуре, хотя датчики лежат на столе совсем рядом. По паспорту сказано, что разброс +- полградуса. Как бы укладываемся в допустимую погрешность, но как быть с точной температурой для БК "добычи" продукта? Там ведь 78,15 для 760мм р.с. Т.е. не 78,3 или 77,8, а именно 79,15. Как в дайвинге и космосе - ставить минимум три датчика и брать среднее? Или смотреть по отбору жидкости и давать "поправки на ветер"?

327

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

zcom ©:

как быть с точной температурой для БК

А зачем она нужна?

Musha ring dum a doo dum a da
There's whiskey in the jar

328

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

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

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Регистрация на форуме отключает почти всю рекламу.

329 (2017-01-04 13:11:08 отредактировано )

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

Artem.SHitov ©:
zcom ©:

как быть с точной температурой для БК

А зачем она нужна?

Ну, во-первых, это красиво. :)
А, во-вторых, как накапливать статистику, если показания скачут?

Иван ©:

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

Судя по скетчу-примеру стоят на 12-битное разрешение, но сейчас доизучаю даташит (

), перепишу скетч, будет понятно.

330

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

zcom ©:

Видна серьезная разница в температуре

Для начала - все датчики имеют свои погрешности. Но они не так важны для нас - для нас более важным является стабильность этой погрешности (что на самом деле имеет зависимость от температуры и питающего напряжения - https://alcodistillers.ru/forum/viewtop … 309#p44309).
+ как сказал Иван - проверь что все датчики имеют одинаковую выставленную точность.

А вообще если хочется чтоб датчики показывали сравнимые температуры - их надо калибровать. По моему все программы позволяют ввести поправку для датчика (про ардуино не знаю). Но если есть желание калибровать - то делать это на воздухе - пустая трата времени (очень подвержен микро-флуктуациям).

Лучше всего взять термос, налить туда воды примерно равной температуры с 78С, закрыть, подождать несколько минут для стабилизации температуры, открыть снова и опкстить датчики, прикрыв при этом горловину термоса чтоб обеспечить герметичность.
В этом случае в домашних условиях мы обеспечиваем для важных условия при калибровке - 1) постоянство температуры во время измерения и 2) постоянство температуры в ограниченном пространстве нахождения датчиков.

331

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

zcom ©:

как накапливать статистику, если показания скачут?

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

Musha ring dum a doo dum a da
There's whiskey in the jar

332

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

zcom, подключи для начала к компу, посмотри что там... да тебе уже дали совет.

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Регистрация на форуме отключает почти всю рекламу.

333 (2017-01-04 17:32:44 отредактировано zcom)

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

написал я скетч для параллельного опроса произвольного количества датчиков температуры. Про калибровку понял. Точнее даже знал. :) Но была надежда, что этим занимаются на заводе.
Если нужны комментарии по скетчу, то отвечу на вопросы. Из "уникального". Параллельный опрос датчиков, отказ от использования программных задержек - работаем от готовности датчиков, возможность управлять периодом опроса (до 1 мс), возможность выгрузки массива температур (пока не реализовал, т.к. непонятно куда, но по коду видно, что для этого все готово). Работает пока через серийный порт, но это не принципиально, вывод можно куда угодно перенаправить.

#include <OneWire.h>

#define PIN_CONNECT 10          // on pin 10 (a 4.7K resistor is necessary)
#define SERIAL_BAUD 115200      //
#define PERIOD_MIN 1000         // 
#define RESOLUTION 12           // 9, 10, 11, 12 bit
#define SENSORS 2

struct tsdata {
  byte addr[8];
  byte answer[9];
  float tempC;
  float tempF;
  boolean enable = false;
  boolean readable = false;
};
tsdata ts[SENSORS];
unsigned long count = 0;
boolean readstate = false;

OneWire  ds(PIN_CONNECT);  

void print_hex(byte data[], byte l = 8, boolean ns = true) {
  byte i;
  for( i=0; i<l; i++) {
    if (data[i] < 16)
      Serial.print("0");
    Serial.print(data[i], HEX);
    if (i != (l-1))
      Serial.print(".");
  }
  if (ns)
    Serial.println();
}


void setup(void) {
  byte i, j;

  Serial.begin(SERIAL_BAUD);

  ds.reset_search();
  i=0;
  while (ds.search(ts[i].addr)) {
    if (ds.crc8(ts[i].addr, 7) == ts[i].addr[7]) {
      if ((ts[i].addr[0] == 0x10) || (ts[i].addr[0] == 0x22) || (ts[i].addr[0] == 0x28)) {
        ts[i].enable = true;
        i++;
        if (i > SENSORS)
          break;
      }
    }
  }
  Serial.print("All sensor = ");
  Serial.println(i);
  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      Serial.print("Device ");
      Serial.print(i);
      Serial.print(" = ");
      print_hex(ts[i].addr, 8, true);
      ds.reset();
      ds.select(ts[i].addr);
      ds.write(0x4E);
      ds.write(0);
      ds.write(0);
      switch (RESOLUTION) {
        case 9:
          ds.write(0x1F);
        case 10:
          ds.write(0x3F);
        case 11:
          ds.write(0x5F);
        default:
          ds.write(0x7F);
      }
      ds.write(0x48);
    }
  }
  count = millis();
}

void loop(void) {
  byte i, j;
  int16_t test;

  if ((millis() - count) <= PERIOD_MIN) {
    delay(1);
    return;
  }
  count = millis();
  if (!readstate) {
    for (i=0; i<SENSORS; i++) {
      if (ts[i].enable) {
        ts[i].readable = false;
        ds.reset();
        ds.select(ts[i].addr);
        ds.write(0x44);
      }
    }
    readstate = true;
    return;
  }
  if (!ds.read()) {
    return;
  }
  readstate = false;
  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      ds.reset();
      ds.select(ts[i].addr);
      ds.write(0xBE);
      for (j=0; j<9; j++) {
        ts[i].answer[j] = ds.read();
      }
      ts[i].readable = (ds.crc8(ts[i].answer, 8) == ts[i].answer[8]);
    }
  }

  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      Serial.print(i+1);
      Serial.print(": ");
      test = ts[i].answer[1] * 256 + ts[i].answer[0];
      if (ts[i].addr[0] == 0x10) {
        test = test << 3;
        if (ts[i].answer[7] == 0x10) {
          test = (test & 0xFFF0) + 12 - ts[i].answer[6];
        }
      }
      else {
        switch (ts[i].answer[4] & 0x60) {
          case 0x00:
            test = test & ~7;
          case 0x20:
            test = test & ~3;
          case 0x40:
            test = test & ~1;
        }
      }
      ts[i].tempC = (float)test / 16.0;
      ts[i].tempF = ts[i].tempC * 1.8 + 32.0; 
      Serial.print(ts[i].tempC);
      Serial.print("C, ");
      Serial.print(ts[i].tempF);
      Serial.println("F");
    }
  }
}

P.S. Да, еще предусмотрел в коде возможность "отключения/подключения" обнаруженных датчиков в ходе работы (поле enable структуры). Возможно, для чего-то и пригодится.

Artem.SHitov ©:
zcom ©:

как накапливать статистику, если показания скачут?

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

Барометрический датчик я взял. Это модуль от "Тройки", но что-то с Arduino Due не завелся. Заказал другой, который припаивается - GY-68, но пока непонятно, когда приедет. В наличии нет, после 9-ого скажут.
А так, да, тоже подключу его в этот скетч.

Куда данные выводить? Из реально накапливать и хранить в памяти Ардуинки. Но только там места мало. Можно скидывать из через серийный порт куда-нибудь сразу пакетом (формат?). Для этого, правда, надо команду передать соответствующую - через клавиатуру, например, или еще как.

В принципе, программировать на Ардуине легко. Так что заказы по доработке принимаются. :)

334

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

А может логичнее температурный лог на флэшку или SD карту скидывать? В простом текстовом формате, например, номер (расположение) датчика, время и температура через запятую и следующий замер с новой строки.

Jedem das Seine
Дистилятор с укреплением 15\650 медь
РК 28\1300 медь
Учиться - никогда не поздно

335

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

zcom ©:

Параллельный опрос датчиков

В каком месте интересно? Датчики опрашиваются последовательно в коде. И да - опрашивать их паралельно не получится - читай 1-Wire протокол.
Из коментариев - запрос на конверсию можно как раз параллельно всем послать - быстрее чем каждому по отдельности. Для этого - послать ресет, затем 0xСС (skip ROM), а затем 0x44. При этом конверсия будет произведена параллельно. При 2-х датчиках это не критично, а вот когда их 4-6 - тогда можно сэкономить.

Конверсия в датчике занимает какое-то время - то есть можно конечно выставить 1мс между посылкой конверсии и чтением - но что мы читаем при этом?

336

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

zcom ©:

написал я скетч

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

zcom ©:

Куда данные выводить?

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

zcom ©:

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

Легко... наверное, когда куча готовых примеров и можно их изменить.  Давай для начала в SQL в реальном времени... сможешь? Или на худой конец в CSV .

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Регистрация на форуме отключает почти всю рекламу.

337 (2017-01-04 21:50:32 отредактировано zcom)

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

d.styler ©:
zcom ©:

Параллельный опрос датчиков

В каком месте интересно? Датчики опрашиваются последовательно в коде. И да - опрашивать их паралельно не получится - читай 1-Wire протокол.

Рекомендую ознакомится. https://www.interfaceinnovations.org/on … ation.html

d.styler ©:

Из коментариев - запрос на конверсию можно как раз параллельно всем послать - быстрее чем каждому по отдельности. Для этого - послать ресет, затем 0xСС (skip ROM), а затем 0x44. При этом конверсия будет произведена параллельно. При 2-х датчиках это не критично, а вот когда их 4-6 - тогда можно сэкономить.

Первое время делал именно так. Убил три часа времени - отладчика-то нет в Ардуине. Не работает. Датчики сигнал не воспринимают. Выдают непонятно что. Изучение импортных форумов (на наших все друг у друга перепечатывают или типовой пример правят) дало этот вариант решения. Это гарантировано работает, это раз, второе, для неиспользуемые датчики (enable = false) не напрягаются, третье, если есть еще устройства на OneWire, то они не получают "случайную" команду. А устройства я планирую добавлять.

d.styler ©:

Конверсия в датчике занимает какое-то время - то есть можно конечно выставить 1мс между посылкой конверсии и чтением - но что мы читаем при этом?

Здесь ценность в том, что можно не ждать ответа от датчиков, а параллельно обрабатывать сигналы клавиатуры, управлять шаговыми двигателями, мощностью тэна и т.п. При использовании delay(1000), как во всех примерах, это невозможно. Здесь - легко. Даже на UNO.
Читаем после того, как датчики готовы. Кстати, здесь тоже подводный камень... Как оказалось. :(
Сейчас, как раз, правлю код.

Иван ©:
zcom ©:

написал я скетч

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

Это написано, практически, "с нуля" по спецификациям. :) В пример поглядывал, но он реально однозадачный. А задача была - управление многими устройствами. Не только "умный градусник".

Иван ©:
zcom ©:

Куда данные выводить?

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

zcom ©:

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

Легко... наверное, когда куча готовых примеров и можно их изменить.  Давай для начала в SQL в реальном времени... сможешь? Или на худой конец в CSV .

Готовые примеры - это прекрасно, но они же уровня "обучалки". Очень плохо дружат между собой - проще новый код написать. В реальном вывод в SQL? Здесь вообще не проблема на стороне Arduino. Он-то в порт льет, успевай ловить. Проблема в софте на стороне компа. Там нужен "резидент", который в реальном времени снимает данные с порта и размещает их через ODBC в любой SQL-базе. С этим сложнее. :)
Проще в CSV выгружать по команде. Сделаю.

Kreg1969 ©:

А может логичнее температурный лог на флэшку или SD карту скидывать? В простом текстовом формате, например, номер (расположение) датчика, время и температура через запятую и следующий замер с новой строки.

Да, думал об этом. С реальным временем сложно - нужен его источник. В Ардуине своих часов нет. Но можно использовать момент времени с начала запуска контроллера. Формат CSV. Его легко импортировать хоть в Excell, хоть в СУБД.


Вот новый вариант скетча. Код стал более читаем, избавился от проблем, связанных с использованием "паразитного питания" (по 2-м проводам, вместо трех). Теперь скетч будет корректно работать и с такой формой подключения. Код функций setup() и loop() существенно упростился. Теперь легко можно добавлять код для управления другими устройствами.
В начале кода есть идентификаторы.
TS_PERIOD - период опроса датчиков. В начале периода идет команда на конвертацию значений (подготовка показаний для считывания), по завершению периода - считывание и размещение куда укажем.
RESOLUTION - разрядность определения температуры. Чем точнее, тем дольше (для 12 бит надо 750мс).
SENSORS - количество датчиков на линии. У меня пока подключено два, планирую шесть.

#include <OneWire.h>

#define PIN_CONNECT 10          // on pin 10 (a 4.7K resistor is necessary)
#define SERIAL_BAUD 115200      //
#define TS_PERIOD   1000        // 
#define RESOLUTION  12          // 9, 10, 11, 12 bit
#define SENSORS     2           //

struct tsdata {
  byte addr[8];
  byte answer[9];
  float tempC;
  float tempF;
  boolean enable = false;
  boolean readable = false;
};
tsdata ts[SENSORS];
unsigned long count = 0;

OneWire  ds(PIN_CONNECT);  

void print_hex(byte data[], byte l = 8, boolean ns = true) {
  byte i;
  for( i=0; i<l; i++) {
    if (data[i] < 16)
      Serial.print("0");
    Serial.print(data[i], HEX);
    if (i != (l-1))
      Serial.print(".");
  }
  if (ns)
    Serial.println();
}

void ts_inin(void) {
  byte i=0, j;

  ds.reset_search();
  while (ds.search(ts[i].addr)) {
    if (ds.crc8(ts[i].addr, 7) == ts[i].addr[7]) {
      if ((ts[i].addr[0] == 0x10) || (ts[i].addr[0] == 0x22) || (ts[i].addr[0] == 0x28)) {
        ts[i].enable = true;
        i++;
        if (i > SENSORS)
          break;
      }
    }
  }
  Serial.print("All sensor = ");
  Serial.println(i);
  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      Serial.print("Device ");
      Serial.print(i);
      Serial.print(" = ");
      print_hex(ts[i].addr, 8, true);
      ds.reset();
      ds.select(ts[i].addr);
      ds.write(0x4E);
      ds.write(0);
      ds.write(0);
      switch (RESOLUTION) {
        case 9:
          ds.write(0x1F);
        case 10:
          ds.write(0x3F);
        case 11:
          ds.write(0x5F);
        default:
          ds.write(0x7F);
      }
      ds.write(0x48);
    }
  }
}

void ts_conv(void) {
  byte i;
  
  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      ts[i].readable = false;
      ds.reset();
      ds.select(ts[i].addr);
      ds.write(0x44);
    }
  }
}

void ts_read(void) {
  byte i, j;
  int16_t test;

  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      ds.reset();
      ds.select(ts[i].addr);
      ds.write(0xBE);
      for (j=0; j<9; j++) {
        ts[i].answer[j] = ds.read();
      }
      ts[i].readable = (ds.crc8(ts[i].answer, 8) == ts[i].answer[8]);
      test = ts[i].answer[1] * 256 + ts[i].answer[0];
      if (ts[i].addr[0] == 0x10) {
        test = test << 3;
        if (ts[i].answer[7] == 0x10) {
          test = (test & 0xFFF0) + 12 - ts[i].answer[6];
        }
      }
      else {
        switch (ts[i].answer[4] & 0x60) {
          case 0x00:
            test = test & ~7;
          case 0x20:
            test = test & ~3;
          case 0x40:
            test = test & ~1;
        }
      }
      ts[i].tempC = (float)test / 16.0;
      ts[i].tempF = ts[i].tempC * 1.8 + 32.0; 
    }
  }
}

void ts_output_serial(void) {
  byte i;
  
  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      Serial.print(i+1);
      Serial.print(": ");
      Serial.print(ts[i].tempC);
      Serial.print("C, ");
      Serial.print(ts[i].tempF);
      Serial.println("F");
    }
  }
}

void setup(void) {
  Serial.begin(SERIAL_BAUD);

  ts_inin();
  ts_conv();
  count = millis();
}

void loop(void) {
  if ((millis() - count) >= TS_PERIOD) {
    count = millis();
    ts_read();
    ts_output_serial();
    ts_conv();
  }
}

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

338 (2017-01-04 21:52:43 отредактировано )

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

zcom ©:

Рекомендую ознакомится.

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

zcom ©:

Датчики сигнал не воспринимают.

Интересно - а у меня работают именно так (не ардуина - на компе). Более того - это согласно спецификации от MaxIntegrated...

zcom ©:

При использовании delay(1000), как во всех примерах, это невозможно.

А в чем разница? Вместо цикла который посылает команду конверсии последовательно доступным устройствам - мы тупо шлем СС и 44 - и также выходим. Ждем как на скетче положенное время в мс и затем считываем. Т.е. между этими операциями делай что хочешь...

zcom ©:

если есть еще устройства на OneWire, то они не получают "случайную" команду.

Здесь согласен - есть смысл в этом случае. Но у меня только температурные датчики висят - мне быстрее послать всем на конверсию, затем выждать и потом все считать.

zcom ©:

для 12 бит надо 750мс

Это максимальное значение - на самом деле конверсия быстрее проходит.

339 (2017-01-04 22:55:40 отредактировано )

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

zcom ©:

Рекомендую ознакомится

Я ознакомился и ..

zcom ©:

возможность управлять периодом опроса (до 1 мс), возможность выгрузки массива температур

А ты точно ознакомился со ссылкой?  Так там чёрным по белому про время написано.. ты как-то противоречишь логике датчика :)

Вот я процитирую...

How it works

A typical read operation of a 1Wire device consists of three steps:

Initialize conversion: Instructs 1Wire device to perform a conversion operation to copy the read value (e.g. temperature, humidity, voltage) into a non-volatile memory location for reading. Issuing this command typically takes 10-80ms.
Wait for conversion: Before the value can be read, the conversion must be completed. A typical conversion operation takes from 75-800ms, depending the precision of the read operation.
Read calculated value: Read the calculated value from the conversion operation. This process typically takes 10-80ms

zcom ©:

Проблема "паразитного питания" для датчиков не позволяет сделать вариант считывания данные датчиков "по готовности".

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

У вас в жизни всегда будет все, что вы хотите, если вы будете помогать другим людям получать то, чего хотят они.
Регистрация на форуме отключает почти всю рекламу.

340 (2017-01-05 00:14:38 отредактировано )

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

Спасибо за комментарии. Питание изначально не паразитное. Финальная на сегодня доработка скетча. Добавил диагностику - поиск нужного датчика. Пока сегодня в колонну их втыкал запутался. Теперь все просто - зажигалкой секунду погрел и смотрим на экран, выводится номер датчика.
Сделал меню. Управляется отсылкой в порт цифры (один байт: 30Н..32Н). Вывод в CSV. Пока накапливание и скидывание лога не успел - колонну собирал. Завтра первый запуск.

#include <OneWire.h>

#define PIN_CONNECT 10          // on pin 10 (a 4.7K resistor is necessary)
#define SERIAL_BAUD 115200      //
#define TS_PERIOD   1000        // 
#define RESOLUTION  12          // 9, 10, 11, 12 bit
#define SENSORS     2           //

struct tsdata {
  byte addr[8];
  byte answer[9];
  float tempC = -273.15;
  float tempF = -273.15;
  boolean enable = false;
  boolean readable = false;
};
tsdata ts[SENSORS];
float tempC[SENSORS];
unsigned long count = 0;
byte operation = 0;

OneWire  ds(PIN_CONNECT);  

void print_hex(byte data[], byte l = 8, boolean ns = true) {
  byte i;
  for( i=0; i<l; i++) {
    if (data[i] < 16)
      Serial.print("0");
    Serial.print(data[i], HEX);
    if (i != (l-1))
      Serial.print(".");
  }
  if (ns)
    Serial.println();
}

void ts_inin(void) {
  byte i, j, n=0;

  ds.reset_search();
  while (ds.search(ts[n].addr)) {
    if (ds.crc8(ts[n].addr, 7) == ts[n].addr[7]) {
      if ((ts[n].addr[0] == 0x10) || (ts[n].addr[0] == 0x22) || (ts[n].addr[0] == 0x28)) {
        ts[n].enable = true;
        n++;
        if (n > SENSORS)
          break;
      }
    }
  }
  Serial.print("Number of sensors = ");
  Serial.println(n);
  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      Serial.print("Device ");
      Serial.print(i);
      Serial.print(" = ");
      print_hex(ts[i].addr, 8, true);
      ds.reset();
      ds.select(ts[i].addr);
      ds.write(0x4E);
      ds.write(0);
      ds.write(0);
      switch (RESOLUTION) {
        case 9:
          ds.write(0x1F);
        case 10:
          ds.write(0x3F);
        case 11:
          ds.write(0x5F);
        default:
          ds.write(0x7F);
      }
      ds.write(0x48);
    }
  }
  if (n != 0)
    Serial.println("Menu:");
    Serial.println("1 - Starts measurement");
    Serial.println("2 - Starts diagnostics");
    Serial.println("0 - To stop all operations");
    Serial.println("Choice?");
}

void ts_conv(void) {
  byte i;
  
  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      ts[i].readable = false;
      ds.reset();
      ds.select(ts[i].addr);
      ds.write(0x44);
    }
  }
}

void ts_read(void) {
  byte i, j;
  int16_t test;

  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      ds.reset();
      ds.select(ts[i].addr);
      ds.write(0xBE);
      for (j=0; j<9; j++) {
        ts[i].answer[j] = ds.read();
      }
      ts[i].readable = (ds.crc8(ts[i].answer, 8) == ts[i].answer[8]);
      test = ts[i].answer[1] * 256 + ts[i].answer[0];
      if (ts[i].addr[0] == 0x10) {
        test = test << 3;
        if (ts[i].answer[7] == 0x10) {
          test = (test & 0xFFF0) + 12 - ts[i].answer[6];
        }
      }
      else {
        switch (ts[i].answer[4] & 0x60) {
          case 0x00:
            test = test & ~7;
          case 0x20:
            test = test & ~3;
          case 0x40:
            test = test & ~1;
        }
      }
      ts[i].tempC = (float)test / 16.0;
      ts[i].tempF = ts[i].tempC * 1.8 + 32.0; 
    }
  }
}

void ts_diag(void) {
  byte i;

  for (i=0; i<SENSORS; i++)
    if (abs(ts[i].tempC - tempC[i]) >= 5) {
      Serial.print("ts");
      Serial.print(i);
      Serial.print(", resting temperature = ");
      Serial.print(tempC[i]);
      Serial.print("C, current temperature = ");
      Serial.print(ts[i].tempC);
      Serial.println("C");
    }
}

void ts_output_serial(void) {
  byte i;
  
  Serial.print("ts_data,");
  Serial.print(millis());
  for (i=0; i<SENSORS; i++) {
    if (ts[i].enable) {
      Serial.print(",");
      Serial.print(ts[i].tempC);
    }
  }
  Serial.println();
}

void setup(void) {
  Serial.begin(SERIAL_BAUD);

  ts_inin();
  ts_conv();
  count = millis();
}

void loop(void) {
  byte i, data;

  data = Serial.read();
  if (data == 0x30) {
    operation = 0;
    Serial.println("Break of operation");
  }
  if (data == 0x31) {
    operation = 1;
    Serial.println("Running measurement");
  }
  if (data == 0x32) {
    operation = 2;
    Serial.println("Running diagnostics");
    ts_read();
    for (i=0; i<SENSORS; i++)
      tempC[i] = ts[i].tempC;
  }

  switch (operation) {
    case 1:
      if ((millis() - count) >= TS_PERIOD) {
        count = millis();
        ts_read();
        ts_output_serial();
        ts_conv();
      }
    case 2:
      if ((millis() - count) >= TS_PERIOD) {
        count = millis();
        ts_read();
        ts_diag();
        ts_conv();
      }
  }
}
d.styler ©:
zcom ©:

Рекомендую ознакомится.

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

:) Все примеры в Инете для Ардуин (или почти все) используют референсный код из примеров к библиотеке. А там последовательный опрос каждого датчика с использование функции delay, что требует использования прерываний для создания видимости многозадачности. Ну, не комп Ардуина, а однозадачный микроконтроллер. :) Эта статья показывает, как можно ускорить работу с датчиками. Можно, конечно, даташит прочитать, шину изучить и самому написать (в принципе, это правильный путь, но долгий в данном случае). Рад, что у вас изначально правильно сделано.