С того момента как я начал изучать Arduino захотелось сделать что нибудь полезное, ну или интересное своими руками. Были проштудированы сайты самоделок глаза разбегались, хотелось повторить все! И выбор пал на часы муляж.
Сразу оговорюсь я в этом деле не профессионал и делал так как знаю. Наверняка можно сделать лучше. И так, поехали.
Задача поставлена: индикаторы указывают часы, минуты, секунды, а так же температуру и влажность в помещении.
Начнем с индикаторов. В идеале нужно было бы использовать индикатор сразу 7 сегментный 6 разрядный, но такого в наличии не было, а под рукой как раз лежали индикаторы KEM-4021BS.
Теперь нужно объединить катоды по одному проводу посегментно. Вот тут берем в руки паяльник и 3 сдвоенных индикатора.
Прикинул примерную схему LAY и собрал ее на макетке.
После сборки получили 6 анодов, это плюс питания для каждого сегмента и подключать аноды нужно через токоограничивающие резисторы. Это обязательно для всех светодиодов. И получили 7 сегментов — ABCDEFG.
Для функционирования такой системы применил сдвиговые регистры 74HC595. Как их подключать было рассказано в прошлой теме.
Использовал 2 регистра, один отвечает за аноды, другой за регистры. Так становится понятно, что за свечение цифр будет отвечать динамическая индикация. В итоге получим конструкцию следующего вида:
Следующий этап, это мозги устройства. И главной в этой роли выступила ATmega 328. Тут в принципе можно использовать хоть любую плату Arduino, хоть любую микруху мегу. У меня давно лежала ATmega 328 без дела и вот для неё нашлось применение. В микроконтроллер ATmega загружаем bootloader при помощи Arduino Uno и этой же уной загружаем в мегу скетч
#include #include "RTClib.h" #include "DHT.h" // подключаем библиотеку #define DHTPIN 8 // вывод, к которому подключается датчик DHT dht(DHTPIN, DHT11); // определяем тип датчика: 22 или 11 RTC_DS1307 RTC; int latchPin = 6; //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты int clockPin = 5; //Пин подключен к SH_CP входу 74HC595 int dataPin = 7; //Пин подключен к DS входу 74HC595 int TimeLight = 4; //время для разогрева сегментов byte SegDisplay; // переменная для вывода символов на индикаторе byte RazrDisplay; // переменная для включения разрядов byte g_digits[12] = {192, 249, 164, 176, 153, 146, 130, 248, 128, 144, 127, 255}; //массив цифр, генерирующий из сегментов цифры byte g_registerArray[6] = {1, 2, 4, 8, 16, 32}; //массив цифр, указывающий разряды char g_digitsArray[6]; byte c = B1100; void setup() { dht.begin(); // датчик передает данные Wire.begin(); RTC.begin(); // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { byte hour, minute, sec; DateTime now = RTC.now(); hour = now.hour(); minute = now.minute(); sec = now.second(); if (sec > 10 && sec < 15) {TempToDigits((dht.readTemperature())-1);} else if (sec > 40 && sec < 45) {HumToDigits(dht.readHumidity());} else {TimeToDigits(hour, minute, sec);} Indicate(); } void TimeToDigits(byte hour, byte minute, byte sec) { g_digitsArray[0]=g_digits[hour/10]; g_digitsArray[1]=g_digits[hour%10]; g_digitsArray[2]=g_digits[minute/10]; g_digitsArray[3]=g_digits[minute%10]; g_digitsArray[4]=g_digits[sec/10]; g_digitsArray[5]=g_digits[sec%10]; } void TempToDigits(byte temp) { g_digitsArray[0]=255; g_digitsArray[1]=255; g_digitsArray[2]=255; g_digitsArray[3]=g_digits[temp/10]; g_digitsArray[4]=g_digits[temp%10]; g_digitsArray[5]=198; } void HumToDigits(byte hum) { g_digitsArray[0]=255; g_digitsArray[1]=255; g_digitsArray[2]=255; g_digitsArray[3]=g_digits[hum/10]; g_digitsArray[4]=g_digits[hum%10]; g_digitsArray[5]=9; } void Indicate() { for (byte r=0; r<6; r++) { SegDisplay = g_digitsArray[r]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре. RazrDisplay = g_registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре. digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда) shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию для первого регистра (Номер символа) digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" } shiftOut(dataPin, clockPin, MSBFIRST, 255); // Выключаем индикацию }
Приступаем к разработке платы. LAY
Список деталей:
С1- 0,33 мкФ
С2 — 0,1 мкФ
С3 — 100 мкф х 10 в
С4 — 22 пФ
С5 — 22 пФ
R1 — 10 кОм
Q1 — 16 МГц
IC2 — LM7805
К X1 подключаются индикаторы и data датчика DHT11, от X2 запитываются индикаторы и DHT11, к X3 подключаются часы RTC DS1307.
Травим, лудим, паяем, удовлетворяем и получаем :
Осталось еще немного. Делаем макет тротиловой шашки. В качестве шашки подошла водопроводная полимерная труба диаметром 20 мм. Отрезаем куски по 20 см и оборачиваем в крафт бумагу. Затем скрепляем изолентой.
Теперь собираем все это в одну кучу и получаем девайс показывающий время, температуру и влажность в помещении.
Небольшое видео работы
Всем добра!