Logo

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

СNC shield v3 + A4988
I2C-PCA9685

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

Мы в соц сетях


Подпишись на канал
Мы на facebook

Arduino часы. Подключаем к Arduino DS3231 модуль и ИК приемник

.Arduino часы. Подключаем к Arduino DS3231 модуль и ИК приемник

Продолжаем собирать Arduino часы . И в данной статье мы подключим к Arduino DS3231 модуль реального времени , ИК приемник и выведи полученную информацию на семи сегментный индикатор TM1637 .

Посмотрите предыдущие части сборки LED часов на Arduino :

1. Светодиодные часы на Arduino Паяем 74HC595N для управления LED

2. Arduino часы. Подключаем к Arduino семисегментный индикатор TM1637, датчик DHT11

Подключим DS3231 модуль , ИК приемник и семи сегментный индикатор к Arduino вот по такой схеме.

Подключим DS3231 модуль , ИК приемник и семи сегментный индикатор к Arduino вот по такой схеме.

При подключении будьте внимательны при подключении ИК приемника . Возможно, что ваш приемник подключаться к другом ножкам. Поищите в интернете где у вашего приемника VCC, GND, DATA. Я спалил один ИК приемник, подключил его не к тем пинам.

Принципиальная схема подключения к Arduino DS3231 модуль реального времени , ИК приемник и семи сегментного индикатора TM1637 .

Принципиальная схема подключения к Arduino DS3231 модуль реального времени, ИК приемник и семи сегментного индикатора TM1637.


При написании кода часть функций взял из интернета без изменений.

///// часы ..
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); 
}

Добавлял переменные.

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;
   }

Температура и влажность не выводиться так как в данной части мы не подключаем датчик температуры и влажности DHT11 . Как подключить датчик температуры рассказывал в предыдущей статье: « Arduino часы. Подключаем к Arduino семисегментный индикатор TM1637, датчик DHT11».


Настройка времени с помощью пульта.

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(); // принимаем следующую команду
  }
}
Вернуться в раздел: Проекты на Arduino Дата публикации 11 мая , 2017

Яндекс.Метрика

Portal-PK (Портал ПК) © 2015 - 2017 MiniYiiCMS Заказать сайт: f-studio.biz
Обратная связь
Вопрос-Ответ