Двухразрядный термометр

Автор оригинала: David Johnson-Davies
  • Перевод
  • Tutorial


Этот двухразрядный светодиодный термометр автор изготовил в качестве подарка на день рождения сыну друга. Ему всего два года, и цифры он уже читает, а буквы — нет. Теперь он может узнавать температуру за окном самостоятельно. Датчиком в термометре служит микросхема 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.
Поддержать автора
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

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

    +1
    Супер! Хорошая, аккуратная плата!
      +6
      В Attiny84 есть встроенный термодатчик, пару деталей можно было выкинуть.
        +2
        Точняк, выкинуть внешний термодатчик и на освободившийся вывод посадить третий разряд индикатора!
          +2
          Нет. Но третий разряд всё равно можно — в тиньках RST же совмещён с GPIO, т.е. вообще-то есть ещё одна нога неиспользуемая.
          +2
          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
            Датчик точный, шкала не откалибрована. Калибруйте по двум точкам и будет все хорошо. Так с любыми измерительными приборами, нормальная практика, а то как в магазине будет, из пяти термометров четыре разное показывают.
              0
              Именно! Требуется индивидуальная калибровка каждого экземпляра. Мы как-то использовали встроенные датчики, но МК был другой — PIC18F66K40. Хотя внутри датчик там такой же, и калибровка его аналогичная. Но для упрощения калибровали по одной точке. В серии получили разброс порядка 5 C. Для того проекта за глаза хватало, но, если есть возможность, лучше всё таки использовать внешние датчики. Есть недорогой вариант — LM75. Стоит дешевле DS128B20, опрашивается по шине I2C. Очень простой датчик.
                +1
                Ну чем лучше то? Дополнительный корпус, дополнительная обвязка, под это надо разводить дополнительно плату, потом дополнительно монтировать и все это будет дополнительно кушать батарейку.
                Для поточного производства калибровка каждого устройство конечно накладывает возможно даже большие затраты. Но дома для DIY, померить в комнате, сравнить с градусником, померить в холодильнике, сравнить, вычислить коэффициенты, залить прошивку и готово, делов минут на пять.
                  +2
                  Там корпус SOIC-8. Обвязка 1 резистор на SDA (на SCL необязательно, т.к. тут всего одна простая микросхема) и одна керамика на 0.1 мкФ по питанию. Там и опять же тут от разводки зависит. Если датчик ближе к процу поставить, то хватит одного кондёра на двоих. Зато вообще калибровать не надо. Стоимость датчика даже в Чип и Дипе 50 руб. всего.
                  Есть ещё аналоговые датчики типа MCP9700A. Корпус SOT-23. Нужна всего одна линия МК, но аналоговая. Зато из обвязки только кондёр по питанию!
                    +1
                    Ну, у DS18B20 погрешность 0,5 градуса. Если калибровать что-то по градуснику из тех, которые обычно бывают под рукой (типичная погрешность, ЕМНИП, около 1 градуса), результат в любом случае будет хуже. Особенно если честно учесть всякие там погрешности снятия измерений с этого градусника.
                  +1
                  Даже не трогая удобства калибровки по двум точкам каждого устройства, хорошо там всё равно не будет. В полном диапазоне уличных температур я бы сильно лучше чем ±5 °С по краям диапазона особо не ожидал бы.

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

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

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

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

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

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

                    Поэтому и -19 минимум
                      +1
                      Ага, в Англии при таких морозах жизнь полностью остановится.
                        +4
                        Мне кажется, что в указании знака температуры ниже -9 и выше +9 не нуждаются.
                      +1
                      Пайка аккуратная, феном паялось? Осталось только места пайки лаком покрыть.

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

                      Не хватает только фотографии «на боевом посту».
                        0
                        Такой достаточно плотный монтаж SMD компонентов почти невозможно паяльником паять, извратиться конечно можно, но феном это горааздо легче паяется.
                          +3
                          Это совсем не плотный монтаж, и паяльником такое паяется без проблем вообще. Единственное место где _может_показаться_ не очень удобным — это сначала запаять С1, а потом DS. И то, места там предостаточно чтобы подлезть. Но конечно лучше сначала запаять DS и потом С1.
                            +1
                            SMD паяльником очень просто паяется, если припой не левый какой-нибудь и температура жала правильная. Облуженным жалом провести по выводам микросхемы — и все. Выпаивать — да, тоскливо…
                            +1
                            Паялось феном Youyue 858D+. Но это перевод, так что остальные вопросы останутся без ответа.
                            +1
                            Подскажите, индикация раз в 24 секунды, а отображение как реализовано? Постоянно горит?
                              +1
                              Нет:
                              Основная программа отображает температуру в течение десятых долей секунды, затем включает спящий режим. Оказалось, что это минимальная продолжительность индикации, удобная для считывания. За две секунды до отображения температуры кратковременно мигает точка
                                +1
                                Ну так вот, как часто включается отображение?
                                  +1
                                  раз в 24 секунды? (3х8 сек. — столько спит микроконтроллер)
                                    +1
                                    Вот именно поэтому я и задался таким вопросом. Насколько это комфортно. в такой большой промежуток времени отображение моргнуть разочек.
                                      +1
                                      Мне было бы некомфортно и 10 секунд. Может быть, причина в том, что это — подарок 2-х летнему ребенку, который все внимательно рассматривает и никуда не торопится?
                                        +2
                                        Двухлетний ребёнок закатит эпический скандал, как только поймёт, что лампочки сами гаснут до того, как он успел их рассмотреть, и долго не зажигаются.
                              +1
                              В какой программе плату делали? Было бы интересно почитать поподробнее о том как делали, заказывали.
                                +1
                                очень рекомедую Kicad и Jlcpcb
                                +3
                                У DS18B20 минимальное напряжение питания — 3в. Т.е. год оно никак не проработает. Нужно ставить что-то вроде TMP112 в качестве температурного датчика.
                                  +1
                                  Реализация отличная, очень понравилась идея с таймером засыпания, но! Как быть с минусовыми температурами? Может, стоило бы взять 4-х-символьный дисплей и отображать минус и десятичную часть? Или, как вариант, поставить какой-нибудь SMD-светодиод (синий, например), который бы включался и индицировал, что показания следует читать как «такая-то температура, но ниже нуля». И как Вы калибровали датчик? или он сам по себе достаточно точный?
                                    +1
                                    Особого смысла в третьем индикаторе нет — это уличный датчик, поэтому даже в условиях российского климата ты всегда знаешь: выше +19 или ниже -19 температура за окном. А знак в диапазоне до -19 эта штука показывает.
                                    А батарею дополнительный знак отжирать будет.

                                    Тут больше другое неудобство — приходится ждать 24 сек чтобы узнать температуру.
                                    Я бы на заднюю поверхность корпуса налепил солнечную панель для уменьшения времени «неотображения данных» при сохранении того же времени работы, но, думаю, при таких габаритах от нее толку не будет.
                                    +5
                                    И опять один резистор на все сегменты, оно ж светит не равномерно из-за этого при отображении разных цифр.
                                      +1
                                      Из-за того, что одно и то же значение тока подается на разное количество сегментов?
                                        +1
                                        Давно уже пофиг — при динамической индикации единовременно светится всегда только один сегмент (ячейка индикатора), т.е. дополнительные резисторы лишние.
                                          +1

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

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


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

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

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


                                                  Меньше ток через светодиод — меньше яркость. Хочется больше яркости — нужно больше миллиампер. Что программист может противопоставить закону сохранения энергии?
                                                    0
                                                    Даже при идеальной схемотехнике яркость можно программно запороть неудачным сочетанием длительностей свечения-несвечения.
                                            +1
                                            Угу, только у него в коде динамическая индикация все-таки поразрядная:
                                            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
                                            }

                                            Так что то еще говно этот проект. Наверное, поэтому для фото и выбрал комбинацию цифр с одинаковым количеством включенных сегментов.
                                              0
                                              Софт всегда можно оптимизировать, это бесплатно, в отличие от железа.
                                              В части разводки платы я б тоже внес изменения, чтобы сделать еще компактнее.
                                                +1
                                                Ага, посегментно выводить — то еще удовольствие в этом проекте будет, согласен. А главное — зачем? Для создания очередного датчика температуры с дебильной логикой работы?
                                                  +1
                                                  Ну то есть как обычно с проектами с хакадея — все отлично, только софт и железо надо переделать.
                                                  +2
                                                  то еще говно этот проект


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

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

                                                  +2
                                                  По моему вы ошибаетесь, посмотрите еще раз на функцию DisplayNextDigit ().
                                                  Там автор как раз берет значение цифры и выводит на порт, а потом уже включает общий катод ( PORTB = PORTB & ~(1<<digit);).
                                                  То есть динамическая индикация в данном примере работает именно так, как и реализовано в большинстве часов: на короткий момент зажигается первая цифра индикатора, затем вторая (потом процесс повторяется). Но из-за медлительности нашего зрения мы это не замечаем. То есть перебирают общие выводы, а не сегменты.
                                                  Теперь касательно того, почему не стоит экономить 7 резисторов. Как известно, светодиод прибор токовый, то есть его яркость зависит от тока пропускаемого через него. А вот падение напряжения на каждом конкретном диоде хоть и принимается ~1.8 вольта (для красных светодиодов), в реальности отличается от экземпляра к экземпляру. А так-как эта характеристика нелинейная, то сегменты получаются неравномерно засвеченными, если использовать общий резистор.
                                                  Более того, если бы не батарейное питание, то для того что бы при динамической индикации цифры не казались тусклыми, ток обычно даже увеличивают (для чего в ДШ на индикатор даже есть параметр Ipeak).
                                                    +1
                                                    Хм, поциферная динамическая индикация это идея. Надо будет как-нибудь поиграться.
                                                    Конечно, в этом случае не стоит пренебрегать резисторами.
                                                  +1
                                                  Честно говоря, 7 сегментный индикаторы это вообще еще та забава. Я долго воевал с динамической индикацией, что бы было четко и якро.
                                                  +2
                                                  LED индикатор в малопотребляющее устройство? Юксюморон же. Почему не взять LCD или EINK?
                                                    +1
                                                    Наверное дело в цене
                                                      +1
                                                      Нуу… Когда это самодельщика останавливала цена комплектующих?
                                                      Если вопрос цены важен — готовый спиртовой термометр по всем параметрам лучше.
                                                      1. Практически вечный.
                                                      2. Показывает температуру постоянно.
                                                      3. Экологически чистый. Если его, например, сдуру сожрет собака — ей это ничем не грозит (литиевая пуговица внутрь — это очень опасно. Детей к устройствам с литиевыми батареями подпускать нельзя!).

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

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

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

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

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


                                                          Тем более нет смысла в подобном изделии. На улице датчик, индикатор где удобно. Упсь, опять получается метестанция.
                                                            +1
                                                            Зачем e-ink? Обычный ЖК стоит копейки и отлично работает на морозе. Правда, переключаться будет медленно-медленно, но в таком устройстве это не критично.
                                                        +4
                                                        Видно издалека.
                                                        И хоть я и фанат E-ink, но само свечение LED-индикаторов мне приятнее.
                                                        0
                                                        Кажется к таким устройствам хорошо подходит ИК-сенсор приближения: чтобы отображение температуры включалось, когда к нему подходят. Кажется, есть даже датчики, которые сами генерируют сигнал ИК-светодиода и подают на ногу питание, если фотодиод поймает нужную последовательность, то есть даже микроконтроллер для этого задействовать не нужно.
                                                          +1
                                                          А ИК-сенсор не кушает ли? Это ж придётся всё время его держать включённым.
                                                            0
                                                            Конечно, сколько-нибудь должен съесть. Но, я бы в таком случае какой-нибудь Li-Ion аккумулятор поставил был (есть куча типоразмеров цилиндрических элементов, которые легко заряжать), либо хорошую 9-вольтовую батарейку, если о морозах думать.
                                                              0
                                                              Для морозов ставят либо пару LiFeS2, либо одну LiSOCl2.

                                                              И не столько ради формальной морозостойкости самой по себе (CR2032 тоже бывают от -30 °С), сколько ради сочетания морозостойкости и нагрузочной способности — для CR2032 и при комнатной 10 мА уже предельный ток разряда, они вообще на < 1 мА рассчитаны.
                                                            +1
                                                            Можно поступить проще, в устройство поставить геркон, внутри дома на окно повесить неодимовый магнит (главное поместить его в большой корпус).
                                                            Хочет ребенок увидеть температуру — подносит этот самый магнит к устройству.
                                                              +1
                                                              Бздынь! И окна нет. Дети — они такие…
                                                            +1
                                                            Этот двухразрядный светодиодный термометр автор изготовил в качестве подарка на день рождения сыну друга. Ему всего два года, и цифры он уже читает, а буквы — нет. Теперь он может узнавать температуру за окном самостоятельно. Датчиком в термометре служит микросхема DS18B20, работающая по протоколу 1-Wire, а микроконтроллер применён типа ATtiny84. Плата — квадратная со стороной в 25 мм,

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


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

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

                                                                  +1
                                                                  И который выключается на полминуты, как только ребёнок начал его разглядывать (двухлетние дети читают цифры… не очень быстро и не очень уверенно).
                                                              +2
                                                              Вообще расчет потребления вызывает большие вопросы. Глянул код, не стал уже проверять настройки таймера, верю автору на слово, пусть пауза будет реально 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
                                                                Ардуино и его адепты в действии!
                                                                Здесь все-таки не тот случай. Истинные «джедаи Ардуино» не работают напрямую с регистрами, а используют так полюбившиеся им digitalRead() и digitalWrite() и их нисколько не смущает несколько десятков тактов на вывод одного бита.
                                                                  +1

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

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

                                                              Самое читаемое