Arduino часы. Подключаем к Arduino DS3231 модуль и ИК приемник
Продолжаем
собирать
Arduino
часы
.
И в данной статье мы подключим к
Arduino DS3231 модуль
реального
времени
, ИК
приемник
и
выведи
полученную информацию на
семи
сегментный индикатор TM1637
.
Посмотрите
предыдущие
части сборки
LED
часов на Arduino:
Подключим
DS3231
модуль
,
ИК
приемник
и
семи сегментный индикатор к
Arduino
вот
по такой схеме.
При
подключении будьте внимательны при
подключении
ИК
приемника
.
Возможно,
что ваш приемник подключаться к другом
ножкам. Поищите в интернете где у вашего
приемника
VCC, GND, DATA. Я спалил один ИК
приемник, подключил его не к тем пинам.
Принципиальная
схема подключения к
Arduino
DS3231
модуль
реального
времени
,
ИК приемник и
семисегментного
индикатора
TM1637
.
При
написании кода часть функций взял
из интернета без изменений.
int interval[5]={10000, 3000, 3000, 5000, 5000}; // интервал
int status = 0;
long prestro1Millis = 0; // до
Функция
Status() отвечает за время отображения
информации на семи сегментный индикаторе.
В
видео
рассказываю немного подробнее о данной
функции. Но в принципе она достаточно
простая.
void Status() {
unsigned long curstro1Millis = millis(); // устанавливаем время в сейчас
if ((curstro1Millis - prestro1Millis) > interval[status]) // проверяем интервал
{
status++;
if (status >= 3) // если последний проход по циклу
{
status=0;
}
prestro1Millis = curstro1Millis;
}
}
Данную
функция нужно вызвать в loop(). В противном
случае она работать не будет.
void loop(){
Status();
}
Получаем
информацию с модуля реального времени
DS3231.
Приводим
в вид для
вывода на семи сегментный индикатор.
// читаем время из модуля
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
// забиваем массив значениями для отпарвки на экран
int ch1 = hour / 10;
int ch2 = hour % 10;
int m1 = minute / 10;
int m2 = minute % 10;
int d1 = dayOfMonth / 10;
int d2 = dayOfMonth % 10;
int me1 = month / 10;
int me2 = month % 10;
В
данной конструкции switch ( status ) выводим
на семи сегментный индикатор TM1637
информации
в соответствии
с полученным
статусом из функции Status().
switch ( status ) {
case 0:
{
tm1637.display(0,ch1);
tm1637.display(1,ch2);
tm1637.display(2,m1);
tm1637.display(3,m2);
attachInterrupt(0, blink, CHANGE);
}
break;
case 1:
{
tm1637.point(false);
tm1637.display(0,0x7f);
tm1637.display(1,0x7f);
tm1637.display(2,0x7f);
tm1637.display(3,15); // put a C at the end
}
break;
case 2:
{
tm1637.point(false);
tm1637.display(0,0x7f);
tm1637.display(1,0x7f);
tm1637.display(2,0x7f);
tm1637.display(3,12); // put a C at the end
}
break;
case 3:
{
tm1637.point(false);
tm1637.display(0,d1);
tm1637.display(1,d2);
tm1637.display(2,0x7f);
tm1637.display(3,13);
}
break;
case 4:
{
tm1637.point(false);
tm1637.display(0,23);
tm1637.display(1,0x7f);
tm1637.display(2,me1);
tm1637.display(3,me2);
}
break;
}
if ( irrecv.decode( &results )) { // если данные пришли
switch ( results.value ) {
case 0x61D6D02F:
{
status = 0;
hour++; // пребавляем единицу к часам
if (hour > 23) hour = 0; // если вылезли за границы присваеваем 0
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
}
break;
case 0x61D6A857:
{
status = 0;
hour--; // пребавляем единицу к часам
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
}
break;
case 0x61D618E7:
{
status = 0;
second = 0;
minute--;
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}
break;
case 0x61D630CF:
{
status = 0;
second = 0;
minute++;
if (minute > 59) minute = 0;
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}
break;
case 0x61D650AF:
{
status = 3;
}
break;
case 0x61D628D7:
{
status = 4;
}
break;
}
// Serial.println( results.value, HEX ); // печатаем данные
irrecv.resume(); // принимаем следующую команду
}
В
данной конструкция
switch ( results.value ) . Обрабатывает
команды
полученные с
пульта
ДУ
. У вас данные команду будут другие.
Для
получения команд с
пульта ДУ
в
Serial
порте
разкомментируйте
строки.
// Serial.begin(9600); // Выставляем скорость COM порта
// Serial.println( results.value, HEX ); // печатаем данные
Скетч
в среде
Arduino IDE,
управления часами получится вот таим:
#include <Wire.h>
#include "TM1637.h"
#include "IRremote.h"
IRrecv irrecv(11); // Указываем пин, к которому подключен приемник
decode_results results;
// 7сигментный индикатор
#define CLK 6
#define DIO 7
#define brightness 2 // яркость, от 0 до 7
int interval[5]={10000, 3000, 3000, 5000, 5000}; // интервал
int status = 0;
long prestro1Millis = 0; // до
TM1637 tm1637(CLK,DIO);
#define DS3231_I2C_ADDRESS 0x68
volatile boolean flag;
///// часы ..
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
return ( (val/16*10) + (val%16) );
}
void setDateDs3231(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
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void getDateDs3231(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void blink() {
flag = !flag;
tm1637.point(flag);
}
void Status() {
unsigned long curstro1Millis = millis(); // устанавливаем время в сейчас
if ((curstro1Millis - prestro1Millis) > interval[status]) // проверяем интервал
{
status++;
if (status >= 3) // если последний проход по циклу
{
status=0;
}
prestro1Millis = curstro1Millis;
}
}
void setup() {
// Serial.begin(9600); // Выставляем скорость COM порта
irrecv.enableIRIn(); // Запускаем прием
Wire.begin();
pinMode(13, OUTPUT);
tm1637.init();
tm1637.set(brightness);
}
void loop(){
// читаем время из модуля
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
// забиваем массив значениями для отпарвки на экран
Status();
int ch1 = hour / 10;
int ch2 = hour % 10;
int m1 = minute / 10;
int m2 = minute % 10;
int d1 = dayOfMonth / 10;
int d2 = dayOfMonth % 10;
int me1 = month / 10;
int me2 = month % 10;
switch ( status ) {
case 0:
{
tm1637.display(0,ch1);
tm1637.display(1,ch2);
tm1637.display(2,m1);
tm1637.display(3,m2);
attachInterrupt(0, blink, CHANGE);
}
break;
case 1:
{
tm1637.point(false);
tm1637.display(0,0x7f);
tm1637.display(1,0x7f);
tm1637.display(2,0x7f);
tm1637.display(3,15); // put a C at the end
}
break;
case 2:
{
tm1637.point(false);
tm1637.display(0,0x7f);
tm1637.display(1,0x7f);
tm1637.display(2,0x7f);
tm1637.display(3,12); // put a C at the end
}
break;
case 3:
{
tm1637.point(false);
tm1637.display(0,d1);
tm1637.display(1,d2);
tm1637.display(2,0x7f);
tm1637.display(3,13);
}
break;
case 4:
{
tm1637.point(false);
tm1637.display(0,23);
tm1637.display(1,0x7f);
tm1637.display(2,me1);
tm1637.display(3,me2);
}
break;
}
if ( irrecv.decode( &results )) { // если данные пришли
switch ( results.value ) {
case 0x61D6D02F:
{
status = 0;
hour++; // пребавляем единицу к часам
if (hour > 23) hour = 0; // если вылезли за границы присваеваем 0
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
}
break;
case 0x61D6A857:
{
status = 0;
hour--; // пребавляем единицу к часам
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
}
break;
case 0x61D618E7:
{
status = 0;
second = 0;
minute--;
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}
break;
case 0x61D630CF:
{
status = 0;
second = 0;
minute++;
if (minute > 59) minute = 0;
setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}
break;
case 0x61D650AF:
{
status = 3;
}
break;
case 0x61D628D7:
{
status = 4;
}
break;
}
// Serial.println( results.value, HEX ); // печатаем данные
irrecv.resume(); // принимаем следующую команду
}
}
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.