И снова часы с будильником.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013
Доброго времени суток.
Я собрал будильник с RTC DS1302.
Схема и код прилагаются.
Критика приветствуется.
#include <Wire.h>
#include <LiquidCrystal.h>
#include <DS1302RTC.h>
#include <Time.h>
#include <Streaming.h>
#include "pitches.h"
#include <Pcint.h>
#include <EEPROM.h>

Pcint pcint;// создаём экземпляр класса (что такое не знаю, но без этого не работает :)

// Init the DS1302
#define CLK 10
#define DAT 11
#define RST 13
// Set pins:  CE, IO,CLK
DS1302RTC RTC(RST, DAT, CLK);
///////////////////////////////////////////////////////////////////////
//Init the LCD
//initialize the library with the numbers of the interface pins
//
#define RS 6
#define E 5
#define D4 4
#define D5 15
#define D6 16
#define D7 17
//            lcd(RS,E,d4,d5,d6,d7,bl,polarity)
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
///////////////////////////////////////////////////////////////////////
byte set_alarm_hour1 = EEPROM.read(0);
byte set_alarm_minute1 = EEPROM.read(1);
byte set_alarm_hour2 = EEPROM.read(2);
byte set_alarm_minute2 = EEPROM.read(3);
int set_date_Year = 2015;
byte set_date_Month = 04;
byte set_date_Day = 23;
byte set_time_Hour = 22;
byte set_time_Minute = 22;
byte set_time_Second = 0;
//////////////////////////////in/out pins//////////////////////////////
#define buzz 9
#define led1 18
#define led2 19
#define lcdON 8
#define bitton_set_alarm   14
#define bitton_set_clock   12
#define bitton_up   2
#define bitton_down   3
#define bitton_on_off_alarm   7
///////////////////////////////////////////////////////////////////////
int flag_up = 0;
int flag_down = 0;
int regim = 9;
volatile byte regim_set_alarm = 0;
volatile byte regim_set_clock = 0;
volatile byte regim_on_off_alarm = 2;//!!!!!!!!!!!!!!!!!
volatile int NUMBER;
volatile char function;
time_t tLast;
time_t t;
tmElements_t tm;
void setup()
{
  Serial.begin(9600);
  pinMode(bitton_set_alarm, INPUT);
  pinMode(bitton_set_clock, INPUT);
  pinMode(bitton_up, INPUT);
  pinMode(bitton_down, INPUT);
  pinMode(bitton_on_off_alarm, INPUT);
  pinMode( buzz, OUTPUT);
  pinMode( led1, OUTPUT);
  pinMode( led2, OUTPUT);
  pinMode( lcdON, OUTPUT);
  digitalWrite(bitton_set_alarm, 1);
  digitalWrite(bitton_set_clock, 1);
  digitalWrite(bitton_up, 1);
  digitalWrite(bitton_down, 1);
  digitalWrite(bitton_on_off_alarm, 1);
  digitalWrite(buzz, 0); // speaker
  digitalWrite(led1, 0);  // alarm1
  digitalWrite(led2, 0);  // alarm2
  digitalWrite(lcdON, 1); // lcd ON
  /////////////////interrupts ///////////////////////////////////////////////////
  pcint.Begin(0);//на 12 пине будет выполняться обработчик прерывания PCINT0
  pcint.Begin(1);//на 14 пине (A0) будет выполняться обработчик прерывания PCINT1
  pcint.Begin(2);//на  7 пине будет выполняться обработчик прерывания PCINT2
  attachInterrupt(0, on_off, RISING);//на 2 пине будет выполняться обработчик прерывания UP
  attachInterrupt(1, DOWN, LOW);//на 3 пине будет выполняться обработчик прерывания DOWN
  ///////////////////////////////////////////////////////////////////////////////
  lcd.begin(16, 2);// Setup LCD to 16x2 characters
  lcd.print("Made by Zahar");
  delay(1000);
  lcd.clear();
  if (RTC.haltRTC()) {
    lcd.print("Clock stopped!");
    Serial.println("Clock stopped!");
  }
  else
  {
    lcd.print("Clock working.");
    Serial.println("Clock working.");
  }
  lcd.setCursor(0, 1);
  if (RTC.writeEN()) {
    lcd.print("Write allowed.");
    Serial.println("Write allowed.");
  }
  else
  {
    lcd.print("Write protected.");
    Serial.println("Write protected.");
  }
  delay (1000);
  lcd.clear();
  lcd.print("RTC Sync");
  Serial.println("RTC Sync");
  setSyncProvider(RTC.get);// the function to get the time from the RTC
  if (timeStatus() == timeSet) {
    lcd.print(" Ok!");
    Serial.println("OK");
  }
  else
  {
    lcd.print(" FAIL!");
    Serial.println("FAIL");
  }
  delay (1000);
  lcd.clear();
}
//-------------------------------------------
//-------------------------------------------
void loop() {
  clock();
  date();
  switch (regim_set_alarm) {
    case 1:
      function = 'h'; //Переменная для ограничения переменной number
      NUMBER = EEPROM.read(0); //Начальное значение NUMBER для настройки будильника1
      Serial.println("set_hour_alarm1");
      set_hour_alarm1();
      break;
    case 2:
      function = 'm'; //Переменная для ограничения переменной number
      NUMBER = EEPROM.read(1);//Начальное значение NUMBER для настройки будильника1
      Serial.println("set_minute_alarm1");
      set_minute_alarm1();
      break;
    case 3:
      function = 'h'; //Переменная для ограничения переменной number
      NUMBER = EEPROM.read(2);//Начальное значение NUMBER для настройки будильника2
      Serial.println("set_hour_alarm2");
      set_hour_alarm2();
      break;
    case 4:
      function = 'm'; //Переменная для ограничения переменной number
      NUMBER = EEPROM.read(3);//Начальное значение NUMBER для настройки будильника2
      Serial.println("set_minute_alarm2");
      set_minute_alarm2();
      break;
  }
  switch (regim_set_clock) {
    case 1:
      function = 'D'; //Переменная для ограничения переменной number
      NUMBER = set_date_Day;//Начальное значение NUMBER для настройки дня
      Serial.println("set_date_Day");
      set_day_date();
      break;
    case 2:
      function = 'M'; //Переменная для ограничения переменной number
      NUMBER = set_date_Month;//Начальное значение NUMBER для настройки месяца
      Serial.println("set_month_date");
      set_month_date();
      break;
    case 3:
      function = 'Y'; //Переменная для ограничения переменной number
      NUMBER = set_date_Year;//Начальное значение NUMBER для настройки года
      Serial.println("set_year_date");
      set_year_date();
      break;
    case 4:
      function = 'h'; //Переменная для ограничения переменной number
      NUMBER = set_time_Hour;//Начальное значение NUMBER для настройки часов
      Serial.println("set_hour_time");
      set_hour_time();
      break;
    case 5:
      function = 'm'; //Переменная для ограничения переменной number
      NUMBER = set_time_Minute;//Начальное значение NUMBER для настройки минут
      Serial.println("set_minute_time");
      set_minute_time();
      tm.Second = 0;
      t = makeTime(tm);
      if (RTC.set(t) == 0) { // Success
        setTime(t);
      }
      else
        Serial << F("RTC set failed!") << endl;

      break;
  }
  switch (regim_on_off_alarm) {
    case 1://Вкл будильник1
      digitalWrite(led1, 1);
      digitalWrite(led2, 0);
      lcd.setCursor(8, 0);
      lcd.print("        ");
      lcd.setCursor(9, 0);
      lcd.print("AL1 ON");
      alarm1();
      break;
    case 2://Вкл будильник2
      digitalWrite(led2, 1);
      digitalWrite(led1, 0);
      lcd.setCursor(8, 0);
      lcd.print("        ");
      lcd.setCursor(9, 0);
      lcd.print("AL2 ON");
      alarm2();
      break;
    case 3://Вкл будильник1 и будильник2
      digitalWrite(led1, 1);
      digitalWrite(led2, 1);
      lcd.setCursor(8, 0);
      lcd.print("        ");
      lcd.setCursor(9, 0);
      lcd.print("AL12ON");
      alarm1();
      alarm2();
      break;
    default://Выкл будильник1 и будильник2
      digitalWrite(led1, 0);
      digitalWrite(led2, 0);
      lcd.setCursor(8, 0);
      lcd.print("        ");
      lcd.setCursor(8, 0);
      lcd.print(" AL OFF");
  }
  lcd.noBlink();
}
/////////// INTERRUPT Function////////////////
void on_off() { //обработчик прерывания ON_OFF pin 2
  static unsigned long millis_prev1;
  if (millis() - 400 > millis_prev1) {
    regim_on_off_alarm++;
    if (regim_on_off_alarm > 3) //ограничим количество режимов
    {
      regim_on_off_alarm = 0; //так как мы используем только одну кнопку то переключать режимы будем циклично
    }
    Serial.print("regim_on_off_alarm=");
    Serial.println(regim_on_off_alarm);
  }
  millis_prev1 = millis();
}
void DOWN() { //обработчик прерывания DOWN pin 3
  static unsigned long millis_prev2;
  if (millis() - 200 > millis_prev2) {
    NUMBER--;
    if (function == 'h' && NUMBER < 0)NUMBER = 23;//Ограничение часов
    if (function == 'm' && NUMBER < 0)NUMBER = 59;//Ограничение минут
    if (function == 'Y' && NUMBER < 1970)NUMBER = 2030;//Ограничение лет
    if (function == 'M' && NUMBER < 1)NUMBER = 12;//Ограничение месяцов
    if (function == 'D' && NUMBER < 1)NUMBER = 31;//Ограничение дней
    Serial.print("NUMBER=");
    Serial.println(NUMBER);
  }
  millis_prev2 = millis();
}
ISR (PCINT2_vect)//обработчик прерывания UP alarm pin 7
{
  static unsigned long millis_prev3;
  if (millis() - 200 > millis_prev3) {
    NUMBER++;
    if (function == 'h' && NUMBER > 23)NUMBER = 0;//Ограничение часов
    if (function == 'm' && NUMBER > 59)NUMBER = 0;//Ограничение минут
    if (function == 'Y' && NUMBER > 2030)NUMBER = 1970;//Ограничение лет
    if (function == 'M' && NUMBER > 12)NUMBER = 1;//Ограничение месяцов
    if (function == 'D' && NUMBER > 31)NUMBER = 1;//Ограничение дней
    Serial.print("NUMBER=");
    Serial.println(NUMBER);
  }
  millis_prev3 = millis();
}
ISR (PCINT1_vect)//обработчик прерывания SET ALARM pin A0
{
  static unsigned long millis_prev4;
  if (millis() - 200 > millis_prev4) {
    regim_set_alarm++;
    if (regim_set_alarm > 4) //ограничим количество режимов
    {
      regim_set_alarm = 0; //так как мы используем только одну кнопку то переключать режимы будем циклично
    }
  }
  millis_prev4 = millis();
}
ISR (PCINT0_vect) //обработчик прерывания SET CLOCK pin 12
{
  static unsigned long millis_prev5;
  if (millis() - 200 > millis_prev5) {
    regim_set_clock++;
    Serial.print("regim_set_clock=");
    Serial.println(regim_set_clock);
    if (regim_set_clock > 5) //ограничим количество режимов
    {
      regim_set_clock = 0; //так как мы используем только одну кнопку то переключать режимы будем циклично
    }
  }
  millis_prev5 = millis();
}
//-------------------------------------------
//-------------------------------------------
void print2digits(int number) {
  //delay(10);
  if (number >= 0 && number < 10) {
    lcd.write('0');
    Serial.print("0");
  }
  lcd.print(number);
  Serial.print(number);
}
//-------------------------------------------
void clock() {
  lcd.setCursor(0, 0);
  print2digits(hour());
  lcd.print(":");
  Serial.print(":");
  print2digits(minute());
  lcd.print(":");
  Serial.print(":");
  print2digits(second());
  Serial.println("");
}
//-------------------------------------------
//-------------------------------------------
void date() {
  lcd.setCursor(0, 1);
  lcd.print("                ");//Очистка второй строки
  lcd.setCursor(0, 1);
  lcd.print(dayShortStr(weekday()));
  Serial.print(dayShortStr(weekday()));
  lcd.setCursor(5, 1);
  lcd.print(" ");
  Serial.print(" ");
  print2digits(day());
  lcd.print("/");
  Serial.print("/");
  print2digits(month());
  lcd.print("/");
  Serial.print("/");
  print2digits(year());
  lcd.print(year());
  Serial.println("  ");
  //delay (100);
}
//-------------------------------------------
//-------------------------------------------
void alarm1() {
  int set_alarm_minute_max1 = set_alarm_minute1 + 5;
  if (set_alarm_hour1 == hour() && set_alarm_minute1 <= minute() && set_alarm_minute_max1 >= minute()) {
    music_call();
  }
  else {
    Serial.println("ALARM-1 OTHER");
  }
}
//-------------------------------------------
//-------------------------------------------
void alarm2() {
  int set_alarm_minute_max2 = set_alarm_minute2 + 5;
  if (set_alarm_hour2 == hour() && set_alarm_minute2 <= minute() && set_alarm_minute_max2 >= minute()) {
    music_call();
  }
  else {
    Serial.println("ALARM-2 OTHER");
  }
}
//-------------------------------------------
//-------------------------------------------
void music_call() {
  int melody[] = {NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, 0, NOTE_B4, NOTE_C5, 0};
  int noteDurations[] = {  4, 8, 8, 4, 4, 4, 4, 4, 0};
  int size = 8;
  int tempo = 100;
  for (int i = 0; i < size; i++) {
    if (regim_on_off_alarm == 4) break;   //Остановка будильника
    if (melody[i] == 0) {
      Serial.println("end");
      if (regim_on_off_alarm == 4) break;   //Остановка будильника
      delay(noteDurations[i] * tempo); // rest
    } else {
      if (regim_on_off_alarm == 4) break;   //Остановка будильника
      Serial.print("notes[i]=");
      Serial.println(melody[i]);
      playTone(melody[i], noteDurations[i] * tempo);
    }
    // pause between notes
    delay(tempo / 2);
  }
}
void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    if (regim_on_off_alarm == 4) break;   //Остановка будильника
    digitalWrite(buzz, HIGH);
    delayMicroseconds(tone);
    digitalWrite(buzz, LOW);
    delayMicroseconds(tone);
  }
}
//-------------------------------------------
//-------------------------------------------
void set_hour_alarm1() {
  do {
    delay (50);//Чтобы экран не мерцал
    print_alarm_set(5, 1);
    set_alarm_hour1 = NUMBER;
  } while ( digitalRead(bitton_set_alarm) == HIGH);
  EEPROM.write(0, set_alarm_hour1);
}
//-------------------------------------------
//-------------------------------------------
void set_minute_alarm1() {
  do {
    delay (50);//Чтобы экран не мерцал
    print_alarm_set(8, 1);
    set_alarm_minute1 = NUMBER;
  } while ( digitalRead(bitton_set_alarm) == HIGH);
  EEPROM.write(1, set_alarm_minute1);
  lcd.clear();
}
//-------------------------------------------
//-------------------------------------------
void set_hour_alarm2() {
  do {
    delay (50);//Чтобы экран не мерцал
    print_alarm_set(5, 2);
    set_alarm_hour2 = NUMBER;
  } while ( digitalRead(bitton_set_alarm) == HIGH);
  EEPROM.write(2, set_alarm_hour2);
}
//-------------------------------------------
//-------------------------------------------
void set_minute_alarm2() {
  do {
    delay (50);//Чтобы экран не мерцал
    print_alarm_set(8, 2);
    set_alarm_minute2 = NUMBER;
  } while ( digitalRead(bitton_set_alarm) == HIGH);
  EEPROM.write(3, set_alarm_minute2);
  lcd.clear();
}
//-------------------------------------------
//-------------------------------------------
void set_year_date() {
  do {
    delay (50);
    print_date_set(12);
    set_date_Year = NUMBER;
  } while ( digitalRead(bitton_set_clock) == HIGH);
  tm.Year = CalendarYrToTm(set_date_Year);
  Serial.print("tm.Year=");
  Serial.println(tm.Year);
}
//-------------------------------------------
//-------------------------------------------
void set_month_date() {
  do {
    delay (50);
    set_date_Month = NUMBER;
    print_date_set(7);
  } while ( digitalRead(bitton_set_clock) == HIGH);
  tm.Month = set_date_Month;
  Serial.print("tm.Month=");
  Serial.println(tm.Month);
}
//-------------------------------------------
//-------------------------------------------
void set_day_date() {
  do {
    delay (50);
    set_date_Day = NUMBER;
    print_date_set(4);
  } while ( digitalRead(bitton_set_clock) == HIGH);
  tm.Day = set_date_Day;
  Serial.print("tm.Day=");
  Serial.println(tm.Day);
}
//-------------------------------------------
//-------------------------------------------
void set_hour_time() {
  do {
    delay (50);
    set_time_Hour = NUMBER;
    print_time_set(5);
  } while ( digitalRead(bitton_set_clock) == HIGH);
  tm.Hour = set_time_Hour;
  Serial.print("tm.Hour=");
  Serial.println(tm.Hour);
}
//-------------------------------------------
//-------------------------------------------
void set_minute_time() {
  do {
    delay (50);
    set_time_Minute = NUMBER;
    print_time_set(8);
  } while ( digitalRead(bitton_set_clock) == HIGH);
  tm.Minute = set_time_Minute;
  Serial.print("tm.Minute=");
  Serial.println(tm.Minute);

}
//-------------------------------------------
//-------------------------------------------
void print_alarm_set(int num_blink, int num_alarm) {
  lcd.clear();
  lcd.setCursor(4, 0);
  if (num_alarm == 1) {
    lcd.print("ALARM 1");
    lcd.setCursor(6, 1);
    lcd.print(":");
    if (set_alarm_minute1 < 10) {
      lcd.setCursor(7, 1);
      lcd.print("0");
      lcd.setCursor(8, 1);
    }
    else {
      lcd.setCursor(7, 1);
    }
    lcd.print(set_alarm_minute1);
    lcd.print(":00");

    if (set_alarm_hour1 < 10) {
      lcd.setCursor(4, 1);
      lcd.print("0");
      lcd.setCursor(5, 1);
    }
    else {
      lcd.setCursor(4, 1);
    }
    lcd.print(set_alarm_hour1);
    lcd.setCursor(num_blink, 1);
    lcd.blink();
  }
  else {
    lcd.print("ALARM 2");
    lcd.setCursor(6, 1);
    lcd.print(":");
    if (set_alarm_minute2 < 10) {
      lcd.setCursor(7, 1);
      lcd.print("0");
      lcd.setCursor(8, 1);
    }
    else {
      lcd.setCursor(7, 1);
    }
    lcd.print(set_alarm_minute2);
    lcd.print(":00");
    if (set_alarm_hour2 < 10) {
      lcd.setCursor(4, 1);
      lcd.print("0");
      lcd.setCursor(5, 1);
    }
    else {
      lcd.setCursor(4, 1);
    }
    lcd.print(set_alarm_hour2);
    lcd.setCursor(num_blink, 1);
    lcd.blink();
  }
}
//-------------------------------------------
//-------------------------------------------
void print_date_set(int num_blink) {
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("DATE SET");
  lcd.setCursor(3, 1);
  if (set_date_Day < 10) lcd.print("0");
  lcd.print(set_date_Day);
  lcd.print("/");
  if (set_date_Month < 10) lcd.print("0");
  lcd.print(set_date_Month);
  lcd.print("/");
  lcd.print(set_date_Year);
  lcd.setCursor(num_blink, 1);
  lcd.blink();
}
//-------------------------------------------
//-------------------------------------------
void print_time_set(int num_blink) {
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("TIME SET");
  lcd.setCursor(4, 1);
  if (set_time_Hour < 10) lcd.print("0");
  lcd.print(set_time_Hour);
  lcd.print(":");
  if (set_time_Minute < 10) lcd.print("0");
  lcd.print(set_time_Minute);
  lcd.print(":00");
  lcd.setCursor(num_blink, 1);
  lcd.blink();
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а теперь приделай рэле и сделай жене или маме автоматическую поливалку цветов

a5021
Offline
Зарегистрирован: 07.07.2013

В качестве пробы сил в электронике -- это вполне достойно. В качестве изготовления полезного утройства -- это никуда не годится. Точность хода -- никакая, время можно считывать только разглядывая дисплей в упор.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а зачем два динамика?

a5021
Offline
Зарегистрирован: 07.07.2013

Уха же тоже два. Стереофония. Понимать надо. :)

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Tomasina пишет:

а зачем два динамика?

У меня были только по 4hom а для LM385 минимум надо 8hom пришлось паролелить.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

a5021 пишет:

В качестве пробы сил в электронике -- это вполне достойно. В качестве изготовления полезного утройства -- это никуда не годится. Точность хода -- никакая, время можно считывать только разглядывая дисплей в упор.

1) По поводу пробы сил в электроникескорее в ардуино.

2) Точность хода вполне приличная. У меня работали около недели , сбились гдето на 3-5 сек.

3) Цифры действительно видно херовато. В следующий раз хочу сделать на лампах. Что то типа этого http://steampunker.ru/uploads/images/00/67/15/2013/05/17/2789d1.jpg

 

 

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

jeka_tm пишет:

а теперь приделай рэле и сделай жене или маме автоматическую поливалку цветов

Не для поливалки это через чур круто. Но за рацуху спасибо :)

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013
Если серьёзно то я ждал коментов по поводу кода.
Как вам кажется код написан нормально? Или можно гдето чтото написать более по людски. 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

int flag_up = 0; зачем?

int flag_down = 0; аналогично. но зачем int для флага, если это конечно флаг

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

if (set_alarm_hour1 < 10)

lcd.setCursor(4, 1);

lcd.print("0");

lcd.setCursor(5, 1);//эта строка зачем? курсор вроде сам перейдет в следующую позицию на экране. аналогично в других функциях

вообще вывод цифр и знака ":" можно оптимизировать. просто повнимательнее

 

a5021
Offline
Зарегистрирован: 07.07.2013

Zahar пишет:

1) По поводу пробы сил в электроникескорее в ардуино.

Тогда принимайте за электронику. Квадратный сигнал усиливать с помощью ОУ -- попахивает извращенчеством. Подбор сопротивления нагрузки числом динамиков, из той же оперы.

Цитата:

2) Точность хода вполне приличная. У меня работали около недели , сбились гдето на 3-5 сек.

Сказки.

How good is a typical crystal ?

A typical crystal has an error of 100ppm (ish) this translates as 100/1e6 or (1e-4)  So the total error on a day is 86400 x 1e-4= 8.64 seconds per day. In a month you would loose 30x8.64 = 259 seconds or 4.32 minutes per month. 

Error: 8.64 seconds per day

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

Цитата:
3) Цифры действительно видно херовато. В следующий раз хочу сделать на лампах. Что то типа этого http://steampunker.ru/uploads/images/00/67/15/2013/05/17/2789d1.jpg

Под такие часы и интерьер нужен соответствующий.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Zahar пишет:
У меня были только по 4hom а для LM385 минимум надо 8hom пришлось паролелить.

эм, запараллелив, вы получили 2 Ома, т.е. в 4 раза хуже :)

 

upd.: пардон, на фото они все-таки последовательно. Тогда все верно.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Zahar пишет:
Цифры действительно видно херовато.

Вот выход. Ежели еще дисплей взять не LCD, а OLED - вообще будет шикарно смотреться - и ярко и четко.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

jeka_tm пишет:

int flag_up = 0; зачем?

int flag_down = 0; аналогично. но зачем int для флага, если это конечно флаг

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

if (set_alarm_hour1 < 10)

lcd.setCursor(4, 1);

lcd.print("0");

lcd.setCursor(5, 1);//эта строка зачем? курсор вроде сам перейдет в следующую позицию на экране. аналогично в других функциях

вообще вывод цифр и знака ":" можно оптимизировать. просто повнимательнее

 

flag_up, flag_down просто лишние переменные ,забыл удалить. 

lcd.setCursor(5, 1); действительно лишняя строка.

set_minute_alarm попробую сделать одной функцией.

":" подумаю как это оптимизировать.

jeka_tm большое спасибо.

a5021 пишет:

Тогда принимайте за электронику. Квадратный сигнал усиливать с помощью ОУ -- попахивает извращенчеством. Подбор сопротивления нагрузки числом динамиков, из той же оперы.

Но ведь LM386  усилитель звука. К тому же я его собрал по схеме с усилением 200db. Я пробовал просто транзистор поставить, но звук какой то  со свистом получался.

По поводу двух динамиков наверное ты прав можно было оставить один и к нему резистор добавить. Но так громче получаетса. Мёртвого поднимет :)

А что такое схема с компенсацией ? Я имею в виду для моих чясов.

Tomasina пишет:

Вот выход. Ежели еще дисплей взять не LCD, а OLED - вообще будет шикарно смотреться - и ярко и четко.

Прикольно но мне нужно больше информации на дисплей. Просто всё не поместица.

Про OLED подумаю в следущем проекте :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Zahar, вы представляете себе что такое усиление 200 db ? Это цифра асторономических масштабов.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Так написано в datasheet.

a5021
Offline
Зарегистрирован: 07.07.2013

И где ж там децибелы? Входной сигнал усиливается в двести раз. 200 децибел -- это усиление в "единица с двадцатью нулями" раз. Не менее интересно звуковое давление близ таких величин. Звуковое давление 194дб вызывает разрыв легких, а больше 200дб, в большинстве случаев, смерть. С такими параметрами будильник будет уже не будить, а, наоборот, усыплять. Навсегда.

Насчет свистящего звучания: меандр 1 кгц имеет 11 гармоник в слышимом диапазоне (3кгц, 5кгц, 7кгц и т.д.). Они и свистят. LM386 делает из прямоугольного сигнала некие горбы замысловатой формы, что тоже весьма неоднозначно с точки зрения звучания. В общем, смысл тащить в схему будильника LM386 крайне сомнителен.

"Схема с компенсацией" это не обязательно схема в ее электрическом понимании. Если кварц имеет некое смещение от заявленной частоты (32768гц в случае часового кварца), то подобный уход можно компенсировать даже чисто программно, вычитая или добавляя секунды с некоторой переодичностью. К компенсации можно отнести и термостабилизированные схемы, где в корпусе с кварцем устанавливаются нагревательный и измерительный элементы, которые поддерживает температуру резонатора вблизи некоторого значения, минимизируя температурные девиации. MAXIM в своих чипах 32KHz и DS3231 использует коммутацию к схеме резонатора дополнительных емкостей в зависимости от температуры кристалла. В общем, разные схемы бывают.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

a5021 большое спасибо за разъяснения. Дело в том что я много лет работал в маленькой фирме по производству спутниковых ретрансляторов. Так вот Gain всегда мерился в DB а Power в DBm. Поэтому я на автомате и сказал DB.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

прикольный и полезный пример (как для меня).

если об устройстве - то не слишком ли много кнопок?

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

http://robocraft.ru/blog/3070.html - на заметку. Как один из режимов. Цифры читать удобней :)

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

вопрос к автору(ну или если кто из знающих зайдёт в тему) :)

так понимаю, что будильник в DS1302 работает по следующему алгоритму:

1. записываем в память АТМ328 значения часов-минут.

2. в скетче их сравниваем с текущим.

3. если есть совпадение - срабатывает.

таким образом, из всех модулей(DS1307 и DS3231) это единственный, который работатет таком вот образом?

верно?

Alex65
Offline
Зарегистрирован: 13.01.2019

Пишу из "далёкого" 2019 

может кто нашел библиотеку <Pcint.h> именно так с Большой буквы!!

пишу #include <pcint.h> - вылазят ошибки...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Alex65, в файловых системах DOS/Windows "Pcint.h" и "pcint.h" - одно и то же.