Этот двухразрядный светодиодный термометр автор изготовил в качестве подарка на день рождения сыну друга. Ему всего два года, и цифры он уже читает, а буквы — нет. Теперь он может узнавать температуру за окном самостоятельно. Датчиком в термометре служит микросхема DS18B20, работающая по протоколу 1-Wire, а микроконтроллер применён типа ATtiny84. Плата — квадратная со стороной в 25 мм, по размерам она сравнима с монетой в 50 пенсов. Автор планирует поместить плату во влагозащищённый корпус и разместить за окном. Индикация включается кратковременно раз в 24 секунды, и батарейки CR2032 хватает примерно на год.
Термометр работает в диапазоне от -19 до +99 °C. При необходимости в старшем разряде одновременно отображаются минус и единица. При выходе за пределы диапазона отображаются буквы Lo или Hi. Можно «научить» устройство отображать температуры ниже -19 °C, задействовав в качестве минуса сегмент с точкой.

По такой схеме устройство было предварительно собрано на макетке:



Задействованы все выводы микроконтроллера, использован встроенный тактовый генератор на 8 МГц. Протитип получился таким:



В прототипе применены DS18B20 в корпусе TO-92, ATtiny84 в корпусе PDIP и 3,6-дюймовый индикатор 3621AS. Затем автор разработал плату в Eagle и заказал её в PCBway. Здесь микроконтроллер уже в корпусе SOIC, датчик — в корпусе µSOP, а резисторы, конденсаторы и дисплей — типоразмера 0805. Всё, кроме дисплея, впаяно феном Youyue 858D+ при температуре в 250°C.

Как на прототипе, так и на печатной плате применены индикаторы с общим анодом. Устройство изготовлено в двух вариантах, с индикаторами красного и жёлтого цветов. Красный — на КДПВ, жёлтый — вот:



С обратной стороны впаян держатель для 20-миллиметрового литиевого элемента (любого с обозначением, начинающимся на 20, т.е., 2016, 2025 или 2032):



Прошивка написана таким образом, чтобы микроконтроллер большую часть времени находился в спящем режиме и просыпался по прерыванию от сторожевого таймера. В реализации интерфейса 1-Wire задействована эта наработка того же автора. Времязадающим является 16-битный таймер-счётчик микроконтроллера, работающий на частоте в 1 МГц:

void OneWireSetup () {
  TCCR1A = 0<<WGM10;                   // Normal mode
  TCCR1B = 0<<WGM12 | 2<<CS10;         // Normal mode, divide clock by 8
}

Подпрограмма DelayMicros() обеспечивает задержку в заданное число микросекунд, опираясь на регистр сравнения выхода OCR0A:

void DelayMicros (unsigned int micro) {
  TCNT1 = 0; TIFR1 = 1<<OCF1A;
  OCR1A = micro;
  while ((TIFR1 & 1<<OCF1A) == 0);
}

Подпрограмма DisplayTemperature() считывает значение температуры из датчика и отображает его. Поскольку датчик на шине всего один, на серийный номер можно не обращать внимание, и просто подать команду Skip ROM, после чего все последующие команды поступают на любое устройство:

void DisplayTemperature () {
  cli();                                  // No interrupts
  if (OneWireReset() != 0) {
    sei();
    DisplayError(0);                      // Device not found
  } else {
    OneWireWrite(SkipROM);
    OneWireWrite(ConvertT);
    while (OneWireRead() != 0xFF);
    OneWireReset();
    OneWireWrite(SkipROM);
    OneWireWrite(ReadScratchpad);
    OneWireReadBytes(9);
    sei();                                // Interrupts
    if (OneWireCRC(9) == 0) {
      int temp = DataWords[0];
      Display((temp+8)>>4);               // Round to nearest degree
    } else DisplayError(1);               // CRC error
  }
}

В ответ на запрос датчик возвращает значение температуры в виде 16-битного целого числа со знаком в единицах, равных 1/16 градуса. Число округляется до ближайшего целого градуса и отображается вызовом подпрограммы Display().

Подпрограмма DisplayError() отображает ошибки взаимодействия микроконтроллера с датчиком по шине 1-Wire:

void DisplayError (int no) {
  Buffer[0] = Error;
  Buffer[1] = no;
}

E0 — датчик не обнаружен, E1 — ошибка CRC.

Данные для динамической индикации берутся из массива Buffer[]. Например, чтобы отобразить число 20, надо выполнить:

Buffer[0]=2; Buffer[1]=0;

Таймер-счётчик 0 генерирует прерывания на частоте в 125 Гц, чего достаточно для устранения мерцания. Вначале таймер сконфигурирован в setup()"

TCCR0A = 2<<WGM00;                      // CTC mode; count up to OCR0A
  TCCR0B = 0<<WGM02 | 4<<CS00;            // Divide by 256
  OCR0A = 250-1;                          // Compare match at 125Hz
  TIMSK0 = 0;                             // Interrupts initially off

Процедура обработки прерывания совпадения при сравнении вызывает подпрограмму DisplayNextDigit() и затем считает в обратном направлении:

ISR(TIM0_COMPA_vect) {
  DisplayNextDigit();
  Ticks--;
}

Подпрограмма DisplayNextDigit() считывает данные из соответствующей ячейки массива Buffer[] и включает нужные сегменты в соответствующем разряде дисплея. Программа использует #define для выбора между индикатором с общим катодом или анодом. Если при подаче питания светятся сразу все сегменты, значит, тип дисплея не соответствует заданному в прошивке. Для общего катода подпрограмму надо заменить на такую:

void DisplayNextDigit () {
  PORTB = PORTB | 1<<digit;                    // Turn old digit off
  digit = digit ^ 1;                           // Toggle between 0 and 1
  char segs = charArray[Buffer[digit]];
  PORTA = segs;                                // Lit segments high
  PORTB = PORTB & ~(1<<digit);                 // Turn new digit on
}

Наконец, подпрограмма Display() вырабатывает двухзначное число для записи в массив Buffer[]:

void Display (int n) {
  int units = n % 10;
  int tens = n / 10;
  int temp0 = tens;
  int temp1 = abs(units);
  if (tens < -1) {temp0 = Lo; temp1 = Lo+1; }
  else if (tens > 9) {temp0 = Hi; temp1 = Hi+1; }
  else if (tens == -1) temp0 = Minus1;
  else if ((tens == 0) && (units >= 0)) temp0 = Blank;
  else if ((tens == 0) && (units < 0)) temp0 = Minus;
  Buffer[0] = temp0;
  Buffer[1] = temp1;
}

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

Для максимально возможного энергосбережения отключены АЦП, тактовые генераторы интерфейса USI и АЦП, и разрешён спящий режим PWR_DOWN:

  ADCSRA &= ~(1<<ADEN);                   // Disable ADC to save power
  PRR = 1<<PRUSI | 1<<PRADC;              // Turn off clocks to USI & ADC to save power
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

Основная программа отображает температуру в течение десятых долей секунды, затем включает спящий режим. Оказалось, что это минимальная продолжительность индикации, удобная для считывания. За две секунды до отображения температуры кратковременно мигает точка:

void loop () {
  Buffer[0] = DP; Buffer[1] = Blank;
  DisplayOn(12);
  WDDelay(6);                              // Sleep for 1 second
  Buffer[0] = Blank; Buffer[1] = DP;
  DisplayOn(12);
  WDDelay(6);                              // Sleep for 1 second
  DisplayTemperature();
  DisplayOn(12);
  WDDelay(9);                              // Sleep for 8 seconds
  WDDelay(9);                              // Sleep for 16 seconds
  WDDelay(9);                              // Sleep for 24 seconds
}

Дисплей остаётся выключенным на 24 секунды за счёт трёх вызовов сторожевого таймера по 8 секунд каждый. При работающем индикаторе потребляемый ток составляет 6,6 мА, в спящем режиме — 4,7 мкА, средний потребляемый ток равен 1/240 * 6,6 мА. Типичная ёмкость элемента CR2032 равна 225 мАч, поэтому хватит его на (225/6.6) x 240 / 24 = 340 дней — чуть меньше года.

Температурные диапазоны компонентов следующие: микроконтроллера и индикатора — от -40 до +85°C, резисторов и конденсатора — от -55 до +125 °C, батарейки — от -20 до +70 °C. Элемент с расширенным температурным диапазоном BR2032 будет работать в диапазоне от -30 до +85 °C.

Микроконтроллер сделан Arduino-совместимым при помощи этой разработки Spence Konde. В IDE надо выбрать пункт ATtiny24/44/84 в разделе ATTinyCore меню Board. Затем надо выставить следующие опции, не обращая внимания на остальные:

Chip: "ATtiny84"
Clock: "8 MHz (internal)"
B.O.D: "B.O.D. Disabled"
Pin Mapping: "Clockwise (like damellis core)"

Программа залита при помощи приспособления Pomona test clip, размещённого поверх микроконтроллера и подключённого к программатору SparkFun Tiny AVR Programmer. Вначале надо выбрать Burn Bootloader, затем — Upload.

Ссылки: полный текст программы, плата и программа на GitHub, плата на OSHpark.

Комментарии (78)


  1. FDA847
    31.05.2019 07:15

    Супер! Хорошая, аккуратная плата!


  1. Ghost_nsk
    31.05.2019 08:43

    В Attiny84 есть встроенный термодатчик, пару деталей можно было выкинуть.


    1. ragesteel
      31.05.2019 08:54

      Точняк, выкинуть внешний термодатчик и на освободившийся вывод посадить третий разряд индикатора!


      1. olartamonov
        31.05.2019 09:10

        Нет. Но третий разряд всё равно можно — в тиньках RST же совмещён с GPIO, т.е. вообще-то есть ещё одна нога неиспользуемая.


    1. olartamonov
      31.05.2019 09:06

      Typically, the measurement accuracy after a single temperature calibration is ±10°C,assuming calibration at room temperature. Better accuracies are achieved by using two temperature points for calibration


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


      1. Ghost_nsk
        31.05.2019 10:21

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


        1. FDA847
          31.05.2019 13:00

          Именно! Требуется индивидуальная калибровка каждого экземпляра. Мы как-то использовали встроенные датчики, но МК был другой — PIC18F66K40. Хотя внутри датчик там такой же, и калибровка его аналогичная. Но для упрощения калибровали по одной точке. В серии получили разброс порядка 5 C. Для того проекта за глаза хватало, но, если есть возможность, лучше всё таки использовать внешние датчики. Есть недорогой вариант — LM75. Стоит дешевле DS128B20, опрашивается по шине I2C. Очень простой датчик.


          1. Ghost_nsk
            31.05.2019 13:19

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


            1. FDA847
              31.05.2019 15:53

              Там корпус SOIC-8. Обвязка 1 резистор на SDA (на SCL необязательно, т.к. тут всего одна простая микросхема) и одна керамика на 0.1 мкФ по питанию. Там и опять же тут от разводки зависит. Если датчик ближе к процу поставить, то хватит одного кондёра на двоих. Зато вообще калибровать не надо. Стоимость датчика даже в Чип и Дипе 50 руб. всего.
              Есть ещё аналоговые датчики типа MCP9700A. Корпус SOT-23. Нужна всего одна линия МК, но аналоговая. Зато из обвязки только кондёр по питанию!


            1. cyberly
              31.05.2019 18:35
              +1

              Ну, у DS18B20 погрешность 0,5 градуса. Если калибровать что-то по градуснику из тех, которые обычно бывают под рукой (типичная погрешность, ЕМНИП, около 1 градуса), результат в любом случае будет хуже. Особенно если честно учесть всякие там погрешности снятия измерений с этого градусника.


        1. olartamonov
          31.05.2019 15:07

          Даже не трогая удобства калибровки по двум точкам каждого устройства, хорошо там всё равно не будет. В полном диапазоне уличных температур я бы сильно лучше чем ±5 °С по краям диапазона особо не ожидал бы.

          Если стоит задача сэкономить — полно аналоговых датчиков, обеспечивающих точность масштаба ±1° без дополнительной калибровки. STLM20 там какой-нибудь. 

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

          Если же нужна лишняя ножка — она тут и так есть.


    1. Polaris99
      31.05.2019 13:16

      Плюсую, с такой точностью внешний термодатчик и не нужен, тем более однопроводной с нехилым временем вычитывания данных. Плюс выкинуть нахрен светодиодный индикатор и взять элементарный ЖК. Если он от батарейки год тянет, то так будет тянуть три года. А включение на десятые доли секунды раз в 24 секунды — это вообще за гранью, таких оптимизаторов убивать нужно на месте.


      1. eabrega
        31.05.2019 15:01

        del


        1. Polaris99
          31.05.2019 15:10

          Только одного меня смущает, что нужно полминуты стоять перед пустым экранчиком и ждать, чтобы там на десятую долю секунды что-то мелькнуло?


          1. iig
            31.05.2019 15:30

            Только одного меня смущает

            Да ;)
            Это киллер-фича. Нигде больше такого нет. Круче — разве только отображать температуру двоичным кодом на светодиодах. А чтобы не заморачиваться с отображением отрицательных температур — использовать шкалу Фаренгейта.


      1. virtualsys
        01.06.2019 00:37

        Простите, но ЖК не работает при отрицательных температурах. Он же за окном. Другое дело что и батарейка тоже не очень работает при -30.


        1. Tomasina
          01.06.2019 08:35

          Прекрасно работает. Уже который год за окном висит китайский термометр, который представляет собой ЖК дисплей размером 7х7 см.
          Да, при ниже -20 скорость прорисовки замедляется (это видно) и символы становятся не темно-серыми, а светло-серыми, но показания по прежнему считываются с нескольких метров.


          1. virtualsys
            01.06.2019 17:17
            +1

            Есть, конечно, что и при -40 по паспорту работают, в термометр вероятно поставили что-то подобное. А есть у которых от 0 градусов диапазон (например 1602), хотя, вероятно, тоже что-то покажут. Но для «за окном» за этим надо следить, плюс еще и подсветку организовывать… Так что вряд ли альтернатива в виде дешевого ЖК предпочтительнее дешевого светодиодного, с учетом всего.


  1. savostin
    31.05.2019 08:49

    Не понял как отображается отрицательная температура.
    И я бы (себе) добавил десятые градуса…


    1. olartamonov
      31.05.2019 09:06

      Сектором g минус рисуется

      Поэтому и -19 минимум


      1. savostin
        31.05.2019 09:14

        Ага, в Англии при таких морозах жизнь полностью остановится.


      1. Spircaran
        31.05.2019 10:05

        Мне кажется, что в указании знака температуры ниже -9 и выше +9 не нуждаются.


  1. ragesteel
    31.05.2019 08:51

    Пайка аккуратная, феном паялось? Осталось только места пайки лаком покрыть.

    А почему у вас переходные отверстия не под маской?

    Не хватает только фотографии «на боевом посту».


    1. GennPen
      31.05.2019 09:24

      Такой достаточно плотный монтаж SMD компонентов почти невозможно паяльником паять, извратиться конечно можно, но феном это горааздо легче паяется.


      1. holomen
        31.05.2019 13:49

        Это совсем не плотный монтаж, и паяльником такое паяется без проблем вообще. Единственное место где _может_показаться_ не очень удобным — это сначала запаять С1, а потом DS. И то, места там предостаточно чтобы подлезть. Но конечно лучше сначала запаять DS и потом С1.


      1. cyberly
        31.05.2019 18:47
        +1

        SMD паяльником очень просто паяется, если припой не левый какой-нибудь и температура жала правильная. Облуженным жалом провести по выводам микросхемы — и все. Выпаивать — да, тоскливо…


    1. 404
      31.05.2019 09:40

      Паялось феном Youyue 858D+. Но это перевод, так что остальные вопросы останутся без ответа.


  1. psinetron
    31.05.2019 09:54

    Подскажите, индикация раз в 24 секунды, а отображение как реализовано? Постоянно горит?


    1. Serge78rus
      31.05.2019 10:24

      Нет:

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


      1. psinetron
        31.05.2019 10:42

        Ну так вот, как часто включается отображение?


        1. Nikita_64
          31.05.2019 10:56

          раз в 24 секунды? (3х8 сек. — столько спит микроконтроллер)


          1. psinetron
            31.05.2019 11:06

            Вот именно поэтому я и задался таким вопросом. Насколько это комфортно. в такой большой промежуток времени отображение моргнуть разочек.


            1. Nikita_64
              31.05.2019 11:56

              Мне было бы некомфортно и 10 секунд. Может быть, причина в том, что это — подарок 2-х летнему ребенку, который все внимательно рассматривает и никуда не торопится?


              1. olartamonov
                31.05.2019 15:11

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


  1. AnthonyDS
    31.05.2019 09:55

    В какой программе плату делали? Было бы интересно почитать поподробнее о том как делали, заказывали.


    1. igrushkin
      31.05.2019 11:16

      очень рекомедую Kicad и Jlcpcb


  1. screep123
    31.05.2019 10:05

    У DS18B20 минимальное напряжение питания — 3в. Т.е. год оно никак не проработает. Нужно ставить что-то вроде TMP112 в качестве температурного датчика.


  1. Yuriy_krd
    31.05.2019 10:05

    Реализация отличная, очень понравилась идея с таймером засыпания, но! Как быть с минусовыми температурами? Может, стоило бы взять 4-х-символьный дисплей и отображать минус и десятичную часть? Или, как вариант, поставить какой-нибудь SMD-светодиод (синий, например), который бы включался и индицировал, что показания следует читать как «такая-то температура, но ниже нуля». И как Вы калибровали датчик? или он сам по себе достаточно точный?


    1. Tomasina
      31.05.2019 11:27

      Особого смысла в третьем индикаторе нет — это уличный датчик, поэтому даже в условиях российского климата ты всегда знаешь: выше +19 или ниже -19 температура за окном. А знак в диапазоне до -19 эта штука показывает.
      А батарею дополнительный знак отжирать будет.

      Тут больше другое неудобство — приходится ждать 24 сек чтобы узнать температуру.
      Я бы на заднюю поверхность корпуса налепил солнечную панель для уменьшения времени «неотображения данных» при сохранении того же времени работы, но, думаю, при таких габаритах от нее толку не будет.


  1. SignallerK
    31.05.2019 10:45
    +1

    И опять один резистор на все сегменты, оно ж светит не равномерно из-за этого при отображении разных цифр.


    1. Yuriy_krd
      31.05.2019 10:59

      Из-за того, что одно и то же значение тока подается на разное количество сегментов?


    1. Tomasina
      31.05.2019 11:28

      Давно уже пофиг — при динамической индикации единовременно светится всегда только один сегмент (ячейка индикатора), т.е. дополнительные резисторы лишние.


      1. u_235
        31.05.2019 12:03

        На такую динамическую индикацию (посегментную а не поразрядную) мало кто заморачивается. Пять резисторов того не стоят.


        1. Tomasina
          31.05.2019 12:59

          Выгода не в стоимости резисторов, а длительности работы от батареи.
          При максимальном заполнении индикатора (28 градусов) при классической индикации потребление составляет 12 х 7 мА = 84 мА, а при динамической индикации потребление составляет 2 х 7 мА = 14 мА, т.е. в 6 раз меньше.


          1. iig
            31.05.2019 13:21

            в 6 раз меньше


            Голос из толпы: «А что с яркостью то?»


            1. Tomasina
              31.05.2019 13:26

              Если позволяет батарея — увеличить ток до +20% от номинала индикатора (сегмент все равно 1/7 времени всегда выключен), остальное зависит от программиста.


              1. iig
                31.05.2019 13:40

                остальное зависит от программиста


                Меньше ток через светодиод — меньше яркость. Хочется больше яркости — нужно больше миллиампер. Что программист может противопоставить закону сохранения энергии?


                1. Tomasina
                  31.05.2019 13:49
                  -1

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


      1. Polaris99
        31.05.2019 13:41

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

        void DisplayNextDigit () {
        #if defined(commoncathode)
          PORTB = PORTB | 1<<digit;               // Turn old digit off
          digit = digit ^ 1;                      // Toggle between 0 and 1
          char segs = charArray[Buffer[digit]];
          PORTA = segs;                           // Lit segments high
          PORTB = PORTB & ~(1<<digit);            // Turn new digit on
        #else
          PORTB = PORTB & ~(1<<digit);            // Turn old digit off
          digit = digit ^ 1;                      // Toggle between 0 and 1
          char segs = charArray[Buffer[digit]];
          PORTA = ~segs;                          // Lit segments low
          PORTB = PORTB | 1<<digit;               // Turn new digit on
        #endif
        }

        Так что то еще говно этот проект. Наверное, поэтому для фото и выбрал комбинацию цифр с одинаковым количеством включенных сегментов.


        1. Tomasina
          31.05.2019 13:51
          -1

          Софт всегда можно оптимизировать, это бесплатно, в отличие от железа.
          В части разводки платы я б тоже внес изменения, чтобы сделать еще компактнее.


          1. Polaris99
            31.05.2019 14:12

            Ага, посегментно выводить — то еще удовольствие в этом проекте будет, согласен. А главное — зачем? Для создания очередного датчика температуры с дебильной логикой работы?


          1. olartamonov
            31.05.2019 15:13

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


        1. iig
          31.05.2019 13:52

          то еще говно этот проект


          Совершенно лишнее было ковырять так глубоко ;). На этапе постановки задачи (уменьшать потребление энергожрущего индикатора путем периодического выключения) — уже понятно, что ничего хорошего не может получиться.


          1. Polaris99
            31.05.2019 14:14

            Ну это исключительно для того, чтобы разбавить возникший тут слаженный хор восхищенных адептов, которым и светодиодный индикатор в LowPower проекте — вполне себе комильфо. Кстати, ничего плохого в выключении индикатора для экономии не вижу, если подходить к этому с умом. Например, как тут уже предлагали — путем добавления датчика движения. Тот же мелкий TFT на базе ST7735 жрет в режиме сна при отключенной подсветке около 1 мкА, что вполне нормально, как я считаю. Причем возвращается из этого режима в активный без потери содержимого экрана, так что это не банальное отключение от питания.


            1. iig
              31.05.2019 20:57
              +1

              Термометр с датчиком движения… ъУъ… Challenge! :)


      1. SignallerK
        31.05.2019 13:56
        +1

        По моему вы ошибаетесь, посмотрите еще раз на функцию DisplayNextDigit ().
        Там автор как раз берет значение цифры и выводит на порт, а потом уже включает общий катод ( PORTB = PORTB & ~(1<<digit);).
        То есть динамическая индикация в данном примере работает именно так, как и реализовано в большинстве часов: на короткий момент зажигается первая цифра индикатора, затем вторая (потом процесс повторяется). Но из-за медлительности нашего зрения мы это не замечаем. То есть перебирают общие выводы, а не сегменты.
        Теперь касательно того, почему не стоит экономить 7 резисторов. Как известно, светодиод прибор токовый, то есть его яркость зависит от тока пропускаемого через него. А вот падение напряжения на каждом конкретном диоде хоть и принимается ~1.8 вольта (для красных светодиодов), в реальности отличается от экземпляра к экземпляру. А так-как эта характеристика нелинейная, то сегменты получаются неравномерно засвеченными, если использовать общий резистор.
        Более того, если бы не батарейное питание, то для того что бы при динамической индикации цифры не казались тусклыми, ток обычно даже увеличивают (для чего в ДШ на индикатор даже есть параметр Ipeak).


        1. Tomasina
          31.05.2019 14:10

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


    1. tw1911
      31.05.2019 12:03

      Честно говоря, 7 сегментный индикаторы это вообще еще та забава. Я долго воевал с динамической индикацией, что бы было четко и якро.


  1. iig
    31.05.2019 11:11

    LED индикатор в малопотребляющее устройство? Юксюморон же. Почему не взять LCD или EINK?


    1. psinetron
      31.05.2019 11:16

      Наверное дело в цене


      1. iig
        31.05.2019 11:36

        Нуу… Когда это самодельщика останавливала цена комплектующих?
        Если вопрос цены важен — готовый спиртовой термометр по всем параметрам лучше.
        1. Практически вечный.
        2. Показывает температуру постоянно.
        3. Экологически чистый. Если его, например, сдуру сожрет собака — ей это ничем не грозит (литиевая пуговица внутрь — это очень опасно. Детей к устройствам с литиевыми батареями подпускать нельзя!).

        Или если нужно с цифрами:
        image

        $8. Уверен, что самоделка из статьи обошлась не дешевле.


        1. psinetron
          31.05.2019 11:52

          Ну, если я не ошибаюсь самый простенький e-lnk обойдется в 1000 рублей. К сожалению не дешево. И если я не ошибаюсь, то такая цена обусловлена патентом на такой тип экранов.
          А вот другой момент — как я понял термометр будет располагаться на улице. Интересно как долго на самом деле он там проживет, если учесть что у нас бывают существенные минусовые температуры


          1. iig
            31.05.2019 12:06

            LCD дешевле, например.

            термометр будет располагаться на улице.


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


          1. alex323
            31.05.2019 12:56

            Зачем e-ink? Обычный ЖК стоит копейки и отлично работает на морозе. Правда, переключаться будет медленно-медленно, но в таком устройстве это не критично.


    1. Tomasina
      31.05.2019 11:30
      +1

      Видно издалека.
      И хоть я и фанат E-ink, но само свечение LED-индикаторов мне приятнее.


  1. we1
    31.05.2019 11:49

    Кажется к таким устройствам хорошо подходит ИК-сенсор приближения: чтобы отображение температуры включалось, когда к нему подходят. Кажется, есть даже датчики, которые сами генерируют сигнал ИК-светодиода и подают на ногу питание, если фотодиод поймает нужную последовательность, то есть даже микроконтроллер для этого задействовать не нужно.


    1. jaiprakash
      31.05.2019 11:53

      А ИК-сенсор не кушает ли? Это ж придётся всё время его держать включённым.


      1. we1
        01.06.2019 07:58

        Конечно, сколько-нибудь должен съесть. Но, я бы в таком случае какой-нибудь Li-Ion аккумулятор поставил был (есть куча типоразмеров цилиндрических элементов, которые легко заряжать), либо хорошую 9-вольтовую батарейку, если о морозах думать.


        1. olartamonov
          01.06.2019 08:32

          Для морозов ставят либо пару LiFeS2, либо одну LiSOCl2.

          И не столько ради формальной морозостойкости самой по себе (CR2032 тоже бывают от -30 °С), сколько ради сочетания морозостойкости и нагрузочной способности — для CR2032 и при комнатной 10 мА уже предельный ток разряда, они вообще на < 1 мА рассчитаны.


    1. Blaine_Mono
      31.05.2019 22:39
      +1

      Можно поступить проще, в устройство поставить геркон, внутри дома на окно повесить неодимовый магнит (главное поместить его в большой корпус).
      Хочет ребенок увидеть температуру — подносит этот самый магнит к устройству.


      1. holomen
        31.05.2019 23:37
        +1

        Бздынь! И окна нет. Дети — они такие…


  1. Tachyon
    31.05.2019 12:02

    Этот двухразрядный светодиодный термометр автор изготовил в качестве подарка на день рождения сыну друга. Ему всего два года, и цифры он уже читает, а буквы — нет. Теперь он может узнавать температуру за окном самостоятельно. Датчиком в термометре служит микросхема DS18B20, работающая по протоколу 1-Wire, а микроконтроллер применён типа ATtiny84. Плата — квадратная со стороной в 25 мм,

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


    1. mlu
      31.05.2019 12:31
      +1

      Не хочу показаться ''яжматерью'' но помоему размеры подарка позволяют маленькому ребёнку если не проглотить его, то уж точно пожевать…


      Если ребёнок окажется по ту сторону окна (устройство ведь будет за окном), то размеры Вас будут волновать в последнюю очередь.


      1. Tomasina
        31.05.2019 13:28

        Подарок, который нельзя потрогать — это издевательство над ребёнком.


        1. olartamonov
          31.05.2019 15:37

          И который выключается на полминуты, как только ребёнок начал его разглядывать (двухлетние дети читают цифры… не очень быстро и не очень уверенно).


  1. Polaris99
    31.05.2019 13:34

    Вообще расчет потребления вызывает большие вопросы. Глянул код, не стал уже проверять настройки таймера, верю автору на слово, пусть пауза будет реально 100 мс (12 тиков с частотой 125 Гц).
    Но в том же коде видно, что контролер выходит из сна минимум 3 раза за цикл (два раза, чтобы мигнуть точкой и раз, чтобы показать температуру — 3 х DisplayOn(12)). Учитывая, что при этом в состоянии сна он находится 26 секунд за цикл (1 + 1 + 24), получаем скважность не 240, как он там посчитал, а 260/3 = 87. На самом деле еще хуже, потому что несколько мс занимает вычитывание медленного 1-wire датчика, что автор спокойно проигнорил, так что не удивлюсь, если скважность окажется вообще в районе 80, то есть, в три раза хуже.
    Ну и благополучный игнор при расчете тока в режиме сна, учитывая, что разница всего на три порядка, а скважность составляет почти те же три порядка — это только добавляет вишенку на тортик.
    В итоге получим время работы от CR2032:
    225 / (1/80 * 6.6 + 79/80 * 0.0047) / 24 = 109 дней.
    И это без учета всяких там накладных расходов.
    Сравнить — «почти год» и 109 дней.
    Ардуино и его адепты в действии!


    1. Serge78rus
      31.05.2019 16:11

      Ардуино и его адепты в действии!
      Здесь все-таки не тот случай. Истинные «джедаи Ардуино» не работают напрямую с регистрами, а используют так полюбившиеся им digitalRead() и digitalWrite() и их нисколько не смущает несколько десятков тактов на вывод одного бита.


      1. iig
        01.06.2019 22:41

        Можно подумать, наличие digitalRead() в этом проекте чего-то непоправимо испортило бы