Часы-будильник на Arduino. Корпус сделан из конструктора LEGO. LEGO Arduino

.Часы-будильник на Arduino. Корпус сделан из конструктора LEGO.  LEGO Arduino

Пришел у меня 5 летний ребенок из садика и сказал, что ему задали сделать проект умные устройства в доме. Корпус можно сделать из любого подручного конструктора. Можно сделать из LEGO конструктора. Немного поразмыслив решили мы с сыном сделать часы-будильник на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 .

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

часы-будильник на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231

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

Корпус из LEGO для чесов

Прошивка для часов на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 в среде Arduino IDE:


#include <TinyWireM.h>
#include "TM1637.h"
#define CLK 4
#define DIO 3 
int soundPin = 1;             // объявляем переменную с номером пина спикера
const int buttonPin = 5;      // номер входа, подключенный к кнопке
int sensorValue = 0;
boolean status = false;
TM1637 tm1637(CLK,DIO);
///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}
void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   TinyWireM.beginTransmission(0x68);
   TinyWireM.send(0);
   TinyWireM.send(decToBcd(second));    
   TinyWireM.send(decToBcd(minute));
   TinyWireM.send(decToBcd(hour));     
   TinyWireM.send(decToBcd(dayOfWeek));
   TinyWireM.send(decToBcd(dayOfMonth));
   TinyWireM.send(decToBcd(month));
   TinyWireM.send(decToBcd(year));
   TinyWireM.endTransmission();
}
void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(0x68, 7);
  *second     = bcdToDec(TinyWireM.receive() & 0x7f);
  *minute     = bcdToDec(TinyWireM.receive());
  *hour       = bcdToDec(TinyWireM.receive() & 0x3f); 
  *dayOfWeek  = bcdToDec(TinyWireM.receive());
  *dayOfMonth = bcdToDec(TinyWireM.receive());
  *month      = bcdToDec(TinyWireM.receive());
  *year       = bcdToDec(TinyWireM.receive());
}
float get3231Temp(){
  byte tMSB, tLSB; 
  float temp3231;
  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0x11);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(0x68, 2);
  if(TinyWireM.available()) {
    tMSB = TinyWireM.receive(); //2's complement int portion
    tLSB = TinyWireM.receive(); //fraction portion
    temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
    temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
  }
  else {
    //oh noes, no data!
  }
  return temp3231;
}
/////////////////
void setup() {
  TinyWireM.begin();
  tm1637.init();
  tm1637.set(7); // яркость, от 0 до 7
  pinMode(soundPin, OUTPUT); //объявляем пин как выход. 
  pinMode(buttonPin, INPUT_PULLUP);
 pinMode(5, INPUT);
    // установка часов 
        //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  second = 30;  minute = 50;  hour = 06;  dayOfWeek = 3; 
     // день недели 
     //dayOfMonth = 1; // день 
      ///month = 4; 
      //year = 14;  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
}
void loop(){
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  byte temp = get3231Temp(); 
  int8_t TimeDisp[4]; 
    TimeDisp[0] = hour / 10;
    TimeDisp[1] = hour % 10;
    TimeDisp[2] = minute / 10;
    TimeDisp[3] = minute % 10;  
    if (second%2)
      tm1637.point(POINT_ON); // включаем точки
    else
      tm1637.point(POINT_OFF); // выключаем точки       
//  }
  buttonValue = digitalRead(buttonPin); // считываем данные с кнопки
   if(hour==7)
   {    
     if (minute==00)
     {
       if (second < 30)
         status = true;
       else
         status = false;
     }     
   }
   if (buttonValue)
      status = false;
   if (status)
    {
      tone(soundPin, 1500); // включаем звук частотой 100 Гц
      delay(200);
      tone(soundPin, 1000); // включаем звук частотой 100 Гц
      delay(200);
      tone(soundPin, 500); // включаем звук частотой 100 Гц
      delay(200);
    }
   else
    noTone(soundPin); // выключаем звук
  tm1637.display(TimeDisp); // отправляем массив на экран
}

Звуковой сигнал будет генерировать функция tone(). Как видно из программы настраивать время срабатывания будильника мы не сможем. Это связанна с тем что у Digispark мало пинов. И все уже заняты.

Если данный проект реализовать например на Atduino NANO, тогда можно реализовать настройку времени срабатывания будильника. Написать мелодии будильника и прочие фишки. Если данное видео и статья будут востребованы, то я сниму переделку на Arduino NANO. Но для первого раза я считаю что получилась не плох. А вы как считает? Пишите в комментариях свое мнение.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

Понравилась статья? Поделитесь ею с друзьями:

Вернуться в раздел: Проекты на Arduino Дата публикации 18 октября , 2018

Комментарии

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

мармок
#8 мармок (21 ноября, 2019 в 13:37)
Часы из Lego супер. Мне нравиться удачи и придумывайте побольше таких проектов.
МиккиМаусс
#7 Гость: МиккиМаусс (23 сентября, 2019 в 19:52)

Часы из лего. Отлично.

Аноним
#6 Гость: Аноним (4 апреля, 2019 в 08:27)

Робототехника сегодня очень развитый вид услуг. Но не всем по карману оплатить обучение ребенка в дорогостоящих школах робототехники. Поэтому собирать дома из конструктора лего, Это просто идеальное решение. Спасибо автору!

Евгений
#5 Евгений (29 марта, 2019 в 13:54)
Отличное решение. Для обучения детей. оптимальный вариант. 
Игорь
#4 Гость: Игорь (27 марта, 2019 в 12:05)

Компиляция выполняется с ошибкой:

Arduino: 1.8.5 (Windows 10), Плата:"Digispark (Default - 16.5mhz)"Digispark+LED\scetch\scetch.ino: In function 'void loop()':scetch:103: error: 'buttonValue' was not declared in this scopeexit status 1'buttonValue' was not declared in this scope

Евгений
#3 Гость: Евгений (22 февраля, 2019 в 16:10)

Отличная идея! Буду собирать!

Vlad Brazhkin
#2 Гость: Vlad Brazhkin (20 февраля, 2019 в 12:02)

Классная идея! Как раз думал про будильник для детей! Но с заменой звука, настройкой времени и прочим календарем, думаю, будет вообще отлично!

Никита Рак
#1 Гость: Никита Рак (20 февраля, 2019 в 11:50)

Интересная задумка! Надо будет попробовать детишкам в комнату собрать...


Cлучайные товары

Посмотреть товар в Магазине »

Мы в соц сетях

Подпишись на канал Telegram

Portal-PK (Портал ПК) © 2015 - 2024
Разработка проектов
AT Block
DWIN Box