1 (2017-07-05 15:26:19 отредактировано Андрей М)

Тема: Настраиваемый термометр на Arduino

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

Для сборки устройства потребуется практически любой из доступных *duino, в моем случае это был nano, к нему резистор 4,7k для подключения ds18b20, сами датчики в количестве 3-х штук, экран -2004,1602 или любой другой. Опционально - датчик давления BMP180. Еще будет нужна кнопка. Еще неплохо-бы разъемы и прочее - но на первый раз будет достаточно и простой макетной платы.

Итого у нас имеется четыре датчика и кнопка, их нужно подключить. Я постарался остаться в схеме предложенной в вышеупомянутой теме.

Начнем с DS18B20 - их три и подключаются они параллельно. Если смотреть на надпись - ноги слева направо = земля-данные-+питания. Землю подключаем к GND *duino, питание к +5v и среднюю ногу (данные) к выходу микросхемы D10.
далее, ногу D10 резистором подтягиваем к +5в (фото выложу завтра) - 1 резистор на все 3 датчика, подключенных параллельно. Намертво датчики не запаиваем, может понадобиться их поочередное подключение.

Проще всего с кнопкой - если возникают ложные (лишние) срабатывания последовательно с ней ставим резистор на 1к и керамический конденсатор. Один провод от кнопки подключается к выводу *duino D2, второй на GND. Кнопка нормально разомкнута.

Последние два устройства - экран и датчик давления BMP180 подключаются по протоколу I2C. Тоже параллельно. 4 провода - VCC к +5в,GND, SDA - A4, SCL -A5. Ножки на датчике и экране подписаны - не ошибетесь. В документации на BMP180 упоминается, что он должен питаться от 3.3в, но у меня он работает от 5 и не греется.

Далее скетч. Самое интересное. Ставим среду arduino и настраиваем на наше устройство (тип *duino и порт COM3-4-5-6...) Дополнительно нужно доставить библиотеки OneWire, SparkFun BMP180 и LiquidCrystal I2C. Они все стандартные и устанавливаются в среду без проблем.

скетч в посте №3
https://yadi.sk/d/fk7DSvLZ3KFx58 <- нужные библиотеки

Копируем, вставляем - собираем - загружаем. Загрузка завершена - нажимаем волшебные ctrl+shift+m и видим терминал. Убедитесь, что скорость выбрана правильно 115200.
Если все у вас прошло гладко - то вы увидите надписи и в терминале и на экранчике.

alcodistillers.ru
Read config
ROM =1 28 FF 88 8 A1 16 4 DB
ROM =2 28 FF 9D 55 A1 16 5 6E
ROM =3 28 FF 3 7D B3 16 4 4C
BMP180 init success
1 0.00 0.00 0.00  
----------
Tn=00.00 Tk=00.00
To= 0
P=  0.0 Tc=49.2
----------
Tn=00.00 Tk=00.00
To= 0
P=736.7 Tc=77.2
----------
Tn=00.00 Tk=00.00
To= 0
P=736.7 Tc=77.2
----------
Tn=00.00 Tk=00.00
To= 0
P=736.7 Tc=77.2
----------
Tn=00.00 Tk=00.00
To= 0
P=736.7 Tc=77.2
----------
Tn=21.18 Tk=21.50
To=21
P=736.7 Tc=77.2
----------
Tn=21.18 Tk=21.50
To=21
P=736.7 Tc=77.2
----------
Tn=21.18 Tk=21.50
To=21
P=736.7 Tc=77.2

Теперь немного про настройки. У нас есть три датчика ds18. Они находятся на одной шине и различаются только адресами, которые на корпусе не написаны. Это может привести к определенным затруднениям, если, допустим датчики уже подписаны или имеют разные гильзы для установки в разные места. Еще неприятная ситуация возникает, когда один из датчиков пропадает и оставшиеся вполне могут поменяться местами или что-то типа того. Эта проблема решается обучением нашего устройства.

При загрузке устройство выучивает до трех датчиков и сохраняет их в долговременную память. После запоминания датчики уже не будут прыгать или подменять друг друга.
Но как расставить их по местам? При загрузке зажимаем кнопку на половину секунды. Эта операция обнуляет сохраненный список датчиков и позволяет провести обучение заново.
1. Отключаем все датчики кроме Тпар и выключаем устройство.
2. Зажимаем кнопку и включаем устройство. Датчик будет виден в терминале или на экране
3. выключаем устройство, подключаем датчик Тсередина и не зажимая кнопки включаем. Ждем несколько секунд.
4. повторяем п.3 для Тохл

Теперь немаловажный момент. Эта программа написана таким образом, что не вывешивается длительными ожиданиями при опросе датчиков, что позволило использовать округление из трех опросов температуры для каждого DS18. Во время ожидания готовности температуры программа занимается опросом других датчиков или выводом. Цикл тройного опроса датчиков составляет около 2,5 секунд, что вполне допустимо для наших задач. Зачем нужно округление? Хочется немного убрать дискретность из вывода. скачки-переходы на графиках особенно раздражают.

К сожалению, времени свободного появилось немного - попозже дополню функционалом.

UPD: 5/7/17: версия 2.2 - с контролем отбора в т.ч. и с перистальтическим дозатором.
Настраиваемый термометр на Arduino

2

Re: Настраиваемый термометр на Arduino



3 (2017-06-19 14:50:15 отредактировано Андрей М)

Re: Настраиваемый термометр на Arduino

#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <OneWire.h>
#include <SFE_BMP180.h>
#include <Wire.h>

//#define SOLID_GRAPH // если нравятся "залитые" графики, раскоментируйте

#define MAGIC "alcodistillers.ru"
#define MAX_DS18 3
#define AVERAGING_COUNT 3

#define PIN_DS18 10
#define PIN_BUTTON 2
#define PIN_SDA 5   // useless on *duino
#define PIN_SCL 4

OneWire  *ds;  // on pin 10 (a 4.7K resistor is necessary)
SFE_BMP180 pressure;
LiquidCrystal_I2C lcd(0x27, 20, 4);

#define VAL_COUNT 5*8
float t[VAL_COUNT];
uint16_t tpos = 0;
#define P(x)   Serial.print(x)
#define PL(x)   Serial.println(x)

struct ds18ScratchPad_struct {
  union {
    uint8_t bytes[9];
    struct {
      uint8_t tempLsb, tempMsb, alarmHiTemp, alarmLoTemp, config,
              internalByte, countRemain, countPerC, crc;
    } regs;
  };
};
typedef struct ds18ScratchPad_struct ds18ScratchPad_t;

struct ds18DeviceRom_struct {
  union {
    uint8_t bytes[8];
    struct {
      uint8_t family, serial[6], crc;
    } regs;
    uint64_t dword;
    uint32_t u32[2];
  };
};
typedef struct ds18DeviceRom_struct ds18DeviceRom_t;

typedef struct {
  ds18DeviceRom_t addr;
  float aTemp[AVERAGING_COUNT];
  float cTemp;
  uint8_t aCount;
  uint8_t errorCount;
} ds18;

ds18 ds18s[MAX_DS18];
double bmp180Temp = 0, bmp180Pressure = 0;
uint8_t hasBmp180 = 0;

uint32_t nextLcdUpdate = 0;
//

#define abs(a) (a>0?a:-a)
void graph( float temp) {
  int16_t i;
  float tmin, tmax, tmin0;
  t[tpos++] = tmin = tmax = temp;
  tpos %= VAL_COUNT;
  for (i = 0; i < VAL_COUNT; i++) {
    if (t[i] == INT16_MAX) continue;
    if (tmin > t[i]) tmin = t[i];
    if (tmax < t[i]) tmax = t[i];
  }
  float tdiv = (tmax - tmin) / 8;
  if (tdiv < 0.0625) { //1/16 temp step && 8 steps per line
    tdiv = 0.0625;
    tmin0 = (tmax + tmin) / 2 - 0.0625 * 3;
  } else {
    tmin0 = tmin;
  }

  uint8_t c[8];
  uint8_t y, x, py = 100;
  P("+++++ Temp:"); P(temp); P(" tpos="); P(tpos); P(" min="); P(tmin); P(" max="); P(tmax); P(" div="); PL(tdiv);
  int p;
  for (i = 0; i < VAL_COUNT; i++) {
    p = (i + (int)tpos);// % VAL_COUNT;
    p %= VAL_COUNT;
    if (i % 5 == 0) {
      memset(c, 0, sizeof(c));
    }
    if (t[p] < INT16_MAX) {
      x = 1 << (4 - i % 5);
      y = (uint8_t)((t[p] - tmin0) / tdiv) + 1;
      if (y > 8) y = 8;
#ifdef SOLID_GRAPH
      for (int y1 = 8 - y; y1 < 8; y1++)
        c[y1] |= x;
#else
      //      P(p); P(" "); P(t[p]); P(" "); P(x); P(" "); P(y); P(" "); P(py); PL(";");
      if (py > 8  || py == y) {
        if (y) c[8 - y] |= x;
      } else if (py > y) {
        for (int y1 = y; y1 < py; y1++)
          c[8 - y1] |= x;
      } else {
        for (int y1 = py + 1; y1 <= y; y1++)
          c[8 - y1] |= x;
      }
      py = y;
#endif
    }
    if (i % 5 == 4)
      lcd.createChar(i / 5, c);
  }

  char str[21];
  snprintf(str, 21, "%2d.%02d \010\011\012\013\014\015\016\017 %2d.%02d", (int)tmin , (int)(tmin * 100) % 100,
           (int) tmax , (int)(tmax * 100) % 100);
  lcd.setCursor(0, 3);
  lcd.print(str);
}

//
int readConfig() {
  char t[sizeof(MAGIC)];
  EEPROM.get(0, t);
  Serial.println("Read config");
  if (memcmp(MAGIC, t, sizeof(MAGIC))) {
    Serial.println("no magic");
    resetConfig();
    return 0;
  }
  for (int i = 0; i < MAX_DS18; i++)
    EEPROM.get(sizeof(MAGIC) + i * sizeof(ds18DeviceRom_t),  ds18s[i].addr.bytes);
}

int saveConfig() {
  Serial.println("Save Config");
  EEPROM.put(0, MAGIC);
  for (int i = 0; i < MAX_DS18; i++) {
    EEPROM.put(sizeof(MAGIC) + i * sizeof(ds18DeviceRom_t), ds18s[i].addr.bytes);
  }
}

int resetConfig() {
  Serial.println("Reset config");
  memset (ds18s, 0, sizeof(ds18s));
  saveConfig();
}

int dumpConfig() {
  int i, i1;
  for (i1 = 0; i1 < MAX_DS18; i1++) {
    Serial.print("ROM =");
    Serial.print(i1 + 1);
    for ( i = 0; i < 8; i++) {
      Serial.write(' ');
      Serial.print(ds18s[i1].addr.bytes[i], HEX);
    }
    Serial.println();
  }
}

int scanDs18() {
  int i, empty, saveFlag = 0;
  ds18DeviceRom_t addr, addr_zero;
  memset(&addr_zero, 0, sizeof(ds18DeviceRom_t));
  ds->reset_search();
  while ( ds->search((void*)&addr.bytes)) {
    empty = -1;
    for (i = 0; i < MAX_DS18; i++) {
      if (!memcmp(&ds18s[i].addr, &addr, sizeof(ds18DeviceRom_t))) {
        break;
      }
      if (empty == -1 && !memcmp(&ds18s[i].addr, &addr_zero, sizeof(ds18DeviceRom_t))) {
        empty = i;
      }
    }
    if (i == MAX_DS18) {
      if (empty >= 0) {
        memcpy(&ds18s[empty].addr, &addr, sizeof(ds18DeviceRom_t));
        saveFlag = 1;
      } else {
        Serial.println("Unable to save new ds18, manual reset needed");
      }
    }
  }
  if (saveFlag) {
    saveConfig();
  }
}

uint8_t bak[] = {219, 191, 165, 143, 122, 102, 85, 69, 53, 39, 25, 12};
uint16_t par[] = {689, 667, 641, 613, 579, 536, 490, 436, 368, 295, 207, 108};

float getParVolPercent(int temp) {
  if (temp >= 100 || temp < 88) return 0;
  temp -= 88;
  return ((float)par[temp]) / 10;
}

float getBakVolPercent(int temp) {
  if (temp >= 100 || temp < 88) return 0;
  temp -= 88;
  return ((float)bak[temp]) / 10;
}

void setup(void) {
  Serial.begin(115200);
  Serial.println(MAGIC);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print(">>>>>>>>>  <<<<<<<<<");
  lcd.setCursor(2, 1);
  lcd.print(MAGIC);
  lcd.setCursor(3, 2);
  lcd.print("samogon powered!");

  pinMode(PIN_BUTTON, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(PIN_DS18, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  ds = new OneWire(PIN_DS18);
  if (!digitalRead(PIN_BUTTON)) {
    if (!digitalRead(PIN_BUTTON))
    {
      lcd.clear();
      lcd.setCursor(0, 3);
      lcd.print("reset ds18b20 config");

      Serial.println("Reset");
      resetConfig();
    }
  }

  readConfig();
  scanDs18();
  dumpConfig();

  // Wire.pins(PIN_SDA, PIN_SCL);
  if (pressure.begin()) {
    Serial.println("BMP180 init success");
    hasBmp180 = 1;
  } else  {
    Serial.println("BMP180 init fail\n\n");
  }
  for (int i = 0; i < VAL_COUNT; i++) {
    t[i] = INT16_MAX;
  }
  float q = 77;
  for (int i = 0; i < 50; i++) {
    q += 0.125 * (1 - random(0, 3));
    graph(q);
    delay(50);
  }
  lcd.clear();
  for (int i = 0; i < VAL_COUNT; i++) {
    t[i] = INT16_MAX;
  }
}

// coRoutines
#define crBegin switch(crStaticVar) { case 0:
#define crReturn(x) do { crStaticVar=__LINE__; return x ; case __LINE__:; } while (0)
#define crFinish }

#define MIN_POLL_DELAY 40 //ms

#ifdef crStaticVar
#undef crStaticVar
#endif

#define crStaticVar _dsStatus
int _dsStatus = 0;
int dsCnt;
int readTemp() {
  ds18ScratchPad_t scp;
  crBegin;
  ds->reset();
  ds->skip();
  ds->write(0x44, 0);
  crReturn(750);        // time to calculate temp
  for (dsCnt = 0; dsCnt < MAX_DS18; dsCnt++) {
    ds->reset();
    ds->select((void*)&ds18s[dsCnt].addr.bytes);
    ds->write(0xBE);         // Read Scratchpad
    for (int i = 0; i < 9; i++) {           // we need 9 bytes
      scp.bytes[i] = ds->read();
    }
    if (OneWire::crc8((void*)&scp.bytes, 8) != scp.regs.crc) {
      if (ds18s[dsCnt].errorCount < 10)
        ds18s[dsCnt].errorCount++;
      else
        ds18s[dsCnt].cTemp = 0;
      Serial.print("Error!!!!");
    } else {
      ds18s[dsCnt].errorCount = 0;
      int TReading, SignBit;
      float temp = 11.11;

      TReading = (scp.regs.tempMsb << 8) + scp.regs.tempLsb;
      SignBit = TReading & 0x8000;  // test most sig bit

      if (SignBit) // negative
        TReading = (TReading ^ 0xffff) + 1; // 2's comp
      temp = 1.0 * (SignBit ? (-TReading) : TReading) / 16;
      ds18s[dsCnt].aTemp[ds18s[dsCnt].aCount++] = temp;
      if (ds18s[dsCnt].aCount == AVERAGING_COUNT) {
        ds18s[dsCnt].aCount = 0;
        temp = 0;

        for (int i = 0; i < AVERAGING_COUNT; i++) {
          temp += ds18s[dsCnt].aTemp[i];
        }
        ds18s[dsCnt].cTemp = temp / AVERAGING_COUNT;
      }
    }
    crReturn(MIN_POLL_DELAY);
  }
  crFinish;
  crStaticVar = 0;
  nextLcdUpdate = 0;
  return MIN_POLL_DELAY;
}
#ifdef crStaticVar
#undef crStaticVar
#endif

#define crStaticVar _bmp180Status
int _bmp180Status = 0;

int readPressure() {
  if (!hasBmp180)
    return 5000;
  crBegin
  pressure.startTemperature();
  crReturn(MIN_POLL_DELAY);
  pressure.getTemperature(bmp180Temp);
  crReturn(MIN_POLL_DELAY);
  pressure.startPressure(3);
  crReturn(MIN_POLL_DELAY);
  pressure.getPressure(bmp180Pressure, bmp180Temp);
  bmp180Pressure /= 1.333;

  crFinish;
  crStaticVar = 0;
  nextLcdUpdate = 0;
  return 2000;
}

int dumpTemp() {
  if (ds18s[0].cTemp > 0)
    graph(ds18s[0].cTemp);
  return 5000;
}
int pos = 0;
int updateLcd() {
  char str[21];//,f1[6],f2[6],f3[6];
  if (nextLcdUpdate < millis()) {
    Serial.println("----------");

    // строка 1
    snprintf(str, 21, "n:%02d.%02d o:%2d   ", (int)ds18s[0].cTemp, (int)(ds18s[0].cTemp * 100) % 100,
             (int)ds18s[2].cTemp);
    lcd.setCursor(0, 0);
    lcd.print(str);
    Serial.println(str);

    // строка 2
    float   pt = (78.91 - (780 - bmp180Pressure ) * 0.038);
    //    strcpy(str,"To=55 P=777.7 Tc=77.7f");
    if (hasBmp180) {
      snprintf(str, 21, "k:%02d.%02d c:%2d.%1d/%3d.%1d      ", (int)ds18s[1].cTemp, (int)(ds18s[1].cTemp * 100) % 100,
               (int)pt, (int)(pt * 10) % 10, (int)bmp180Pressure, (int)(bmp180Pressure * 10) % 10);
    } else {
      snprintf(str, 21, "o:%2d                        ", (int)ds18s[2].cTemp);
    }
    lcd.setCursor(0, 1);
    lcd.print(str);
    Serial.println(str);

    // строка 3
    if (ds18s[0].cTemp > 88 || ds18s[1].cTemp > 88) { // дистилляция
      int vpp = getParVolPercent(ds18s[0].cTemp) * 10;
      int vpb = getBakVolPercent(ds18s[1].cTemp) * 10;
      snprintf(str, 20, "%par=%2d.%1d %bak=%2d.%1d          ", vpp / 10, vpp % 10, vpb / 10, vpb % 10);
    } else {
      memset(str, ' ', 20);
      str[20] = '\0';
    }
    lcd.setCursor(0, 2);
    lcd.print(str);
    Serial.println(str);

    // строка 4 - графики
    nextLcdUpdate = millis() + 2000;
  }
  return 200;
}

uint32_t prev_time = 0;

enum {POLL_DS, POLL_BMP, POLL_DUMP, POLL_LCD, POLL_END};
#define MAX_POLL_MS 10000
uint32_t polls[POLL_END] = {0};
void loop(void) {
  uint32_t timems = millis();
  uint32_t minms = timems + MAX_POLL_MS;
  uint32_t x;
  for (int i = 0; i < POLL_END; i++) {
    if (polls[i] < timems) {
      switch (i) {
        case POLL_DS:
          x = readTemp();
          break;
        case POLL_DUMP:
          x = dumpTemp();
          break;
        case POLL_BMP:
          x = readPressure();
          break;
        case POLL_LCD:
          //          x = dumpTemp();
          x = updateLcd();
          break;

      }
      polls[i] = timems + x;
    } else {
    }
    if (minms > polls[i] ) {
      minms = polls[i];
    }

  }
  delay(minms - timems);
}

4 (2017-06-18 11:19:03 отредактировано Андрей М)

Re: Настраиваемый термометр на Arduino

Обновил.
+добавил расчет "крепости" по температуре при производстве СС. Не слишком точный, но полезный. Тпар ставим на пар, Тсередина на куб.
+ Единичные ошибки считывания температуры не влияют на процесс.
+ не работающий датчик отображается  "0.00"
+ добавил историю с графиком за последние 200 секунд. С графиком. На 2004 LCD

5

Re: Настраиваемый термометр на Arduino

Ого... А я пока ещё не прошивал даже прежнюю версию :(. По части медицины форс-мажор случился. Пока не дошли руки...

6 (2017-06-18 11:41:59 отредактировано Андрей М)

Re: Настраиваемый термометр на Arduino

SLOG ©:

Ого... А я пока ещё не прошивал даже прежнюю версию :(. По части медицины форс-мажор случился. Пока не дошли руки...

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

7

Re: Настраиваемый термометр на Arduino


Легенда:
1 строка -- Тп = температура пара/верхний датчик  Тк= температура колонны/бака
2 строка -- То - температура охлаждения Тс - температура кипения спирта/атм.давление
3 строка -- расчетные параметры режима. Пока там выводится расчет крепости для диапазона температур 88-100*
4 строка -- минимальное значение температуры за 200 секунд/ график / максимальное значение.

Минимальный шаг графика 1/16 градуса. По графику хорошо понятна динамика изменения температуры

8

Re: Настраиваемый термометр на Arduino

Я дико извиняюсь, но всё-таки спрошу: может поменять местами To и Тк? Не будет так проще сравнивать? Т.е. расположить вывод температур так же как и на царге и сравнивать удобней - не надо взглядом метаться по экрану. ИМХО естественно - в принципе и так отлично :)

9

Re: Настраиваемый термометр на Arduino

SLOG ©:

Я дико извиняюсь, но всё-таки спрошу: может поменять местами To и Тк? Не будет так проще сравнивать? Т.е. расположить вывод температур так же как и на царге и сравнивать удобней - не надо взглядом метаться по экрану. ИМХО естественно - в принципе и так отлично :)

На "большом" самогинаторе так и сделано. Вот думаю, насколько нужна динамика по "среднему" датчику.

Так пойдет?

10 (2017-06-19 22:18:47 отредактировано SLOG)

Re: Настраиваемый термометр на Arduino

Андрей М ©:

Так пойдет?

Так просто супер! Ещё раз спасибо! А какой версией IDE прошивать?

Андрей М ©:

Вот думаю, насколько нужна динамика по "среднему" датчику.

С динамикой наглядней, да и выглядит занятно - как эквалайзер на Hi-Fi :)

11 (2017-06-20 09:17:04 отредактировано )

Re: Настраиваемый термометр на Arduino

SLOG ©:

Так просто супер! Ещё раз спасибо! А какой версией IDE прошивать?

1.8.0 - 100% 1.8.1 генерит предупреждения по типам, но все равно нормально собирает

SLOG ©:
Андрей М ©:

Вот думаю, насколько нужна динамика по "среднему" датчику.

С динамикой наглядней, да и выглядит занятно - как эквалайзер на Hi-Fi :)

Есть ограничение по графике в 8 знакомест. Т.е. динамика середины должна как-то цифрами отображаться.


SLOG, 1.8.3 собралось и прошилось нормально

12

Re: Настраиваемый термометр на Arduino

Андрей М,  а нет в планах добавить пищалку и сделать аларм хотя бы на один датчик, желательно на датчик ⅔ колонны...

И идиотский вопрос - внешнее питание на ардуину, что люди используют? Отдельно заказывать или от смарта/планшета подойдет? А то у меня двухамперников для планшетов как у дурака фантиков...

13

Re: Настраиваемый термометр на Arduino

Иван ©:

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

Винокурня Аркадия
---
До седин я у жизни хожу в подмастерьях,
Все еще не зачислен в разряд мастеров... (c)

14

Re: Настраиваемый термометр на Arduino

Аркадий ©:
Иван ©:

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

Иван ©:

Для первого раза рекомендую покупать Mini и лучше прямо с проводом, так по почти все ваши провода не подойдут (от зарядок не подходят)

15

Re: Настраиваемый термометр на Arduino

valera, для прошивки не подходят многие провода, а для питания- любой от зарядки.

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

16

Re: Настраиваемый термометр на Arduino

Иван, ясно, спасибо.

17

Re: Настраиваемый термометр на Arduino

valera, даже если провод полный (на все контакты) он частенько выполнен дешевым способом. Хороший провод обычно короче, в среднем 30-50см, имеет экранировку, а совсем хороший вообще оплетку как у коаксиального кабеля.  У меня из 5 проводов нормально шьет только один!  И вот так я однажды попал в дурацкую ситуацию, когда ругался с технической поддержкой навигаторов, у меня обновления шились с ошибками... поменял провод чисто случайно и все прошилось с первого раза :)

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

18

Re: Настраиваемый термометр на Arduino

valera ©:

Андрей М,  а нет в планах добавить пищалку и сделать аларм хотя бы на один датчик, желательно на датчик ⅔ колонны...

Запчасти кое-какие подошли, понемногу буду доделывать.

Иван ©:

valera, для прошивки не подходят многие провода, а для питания- любой от зарядки.

Кабель лучше брать не от китайского прибора, зарядка >1A. Если нет такого кабеля - покупай усб-папу и паяй отдельный кабель на питание, минуя миниусб (на плате отдельный пин есть).
Мнение, что "кабель не подходит для программирования" - не верно, зачастую на платах стоят разъемы, которые сгнили еще при изготовлении. Все дело в качестве, электроника вообще наука о контактах. Если "не шьется" - бери другой кабель. Обычно очень неплохие миниусб кабели на носимых винтах.

19

Re: Настраиваемый термометр на Arduino

valera ©:

внешнее питание на ардуину, что люди используют?

Любой блок питания на постоянный выход от 5 до 12 В. По току смотря, что запитывать.

Алкоголь не помогает найти ответ,
он помогает забыть вопрос!

20

Re: Настраиваемый термометр на Arduino

Спасибо за ответы, шнуров полно разных, и мини и микро, и от внешних hdd и от андроид приставки к тв. И блоки питания на 2 А честных. Просто особо не вникал в тему ардуины, подумалось мож там заковыка какая то есть, оказалось нет.

Как автор сделает в своем термометре управление реле по температуре любого датчика, то это будет самая простая штука, для автоматизации ректификации.