Arduino и ZS-042

28-05-2020, 15:28 0 комментариев
Сегодня говорим о том, как подключить модуль ZS-042 к Arduino. Такая периферия востребована во многих современных проектах, где есть необходимость учета хронометрических данных (времени, даты). О подобных приборах мы уже писали, обсуждали их достоинства и сферу применения, повторяться не будем. Отметим лишь пару важных моментов.
 
Часто эти микросхемы имеют кварцевый резонатор внутри (но не все модели). Часы умеют производить подсчёт секунд, минут, часов, месяцев и даже лет. Функционируют в 12 или 24 часовом режиме с отображением AM/PM, содержат несколько будильников (чаще два), а также снабжены интегрированным термометром. Подключаются по I2C-шине. Кроме того, они функциональны и практичны, могут быть задействованы в качестве основных ∕ дополнительных элементов для модернизации будильников, систем оповещения и сигнализации, различных GPS-модулей, электросчетчиков, телеметрического оборудования и т.п.

Перейдем к техническим параметрам шилда:
  • тип микрочипа: DS3231;
  • напряжение: 2,3 или 5V;
  • точность: около 0.432 сек∕день;
  • диапазон рабочих температур (коммерческий): -40 ° … + 85 ° C;
  • внешняя EEPROM память: 32 байт;
  • частота внутреннего генератора: 32768 Гц;
  • скорость соединения: 100-400 кГц;
  • имеется вход/выход сброса nonRST;
  • размеры: 38×22×15мм.
Распиновка часов показана ниже:
Принципиальная схема:
Теперь займемся подключением ZS-042 к Ардуино. Для сборки нам понадобятся такие аппаратные компоненты как: плата расширения Ардуино Уно (подойдут и другие), модуль часов, комплект соединительных проводов, ПК, при возможности макетная плата.
Схема будет выглядеть следующим образом:
Заливаем программный скетч:
#include <Wire.h>
#include <OLED_I2C.h>

OLED  myOLED(SDA, SCL, 8);

extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
 
   
 ///// часы ..
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
{
   Wire.beginTransmission(0x68);
   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 getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(0x68, 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());
}
  
///// температура ..
float get3231Temp(){
  byte tMSB, tLSB; 
  float temp3231;

  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 2);

  if(Wire.available()) {
    tMSB = Wire.read(); //2's complement int portion
    tLSB = Wire.read(); //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()
{
  Serial.begin(9600);
  myOLED.begin();
  Wire.begin();
 

 /*  // установка часов
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  second = 30;
  minute = 0;
  hour = 14;
  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;
  char week[8][10] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  char time[10];
  char data[11];
  
  snprintf(time, sizeof(time),"%02d:%02d:%02d",           
           hour, minute, second);
           
  snprintf(data, sizeof(data), "%02d/%02d/%02d",            
            dayOfMonth, month, year);
  
  myOLED.setFont(SmallFont);
 
  myOLED.print(time, LEFT, 0);
  myOLED.print(data, LEFT, 15);
  myOLED.printNumF(get3231Temp(), 2, LEFT, 30);
  myOLED.print("C", 32, 30);
  myOLED.update();

 delay(1000);
}

////// конец
В нем мы использовали 2 специализированные утилиты – библиотеку Wire (для управления интерфейсом) и узкопрофильную OLED_I2C. Скачать их можно на нашем сайте в одноименном разделе «Библиотеки». Не забывайте распаковать их и поместить в папку «libraries» в среде Arduino IDE.
Для следующего проекта нужен уже другой софт: Time и DS1307RTC. Процедура аналогична.
Меняем прошивку:
//Подключаем библиотеки:
#include <Time.h>  
#include <Wire.h>  
#include <DS1307RTC.h>

void setup()  {
setSyncProvider(RTC.get);
//Устанавливаем время в формате:
//Часы, минуты, секунды, день, месяц, год
setTime(13,35,0,20,01,2020);
//Применяем:
RTC.set(now());
}
void loop()
{
delay(100);
}
Проверить корректность вывода значений можно в Serial Monitor – открыть монитор последовательного порта можно сочетанием клавиш Ctrl+Shift+M либо через меню Инструменты.

На этом наша статья подошла к концу. Надеемся, у вас все получится! Удачи!
Поделись в социальных сетях:
О авторе
Калугин Антон

Программист микроконтроллеров с 8-ми летним стажем, работал в таких компаниях как IBM, ASUS, Microsoft.

В комментариях с радостью отвечу на ваши вопросы.

Все статьи автора
Похожие новости

Сегодня хотим рассказать вам о том, как происходит подключение DS3231 к Arduino и что это за электронное устройство. Речь идет о модуле часов реального...

Сегодня поговорим о том, как воплотить в жизнь подключение FPM10A к Arduino, что это за модуль, где используется, каковы параметры его работы и т.д. Речь идет...

В новом информационном обзоре рассматриваем GSM модуль SIM800L к Arduino. Почему выбрано именно это устройство? Во-первых, оно достаточно известно и популярно...

Подключение Motor Shield к Arduino у многих любителей электроники вызывает определенные затруднения. Тем не менее этот драйвер двигателей очень популярен и...

В этой статье мы рассмотрим подключение ADS1115 к Ардуино. Речь идет о 16-битном аналого-цифровом преобразователе, оснащенном 4 входами непосредственно для...

Оставить комментарий