جستجو برای:
سبد خرید 0
  • خانه
  • فروشگاه
    • دوره های آموزشی
    • پروژه
    • بسته های آموزشی
      • رباتیک
      • آردوینو
  • هوافضا
    • آموزش هوافضا
      • فیلم های آموزش هوافضا
      • PDF های آموزش هوافضا
    • محصولات هوافضایی
    • نرم افزار های هوافضا
    • تازه های هوافضا
  • رباتیک
    • آموزش رباتیک
      • فیلم های آموزش رباتیک
        • PDF های آموزش رباتیک
    • دیتاشیت فارسی
    • نرم افزار های رباتیک
    • تازه های رباتیک
    • تاریخ مسابقات
  • پروژه
    • پروژه های رایگان
    • پروژه های آماده
    • پروژه های آردوینو
    • پروژه های رزبری پای
    • پروژه های بدون میکروکنترلر
    • پردازش تصویر
    • سفارش پروژه
  • دوره های آموزشی
    • کلاس های آموزشی
    • فیلم های آموزشی
    • جلسه های آموزشی
      • آموزش آردوینو
      • آموزش رسپبری پای
      • آموزش STM32
      • ربات پرنده
      • رباتیک مقدماتی
  • تماس با ما
  • درباره ما
  • مقالات
شروع ثبت نام دوره تابستانی آوات روبو
فرصت تکرار نشدنی ثبت نام در دوره های حضوری با 20% تخفیف!
ساعت
دقیقه
ثانیه
مشاهده دوره های آموزشی
رباتیک و هوافضا
ورود
با ایمیل با شماره موبایل
گذرواژه خود را فراموش کرده اید؟
عضویت
با ایمیل با شماره موبایل
  • 09152556924
  • sup@avatrobo.ir
رباتیک و هوافضا
  • خانه
  • فروشگاه
    • دوره های آموزشی
    • پروژه
    • بسته های آموزشی
      • رباتیک
      • آردوینو
  • هوافضا
    • آموزش هوافضا
      • فیلم های آموزش هوافضا
      • PDF های آموزش هوافضا
    • محصولات هوافضایی
    • نرم افزار های هوافضا
    • تازه های هوافضا
  • رباتیک
    • آموزش رباتیک
      • فیلم های آموزش رباتیک
        • PDF های آموزش رباتیک
    • دیتاشیت فارسی
    • نرم افزار های رباتیک
    • تازه های رباتیک
    • تاریخ مسابقات
  • پروژه
    • پروژه های رایگان
    • پروژه های آماده
    • پروژه های آردوینو
    • پروژه های رزبری پای
    • پروژه های بدون میکروکنترلر
    • پردازش تصویر
    • سفارش پروژه
  • دوره های آموزشی
    • کلاس های آموزشی
    • فیلم های آموزشی
    • جلسه های آموزشی
      • آموزش آردوینو
      • آموزش رسپبری پای
      • آموزش STM32
      • ربات پرنده
      • رباتیک مقدماتی
  • تماس با ما
  • درباره ما
  • مقالات
شروع کنید
آخرین اطلاعیه ها
لطفا برای نمایش اطلاعیه ها وارد شوید
0

وبلاگ

رباتیک و هوافضا > مقالات > پروژه > ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردوینو

ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردوینو

اسفند 19, 1396
ارسال شده توسط mjavad
پروژه، پروژه های آردوینو، پروژه های رایگان
پروژه ی ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو,دانلود ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو , آموزش ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو , کد ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو ,ساخت دماسنج به همراه کنترل از راه دور با آردونیو

به نام خدا

ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردوینو

 

پروژه ی ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو,دانلود ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو , آموزش ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو , کد ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو ,ساخت دماسنج به همراه کنترل از راه دور با آردونیو

به عنوان یک افزودنی ساده به پروژه ساعت آردوینو با آلارم و پروژه مانیتور دما ، قصد داریم به یک سیستم کنترل از راه دور IR به مدار اضافه کنیم. کنترل از راه دور مورد استفاده در این پروژه یک ریموت کنترل تلویزیون (تلویزیون ال جی) است که با استفاده از پروتکل RC-5، این کنترل از راه دور برای تنظیم ساعت زمان واقعی، تقویم و آلارم استفاده می شود .
ما باید کنترل از راه دور خود را رمزگشایی کنیم تا  کد هر دکمه را بدست آوریم زیرا  باید این کد ها را در کد آردوینو اضافه کنیم.

قطعات مورد نیاز ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردوینو :

  • آردوینو uno
  • ماژول DS3231
  • ال سی دی کاراکتری 4*20
  • کنترل از راه دور
  • گیرنده مادون قرمز
  • LED
  • خازن 47uf
  • پتانسیومتر 10k
  • 2 قطعه مقاومت 330 اهم
  • باتری ساعتی 3 ولت
  • برد برد
  • سیم برد بردی

 

توضیحات مدار :

شماتیک مدار پروژه در تصویر زیر نشان داده شده است.

پروژه ی ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو,دانلود ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو , آموزش ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو , کد ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو ,ساخت دماسنج به همراه کنترل از راه دور با آردونیو

ماژول DS3231 و LCD و گیرنده مادون قرمز  با 5 ولت تغذیه می شوند که در روی برد آردوینو موجود است. سه خط دیتا بین ماژول DS3231 و آردوینو وجود دارد ، SCL  به پین آنالوگ 4 ، SDA به پین دیجیتال 2 و INT  به پین دیجیتال 2 که همان وقفه خارجی  ( INT 0)میکرو کنترلر است متصل شده است . DS3231 یک وقفه برای میکروکنترلر موجود روی برد آردوینو زمانی که هشدار وجود داشته باشد ایجاد می کند .

گیرنده مادون قرمز سه پایه دارد : GND و VCC و OUT که پین OUT به پین دیجیتال 3 آردوینو که همان وقفه شماره 2 است متصل شده است .

LED که به پین 10 آردوینو متصل شده است به عنوان نشانگر برای زمانی که آلارمی فعال  می شود عمل می کند.

 

کد آردوینو :

در کد این پروژه از کتابخانه DS3231 استفاده نشده است.

دکمه های استفاده شده ریموت کنترل با شماره مشخص شده اند .

پروژه ی ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو,دانلود ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو , آموزش ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو , کد ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیو ,ساخت دماسنج به همراه کنترل از راه دور با آردونیو

کد های هر دکمه (در مبنای شانزده ) :

1 افزایش0x20
2 تنظیم تاریخ و ساعت 0x10
3  کاهش0x21
4 تنظیم آلارم 0x11
5 قطع کردن آلارم 0x25

دکمه #1 برای افزایش پارامتر انتخاب شده (ساعت، دقیقه، روز، تاریخ، ماه، سال،  زنگ  ساعت ، دقیقه زنگ و وضعیت زنگ (روشن و خاموش))و دکمه #3 برای کاهش دادن آن پارامتر ها مورد استفاده قرار میگیرد. پارامترهای زمان و تقویم با دکمه شماره 2 انتخاب می شوند و پارامترهای آلارم (زنگ هشدار 1 و هشدار 2) با دکمه شماره 4 انتخاب می شوند.

هنگامی که هشدار (زنگ هشدار 1 یا زنگ هشدار 2)، آردوینو LED  را روشن می کند، در اینجا دکمه شماره 5 LED را روشن می کند و هشدار رخ داده قطع می شود.

دانلود کد برنامه ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردوینو:

[maxbutton id=”210″ url=”http://avatrobo.ir/wp-content/uploads/2018/03/Arduino-real-time-clock-and-calendar.txt” ]

/* Arduino real time clock and calendar with 2 alarm functions, temperature monitor and RC-5 IR remote control
   Read DS3231 RTC datasheet to understand the code
   DS3231 interrupt pin is connected to Arduino external interrupt pin (pin #2).
*/

// Define number of Timer1 ticks (with a prescaler of 1/8)
#define short_time     1400                      // Used as a minimum time for short pulse or short space ( ==>  700 us)
#define   med_time     2400                      // Used as a maximum time for short pulse or short space ( ==> 1200 us)
#define  long_time     4000                      // Used as a maximum time for long pulse or long space   ( ==> 2000 us)

// include LCD library code
#include <LiquidCrystal.h>
// include Wire library code (needed for I2C protocol devices)
#include <Wire.h>

// LCD module connections (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

const int alarm_pin = 10;                     // Alarms pin number

void setup() {
  pinMode(alarm_pin, OUTPUT);
  digitalWrite(alarm_pin, LOW);
  // set up the LCD's number of columns and rows
  lcd.begin(20, 4);
  // Timer1 module configuration
  TCCR1A = 0;
  TCCR1B = 0;                                    // Disable Timer1 module
  TCNT1  = 0;                                    // Set Timer1 preload value to 0 (reset)
  TIMSK1 = 1;                                    // enable Timer1 overflow interrupt
  Wire.begin();                                  // Join i2c bus
  attachInterrupt(1, RC5_read, CHANGE);          // Enable external interrupt (INT1)
  attachInterrupt(0, Alarm, FALLING);            // Enable external interrupt (INT0)
}
// RC5 remote control variables
boolean rc5_ok = 0, toggle, last_toggle;
byte rc5_state = 0, j;
unsigned int rc5_code;
// RTC Variables declaration
bool alarm1_status, alarm2_status;
char Time[]     = "  :  :  ",
     calendar[] = "      /  /20  ",
     alarm1[]   = "A1:   :  :00", alarm2[]   = "A2:   :  :00",
     temperature[] = "T:   .   C";
byte  i, second, minute, hour, day, date, month, year,
      alarm1_minute, alarm1_hour, alarm2_minute, alarm2_hour,
      status_reg;

void RC5_read() {
unsigned int timer_value;
  if(rc5_state != 0){
    timer_value = TCNT1;                         // Store Timer1 value
    TCNT1 = 0;                                   // Reset Timer1
  }
  switch(rc5_state){
   case 0 :                                      // Start receiving IR data (initially we're at the beginning of mid1)
    TCNT1  = 0;                                  // Reset Timer1
    TCCR1B = 2;                                  // Enable Timer1 module with 1/8 prescaler ( 2 ticks every 1 us)
    rc5_state = 1;                               // Next state: end of mid1
    j = 0;
    return;
   case 1 :                                      // End of mid1 ==> check if we're at the beginning of start1 or mid0
    if((timer_value > long_time) || (timer_value < short_time)){         // Invalid interval ==> stop decoding and reset
      rc5_state = 0;                             // Reset decoding process
      TCCR1B = 0;                                // Disable Timer1 module
      return;
    }
    bitSet(rc5_code, 13 - j);
    j++;
    if(j > 13){                                  // If all bits are received
      rc5_ok = 1;                                // Decoding process is OK
      toggle = bitRead(rc5_code, 11);            // Toggle bit is bit number 11
      rc5_code &= 0x07FF;                        // Remove the two start bits and the toggle bit from the code message
      detachInterrupt(1);                        // Disable external interrupt (INT1)
      return;
    }
      if(timer_value > med_time){                // We're at the beginning of mid0
        rc5_state = 2;                           // Next state: end of mid0
        if(j == 13){                             // If we're at the LSB bit
          rc5_ok = 1;                            // Decoding process is OK
          bitClear(rc5_code, 0);                 // Clear the LSB bit
          toggle = bitRead(rc5_code, 11);        // Toggle bit is bit number 11
          rc5_code &= 0x07FF;
          detachInterrupt(1);                    // Disable external interrupt (INT1)
          return;
        }
      }
      else                                       // We're at the beginning of start1
        rc5_state = 3;                           // Next state: end of start1
      return;
   case 2 :                                      // End of mid0 ==> check if we're at the beginning of start0 or mid1
    if((timer_value > long_time) || (timer_value < short_time)){
      rc5_state = 0;                             // Reset decoding process
      TCCR1B = 0;                                // Disable Timer1 module
      return;
    }
    bitClear(rc5_code, 13 - j);
    j++;
    if(timer_value > med_time)                   // We're at the beginning of mid1
      rc5_state = 1;                             // Next state: end of mid1
    else                                         // We're at the beginning of start0
      rc5_state = 4;                             // Next state: end of start0
    return;
   case 3 :                                      // End of start1 ==> check if we're at the beginning of mid1
    if((timer_value > med_time) || (timer_value < short_time)){           // Time interval invalid ==> stop decoding
      TCCR1B = 0;                                // Disable Timer1 module
      rc5_state = 0;                             // Reset decoding process
      return;
    }
    else                                         // We're at the beginning of mid1
      rc5_state = 1;                             // Next state: end of mid1
    return;
   case 4 :                                      // End of start0 ==> check if we're at the beginning of mid0
    if((timer_value > med_time) || (timer_value < short_time)){           // Time interval invalid ==> stop decoding
      TCCR1B = 0;                                // Disable Timer1 module
      rc5_state = 0;                             // Reset decoding process
      return;
    }
    else                                         // We're at the beginning of mid0
      rc5_state = 2;                             // Next state: end of mid0
    if(j == 13){                                 // If we're at the LSB bit
      rc5_ok = 1;                                // Decoding process is OK
      bitClear(rc5_code, 0);                     // Clear the LSB bit
      toggle = bitRead(rc5_code, 11);            // Toggle bit is bit number 11
      rc5_code &= 0x07FF;
      detachInterrupt(1);                        // Disable external interrupt (INT1)
    }
  }
}
ISR(TIMER1_OVF_vect) {                           // Timer1 interrupt service routine (ISR)
  rc5_state = 0;                                 // Reset decoding process
  TCCR1B = 0;                                    // Disable Timer1 module
}

void Alarm(){
  digitalWrite(alarm_pin, HIGH);
}
void DS3231_read(){                             // Function to read time & calendar data
  Wire.beginTransmission(0x68);                 // Start I2C protocol with DS3231 address
  Wire.write(0);                                // Send register address
  Wire.endTransmission(false);                  // I2C restart
  Wire.requestFrom(0x68, 7);                    // Request 7 bytes from DS3231 and release I2C bus at end of reading
  second = Wire.read();                         // Read seconds from register 0
  minute = Wire.read();                         // Read minuts from register 1
  hour   = Wire.read();                         // Read hour from register 2
  day    = Wire.read();                         // Read day from register 3
  date   = Wire.read();                         // Read date from register 4
  month  = Wire.read();                         // Read month from register 5
  year   = Wire.read();                         // Read year from register 6
}
void alarms_read_display(){                     // Function to read and display alarm1, alarm2 and temperature data
  byte control_reg, temperature_lsb;
  char temperature_msb;
  Wire.beginTransmission(0x68);                 // Start I2C protocol with DS3231 address
  Wire.write(0x08);                             // Send register address
  Wire.endTransmission(false);                  // I2C restart
  Wire.requestFrom(0x68, 11);                   // Request 11 bytes from DS3231 and release I2C bus at end of reading
  alarm1_minute = Wire.read();                  // Read alarm1 minutes
  alarm1_hour   = Wire.read();                  // Read alarm1 hours
  Wire.read();                                  // Skip alarm1 day/date register
  alarm2_minute = Wire.read();                  // Read alarm2 minutes
  alarm2_hour   = Wire.read();                  // Read alarm2 hours
  Wire.read();                                  // Skip alarm2 day/date register
  control_reg = Wire.read();                    // Read the DS3231 control register
  status_reg  = Wire.read();                    // Read the DS3231 status register
  Wire.read();                                  // Skip aging offset register
  temperature_msb = Wire.read();                // Read temperature MSB
  temperature_lsb = Wire.read();                // Read temperature LSB
    // Convert BCD to decimal
  alarm1_minute = (alarm1_minute >> 4) * 10 + (alarm1_minute & 0x0F);
  alarm1_hour   = (alarm1_hour   >> 4) * 10 + (alarm1_hour & 0x0F);
  alarm2_minute = (alarm2_minute >> 4) * 10 + (alarm2_minute & 0x0F);
  alarm2_hour   = (alarm2_hour   >> 4) * 10 + (alarm2_hour & 0x0F);
    // End conversion
  alarm1[8]     = alarm1_minute % 10  + 48;
  alarm1[7]     = alarm1_minute / 10  + 48;
  alarm1[5]     = alarm1_hour   % 10  + 48;
  alarm1[4]     = alarm1_hour   / 10  + 48;
  alarm2[8]     = alarm2_minute % 10  + 48;
  alarm2[7]     = alarm2_minute / 10  + 48;
  alarm2[5]     = alarm2_hour   % 10  + 48;
  alarm2[4]     = alarm2_hour   / 10  + 48;
  alarm1_status = bitRead(control_reg, 0);      // Read alarm1 interrupt enable bit (A1IE) from DS3231 control register
  alarm2_status = bitRead(control_reg, 1);      // Read alarm2 interrupt enable bit (A2IE) from DS3231 control register
  if(temperature_msb < 0){
    temperature_msb = abs(temperature_msb);
    temperature[2] = '-';
  }
  else
    temperature[2] = ' ';
  temperature_lsb >>= 6;
  temperature[4] = temperature_msb % 10  + 48;
  temperature[3] = temperature_msb / 10  + 48;
  if(temperature_lsb == 0 || temperature_lsb == 2){
    temperature[7] = '0';
    if(temperature_lsb == 0) temperature[6] = '0';
    else                     temperature[6] = '5';
  }
  if(temperature_lsb == 1 || temperature_lsb == 3){
    temperature[7] = '5';
    if(temperature_lsb == 1) temperature[6] = '2';
    else                     temperature[6] = '7';
  }
  temperature[8]  = 223;                        // Put the degree symbol
  lcd.setCursor(10, 0);
  lcd.print(temperature);                       // Display temperature
  lcd.setCursor(0, 2);
  lcd.print(alarm1);                            // Display alarm1
  lcd.setCursor(17, 2);
  if(alarm1_status)  lcd.print("ON ");          // If A1IE = 1 print 'ON'
  else               lcd.print("OFF");          // If A1IE = 0 print 'OFF'
  lcd.setCursor(0, 3);
  lcd.print(alarm2);                            // Display alarm2
  lcd.setCursor(17, 3);
  if(alarm2_status)  lcd.print("ON ");          // If A2IE = 1 print 'ON'
  else               lcd.print("OFF");          // If A2IE = 0 print 'OFF'
}
void calendar_display(){                        // Function to display calendar
  switch(day){
    case 1:  strcpy(calendar, "Sun   /  /20  "); break;
    case 2:  strcpy(calendar, "Mon   /  /20  "); break;
    case 3:  strcpy(calendar, "Tue   /  /20  "); break;
    case 4:  strcpy(calendar, "Wed   /  /20  "); break;
    case 5:  strcpy(calendar, "Thu   /  /20  "); break;
    case 6:  strcpy(calendar, "Fri   /  /20  "); break;
    case 7:  strcpy(calendar, "Sat   /  /20  "); break;
    default: strcpy(calendar, "Sat   /  /20  ");
  }
  calendar[13] = year  % 10 + 48;
  calendar[12] = year  / 10 + 48;
  calendar[8]  = month % 10 + 48;
  calendar[7]  = month / 10 + 48;
  calendar[5]  = date  % 10 + 48;
  calendar[4]  = date  / 10 + 48;
  lcd.setCursor(0, 1);
  lcd.print(calendar);                          // Display calendar
}
void DS3231_display(){
  // Convert BCD to decimal
  second = (second >> 4) * 10 + (second & 0x0F);
  minute = (minute >> 4) * 10 + (minute & 0x0F);
  hour = (hour >> 4) * 10 + (hour & 0x0F);
  date = (date >> 4) * 10 + (date & 0x0F);
  month = (month >> 4) * 10 + (month & 0x0F);
  year = (year >> 4) * 10 + (year & 0x0F);
  // End conversion
  Time[7]     = second % 10  + 48;
  Time[6]     = second / 10  + 48;
  Time[4]     = minute % 10  + 48;
  Time[3]     = minute / 10  + 48;
  Time[1]     = hour   % 10  + 48;
  Time[0]     = hour   / 10  + 48;
  calendar_display();                           // Call calendar display function
  lcd.setCursor(0, 0);
  lcd.print(Time);                              // Display time
}
void Blink(){
  byte k = 0;
  while((!rc5_ok || (rc5_code != 0x10) && (rc5_code != 0x11) && (rc5_code != 0x20) && (rc5_code != 0x21)) && (k < 10)){
    k++;
    delay(25);
  }
}
byte edit(byte x, byte y, byte parameter){
  char text[3];
  rc5_reset();
  while(true){
    if(rc5_ok && (rc5_code == 0x20 || rc5_code == 0x21)){     // If RC5 code received
      if(rc5_code == 0x20){
        parameter++;
        if(((i == 0) || (i == 5)) && parameter > 23)          // If hours > 23 ==> hours = 0
          parameter = 0;
        if(((i == 1) || (i == 6)) && parameter > 59)          // If minutes > 59 ==> minutes = 0
          parameter = 0;
        if(i == 2 && parameter > 31)                          // If date > 31 ==> date = 1
          parameter = 1;
        if(i == 3 && parameter > 12)                          // If month > 12 ==> month = 1
          parameter = 1;
        if(i == 4 && parameter > 99)                          // If year > 99 ==> year = 0
          parameter = 0;
        if(i == 7 && parameter > 1)                           // For alarms ON or OFF (1: alarm ON, 0: alarm OFF)
          parameter = 0;
      }
      if(rc5_code == 0x21){
        if(((i == 0) || (i == 5)) && parameter < 1)
          parameter = 24;
        if(((i == 1) || (i == 6)) && parameter < 1)
          parameter = 60;
        if(i == 2 && parameter < 2)
          parameter = 32;
        if(i == 3 && parameter < 2)
          parameter = 13;
        if(i == 4 && parameter < 1)
          parameter = 100;
        if(i == 7 && parameter < 1)
          parameter = 2;
        parameter--;
      }
      lcd.setCursor(x, y);
      if(i == 7){                                           // For alarms ON & OFF
        if(parameter == 1)  lcd.print("ON ");
        else                lcd.print("OFF");
      }
      else{
        sprintf(text,"%02u", parameter);
        lcd.print(text);
      }
    }
    if(rc5_ok){
      delay(200);
      rc5_reset();
    }
    lcd.setCursor(x, y);
    lcd.print("  ");                            // Print two spaces
    if(i == 7) lcd.print(" ");                  // Print space (for alarms ON & OFF)
    Blink();                                    // Call Blink function
    lcd.setCursor(x, y);
    if(i == 7){                                 // For alarms ON & OFF
      if(parameter == 1)  lcd.print("ON ");
      else                lcd.print("OFF");
    }
    else{
      sprintf(text,"%02u", parameter);
      lcd.print(text);
    }
    Blink();
    if(i >= 5){
      DS3231_read();
      DS3231_display();
    }
    if(rc5_ok && last_toggle != toggle && ((rc5_code == 0x10 && i < 5) || (rc5_code == 0x11 && i >= 5))){
      i++;                                     // Increment 'i' for the next parameter
      return parameter;                         // Return parameter value and exit
    }
  }
}
void rc5_reset(){
  rc5_ok = 0;                                    // Reset decoding process
  rc5_state = 0;
  last_toggle = toggle;                          // Save toggle bit
  attachInterrupt(1, RC5_read, CHANGE);          // Enable external interrupt (INT1)
}

void loop() {
  if(rc5_ok){                                   // If RC5 code received
    if(rc5_code == 0x10){                       // If clock/calendar set button code received
      i = 0;
      hour   = edit(0, 0, hour);
      minute = edit(3, 0, minute);
      rc5_reset();
      while(true){
        if(rc5_ok && (rc5_code == 0x20)){       // If button up button code received
          day++;                                // Increment day
          if(day > 7) day = 1;
          calendar_display();                   // Call display_calendar function
          lcd.setCursor(0, 1);
          lcd.print(calendar);                  // Display calendar
        }
        if(rc5_ok){
          delay(200);
          rc5_reset();
        }
        lcd.setCursor(0, 1);
        lcd.print("   ");                       // Print 3 spaces
        Blink();
        lcd.setCursor(0, 1);
        lcd.print(calendar);                    // Print calendar
        Blink();                                // Call Blink function
        if(rc5_ok && last_toggle != toggle && (rc5_code == 0x10))               // If button B1 is pressed
         break;
      }
      date = edit(4, 1, date);                  // Edit date
      month = edit(7, 1, month);                // Edit month
      year = edit(12, 1, year);                 // Edit year
      // Convert decimal to BCD
      minute = ((minute / 10) << 4) + (minute % 10);
      hour = ((hour / 10) << 4) + (hour % 10);
      date = ((date / 10) << 4) + (date % 10);
      month = ((month / 10) << 4) + (month % 10);
      year = ((year / 10) << 4) + (year % 10);
      // End conversion
      // Write time & calendar data to DS3231 RTC
      Wire.beginTransmission(0x68);             // Start I2C protocol with DS3231 address
      Wire.write(0);                            // Send register address
      Wire.write(0);                            // Reset sesonds and start oscillator
      Wire.write(minute);                       // Write minute
      Wire.write(hour);                         // Write hour
      Wire.write(day);                          // Write day
      Wire.write(date);                         // Write date
      Wire.write(month);                        // Write month
      Wire.write(year);                         // Write year
      Wire.endTransmission();                   // Stop transmission and release the I2C bus
    }
    if(rc5_code == 0x11){                       // If alarm set button code received
      i = 5;
      alarm1_hour   = edit(4,  2, alarm1_hour);
      alarm1_minute = edit(7,  2, alarm1_minute);
      alarm1_status = edit(17, 2, alarm1_status);
      i = 5;
      alarm2_hour   = edit(4,  3, alarm2_hour);
      alarm2_minute = edit(7,  3, alarm2_minute);
      alarm2_status = edit(17, 3, alarm2_status);
      alarm1_minute = ((alarm1_minute / 10) << 4) + (alarm1_minute % 10);
      alarm1_hour   = ((alarm1_hour   / 10) << 4) + (alarm1_hour % 10);
      alarm2_minute = ((alarm2_minute / 10) << 4) + (alarm2_minute % 10);
      alarm2_hour   = ((alarm2_hour   / 10) << 4) + (alarm2_hour % 10);
      // Write alarms data to DS3231
      Wire.beginTransmission(0x68);               // Start I2C protocol with DS3231 address
      Wire.write(7);                              // Send register address (alarm1 seconds)
      Wire.write(0);                              // Write 0 to alarm1 seconds
      Wire.write(alarm1_minute);                  // Write alarm1 minutes value to DS3231
      Wire.write(alarm1_hour);                    // Write alarm1 hours value to DS3231
      Wire.write(0x80);                           // Alarm1 when hours, minutes, and seconds match
      Wire.write(alarm2_minute);                  // Write alarm2 minutes value to DS3231
      Wire.write(alarm2_hour);                    // Write alarm2 hours value to DS3231
      Wire.write(0x80);                           // Alarm2 when hours and minutes match
      Wire.write(4 | alarm1_status | (alarm2_status << 1));      // Write data to DS3231 control register (enable interrupt when alarm)
      Wire.write(0);                              // Clear alarm flag bits
      Wire.endTransmission();                     // Stop transmission and release the I2C bus
    }
    if(rc5_code == 0x25 && digitalRead(alarm_pin)){         // If rset alarm button code is received with alarm (Reset and turn OFF the alarm)
      digitalWrite(alarm_pin, LOW);               // Turn OFF the alarm indicator
      Wire.beginTransmission(0x68);               // Start I2C protocol with DS3231 address
      Wire.write(0x0E);                           // Send register address (control register)
      // Write data to control register (Turn OFF the occurred alarm and keep the other as it is)
      Wire.write(4 | (!bitRead(status_reg, 0) & alarm1_status) | ((!bitRead(status_reg, 1) & alarm2_status) << 1));
      Wire.write(0);                              // Clear alarm flag bits
      Wire.endTransmission();                     // Stop transmission and release the I2C bus
    }
    rc5_reset();
  }
  DS3231_read();                                // Read time and calendar parameters from DS3231 RTC
  alarms_read_display();                        // Read and display alarms parameters
  DS3231_display();                             // Display time & calendar
  delay(50);                                    // Wait 50ms
}
// End of code

 

برچسب ها: آردوینو یونوآموزش ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیودماسنجساخت دماسنج به همراه کنترل از راه دور با آردونیوساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیوکد ساعت زنگدار و دماسنج به همراه کنترل از راه دور با آردونیوکنترل از راه دور
قبلی پروژه ی کنترل دما با استفاده از فن از طریق آردوینو
بعدی پروژه ی ساخت مدار محاسبه ی مقدار انرژی ذخیره شده در باتری

پست های مرتبط

اردیبهشت 9, 1398

برنامه نویسی به زبان پایتون برای رزبری پای

mjavad
ادامه مطلب

اسفند 5, 1397

تشخیص رنگ با استفاده از رزبری پای

mjavad
ادامه مطلب

بهمن 10, 1397

راه اندازی ال سی 2 در 16 با استفاده رزبری پای قسمت دوم

mjavad
ادامه مطلب

بهمن 10, 1397

راه اندازی ال سی 2 در 16 با استفاده رزبری پای قسمت اول

mjavad
ادامه مطلب

بهمن 2, 1397

ساخت اسپیدکنترلر موتور براشلس 3 ( با سنسور )

Author Avatar
Admin
ادامه مطلب

دیدگاهتان را بنویسید لغو پاسخ

دسته های محصولات
آخرین دیدگاه‌ها
  • Admin در پروژه ی ساخت یک ریموت کنترل 2.4 گیگا هرتز برای 10 کانال
  • Admin در درباره ما
  • Admin در پروژه ی ساخت یک ریموت کنترل 2.4 گیگا هرتز برای 10 کانال
  • Admin در رادیوکنترل 4 کاناله با قابلیت افزایش تا 10 کانال
  • امیر در رادیوکنترل 4 کاناله با قابلیت افزایش تا 10 کانال
ژوئن 2026
ش ی د س چ پ ج
 12345
6789101112
13141516171819
20212223242526
27282930  
« آوریل    
فهرست 1
  • عضویت
  • ویرایش حساب کاربری
  • ورود
  • خانه
فهرست 2
  • حمایت مالی
  • تبلیغات
  • فروشنده
  • داشبورد فروشندگان
  • سفارش پروژه
  • تماس با ما
  • درباره ما
فهرست 3
  • ویرایش حساب کاربری
  • فراموشی رمز عبور
  • ثبت نام
  • ویرایش حساب کاربری
محل کد نماد...
جستجو برای:
محصولات
  • دوره کوادکوپتر سرعتی FPV دوره آموزش ساخت کوادکوپتر مسابقاتی FPV
    نمره 4.00 از 5

    4,830,000 
  • دوره هواپیما مقدماتی تا پیشرفته دوره آموزش ساخت پهپاد بال ثابت ( هواپیما ) - مقدماتی تا پیشرفته
    10,480,000 
  • دوره کوادکوپتر مقدماتی دوره آموزش مقدماتی ساخت مولتی کوپتر (کوادکوپتر، هگزاکوپتر و ...)
    2,490,000 
  • دوره کوادکوپتر فیلم بردار دوره آموزش ساخت پهپاد فیلم بردار ( مولتی کوپتر )
    8,970,000 
  • دوره هواپیمای مدل موتور کشی دوره آموزش ساخت هواپیمای موتور کشی
    2,030,000 
نوشته‌های تازه
  • برنامه نویسی به زبان پایتون برای رزبری پای
  • تشخیص رنگ با استفاده از رزبری پای
  • راه اندازی ال سی 2 در 16 با استفاده رزبری پای قسمت دوم
  • راه اندازی ال سی 2 در 16 با استفاده رزبری پای قسمت اول
  • کنترل PID با آردوینو و دو موتور براشلس

درباره آوات روبو

 

آرمان آوات روبو نه تنها تغییر اکنون و تعریف آینده آموزش عملی و کاربردی در ایران، بلکه توسعه همین تغییر به کل دنیا است. نسخه بین المللی آوات روبو، هم اکنون در حال برنامه ریزی است و کارهای اولیه آن برای فعالیت در یوتیوب و یک سایت انگلیسی در حال انجام است.

دسترسی سریع

  • دوره های آموزشی
  • کیت
  • کلاس های حضوری
  • پروژه

کاوش

  • درباره ما
  • تماس با ما
  • مقالات

شبکه های اجتماعی

  • اینیستاگرام
  • یوتیوب
  • تلگرام

استفاده از مطالب سایت برای مقاصد غیر تجاری و با ذکر منبع بلامانع است. تمامی حقوق برای آوات روبو محفوظ است.