Как сделать термометр на ардуино с дисплеем

Обновлено: 07.07.2024

Узнайте, как использовать RF модуль 433 МГц совместно с ATMega328P-PU. В данной статье мы соберем схему из датчика DHT11 и радиочастотного передатчика. А также соберем приемное устройство с радиоприемником 433 МГц и LCD дисплеем.

Что нам потребуется

  • компьютер с установленной Arduino IDE (я использую версию 1.6.5);
  • библиотека VirtualWire (ссылка ниже); ;
  • ATMega328P;
  • программатор AVR MKII ISP; ; ; ; ; ;
  • компоненты из перечня элементов, приведенного ниже.

Введение

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

Модуль передатчика 433 МГц, когда не передает данные, всё равно излучает радиочастотные колебания и передает шум. Он также может создавать помехи другим радиочастотным устройствам. Чтобы не допустить этого, я включаю его, когда необходимо передать данные, и выключаю его, когда передача закончена.

Аппаратная часть

Нам необходимы две структурные схемы. Одна для передающего устройства, вторая для приемного.

Передатчик

Передающая часть беспроводного термометра

  • способ прошивки микроконтроллера → ISP;
  • датчик для измерения температуры и влажности → DHT11;
  • микроконтроллер для обработки данных → ATMega32p;
  • способ беспроводной передачи данных → радиочастотный модуль 433 МГц.

Приемник

Приемная часть беспроводного термометра на Arduino

  • способ приема радиосигнала → радиочастотный модуль 433 МГц;
  • способ обработки принятых данных → Arduino Mega;
  • способ отображения температуры и влажности → 16x2 LCD.

Принципиальные схемы

Передатчик

Передающая часть беспроводного термометра на ATmega328 и Arduino

Передающая часть беспроводного термометра на ATMega328p
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)

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

Приемник

Приемная часть беспроводного термометра на Arduino Mega

Приемная часть беспроводного термометра на Arduino Mega
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)

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

Перечень элементов

Передатчик

Перечень элементов передающей части беспроводного термометра на ATMega328p и Arduino Mega

Перечень элементов передающей части беспроводного термометра на ATMega328p
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)

Приемник

Перечень элементов приемной части беспроводного термометра на Arduino Mega

Перечень элементов приемной части беспроводного термометра на Arduino Mega
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)

Программа

Программа передатчика

Сперва рассмотрим программу передающей части:

Программа приемника

Интересный способ использования библиотеки LiquidCrystal – это создание пользовательских символов. С помощью createChar я создал символ градусов. Таким же способом вы можете создать и свои собственные символы. Чтобы создать пользовательский символ или значок, вам необходимо объявить его, как массив из восьми байт, и «нарисовать», какие пиксели будут включены (1 – включен, 0 – выключен).

В функции setup() вы создаете его с помощью createChar . createChar принимает два аргумента: номер позиции для хранения символа и массив байт, в котором определено, какие пиксели будут отображаться. В нашем случае это lcd.createChar(1, degreesymbol) . Затем символ выводится на LCD с помощью функции lcd.write .

Заключение

В данной статье я использовал датчик температуры и влажности DHT11. Температура и влажность были преобразованы в массив символов, а затем переданы с помощью передатчика 433 МГц. На приемной стороне массив символов был разделен на пары и выведен на LCD. Для получения символа градусов я использовал функцию createChar библиотеки LiquidCrystal.

Загрузки

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

Фото и видео

Передатчик

Передающая часть беспроводного термометра на ATMega328p и Arduino

Передающая часть беспроводного термометра на ATMega328p

Приемник

Приемная часть беспроводного термометра на Arduino

Приемная часть беспроводного термометра на Arduino

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

Список деталей для эксперимента

Для дополнительного задания

Принципиальная схема

Схема на макетке

Обратите внимание

Термистор мы включили в известную нам схему делителя напряжения.

Скетч

Пояснения к коду

В этом эксперименте мы подключаем библиотеку math.h для того, чтобы использовать функцию взятия натурального логарифма x log(x) .

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

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

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

они могут принимать значения от -3.4028235×10 38 до 3.4028235×10 38 ,

при этом количество значащих цифр может быть 6-7: всех цифр, не только после запятой!

точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки, например, при использовании float в условном операторе. Не полагайтесь на точность!

вычисления с float происходят медленнее, чем с целыми числами

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

Вопросы для проверки себя

Как нужно подключить термистор, чтобы получать на Arduino данные о температуре?

Каким образом можно воспользоваться ранее разработанными функциями, не переписывая их в программный код?

Чем неудобно использование чисел с плавающей точкой на Arduino?

Что за выражение стоит справа от = при объявлении булевой переменной enableSegment ?

Задания для самостоятельного решения

Измените код программы таким образом, чтобы индикатор включался при 0 градусов и его показания прирастали на одно деление каждые 5 градусов.

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

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 4.0 International

конспект-arduino/комнатный-термометр.txt · Последние изменения: 2020/01/17 15:10 — mik

Термометры – это полезные устройства, которые используются человечеством уже долгое время. В этой статье мы спроектируем цифровой термометр на базе платы Arduino Uno и датчика температуры LM35, который будет измерять температуру окружающей среды в режиме реального времени и выводить ее значение на жидкокристаллический (ЖК) дисплей 16x2.

Цифровой термометр на Arduino и датчике температуры LM35: внешний вид

Данное устройство условно можно разделить на три модуля: первый измеряет температуру используя температурный датчик LM35, второй конвертирует измеренное значение температуры в привычную нам шкалу Цельсия (выполняется с помощью Arduino), а третий отображает это значение температуры на ЖК дисплее. Условно весь этот процесс можно представить в виде следующей диаграммы:

Диаграмма работы устройства

Все процессы на этой диаграмме проходят под контролем Arduino. Датчик температуры LM35 используется для измерения окружающей температуры и обеспечивает при изменении температуры на 1 градус изменение напряжения на 10 мВ на своем выходном контакте. Этот факт можно достаточно просто проверить с помощью вольтметра, подсоединив Vcc к pin 1, землю (Ground) к pin 3 и выходное напряжение к контакту pin 2 датчика LM35. К примеру, если напряжение на выходе датчика LM35 равно 250 мВ, то это означает, что температура окружающей среды примерно равна 25 градусам Цельсия.

Arduino считывает выходное напряжение датчика температуры со своего аналогового контакта A0 и выполняет вычисления, направленные на конвертацию этого аналогового значения напряжения в цифровое значение температуры. После проведения вычислений Arduino передает полученное значение температуры на ЖК дисплей 16x2.

Необходимые компоненты

Arduino

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

Внешний вид платы Arduino Uno

Датчик температуры LM35

LM35 (купить на AliExpress) представляет собой датчик температуры с 3 контактами, который обеспечивает изменение напряжения на своем выходе на 10 мВ при изменении температуры на 1 градус Цельсия. Верхний предел измерения температуры у него составляет около 150 градусов Цельсия. На 1-й контакт датчика подается питающее напряжение, 2-й контакт – выход датчика, а на 3-й подается земля.

Номер контакта Функция Обозначение
1 Питающее напряжение; 5V (+35V to -2V) Vcc
2 Выходное напряжение (+6V to -1V) Output
3 Земля (0V) Ground

Внешний вид датчика температуры LM35 и обозначение его контактов

ЖК дисплей

ЖК дисплеи 16x2 (купить на AliExpress) широко используются в различных проектах поскольку они дешевы, легко доступны, относительно небольшие по размеру и просты в подключении. ЖК дисплей 16x2 имеет 2 строки и 16 столбцов, что означает что он состоит из 16 блоков по 5x8 точек в каждом. Он имеет 16 контактов, из которых 8 контактов для передачи данных (D0-D7) и 3 контакта для управления, которые обозначаются как RS, RW and EN. Остальные контакты используются для подачи питания, контроля яркости и подсветки.

Внешний вид ЖК дисплея 16x2

Питание

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

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема цифрового термометра на Arduino и датчике температуры LM35

На представленной схеме ЖК дисплей 16x2 напрямую подсоединен к плате Arduino в 4-битном режиме. Контакты ЖК дисплея с обозначениями RS, EN, D4, D5, D6, D7 подсоединены к цифровым контактам Arduino 7, 6, 5, 4, 3, 2. Датчик температуры LM35 подсоединен к аналоговому контакту A0 платы Arduino.

Исходный код программы

Чтобы написать код программы для нашего цифрового термометра, мы должны написать код для Arduino, датчика температуры LM35 и ЖК дисплея 16x2. Сначала подключим библиотеку для ЖК дисплея, а затем определим контакты данных и управления для подключения ЖК дисплея и датчика температуры.

После получения аналогового значения напряжения на аналоговом входе A0 мы считываем это значение и сохраняем его в переменной с помощью команды float analog_value=analogRead(analog_pin) . После этого мы преобразуем его в цифровое значение температуры по следующей формуле:

float Temperature=analog_value*factor*100

где factor=5/1023, analog_value – аналоговое значение напряжение с выхода датчика температуры.

То есть получаем код вида:

Символ градуса формируем используя стандартный метод с помощью следующего кода:

Далее представлен полный исходный код программы нашего цифрового термометра.

Видео, демонстрирующее работу термометра

Похожие статьи

Комментарии

Комментарий перенес в указанную Вами статью.

Конвертацию уровней сделать самому проблематично. В программе строка,

if (level<230) level=level+26; //увеличиваем значение MCP41010 на 2 ступени

судя по комментарию, должна увеличить Level на 2 ступени, но увеличение происходит на 26 ступеней. 2 ступени резистора должны соответствовать 26 ступеням MCP41010, т.е. level должен равняться 2 при изменении MCP41010 на 26 ступеней, что и должно отображаться в мониторе порта, а отображается изменение на 26. Если в этой строке заменить 26 на 2, то это будет неверно. Значение level должно быть максимально 19 и изменение на 1 уровень должно изменять значение MCP41010 на 13, но выводиться как одна ступень. Нужно какое-то дополнительное преобразование 13 в 1 то ли переменной, то ли функцией. В этом проблема для меня.

Ну если ссылку на статью дадите где такой индикатор к Ардуино подключают, то могу попробовать сделать это для вас.
Про преобразование уровней вы меня что то совсем запутали, я даже и не знаю что вам еще предложить. Можно попробовать использовать функцию map, с ее помощью можно, к примеру, преобразовать диапазон 1-19 в диапазон 1-255 и наоборот, но не знаю, поможет вам это или нет. Ну или в сети вы не можете найти информацию по поводу того какая функция преобразования вам нужна?

Наверное, нужно всё-таки 1-19 в 1-255, т.к. от температуры меняются уровни - 1 уровень соответствует изменению 13 ступеней MCP41010.
Если 1-19 в 1-255 или 1-255 в 1-19 с помощью функции map, то будет соблюдаться регулировочное соотношение 13 к 1 или 1 к 13? Если да, то давайте попробуем.

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

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

Температура больше 27.5, но меньше 30 - ступени не уменьшаются - это потому что уровень и так уже уменьшился до 0. Ведь меньше 0 он быть не может? Я специально поставил условие чтобы так было. Или нужно как то по другому? Просто когда вы задержку увеличите до 3-х минут, возможно такой ситуации уже наблюдаться не будет, не?
По поводу шага изменения уровней вы меня что то уже совсем запутали. Ну если вам не подходит шаг 26, который сейчас в программе установлен, вы же можете изменить его на любой другой который вам подходит. Я вам могу этот шаг даже отдельной переменной сделать чтобы вам удобнее было его менять и экспериментировать с ним

Возможно при 3-х минутной задержке такого и не будет. Кстати, где в скетче эта задержка устанавливается? Можно попробовать охлаждать DS18B20.
Про шаг изменения уровней. Сделайте конвертацию 13 уровней в 1, чтобы в мониторе порта было не 26, а 2, как на резисторе в котле.

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

Скетч не с Вашего сайта. Как в Вашем скетче с датчиком BMP180 сделать целый поправочный коэффициент при считывание значения температуры с датчика?

То есть нужно установить еще предел температуры сверху, при достижении которого котел должен отключаться? Что в этом случае делать с уровнем потенциометра?
Если вы один раз в программе собираетесь использовать поправочный коэффициент на температуру, то можно это сделать как вы написали - times = bmp.readTemperature()-2;
Если в нескольких местах, то лучше завести отдельную переменную для хранения значения поправочного коэффициента - просто в этом случае если вы захотите его поменять, то это будет сделать гораздо проще

У Вас на сайте есть статья про двухканальный термостат, в котором задается две температуры, нижняя и верхняя. По аналогии с этим задаются пределы, к примеру 26,5 - 27,5 градусов. В этих пределах изменение уровня MCP41010 не происходит, т.е. этим пределам соответствует определенный уровень MCP41010, аналогия с выставленным уровнем резистора (у которого 19 ступеней) вручную в котле. Отличие только в том, что при выходе температуры за пределы, не нужно вручную устанавливать другой уровень резистора, это будет делать автоматически программа через MCP41010, но ступенчато, к примеру, изменением на две ступени резистора, которые соответствуют 26 уровням MCP41010, т.е. программа выдает не 26 уровней регулировки, а два, соответствующих 26 ступеням MCP41010, с периодической проверкой заданных пределов температуры. Если температура меньше заданных пределов, то прибавляются еще две ступени, соответствующие 26 ступеням MCP41010. Если температура по каким-либо причинам будет больше заданных пределов, то по две ступени вниз. При заданной максимальной температуре, к примеру 30 градусов, уровень MCP41010 делается нулевым.

Как завести отдельную переменную для хранения значения поправочного коэффициента?

Завести такую переменную не сложно, например, const int popravka = 2;
Ту статью про двухканальный термостат не я писал, а предыдущий админ сайта. Давайте я вам в программе тогда сделаю два уровня: 26,5 и 27,5 градусов, и 30 градусов верхний предел. Все эти уровни сделаю отдельными переменными, поэтому вы сами потом сможете их легко менять. Так подойдет?

Отдельная переменная для хранения значения поправочного коэффициента нужна для другого скетча с BMP280.

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

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

Знаки больше и меньше не отобразились, поэтому весь абзац с заменой их словами.
Для начала такой алгоритм: при "первоначальном" включении котла MCP41010 на минимуме и с помощью реле его минимум (50 Ом) шунтируется на 0, задается температура для DS18B20 кнопками () в пределах +25 - 28 градусов (нужен индикатор), например +27 (гистерезис плюс минус 0.5 градуса), далее шунтирующее реле отключается и начинается изменение сопротивления MCP41010 по 2 ступени, которые соответствуют перерассчитанным уровням резистора котла и сравнение с заданной температурой, через 3 минуты к примеру, если меньше +27, то происходит увеличение на две ступени до достижения соответствия заданной температуре. Если больше +27, то происходит уменьшение на две ступени до достижения соответствия заданной температуре вплоть до минимума сопротивления MCP41010 и включения шунтирующего реле для отключения контура отопления.

MCP41010 будет вместо переменного сопротивления в плате управления котла. Поэтому приведен перерасчет уровней. Включение в режиме потенциометра.
Переменным резистором с 19 уровнями управления устанавливается температурный режим контура отопления, который управляется датчиком от нагрева воды в котле: при достижении определенной температуры на датчике нагрев отключается, при снижении температуры - включается, и так циклически; чем на больший уровень выставлен резистор, тем дольше нагрев. Установка ручная. Также в котле есть возможность подключения внешнего термостата, но он будет производить регулировку в зависимости от установленного уровня переменного резистора, который устанавливается вручную. Поэтому подумалось об автоматике.
О соответствии уровней MCP41010 определенной температуре сказать не могу.
Для начала такой алгоритм: при "первоначальном" включении котла MCP41010 на минимуме и с помощью реле его минимум (50 Ом) шунтируется на 0, задается температура для DS18B20 кнопками () в пределах +25 - 28 градусов (нужен индикатор), например +27 (гистерезис плюс минус 0.5 градуса), далее шунтирующее реле отключается и начинается изменение сопротивления MCP41010 по 2 ступени, которые соответствуют перерассчитанным уровням резистора котла и сравнение с заданной температурой через 3 минуты к примеру, если +27, то происходит уменьшение на две ступени до достижения соответствия заданной температуре вплоть до минимума сопротивления MCP41010 и включения шунтирующего реле для отключения контура отопления. Если будет взаимовлияние температуры внешнего датчика DS18B20 и внутреннего датчика котла, то можно попробовать управление через внешний термостат, управление которого осуществляется по двум проводам с помощью реле или оптопары.

Давайте я тогда напишу вам программу, в которой заранее установленной температурой будет 27 градусов, если измеренная температура будет меньше 27 градусов, то на 2 ступени будет увеличиваться значение MCP41010, если больше 27 градусов, то на 2 ступени будет уменьшаться значение MCP41010. Это будет делаться с задержкой в 2 секунды. Ступени, насколько я понимаю, здесь это преобразованные 256 уровней в 19 ступеней. Так подойдет вам для теста?

Хорошо. Да, ступени - это преобразование 256 уровней в 19 ступеней или 13 к 1.

Вопрос по другой теме. В скетче с датчика BMP280 выводится температура в целых числах без десятых так:
times = bmp.readTemperature();

Температура показывает значение больше на 2 градуса. Как правильно ввести поправочный коэффициент? Так: times = bmp.readTemperature()-2;
или нужно задавать это через переменную. Если через переменную, то как это написать?

Ну почему происходят большие скачки напряжения при небольшом изменении уровня потенциометра - этого я, к сожалению, не знаю. Никогда просто с такими потенциометрами не работал. А уровни меняются правильно, по алгоритму как вы написали.
Значение 26 выбрано потому что вы сами писали что на 1 ступень приходится 13 уровней, то есть 2 ступени эквивалентно 26 уровням. Но это легко поменять если вас эта цифра не устраивает.
В каком скетче с датчиком BMP280? У меня на сайте есть статья с датчиком BMP180, а вот BMP280 я вот что то не помню

Термометр на arduino

Я писал недавно статью, где подключал к arduino 4-разрядный 7-сегментный индикатор hs420561k-32, тогда упоминал, что хочу сделать градусник с выводом температуры на этот индикатор, только проблема была в отсутствии датчиков. И вот наконец-то приехала посылка с недостающими запчастями и можно продолжить проект. Температурных датчиков у меня три штуки – dht11, LM35 и DS18B20. Но использовать буду только LM35 и DS18B20, поскольку dht11 очень неточный, в даташите написано, что отклонения от реальной температуры составляют плюс-минус два градуса, а так же он работает только с положительной температурой.

Температурный датчик LM35. Подключение к arduino

Первый датчик, который будем использовать – это LM35, использовать его очень просто, тут даже дополнительные библиотеки не требуются, достаточно подключить к нему питание и считать данные на выходе с помощью аналогового пина arduino. LM35 работает с температурами от -55 до 150 градусов Цельсия и если верить даташиту, то погрешность составляет всего плюс-минус 0,25 градуса. Хоть датчик и обрабатывает до +150 градусов, но считать ардуиной сможем только до +110, хотя и это более чем достаточно для домашнего градусника. Поскольку этот датчик имеет высокую точность, но находится в корпусе TO92, без какой-либо дополнительной защиты, использовать его будем для измерения температуры в помещении.
Официальный мануал arduino рекомендует использовать для снятия показаний этого датчика опорное напряжение 1,1 В. Чтобы настроить arduino подобным образом достаточно использовать команду analogReference(INTERNAL) в функции setup. Далее достаточно просто, с нужным интервалом, считывать напряжение с выходной ножки(OUT) датчика. LM35 формирует напряжение 10 милливольт на один градус, таким образом имея опорное напряжение в 1,1 В легко обработать, довольно точно, данные.

Ниже на картинке показано, какая нога датчика LM35 за что отвечает.

Ноги датчика LM35

Температурный датчик DS18B20. Подключение к arduino

Подключение датчика DS18B20

Проблема вывода температуры на индикаторе hs420561k-32

Пока я разбирался с каждым датчиком по отдельности, а также когда подключал к arduino 4-х разрядный 7-сегментнтый индикатор, проблем ни каких не было, все прекрасно работало. Но стоило мне собрать все в кучу, на одну макетную плату и собрать код воедино, как сразу появилась серьезная проблема. Я писал в прошлой статье, что для одновременного вывода данных сразу на 4-х разрядах hs420561k-32 необходимо очень быстро по очереди выводить по одному разряду, тогда создается впечатление одновременного вывода четырех цифр, глаз не успевает уловить смену разрядов. В связи с таким способом вывода возникла сложность с одновременной работой датчика DS18B20, для его опроса требуется чуть больше секунды времени – в двух участках кода используется delay, который заставляет микроконтроллер ждать, 250 и 1000 миллисекунд. Сначала я сделал запрос к датчику раз в 30 секунд, но это не решило проблему – два раза в минуту датчик по секунде показывал непонятно что. Поэтому пришлось отказаться от delay и добавить другую аналогичную конструкцию в код, которая будет выполнять определенные куски кода с задержкой, а остальной код будет выполняться без задержек. Многопоточности в arduino, как оказалось, нет, но есть псевдомногопоточность, добиться ее можно используя не хитрую конструкцию с таймером, который отмеряет время в миллисекундах от старта работы микроконтроллера. Пример такого кода я приведу ниже:

Что использовалось в проекте:

  • Arduino (я использовал arduino nano, но можно любую другую). Покупал тут: arduino nano
  • Температурный датчик LM35. Покупал тут: Температурный датчик LM35 5 шт
  • Температурный датчик DS18B20. Покупал тут: Температурный датчик DS18B20
  • Дисплей hs420561k-32. Покупал тут: аналог дисплея hs420561k-32
  • 1 резистор сопротивлением 4.7 кОм. Покупал тут:набор резисторов 700 шт. От 10 Ом до 1 МОм
  • 8 резисторов сопротивлением 300 Ом. Покупал тут:набор резисторов 700 шт. От 10 Ом до 1 МОм
  • 1 Сдвиговый регистр 74HC595. Покупал тут: сдвиговые регистры 10 штук
  • Макетная плата. Я использовал с 830 отверстиями. Покупал тут: макетная плата
  • Несколько соединительных проводов. Покупал тут: соединительные провода

Скетч уличного и комнатного термометра на arduino

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

Послесловие

Термометр работает, показывает температуры дома и на улице, только вся конструкция собрана на макетной плате, и использовать прибор в таком виде довольно неудобно. Поэтому в планах на будущее будет разработка удобного в эксплуатации устройства – напечатаю на 3D принтере корпус, а все провода нужно будет перенести на печатную плату, так же хочется убрать arduino и использовать atmega8. Это что касается планов на будущее, а пока в завершение статьи приложу видео работы термометра:

Читайте также: