Пришел у меня 5 летний ребенок из садика и сказал, что ему задали сделать проект умные устройства в доме. Корпус можно сделать из любого подручного конструктора. Можно сделать из LEGO конструктора. Немного поразмыслив решили мы с сыном сделать часы-будильник на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 .
Подключение электроники осуществляется вот по токай схеме.
Корпус из 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. Но для первого раза я считаю что получилась не плох. А вы как считает? Пишите в комментариях свое мнение.
Понравилась статья? Поделитесь ею с друзьями:
Вернуться в раздел: Проекты на Arduino Дата публикации 18 октября , 2018
Читайте также
Часы из лего. Отлично.
Робототехника сегодня очень развитый вид услуг. Но не всем по карману оплатить обучение ребенка в дорогостоящих школах робототехники. Поэтому собирать дома из конструктора лего, Это просто идеальное решение. Спасибо автору!
Компиляция выполняется с ошибкой:
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
Отличная идея! Буду собирать!
Классная идея! Как раз думал про будильник для детей! Но с заменой звука, настройкой времени и прочим календарем, думаю, будет вообще отлично!
Интересная задумка! Надо будет попробовать детишкам в комнату собрать...
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.