Часы с кукушкой

Leopoll
Offline
Зарегистрирован: 16.06.2016

Пришла мысль сделать вроде бы простой проект: устройство, который каждый час дергает сервопривод. При этом сами часы как таковые не нужны. Но есть ряд условий - максимальная автономность (в идеале 1 год), работа на улице при любой погоде, возможность корректировки времени. 

1. Какой модуль реального времени использовать. DS3231 для большей точности?

2. Как часто МК к модулю реального времени обращаться? По идее он нужен один раз после загрузки МК.

3. Какой МК использовать. Нано, или вообще Attiny13 для большей автономности?

4. Какие батарейки лучше взять, опять же для большей автономности.

5. Дисплей вроде не нужен, и в уличных условиях лучше без него,  но как тогда удобно организовать механизм корректировки времени?

6. Как все это лучше оформить, чтобы и в дождь и в мороз работало?

b707
Offline
Зарегистрирован: 26.05.2017

У вас серва тоже будет год на батарейках работать?

Leopoll
Offline
Зарегистрирован: 16.06.2016

b707 пишет:
У вас серва тоже будет год на батарейках работать?

Сомнительно, конечно. Планируется Около 10 сработок в сутки. Но хотелось бы выжать максимальное из возможного. Хотя вот Guver в своем проекте довольно оптимистичен.
https://alexgyver.ru/trashcan/#iLightbox[9085616bc6d96f7d03a]/0

Green
Offline
Зарегистрирован: 01.10.2015

Говорят, оптимизм продлевает жизнь... И даже батареек.)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Leopoll пишет:

возможность корректировки времени. 

Как часто и насколько это должно быть технологично?

Leopoll пишет:

DS3231 для большей точности?

А какая нужна точность?

Потому, что при ответах на оба вопроса: "в пределах разумного" получаем конструкцию в которой МК не нужен вовсе - достаточно RTC и исполнительного механизма

Leopoll
Offline
Зарегистрирован: 16.06.2016

ЕвгенийП пишет:

Как часто и насколько это должно быть технологично?


Соответственно, при замене батареек в RTC и в случае расхождения с реальным временем больше минуты. Нечасто. Но достаточно удобно для рядового обывателя.
ЕвгенийП пишет:

А какая нужна точность?


Точность такая, чтобы корректировку делать как можно реже.
Без МК наверно не получится, т.к. на работать должно только днем, и срабатывть как часы с боем, в зависимости от значения часа.

sadman41
Offline
Зарегистрирован: 19.10.2016

Прибор должен работать как можно дольше в разнообразных климатических условиях, обслуживаться как можно реже и стоить как можно дешевле.

Отличное ТЗ для создания любых девайсов. Любой разработчик сразу сможет по нему всё собрать.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Leopoll пишет:

Без МК наверно не получится, т.к. на работать должно только днем, и срабатывть как часы с боем, в зависимости от значения часа.

Получится и без МК. Здесь всё упираецца в стоимость и потребление тока.

-NMi-
Offline
Зарегистрирован: 20.08.2018

ЕвгенийП пишет:

А какая нужна точность?

Петрович, а ща осталась служба ГКРЧ??? Ты не фкурсе? Ато раньше можно было...... мегаточно.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Как то слабо сочетаются между собой, "автономность год" , серво и различные климатические условия .

-NMi-
Offline
Зарегистрирован: 20.08.2018

Kakmyc пишет:
Как то слабо сочетаются между собой, "автономность год" , серво и различные климатические условия .

Этт как два пальца... Аккумулятор на 190 А/ч от камаза и фсё. Можт и на 3 года хватит... ))))))))))))))))))))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Угу, можно ещё персональную АЭС прикрутить, чтоб наверняка.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Kakmyc пишет:
Угу, можно ещё персональную АЭС прикрутить, чтоб наверняка.

Ты кагбудта живёшь в ипинях и от них ещё пешком пару часиков...

Оглянись вокруг - давным давно в отдалённых местах ставят "самолётики" с ветрогенератором и солнечной панелью и питают светофоры и даже освещение уличное. 

rkit
Offline
Зарегистрирован: 23.11.2016

Сервопривод жрет достаточно электричества даже в неактивном режиме, так что принципиально не годится.

Если делаешь максимально дешево, то микроконтроллер тактуется от часового кварца без всяких модулей часов.

Green
Offline
Зарегистрирован: 01.10.2015

Да, да, да. Аккумуляторы от Камаза, ветро и бензо гетераторчики... А как же зелёные? С ихней минимизацией потребления? Так ведь и всех земных энергоресурсов не хватит! Или только о себе думаем? Эгоисты.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

-NMi- пишет:

Петрович, а ща осталась служба ГКРЧ???

Таки да. А также имеются эталонные - типа официальные NTP серверы

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Leopoll пишет:
т.к. на работать должно только днем, и срабатывть как часы с боем, в зависимости от значения часа.
Тааак. Сравниваю с первым постом и думаю, а что мы ещё узнаем со временем? Она там часом видеопотоки с порнхаба транслировать не должна? Мож ещё чего?

Leopoll
Offline
Зарегистрирован: 16.06.2016

rkit пишет:

Сервопривод жрет достаточно электричества даже в неактивном режиме, так что принципиально не годится.

Если делаешь максимально дешево, то микроконтроллер тактуется от часового кварца без всяких модулей часов.


Чем-то можно заменить серву, чтобы дергать за веревочку?
Про дешевизну я ничего не говорил. Это добрые критики за меня додумывают.

sadman41
Offline
Зарегистрирован: 19.10.2016

Негритенок может дергать за верёвочку.

Leopoll
Offline
Зарегистрирован: 16.06.2016

Тише. Сейчас же БЛМ будет.

rkit
Offline
Зарегистрирован: 23.11.2016

Leopoll пишет:
Чем-то можно заменить серву, чтобы дергать за веревочку? Про дешевизну я ничего не говорил. Это добрые критики за меня додумывают.

Обычный мотор. Или соленоид. Никто кроме тебя не знает, что у тебя там за конструкция.

Izvekoff
Offline
Зарегистрирован: 02.03.2020

ЕвгенийП пишет:

-NMi- пишет:

Петрович, а ща осталась служба ГКРЧ???

Таки да. А также имеются эталонные - типа официальные NTP серверы

Петрович, а какая разница эталонного от не эталонного, для синхронизации протокола NTP вроде сутки требуются? ( я о сервере)

Leopoll
Offline
Зарегистрирован: 16.06.2016

rkit пишет:

Обычный мотор. Или соленоид. Никто кроме тебя не знает, что у тебя там за конструкция.


Звонить надо в колокольчик средних размеров. По идее, конечно, соленоид. По крайней мере, на всяких колокольнях и корильонах используются именно они. Но на али встречал только клапана на соленоиде. И это уже 12в.

rkit
Offline
Зарегистрирован: 23.11.2016

Соленоид самостоятельно накрутить не так уж и сложно.

Гриша
Offline
Зарегистрирован: 27.04.2014

rkit пишет:

Соленоид самостоятельно накрутить не так уж и сложно.

можно подвижный контакт реле попробовать задействовать, разобрав реле. Есть соленоиды в принтерах. А вот с автономностью, вернее с источником для автономки, большой вопрос... всепогодные батарейки стоят очень дорого или:

-NMi- пишет:

Этт как два пальца... Аккумулятор на 190 А/ч от камаза и фсё. Можт и на 3 года хватит... ))))))))))))))))))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Leopoll пишет:
на али встречал только клапана на соленоиде.
Неправильно искали. Вот, например отдельный соленоид - https://aliexpress.ru/item/32777233179.html

Leopoll
Offline
Зарегистрирован: 16.06.2016

ЕвгенийП пишет:

Неправильно искали. 

Да, спасибо. Уже посмотрел. Можно найти и ровно на 5В, и любой мощности. Не знаю, сколько ньютонов мне понадобится, чтобы дубасить в колокольчик ок 0.5 кг.

А как лучше поступить с питанием? LSD Ni-Mh?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Не связывался бы ты с LSD! Там двушечкой не отделаешься - червонец прилетит, охнуть не успеешь.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Izvekoff пишет:

Петрович, а какая разница эталонного от не эталонного

Знаете, какая разница между вот этими двумя мультиметрами?

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Оба - DT-838, тока правый дороже.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ворота пишет:

Оба - DT-838, тока правый дороже.

в 10 раз. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот в том и вопрос к Izvekoff - чем они отличаются?

b707
Offline
Зарегистрирован: 26.05.2017

у такой как справа. желтенький, куплен, если не ошибаюсь, за 255 рублей в Оби на распродаже. Отработал лет семь, сейчас глючит по страшному...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А всё жду от Izvekoff  ответа на свой вопрос. А то как сам вопросы задавать, так горазд! :-)

sadman41
Offline
Зарегистрирован: 19.10.2016

В Оби не МЦ, полагаю.

Leopoll
Offline
Зарегистрирован: 16.06.2016

Подниму свою тему.
Сделал заготовку на Pro mini и ds3231. Каждую минуту мигает светодиодом по будильнику rtc.
В описании rtc сказано, что потребление от Vcc 250мкА. Но у меня получается 4 мА. Вряд ли это только потому, что светодиод пока не выпаян.

Ну и, самое главное, если отключить Vcc, перевести rtc на питание от  Vbat, сигнал будильника на SQW не идет. Может данная библиотека этого не позволяет?

#include <Wire.h>
#include <DS3231.h>
#include <GyverPower.h>

#define PIN_LED 13
DS3231 clock;
RTCDateTime dt;
volatile boolean isAlarm = false;

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LED, OUTPUT);
  Serial.println("Initialize DS3231");;
  clock.begin();
  clock.enableOutput(false);//
  clock.armAlarm1(false);
  clock.clearAlarm1();
  clock.setAlarm1(0, 0, 0, 0, DS3231_MATCH_S);

  pinMode (2, INPUT_PULLUP);
  attachInterrupt(0, myEventListener, FALLING);
  power.setSleepMode(POWERDOWN_SLEEP);
  power.sleep(SLEEP_FOREVER);
}

void loop() {
 

  if (isAlarm)  {
   
    clock.clearAlarm1();
    isAlarm = false;
    dt = clock.getDateTime();
    String wb = (clock.dateFormat("i", dt));
    int myHour =  wb.toInt() ;
    Serial.println ( myHour );
  
      digitalWrite (PIN_LED, HIGH );
      delay ( 500 );
      digitalWrite (PIN_LED, LOW );
      delay (500);
    
    
    power.sleep(SLEEP_FOREVER);
  } 
  

  delay(1000);
}

void myEventListener() {

isAlarm = true;

}

 

Feofan
Offline
Зарегистрирован: 28.05.2017

Если не изменяет память, то биты INTCN и BBSQW надо установить в 1. Тогда SQW будет дергать и от Vcc, и от Vbat. В datasheet'е гляньте для уточнений.

 

Leopoll
Offline
Зарегистрирован: 16.06.2016

Спасибо. Жаль, в библиотеке такой функции нет. Видимо так?

 Wire.beginTransmission(0x68);
  Wire.write(0x0E);// 
  Wire.write(0xFF);/
  Wire.endTransmission();

Только, правильно ли я понимаю, после каждого срабатывания будильника надо подавать питание на rtc  и делать сброс будильника, в данной библиотеке clock.clearAlarm1() ?

kost82
Offline
Зарегистрирован: 30.11.2015

Leopoll пишет:

Спасибо. Жаль, в библиотеке такой функции нет. Видимо так?

Делал я как-то измеритель влажности почвы, который должен измерять раз в полчаса и работать от двух пальчиковых батареек не менее полугода. До полевых испытаний не дошло, но при замере тока расчеты вроде сходились. Так вот, я отправлял ардуинку спать, и пробуждал ее от прерывания на пине D2 во время срабатывания будильника. Для этого контакт SQW часов DS3231 я соединил с пином D2 ардуино. И заводил два будильника: один срабатывал в 00 минут каждый час, а второй в 30 минут тоже каждый час. Все делал при помощи этой библиотеки (DS3231.h). В блоке setup() делал так:

clock.begin();
clock.enableOutput(false);

  // Отключаем все ранее установленные будильники
clock.armAlarm1(false);
clock.armAlarm2(false);
clock.clearAlarm1();
clock.clearAlarm2();

  //будильник будет срабатывать каждый час при совпадении минут и секунд
clock.setAlarm1(0, 0, 0, 0, DS3231_MATCH_M_S);
clock.setAlarm2(0, 0, 30,   DS3231_MATCH_M);

А при пробуждении в цикле loop() делал так:

// строчки необходимы для повторного срабатывания будильника
clock.isAlarm1(true);
clock.isAlarm2(true);
  
dt = clock.getDateTime();

После необходимых действий - опять отправлял ардуину в спячку.

У Вас по-сути то же самое, только будильник один. Проснулся раз в час, проверил сколько времени, если день - звякнул в колокольчик и опять уснул.

Вместо библиотеки Гайвера (его здесь не жалуют) наверно лучше использовать стандартные:

#include <avr/sleep.h>
#include <avr/power.h>

И я не совсем понимаю зачем нужна проверка

if (isAlarm)

Ведь во время сна цикл loop() не выполняется.

 

kost82
Offline
Зарегистрирован: 30.11.2015

По факту в цикле loop() Вы в 31 строке выключаете будильник:

clock.clearAlarm1();

Вот здесь выводите минуты, а называете часами:

dt = clock.getDateTime();
String wb = (clock.dateFormat("i", dt));
int myHour =  wb.toInt() ;
Serial.println ( myHour );

Для отладки можно целиком вывести дату, заодно и будет видно установлено ли время.

Serial.println(clock.dateFormat("d-m-Y H:i:s", dt));

 

Leopoll
Offline
Зарегистрирован: 16.06.2016

kost82 пишет:

По факту в цикле loop() Вы в 31 строке выключаете будильник:

clock.clearAlarm1();

Вот это действительно не разобрался. Думал что эта команда делает то, что на самом деле  делает clock.isAlarm1(true);

Документации к библиотеке нет, примеры кривые.

А у вас ds3231 был запитан от МК или от Vbat? 

kost82
Offline
Зарегистрирован: 30.11.2015

Leopoll пишет:

А у вас ds3231 был запитан от МК или от Vbat? 

ds3231 запитан был от своей батарейки, вроде там был диод или резистор для ее подзарядки - я его выкусил напрочь, чтобы не тратить драгоценную энергию батареек.

Leopoll
Offline
Зарегистрирован: 16.06.2016

Такт вроде, если ds3231 соединен с Vcc МК он свою батарею не использует. И потребление у него в этом случае больше.

kost82
Offline
Зарегистрирован: 30.11.2015

Так я ж и написал, что нужно разорвать цепь заряда батареи, для экономии. А без подачи питания на Vcc не будет работать I2C

Feofan
Offline
Зарегистрирован: 28.05.2017

Leopoll пишет:

Спасибо. Жаль, в библиотеке такой функции нет. Видимо так?

 Wire.beginTransmission(0x68);
  Wire.write(0x0E);// 
  Wire.write(0xFF);/
  Wire.endTransmission();

Не уверен, что по адресу 0х0Е Вам нужны все единицы.

Leopoll пишет:

Только, правильно ли я понимаю, после каждого срабатывания будильника надо подавать питание на rtc  и делать сброс будильника, в данной библиотеке clock.clearAlarm1() ?

При включении надо сбрасывать флаг сработавшего будильника (бит A1F или A2F). По поводу clock.clearAlarm1() ничего не скажу.

Leopoll
Offline
Зарегистрирован: 16.06.2016

Oк, это понятно. Хотелось сэкономить еще больше. Судя по тому что сказано в описании, кроме подзарядки, в режиме питания от Vcc  модуль расходует на два порядка больше: 250 мкА против 3.5 мкА. 

Здесь сказано , что 

 I2C доступен, когда достигло допустимого уровня напряжение VCC или VBAT.

То есть должен работать i2c от батарейки. Однако, у меня действительно не работает.

Если включать подачу Vcс после каждого срабатывания будильника, а потом выключать, то прерывания почему-то начинают происходить раз в секунду. Хотя бит INTCN установлен.

Feofan
Offline
Зарегистрирован: 28.05.2017

Leopoll пишет:

Если включать подачу Vcс после каждого срабатывания будильника, а потом выключать, то прерывания почему-то начинают происходить раз в секунду. Хотя бит INTCN установлен.

Прочитайте состояние регистров 0х0Е и 0x0F перед выключением.

kost82
Offline
Зарегистрирован: 30.11.2015

Leopoll пишет:

Здесь сказано , что 

 I2C доступен, когда достигло допустимого уровня напряжение VCC или VBAT.

То есть должен работать i2c от батарейки. Однако, у меня действительно не работает.

Земля у ардуино и часов общая при этом?

Схему подключения в студию!

Leopoll
Offline
Зарегистрирован: 16.06.2016

kost82 пишет:

Земля у ардуино и часов общая при этом?

Земля общая. Vcc в воздухе, или, как вариант при включении-отключении, подключен к 6 пину MK, который управляется digitalWrite().

Leopoll
Offline
Зарегистрирован: 16.06.2016

Feofan пишет:

Прочитайте состояние регистров 0х0Е и 0x0F перед выключением.

Читаю. Вроде все норм.


#include <Wire.h>
#include <DS3231.h>


#define PIN_LED 13
DS3231 clock;
RTCDateTime dt;
volatile boolean isAlarm = false;

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LED, OUTPUT);
  pinMode(6, OUTPUT);
  digitalWrite ( 6, HIGH);
  Serial.println("Initialize DS3231");;
  clock.begin();
    
  Wire.beginTransmission(0x68);
  Wire.write(0x0E);// 
  Wire.write(0x5D);//         Устанавливаем регистр Control 01011101
  Wire.endTransmission();

  clock.enableOutput(false);
  
  clock.armAlarm1(false);
  clock.clearAlarm1();
 
  clock.setAlarm1(0, 0, 0, 0, DS3231_MATCH_S);// Будильник каждую минуту

  pinMode (2, INPUT_PULLUP);
  attachInterrupt(0, myEventListener, FALLING);

 
  digitalWrite ( 6, LOW);

    }


void loop() {
 

  if (isAlarm)  {
  
  isAlarm = false;
  
  digitalWrite ( 6, HIGH);// подаем питание на модуль
  
  Wire.beginTransmission(0x68); // Инициализация шины. иначе читает 0.
  Wire.endTransmission();   //
 
  Wire.beginTransmission(0x68); // Читаем регистр Control. 
  Wire.write(0x0E);    // 
  Wire.endTransmission();   //

  Wire.beginTransmission(0x68); // 
  Wire.requestFrom(0x68, 1);    //  
  char c = Wire.read(); // 
  Serial.println(c, HEX);         // 
  Wire.endTransmission(); //
    
    dt = clock.getDateTime();
    String wb = (clock.dateFormat("H:i:s", dt));  //   Serial.print(dt.hour);   //Serial.print(dt.minute); 
                                              
 
    Serial.print ( wb );
    Serial.print ("  -  ");
  
  Wire.beginTransmission(0x68); //Читаем регистр Control. 
  Wire.write(0x0E);    //
  Wire.endTransmission();   //

  Wire.beginTransmission(0x68); // 
  Wire.requestFrom(0x68, 1);    //  
  c = Wire.read(); // 
  Serial.println(c, HEX);         // 
  Wire.endTransmission(); // 

  Wire.beginTransmission(0x68); //Читаем регистр Status. 
  Wire.write(0x0F);    // 
  Wire.endTransmission();   //

  Wire.beginTransmission(0x68); // 
  Wire.requestFrom(0x68, 1);    // 
  c = Wire.read(); // 
  Serial.println(c, HEX);         // 
  Wire.endTransmission(); // 

   clock.isAlarm1(true);

    digitalWrite ( 6, LOW);     // отключаем питание модуля
  } 
  

  delay(1000);
}

void myEventListener() {

isAlarm = true;

}

Вывод:

Initialize DS3231
5D
04:35:57  -  5D
FFFFFF80
5D
04:35:58  -  5D
FFFFFF80
5D
04:35:59  -  5D
FFFFFF80
5D
04:36:00  -  5D
FFFFFF81
5D
04:36:01  -  5D
FFFFFF80
5D
04:36:02  -  5D
FFFFFF80
5D
04:36:03  -  5D
FFFFFF80

Видно, что будильник срабатывает раз в минуту, но прерывания каждую секунду, хотя биты регистра установлены правильно. Если убрать в 90 строке digitalWrite ( 6, LOW);  и не отключать Vcc, все работает как надо.

kost82
Offline
Зарегистрирован: 30.11.2015

Может надо дать время на запись, ну то есть сделать паузу перед отключением питания (вставить задержку в строку 89)