برد STM سخت افزار نمایشگر LCD

پروژه ساعت دیجیتال با ماژول DS3231 و برد میکروکنترلر STM32 BluePill

نوشته شده توسط علی زاهدی

بررسی زمان دقیق در برخی پروژه های الکترونیکی بسیار حیاتی است. روش‌های مختلفی برای اندازه‌گیری ساعت دقیق وجود دارد. از جمله این روش ها میتوان به اتصال کریستال ساعت به میکروکنترلر و محاسبه ساعت نسبتا دقیق اشاره نمود. اما برای استفاده از ساعت دقیق در پروژه روش‌های آسان‌تری هم وجود دارد که آن استفاده استفاده از ایسی های ساعت مانند Ds1307 و Ds3231 است. پیش از این راه اندازی ماژول Ds3231 را با استفاده از میکروکنترلر های AVR را آموزش دادیم اما در پست ساعت دیجیتال با STM32 قصد داریم تا نحوه راه اندازی ماژول Ds3231 را با استفاده از میکروکنتلرهای STM32 آموزش دهیم.

 


ماژول ساعت DS3231 فوق دقیق


تراشه ساعت DS2331 آی سی تکمیل شده و پیشرفته‌تر DS1307 می‌باشد. این تراشه علاوه بر امکانات DS1307 از دقت بالاتر، با قابلیت تنظیم آلارم می‌باشد. ولتاژ کاری ماژول ۳٫۳ الی ۵٫۵ ولت بوده و از باتری بک آپ و جریان مصرفی بسیار پایین استفاده می‌کند. در واقع این ماژول ساعت زمان واقعی یا همان RTC مخفف شده real time clock می‌باشد. ساعت DS3231 از پروتکل سریال I2C پشتیبانی می‌کند. کارکرد این ماژول براساس کدهای binary coded decimal که اصطلاحا کد BCD نامیده می‌شود، است. باتری بک آپ قرار گرفته بر روی این ماژول زمانی که جریان برق در دسترس نیست باعث جلوگیری از عقب افتادن زمان خواهد شد. منبع کلاک این آی سی از یک کریستال ساعت به فرکانس ۳۲٫۷۶۸KHZ استفاده می‌کند.

این آی سی قابل کارکرد در دو حالت ۲۴ ساعته و ۱۲ساعته AM/PM را دارد. همچنین علاوه بر ساعت بصورت ثانیه، دقیقه، ساعت امکان ذخیره تاریخ بصورت روز، هفته، ماه، سال را نیز دارد. در ضمن اطلاعات نوشته شده بر روی این آی سی تا سال ۲۱۰۰ برنامه ریزی شده است. از دیگر امکانات این ماژول می‌توان به اندازه‌گیری دما اشاره نمود.

ds3231


معرفی کتابخانه DS3231 برای STM32


برای راه اندازی ماژول Ds3231 بر روی میکروکنترلر های STM32 نیاز است که از کتابخانه مربوط به این ماژول استفاده کنید. شما میتوانید کتابخانه مربوط به این ماژول را خود بسازید. اما کتابخانه های بسیار خوب و کاملی از قبل برای این ماژول نوشته شده است. یکی از کتابخانه هایی که بنظر من بسیار کامل بود. کتابخانه DS3231_for_STM32_HAL است. با کلیک بر روی لینک میتوانید وارد Github شده و این کتابخانه را دانلود کنید. توابع موجود در این کتابخانه به شرح زیر است.

  • void DS3231_Init(I2C_HandleTypeDef *hi2c);

این تابع برای انجام تنظیمات اولیه ماژول است. این تابع دارای یک ورودی است. در قسمت ورودی این تابع بایستی I2C فعال شده برای ارتباط با DS3231 را معرفی کنید. برای درک بهتر به مثال زیر توجه کنید.

DS3231_Init(&hi2c1);

 

  • توابع مربوط به دریافت ساعت و تاریخ

در این کتابخانه برای دریافت پارامتر های ساعت و تاریخ توابع جداگانه ای تعریف شده است که این توابع عبارتند از؛

//توابع تاریخ
uint8_t DS3231_GetDayOfWeek(void); // روز از هفته
uint8_t DS3231_GetDate(void); // روز از ماه
uint8_t DS3231_GetMonth(void); // ماه
uint16_t DS3231_GetYear(void); // سال
// توابع ساعت
uint8_t DS3231_GetHour(void); // ساعت
uint8_t DS3231_GetMinute(void); // دقیقه
uint8_t DS3231_GetSecond(void); // ثانیه

شما با تعریف متغیر و قرار دادن در قسمت خروجی تابع میتوانید مقادیر مربوطه را از ماژول دریافت نموده و در کد خود استفاده کنید. برای درک بهتر این مطلب به کدی که در انتهای آموزش قرار داده شده است توجه کنید.

  • توابع مربوط به تنظیم ساعت و تاریخ

برای تنظیم این پارامتر ها نیز همانند دریافت پارامتر ها توابع جداگانه تعریف شده است. البته در این کتابخانه دو تابع دیگر نیز وجود دارد که با استفاده از آن میتوانید تمام پارامتر های ساعت و تاریخ را بصورت یکجا تعریف کنید. توابع تنظیم ساعت و تاریخ عبارتند از؛

// تنظیم پارامتر های تاریخ
void DS3231_SetDayOfWeek(uint8_t dow); // روز از هفته
void DS3231_SetDate(uint8_t date); // روز ار ماه
void DS3231_SetMonth(uint8_t month); // ماه
void DS3231_SetYear(uint16_t year); // سال
// تنظیم پارامتر های ساعت
void DS3231_SetHour(uint8_t hour_24mode); // ساعت 
void DS3231_SetMinute(uint8_t minute); // دقیقه
void DS3231_SetSecond(uint8_t second); // ثانیه
// تنظیم پارامتر های ساعت بصورت یکجا
void DS3231_SetFullTime(uint8_t hour_24mode, uint8_t minute, uint8_t second);
// تنظیم پارامتر های تاریخ بصورت یکجا
void DS3231_SetFullDate(uint8_t date, uint8_t month, uint8_t dow, uint16_t year);

برای مثال شما اگر بخواهید تاریخ ماژول را ۲۰۲۱/۲/۲۰ و ساعت را ۱۰:۳۳:۱۵ ثانیه تنظیم کنید. بایستی کد زیر را در برنامه خود قرار دهید.

void DS3231_SetFullTime(10, 33, 15); 
void DS3231_SetFullDate(20, 2, 6, 2021);

توابع دیگری نیز در این کتابخانه موجود است. از جمله توابع مربوط به تنظیم ALARM، خواندن دمای ماژول و … که شما با مراجعه به فایل  ds3231_for_stm32_hal.h  میتوانید تمامی توابع موجود در کتابخانه را مشاهده کنید. در ادامه کدی برای خواندن ساعت و نمایش آن بر روی LCD کاراکتری نوشته شده است.

 


اتصالات DS3231 به STM32


در این پروژه زبان با استفاده از ماژول DS3231 زمان محاسبه می شود و بر روی نمایشگر LCD کاراکتری نمایش داده میشود. برای درک بهتر این مطلب به شماتیک زیر توجه کنید.

اتصالات DS3231 به STM32 - دیجی اسپارک

 


پیکربندی میکروکنترلر STM32


ابتدا بایستی پروژه جدیدی در نرم‌افزار STM32CubeMX ایجاد کنید. در صورتی که با نحوه ایجاد پروژه در این نرم افزار آشنایی ندارید. بخش اول آموزش میکروکنترلر های STM32 را مطالعه کنید. سپس بایستی وارد یکی از I2C موجود بر روی میکروکنترلر شده و این بخش را با گزینه I2C فعال کنید. مشاهده می‌کنید که پایه های مربوط به I2C بر روی میکروکنترلر به رنگ سبز درآمده است. سپس ۷ پایه برای LCD بر روی میکروکنترلر برای LCD درنظر بگیرید و آن هارا بعنوان خروجی تعریف کنید. در صورتی که با نحوه راه اندازی LCD آشنا نیستید. آموزش راه اندازی LCD کاراکتری با بردهای میکروکنترلر STM32 را مطالعه کنید.

Stm32 Pinout

سپس از صفحه Clock Configuration فرکانس کاری میکروکنترلر را به دلخواه تنظیم کنید. سپس وارد صفحه ی Project Manager شوید. پس از انتخاب نام و IDE برای پروژه بر روی CODE GENERATE کلیک کرده و وارد نرم افزار KEIL شوید.

 


کدنویسی پروژه DS3231 و STM32


ابتدا بایستی کتابخانه DS3231_for_STM32_HAL را دانلود کنید. سپس کتابخانه را به پروژه خود اضافه کنید. سپس کد زیر را به فایل main.c خود اضافه کنید. همانطور که در آموزش های قبلی میکروکنترلر های STM32 گفته شده است. زمانی که از نرم افزار STM32CubeMX برای ساخت پروژه استفاده می‌کنید. در فایل هایی که توسط این نرم افزار ساخته می‌شود. قسمت هایی برای نوشتن کد توسط کاربر مشخص شده است. شما بایستی کد زیر را به این قسمت ها اضافه کنید.

#include "ds3231_for_stm32_hal.h"
#include "character_lcd.h"
#include <stdio.h>



int main(void)
{
  // local variable
  uint8_t Hour,Minute,Second;
  uint16_t Year;
  uint8_t Month,Day;
  char LCD_Buffer[16];

  //Ds3231
  DS3231_Init(&hi2c1);
  
  //LCD
  Lcd_Config.Font = _FONT_5X10;
  Lcd_Config.Mode = _4BIT_INTERFACE;
  Lcd_Config.NumberOfLine = _2LINE_DISPLAY;
  Lcd_Init();

  while (1)
  {
			Hour = DS3231_GetHour();
			Minute = DS3231_GetMinute();
			Second = DS3231_GetSecond();
			Day = DS3231_GetDate();
			Month = DS3231_GetMonth();
			Year = DS3231_GetYear();
			sprintf(LCD_Buffer,"Clock  %2d:%2d:%2d",Hour,Minute,Second);
			Lcd_GotoXY(0,0);
			Lcd_PutString(LCD_Buffer);
			sprintf(LCD_Buffer,"Date  %4d/%2d/%2d",Year,Month,Day);
			Lcd_GotoXY(0,1);
			Lcd_PutString(LCD_Buffer);
				
  }
}

در آخر بایستی برنامه را کامپایل کرده و بر روی برد Bluepill پروگرام کنید. در صورتی که با نحوه پروگرام کردن میکروکنترلر های Stm32 آشنا نیستید. لطفا بخش اول آموزش های میکروکنترلر Stm32 را مطالعه نمایید.

 

پروژه ماژول ساعت DS3231 به STM32 - دیجی اسپارک

 


جمع بندی


در این آموزش به معرفی ماژول DS3231 و قابلیت های آن پرداختیم. سپس کتابخانه ای برای راه اندازی ماژول Ds3231 با استفاده از میکروکنترلر STM3  معرفی شد. همچنین توابع مربوط به دریافت ساعت و تاریخ از ماژول و همچنین توابع مربوط به تنظیم ساعت و تاریخ ماژول توضیح داده شد. در ادامه نحوه پیکربندی میکروکنترلر در نرم افزار STM32CubeMX توضیح داده شد. در آخر کدی برای دریافت ساعت و تاریخ از ماژول و نمایش آن بر روی LCD کاراکتری نوشته شده است.

 


لوازم مورد نیاز


 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

دانسته هایتان را مانند یک ساعت مچی در دست کنید، نه صرفا به این خاطر که نشان دهید آن را دارید. بلکه به این خاطر که اگر کسی از شما ساعت را پرسید، برایش بگویید.
لرد چسترفیلد

تبادل نظر و رفع عیب با ثبت دیدگاه

۵ دیدگاه