И снова часы с будильником.
- Войдите на сайт для отправки комментариев
Пнд, 27/04/2015 - 08:53
Доброго времени суток.
Я собрал будильник с 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();
}




а теперь приделай рэле и сделай жене или маме автоматическую поливалку цветов
В качестве пробы сил в электронике -- это вполне достойно. В качестве изготовления полезного утройства -- это никуда не годится. Точность хода -- никакая, время можно считывать только разглядывая дисплей в упор.
а зачем два динамика?
Уха же тоже два. Стереофония. Понимать надо. :)
а зачем два динамика?
У меня были только по 4hom а для LM385 минимум надо 8hom пришлось паролелить.
В качестве пробы сил в электронике -- это вполне достойно. В качестве изготовления полезного утройства -- это никуда не годится. Точность хода -- никакая, время можно считывать только разглядывая дисплей в упор.
1) По поводу пробы сил в электронике, скорее в ардуино.
2) Точность хода вполне приличная. У меня работали около недели , сбились гдето на 3-5 сек.
3) Цифры действительно видно херовато. В следующий раз хочу сделать на лампах. Что то типа этого http://steampunker.ru/uploads/images/00/67/15/2013/05/17/2789d1.jpg
а теперь приделай рэле и сделай жене или маме автоматическую поливалку цветов
Не для поливалки это через чур круто. Но за рацуху спасибо :)
intflag_up = 0; зачем?intflag_down = 0; аналогично. но зачем int для флага, если это конечно флагset_minute_alarm разве нельзя одной функцией сделать, но с условиями, передавать ей какое нибудь значение по которому будет срабатывать
if(set_alarm_hour1 < 10)lcd.setCursor(4, 1);
lcd.print("0");lcd.setCursor(5, 1);//эта строка зачем? курсор вроде сам перейдет в следующую позицию на экране. аналогично в других функциях
вообще вывод цифр и знака ":" можно оптимизировать. просто повнимательнее
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
Почти девять секунд в сутки. И это весьма неплохой результат для схем без компенсации.
Под такие часы и интерьер нужен соответствующий.
эм, запараллелив, вы получили 2 Ома, т.е. в 4 раза хуже :)
upd.: пардон, на фото они все-таки последовательно. Тогда все верно.
Вот выход. Ежели еще дисплей взять не LCD, а OLED - вообще будет шикарно смотреться - и ярко и четко.
intflag_up = 0; зачем?intflag_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 большое спасибо.
Тогда принимайте за электронику. Квадратный сигнал усиливать с помощью ОУ -- попахивает извращенчеством. Подбор сопротивления нагрузки числом динамиков, из той же оперы.
Но ведь LM386 усилитель звука. К тому же я его собрал по схеме с усилением 200db. Я пробовал просто транзистор поставить, но звук какой то со свистом получался.
По поводу двух динамиков наверное ты прав можно было оставить один и к нему резистор добавить. Но так громче получаетса. Мёртвого поднимет :)
А что такое схема с компенсацией ? Я имею в виду для моих чясов.
Вот выход. Ежели еще дисплей взять не LCD, а OLED - вообще будет шикарно смотреться - и ярко и четко.
Прикольно но мне нужно больше информации на дисплей. Просто всё не поместица.
Про OLED подумаю в следущем проекте :)
Zahar, вы представляете себе что такое усиление 200 db ? Это цифра асторономических масштабов.
Так написано в datasheet.
И где ж там децибелы? Входной сигнал усиливается в двести раз. 200 децибел -- это усиление в "единица с двадцатью нулями" раз. Не менее интересно звуковое давление близ таких величин. Звуковое давление 194дб вызывает разрыв легких, а больше 200дб, в большинстве случаев, смерть. С такими параметрами будильник будет уже не будить, а, наоборот, усыплять. Навсегда.
Насчет свистящего звучания: меандр 1 кгц имеет 11 гармоник в слышимом диапазоне (3кгц, 5кгц, 7кгц и т.д.). Они и свистят. LM386 делает из прямоугольного сигнала некие горбы замысловатой формы, что тоже весьма неоднозначно с точки зрения звучания. В общем, смысл тащить в схему будильника LM386 крайне сомнителен.
"Схема с компенсацией" это не обязательно схема в ее электрическом понимании. Если кварц имеет некое смещение от заявленной частоты (32768гц в случае часового кварца), то подобный уход можно компенсировать даже чисто программно, вычитая или добавляя секунды с некоторой переодичностью. К компенсации можно отнести и термостабилизированные схемы, где в корпусе с кварцем устанавливаются нагревательный и измерительный элементы, которые поддерживает температуру резонатора вблизи некоторого значения, минимизируя температурные девиации. MAXIM в своих чипах 32KHz и DS3231 использует коммутацию к схеме резонатора дополнительных емкостей в зависимости от температуры кристалла. В общем, разные схемы бывают.
a5021 большое спасибо за разъяснения. Дело в том что я много лет работал в маленькой фирме по производству спутниковых ретрансляторов. Так вот Gain всегда мерился в DB а Power в DBm. Поэтому я на автомате и сказал DB.
прикольный и полезный пример (как для меня).
если об устройстве - то не слишком ли много кнопок?
http://robocraft.ru/blog/3070.html - на заметку. Как один из режимов. Цифры читать удобней :)
вопрос к автору(ну или если кто из знающих зайдёт в тему) :)
так понимаю, что будильник в DS1302 работает по следующему алгоритму:
1. записываем в память АТМ328 значения часов-минут.
2. в скетче их сравниваем с текущим.
3. если есть совпадение - срабатывает.
таким образом, из всех модулей(DS1307 и DS3231) это единственный, который работатет таком вот образом?
верно?
Пишу из "далёкого" 2019
может кто нашел библиотеку <Pcint.h> именно так с Большой буквы!!
пишу #include <pcint.h> - вылазят ошибки...
Alex65, в файловых системах DOS/Windows "Pcint.h" и "pcint.h" - одно и то же.