Взрывные часы

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

Сразу оговорюсь я в этом деле не профессионал и делал так как знаю. Наверняка можно сделать лучше. И так, поехали.

Задача поставлена: индикаторы указывают часы, минуты, секунды, а так же температуру и влажность в помещении.

Начнем с индикаторов. В идеале нужно было бы использовать индикатор сразу 7 сегментный 6 разрядный, но такого в наличии не было, а под рукой как раз лежали  индикаторы KEM-4021BS. 

KEM-4021BS

Теперь нужно объединить катоды по одному проводу посегментно. Вот тут берем в руки паяльник и 3 сдвоенных индикатора.

Приступаем к разработке платы

 

 

Прикинул примерную схему LAY и собрал ее на макетке.

 

Сегменты

 

После сборки получили 6 анодов, это плюс питания для каждого сегмента и подключать аноды нужно через токоограничивающие резисторы. Это обязательно для всех светодиодов. И получили 7 сегментов — ABCDEFG.

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

сдвиговые регистры 74HC595

 

Использовал 2 регистра, один отвечает за аноды, другой за регистры. Так становится понятно, что за свечение цифр будет отвечать динамическая индикация. В итоге получим конструкцию следующего вида:

 

SONY DSC

 

Следующий этап, это мозги устройства. И главной в этой роли выступила 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.

Травим, лудим, паяем, удовлетворяем  и получаем :

 

часы бомба2

 

Осталось еще немного. Делаем макет тротиловой шашки. В качестве шашки подошла водопроводная полимерная труба диаметром 20 мм. Отрезаем куски по 20 см и оборачиваем в крафт бумагу. Затем скрепляем изолентой.

макет тротиловой шашки

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

часы бомба

 

 

 

 

Небольшое видео работы

Всем добра!

 

 

 

Поделись с друьями:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • MySpace
  • В закладки Google
  • Яндекс.Закладки
  • LinkedIn
  • Reddit

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *