В новогодние праздники тут была статейка в которой показывали термометр на заводской трубе. Меня это заинтересовало. Тем более что схемка для реализации такого устройства элементарная. Как и программа для контроллера.
В той теме я об этом и сказал. Кое-кого это заинтересовало и народ стал просить схему. Начало года у меня выдалось довольно напряжным — обстановка в мире не способствовала образованию свободного времени для хобби, но на днях я всё же сделал это устройство. И сейчас расскажу, как это можно повторить.
П.С. 16 картинок и чуток текста
Схемка будет вот такая:
Первым делом нужно собрать необходимые детальки. Их не так уж и много:
Микроконтроллер ESP-12E.
Можно взять даже ESP-01, только его использовать немного напряжно (нужен программатор. Да ещё и стабилизатор припаять надо с 5V на 3.3V). Зато схемка будет немного меньше. Да и дешевле этот контроллер. Кто захочет, может заморочиться – там нет ничего сложного.
Так что буду использовать ESP-12E. Вернее, его китайский аналог. Сейчас эта штука стоит 140-170 рублей на AliExpress, а покупал я эти платки года четыре назад по цене 107 рублей. Это было (да и есть) даже дешевле чем китайский аналог Arduino Nano V3. Её, кстати, тоже можно использовать, только у неё возможностей меньше. Но на термометр хватит.
Ещё возьмём светодиодную ленту с адресными светодиодами WS2812B. Цена её, при 60 светиков на метр без пыле-влаго защиты, в нашем не самом дешёвом в городе магазине «Радио» 550 рублей за метр. Берём два метра. На самом деле у меня были остатки ленты с предыдущих проектов, но цену я посмотрел, чтобы сориентировать тех, кто захочет повторить конструкцию.
Ещё нам понадобиться термодатчик. У меня есть кучка DS18B20 - его и возьму. Тем более, что есть у меня датчик в герметичном исполнении. У нас он стоит 145 рублей:
Ещё понадобятся два резистора: на 270 Ом и 4.7кОм. Стоят рублей пять за оба. Мощность может быть любая. На 0.125 вполне пойдут. Можно даже SMD взять, если хотите заморочиться.
Теперь надо всё это дело спаять или собрать на макетной плате без пайки. Платка такая у меня на работе оказалась занята под другой проект, поэтому буду паять.
Первым делом подготавливаем термодатчик. К нему надо подпаять резистор. Резистор на 4.7К подпаиваем между красным проводом (питание) и жёлтым (сигнал)
Теперь подпаяем резистор на 270Ом к ленте светодиодов (к контакту DIN).
На фото он уже затянут в термоусадку.
Обратите внимание на то, к какому концу ленты подпаиваться. Направление ленты указано стрелочкой-треугольником. Резистор подпаиваем к контакту DIN. Питание 5 вольт соответственно к выводу +5V, а землю к выводу GND.
Ленту, кстати, нужно обрезать, оставив отрезок со 101-им светодиодом. Длина такой ленты будет ~168см. Ха, мой рост!
Как уже многие догадались, диапазон измерений этого термометра будет от -50 до +50 градусов Цельсия. Один светодиод = 1 градус. Это что бы не усложнять программу. Хотя есть в ардуиновском С-подобии функция «map», с помощью которой можно легко и просто отмасштабировать диапазон измерений на ленту любой длины. Ну а выбранного мной диапазона хватит почти везде. У нас в эту зиму ниже -38 не опускалась температура, да и больше 35 летом редко поднимается. Так что, как говориться: «хватит за глаза и за уши!».
Теперь, согласно схеме, подсоединяем красный провод датчика температуры к выводу контроллера 3V3, чёрный к выводу GND, а жёлтый – к выводу D2. Этот вывод может быть и любой другой цифровой, у меня это просто исторически так сложилось. С других проектов.
Провод питания с ленты цепляем к выводу VIN, землю к выводу контроллера GND, а сигнальный к выводу D7. Это тоже исторически сложилось, а так можно использовать и другие цифровые выводы. Только, конечно, в программе надо это будет учесть.
В итоге получается вот такая сляпаная наскоро хренатень:
Врубаем её, загнав внутрь сляпанную наскоро прогу.
На фото видно, что я подпаял ещё и USB-разъём для внешнего питания, но оказалось, что он лишний. Мой вариант устройства, даже если зажечь все светики белым светом на полной яркости, не дотягивал по току даже до двух ампер (1.8А). Так что двухамперная зарядка от телефона, подключенная к микро-USB контроллера в качестве блока питания устройства, вполне подойдёт. На самом деле устройство и до ампера не дотягивает, если работает в штатном режиме с моей программой (0.8А). Но есть ленты, в которых светики на полной мощности потребляют по 60мА каждый (при ярком белом свете). Так что тут всё зависит от ленты.
На фото контроллер уже показывает красным цветом температуру 28 градусов. Но одним цветом и без шкалы – это как-то некрасиво.
Можно подключиться к COM-порту и проверить выдаваемую датчиком температуру (скорость порта 115200). Это я датчик в руках подержал – он ещё не совсем остыл. Так температура в комнате 25-26 градусов.
Загоняем готовую программу в контроллер и приступаем к испытаниям. Ну или к демонстрации устройства – народ повеселил (внерабочее время естественно).
Тут комнатная температура 25 градусов:
А тут в кружке горячая вода из куллера и шкала вся заполнена.
Как видите, теперь прога отображает отрицательную температуру синим, ноль – белым, положительную – красным. А риски шкалы через каждые пять градусов выделяются другими цветами (голубым и розовым вроде как).
Теперь в кружке снег, но так как датчик только что из кипятка, то показывает ноль. Обычно снег до этого показывал -2 градуса. До окна далековато – длины провода датчика не хватает. Да и в день измерений было где-то -5, не так уж и холодно.
Измерение температуры происходит с частотой раз в три секунды. Тут вообще надо соблюсти золотую середину, ибо если часто опрашивать датчик, то он нагревается и начинает завышать температуру. Надо это учитывать. И думается мне, что для домашнего термометра и три секунды – это довольно часто, но так оставил.
В итоге что? В итоге мы, я думаю, убедились, что устройство работает. Народ сказал, что можно и не так ярко, а то слепит глаза. В проге это можно быстро исправить.
Что ещё остаётся? Разве что осталось времянку перепаять более культурно что ли?
Как видите, теперь термодатчик подключается к гнезду Stereo-Jack 3.5мм (обычные гнездо и штекер от наушников). Лучше брать их подороже, а то дешёвые нихрена не контачат и разваливаются прямо в руках. Я на этом обжёгся в этом проекте. А вообще рекомендую взять гнездо и штекер RG11 (телефонный). Они как-то получше будут и безопаснее в плане включения и отключения «на ходу». А то мало ли что?
Лента подцеплена через разъём от компьютерного вентилятора. Хотел взять трёх-пиновый, но не нашёл в ближайшем доступе их. Только четырёх-пиновые были на дохлых материнках и вентиляторах, но и так нормально. Разъёмы приклеены к плате с помощью термоклея. Пайка между лентой и разъёмом залита лаком.
Осталось только нарисовать в каком-либо CADе корпус для устройства и распечатать его на 3D-принтере, но этим я займусь как-нибудь потом, когда появится настроение и время для этого.
Вообще контроллер позволяет сделать ещё очень многое с этим термометром. Например, он способен подключиться к роутеру через Wi-Fi, или сам поднимать точку доступа. После чего он способен поднять Web-сервер, на котором будет показывать текущую температуру. Или с которого можно задавать цвета шкалы термометра. Ну или вообще в праздничные дни превращать это устройство в гирлянду с различными спецэффектами. Всё ограничивается только его памятью и вашей фантазией.
Код
Прога:
#include // Подключаем нужные библиотеки
#include
#include
#define DS18B20PIN 4 // пин D2 к нему подключен датчик
#define PIN 13 // Лента на пин D7
#define NUMPIXELS 101 // Количество светиков в ленте
OneWire oneWire(DS18B20PIN); // Запуск протокола OneWire
DallasTemperature sensor(&oneWire); // запускаем датчик температуры
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // Параметры ленты
void setup()
{
Serial.begin(115200); // Задаём скорость последовательного порта
sensor.begin(); // Инициализирую библиотеку работы с датчиком
strip.begin(); // Инициализирует библиотеку работы с лентой
}
void loop()
{
sensor.requestTemperatures();
int8_t tempinC = round(sensor.getTempCByIndex(0)); // Округляем температуру до целого числа
Serial.print("Temperature = "); // И выводим
Serial.print(tempinC); // её
Serial.println("ºC"); // в консоль
for (byte i=0; i byte tmp = tempinC + 50;
if (i <= tmp) {
if (i <= 50) {
strip.setPixelColor(i, strip.Color(0,0,100)); // Холодрыгу выводим синим
}
else {
strip.setPixelColor(i, strip.Color(100,0,0)); // Тепло красным
}
}
else {
strip.setPixelColor(i, strip.Color(0,0,0)); // Все остальные светики не горят
}
}
for (byte i=0; i<=50; i +=5) {
strip.setPixelColor(i, strip.Color(100,100,250)); // Рисуем шкалу по 5 градусов
strip.setPixelColor(i+50, strip.Color(250,100,100));
}
strip.setPixelColor(50, strip.Color(250,250,250)); // Рисуем белым ноль.
strip.show(); // Засветить всю ленту.
delay(3000); //Ждём три секунды и повторяем цикл
}
Осталось только дать ссылочку на архив с прогой, библиотеками и дополнительными фотографиями. Ну и кучку ссылок, что будут полезны как для начинающих, так и для продолжающих, а то подробности работы в Arduino IDE в своей статье я опустил. А профи и сами подобное уже тыщу раз делали.
Ссылка на архив с прогой, библиотеками и дополнительными фото: https://drive.google.com/file/d/1uapSWbQNIb...iew?usp=sharing
Ссылка на даташит DS18B20: https://www.digchip.com/datasheets/parts/da...DS18B20-pdf.php
Ссылка на даташит WS2812B: https://components101.com/displays/ws2812b-...essable-rgb-led
Ссылка на описание ESP-12E: https://datasheet4u.com/datasheet-pdf/AI-Th....php?id=1258546
Как программировать ESP в Arduino IDE: https://robot-on.ru/articles/proshivka-esp8...rez-arduino-ide
Как работать с DS18B20 на ESP: https://espsmart.ru/blog/19-podkljuchenie-d...-k-esp8266.html
Как работать с лентами WS2812B с помощью контроллера ESP: https://esp8266.ru/esp8266-ws2812-arduino/
FAQ по работе с лентами адресных светодиодов: https://alexgyver.ru/ws2812_guide/
П.С. Если что, то готов ответить на вопросы, по мере своих слабых сил, разумеется.
Всё!