Реально задолбали часы!!!

maxvalin
Offline
Зарегистрирован: 22.02.2016

Добрый день уважаемые. Все как всегда банально но с изьяном. Имею конструкцию arduino nano к ней модуль ds1307 и модуль реле (на 4штуки) Все стандартно! Никакого самопая. Вот скетч :

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1307);
uint8_t old_min ;  // показание старых минут
int8_t flag = 1 ; // флаг для переключения каналов

void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
    old_min = 1;
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);
}
void loop(){
    if(millis()%100==0) // 
      Serial.println(time.gettime("m")); // выводим время
      uint8_t new_min ;  // локальная переменная для новых минут
      new_min = time.minutes; // new_min равна  текущим минутам
      if (new_min != old_min && flag == 1)
      { 
        digitalWrite(10, LOW);
        delay(1000); // задержка сигнала на 2 сек
        digitalWrite(10, HIGH);
        old_min = new_min;
        flag = 2 ;
        }
       if (new_min != old_min && flag == 2)
      { 
        digitalWrite(11, LOW);
        delay(1000); // задержка сигнала на 2 сек
        digitalWrite(11, HIGH);
        old_min = new_min;
        flag = 1 ;
        }
    

    
}

Ну что может быть не так?!!! Ну что может НЕработать? выдернуть сигнал один раз в минуту, дать единицу на выход на 2 секунды и все. А через минуту тоже самое но на второй пин.

Неделю уже не могу добить! Естественно плюнул на 1307 и заказал ds3231.

Естественно уже все манипуляции провел:

1) Развел отдельно камень от релюшек и катушку потребления убрал на 3 метра от арды (ардуина перестала хаотично вырубаться) 

2) на 1307 провел все манипуляции по "прокачиванию" (убрал плечо подзарядки, убирал батарейку вообще, ставил другую, не перегревая менял кварц с материнки, просто еще раз менял кварц на новый, ставил на кварц типа экрана в виде медной пластинки,

3)  менял саму ардуино. 

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

Кстати 1307 работала много времени вообще без батарейки, никаких сбоев! Это к тому что некоторвые пишут что невозможно работать без батарейки, но все же может работала только с этим скетчем. Так как ничего особого от часов не требовалось, всего лишь поминутная единица.

Может что в скетче?

Joiner
Offline
Зарегистрирован: 04.09.2014

Странно....У меня на стене висят часики на базе DS3231, прошло немного больше года, как установил время. Убежали вперед, заразы.......на 12 секунд.

Спросите, как проверяю? По этим http://radioclock.narod.ru/

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

maxvalin пишет:

Реально задолбали часы!!!

Забейте.

valera678
Offline
Зарегистрирован: 04.11.2016

зачем вам эта хрень iarduino_RTC.h ?  мало нормальных библиотек?

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

подсажите пожалуйста нормальную библиотеку!

Две проблемы мне кажется- наводки от катушки 24dc( но это устраню, взял домой чтоб осликом посмотреть что там вообще творится.

А вот "бежит" скорее всего программно из-за библиотеки, сейчас попробую со стандартной пример закинуть и сверит через час с компом. Сразу покажет кто -кому должен)))

 

п.с. уведомление  о коментариях не приходили....странно

SLKH
Offline
Зарегистрирован: 17.08.2015

maxvalin пишет:

 

Может что в скетче?

Попробуй "old_min = new_min" переставить на 3 строки вверх.


 

maxvalin
Offline
Зарегистрирован: 22.02.2016

сейчас вот сутки поганял модуль чисто часиками, идет точно.  А легендарные мои часы "стрела" набегали скорее всего от мусора, так как в логе после дописания скетча, смотрю мусор проскакивает и не хило так. типа 06 в начале строки. Причем мусор этот появляется не в такт тикания- тоисть не тогда когда происходит выброс ЭМИ от 24 вольтовой катушки а хаотично. вчера вечером попробовал дописать вместо 10-ой строки 

old_min = 1;

написал:

 old_min = time.gettime("m");

случайных чисел в логе не увилел, да еще попробую вот сейчас перенести "old_min = new_min" 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Поковырял дальше код:

#include <iarduino_RTC.h>


iarduino_RTC time(RTC_DS1307);
uint8_t old_min ;  // показание старых минут
int8_t flag = 1 ; // флаг для переключения каналов
uint8_t new_min ;  //  для новых минут


void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
    old_min = time.minutes;
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);
    //time.settime(0,18,19,7,6,17,3);
}
void loop(){
    
    if(millis()%100==0) // 
      {
      //Serial.println(time.gettime("m")); // выводим время
      new_min = time.minutes; // new_min равна  текущим минутам ИМЕННО ТАК!
      if (new_min != old_min && flag == 1)
      { 
        
        digitalWrite(10, LOW);
        delay(1000); // задержка сигнала на 2 сек
        digitalWrite(10, HIGH);
        flag = 2 ;
        old_min = new_min;
        }
       if (new_min != old_min && flag == 2)
      { 
        
        digitalWrite(11, LOW);
        delay(1000); // задержка сигнала на 2 сек
        digitalWrite(11, HIGH);
        flag = 1 ;
        old_min = new_min;
        }
        Serial.println(time.gettime("d-m-Y, H:i:s")); // выводим время
        Serial.println(new_min); // показания переменной минут
        delay(500);
      }

    
}

Сейчас лог чистый, ХЗ, надо в железе проверять, сместятся тики или нет. Но забегало скорее всего действительно из-за музора. Проверю, отпишусь.

 

p/s На заметку : Относите катушки с индукивностью нафиг подальше от МК, убивает камень напрочь!(тосить может убить а тактирование вот точно убивает)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

maxvalin пишет:

А вот "бежит" скорее всего программно из-за библиотеки

Как могут аппаратные часы бежать программно?

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

ua6em пишет:

Как могут аппаратные часы бежать программно?

Непросто, конечно, но специалисты имеются.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Так-так-так Евгений! Прошу не стебать!))
Может я в по и новичек но не в электронике.
Наберите в гугле часы "стрела"- посмотрите как они приводятся в действие. Там 24dc подаётся раз в минуту с одной полярностью а ровно через минуту с обратной полярностью. Задержка сигнала 1сек. В скетче видно, также видно что подключено к 10 и к 11 пину. Тик а через минуту так. Вот так. А вот то что механизм без обратной связи это конечно хреновенько. По моему скетчу тикает но из-за того в нем присутствовал мусор(видно на картинке) тикало лишний раз иногда.
Подскажите лучше библиотеку понадежней;)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Я пользую эту - "Sodaq_DS3231.h"

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

Я не понимаю какое отношение часы "Стрела" имеют к ds1307. ds1307  - самостоятельня микросхема, которая тикает сама по себе и чтобы заставить из сбоить программно - это надо постараться.

библиотеку понадёжнее подсказать не могу, т.к. в общем-то никогда ими не пользуюсь. Если я купил новый девайс для пробы "жив или спор открывать", я, конечно, запускаю его с какой-нибудь библиотекой, но в проекте - никогда. Только своим кодом. С часами имеено так - я читаю даташит и гоню им нужные команды "ручками" безо всяких библиотек.

А в скетче я вообще не понимаю, зачем Вы так всё усложнили.

1307 умеют выдавать Вам прерывания раз в секунду (а ds3231 так и раз в минуту - самому вообще ничего делать не надо). Это надо использовать, зачем огород-то городить?

maxvalin
Offline
Зарегистрирован: 22.02.2016

Вот вот!

прерывания раз в минуту, я допустим не нашел когда изначально начинал кумекать над часами. а сейчас времени нет на переосмысливание. Библиотеками конечно пользоваться грех, это добавляет корявость в машинный код. По этому я немного начал осваивать Си с STM32, стало немного яснее. Но з ардуиной уже просто нет желания сильно заморачиваться. По этому прелести "фаст-фута" и вылазят.  Что по поводу DS1307- модуль очень даже таки рабочий. Внезапные остановки и "забег" часов- все это отловил.  Забег происходил из-за мусора а остановки по причине.... даже не знаю как это правильно назвать. Но лучше покажу, так наглядней будет:

тоисть поставил с утра к ноутбуку часики и ушел, они тикают. Прихожу, смотрю на лог и вот что вижу- он не принимает дату с модуля. идут ноли типа ну или сброс (это вам наверное виднее будет)  нажимаю ресет на ардуино. И вот пожалуйста- время опять принимает правильно и опять они тикают. И болие того в самом модуле время не сбилось как видно. По этому считаю что кривовата сама библиотека . Жалко! Ибо описана она автором очень хорошо.  

 

можно было вообще без модуля сделать, но он валялся под рукой и хотелось немного практики с ним. Что собственно и вышло.  Иногда чейто "огород" может оказаться собственной самозадачей, которую решив и понимаешь что это "огород" ))))

Спасибо за дискусию. Но покажите пожалуйста пару строчек как прерыванием вытащить поминутный сигнал. Думаю очень пригодится мне для STM32

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

Вы внимательно читали? Поминутный в ds3231, а в 1307 только посекундный.

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

maxvalin пишет:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Не подскажите, какую тему вы используете в своей IDE,

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

Вопрос ко мне? Ну, не знаю, какая там ставится по умолчанию, такая и есть. Я не так чтобы часто IDE пользуюсь.

SLKH
Offline
Зарегистрирован: 17.08.2015

maxvalin пишет:

Вот вот!

прерывания раз в минуту, я допустим не нашел когда изначально начинал кумекать над часами. 

в этой задаче вообще прерывания не нужны, достаточно digitalRead().

разве что сильно хочется, тогда http://arduino.ru/Reference/AttachInterrupt

а дальше - Ардуина неплохо умеет считать до 60.

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Евгений, все верно, по минутный. Мне скоро придёт ds3231:) с этим по-ходу ясно. Библиотека косячила, сейчас использую другую, пока работают правильно.

Имасофт: это обычная ide модифицированная в ручную. Мне легче так понимать кто-есть кто.

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

maxvalin пишет:
Имасофт: это обычная ide модифицированная в ручную. Мне легче так понимать кто-есть кто.

Тему сами разресовывали или готовую где-то взяли?

maxvalin
Offline
Зарегистрирован: 22.02.2016

Сам . там файл править надо. Посмотрел в гугле пример и сам себе сделал.

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

maxvalin пишет:
Сам . там файл править надо. Посмотрел в гугле пример и сам себе сделал.

Понятно, а я думал что за основу взяли DarkArduinoTheme, больно уж похожа на нее, не поделитесь своим творением?

maxvalin
Offline
Зарегистрирован: 22.02.2016

На дрюбокс ссылка пойдёт? Честно сказать -не знаю может и дарк, я не заморачивался с белой делал. Теперь папка theme кочует с обновления к обновлению. Возмете папку и заменитель на свою. Свою естественно сохранив отдельно. Через минут 30 выложу. (Сейчас с телефона)

 

вот https://www.dropbox.com/sh/vfnhbyw50kqd4ti/AAA_Z321gKGaLz5mPvUgJvpba?dl=0

 

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

Спасибо, симпатичная!

maxvalin
Offline
Зарегистрирован: 22.02.2016

SLKH пишет:

 

в этой задаче вообще прерывания не нужны, достаточно digitalRead().

разве что сильно хочется, тогда http://arduino.ru/Reference/AttachInterrupt

а дальше - Ардуина неплохо умеет считать до 60.

 

[/quote]

сейчас вот работает нормально но , но пока сидел в комнате - один раз все таки проскочило (за 3 часа) два раза, тоисть сразу был и тик и так. Все таки где то берется мусор в переменную old_min.

Вот я и подумал о прерываниях, для надежности. 

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

взял переменную из часов
отнял от старой переменной 
если разница 1
тикаю или такаю
если разница больше 
значит вброс мусора и естественно ничего не делаю
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLKH пишет:

в этой задаче вообще прерывания не нужны, достаточно digitalRead().

Ну, это Вы погорячились :)

SLKH
Offline
Зарегистрирован: 17.08.2015

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

SLKH пишет:

в этой задаче вообще прерывания не нужны, достаточно digitalRead().

Ну, это Вы погорячились :)

считать импульсы на SQW/OUT с частотой 1 герц - что там горячего? 

 

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

Даже не Герц, герц это от безусходности. Как только получит 3231, ТС сделает частоту 1/60 Герц. Но всё равно это лучше делать по прерыванию. Это же часы. Минуты нужно переключать точно в момент перехода часов  на новую минуту, а не в тот момент, когда спросили digitalRead и обнаружили, что минута уже сменилась (как давно - хз). Вот для отлавливания точно момента перехода и существуют эти импульсы.

SLKH
Offline
Зарегистрирован: 17.08.2015

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

Даже не Герц, герц это от безусходности. Как только получит 3231, ТС сделает частоту 1/60 Герц. Но всё равно это лучше делать по прерыванию. Это же часы. Минуты нужно переключать точно в момент перехода часов  на новую минуту, а не в тот момент, когда спросили digitalRead и обнаружили, что минута уже сменилась (как давно - хз). Вот для отлавливания точно момента перехода и существуют эти импульсы.

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

Давайте вспомним о задаче: раз в минуту передвинуть стрелку на вторичных часах "Стрела". Какая нужна точность для чудовищно неповоротливого (с точки зрения ардуины) механизма?

Предположим, "неправильная" программа2 подаст сигнал digitalWrite аж на 40000(!) микросекунд позже, чем "правильная" программа1. А в следующую минуту - на 700 микросекунд. Вы стоите на площади и смотрите на часы - Вы эту разницу увидите?  

=================

У оригинальной системы "точность момента перехода к новой минуте" обеспечивалась узлом "храповое колесо". Я эту "точность" даже приблизительно оценить не возьмусь.

 

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

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

maxvalin
Offline
Зарегистрирован: 22.02.2016

Как вытащить по-минутные прерывания с 3231 :)
С прерываниями ещё дело не имел :(

SLKH
Offline
Зарегистрирован: 17.08.2015

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

Ну, так с прерываниями меньше кода (а значит меньше ошибок),

для того, кто хорошо понимает тему - одинаково. Он и без прерываний не накосячит.

Для остальных - не факт. Всё-таки использование прерываний требует более глубокого понимания логики всего скетча. И ещё - Вы не используете чужие библиотеки, а так пишут далеко не все.

Цитата:
не нужно бояться делэев
их вообще бояться не нужно, независимо от прерываний.

Цитата:
и прочих длинных операций в loop и вообще - это архитектурно более правильно, а потому способствует привитию правильных навыков и подходов. Как-то так.

Так-то оно так. 

Но где-то на просторах этого форума есть фраза (в пересказе) "Если можно обойтись без прерываний, лучше обойтись без прерываний". ИМХО, такой подход тоже имеет право на жизнь, особенно для начинающих.

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

/2 - по-людски в исходном вопросе желательно переделывать железо на выходе (реле с индуктивной нагрузкой на  контактах при постоянке 24 в - не самое лучшее решение) и добавлять кнопки и, соответственно, функциональность программы. 

 

 

 

 

 

 

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

Ну, знаете, тут проблема. Я же не пользуюсь библиотеками. Я могу Вам дать свой код, но там почти всё своё .... 

Давайте так, я сейчас дам Вам код какой-то библиотеки, в которую я вставил возможность включения ежеминутного прерывания. Откуда скачана библиотека - не знаю, мне её дал такой же начинающий коллега, как Вы специально, чтобы я эту функцию для него добавил. Вот библиотека. Там есть функция EnableMinuteInterrupt - она Вам и нужна.

Впрочем, смотрите и мой код - мне не жалко, но я предупредил .... Этот кусочек кода собственно и есть инициализация часов и включение этого прерывания. Там есть ещё одна полезная фича - включение осциллятора и очистка OSF при инициализации.

Для того, чтобы воспользоваться моим кодом,

1. найдите у себя в папке <корень ардуино>\hardware\arduino\avr\libraries\Wire\utility  файлы twi.c и twi.h
2. скопируйте эти файлы в папку своего скетча
3. В файле twi.h, после строки "#include <inttypes.h>" (у меня она 23-я) добавьте строки

#ifdef __cplusplus
extern "C" 
#endif
uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait, uint8_t sendStop);

#ifdef __cplusplus
extern "C" 
#endif
uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sendStop);

4. Ну и, наконец, вот он скетч

#include "twi.h"

//
// Пин, на который заведено прерывание с пина SQW модуля часов 
// может быть 2 или 3
//
#define PIN_SQW	2 

//
// I2C адрес часов
//
#define CLOCK_ADDRESS 0x68

//
//	Преобразование формата чисел
//
static inline uint8_t bcdToDec(uint8_t val) { return ((val/16*10) + (val%16)); }
static inline uint8_t decToBcd(uint8_t val) { return ((val/10*16) + (val%10)); }

//
// Функции чтения/записи регистров часов
//
static uint8_t getElement(uint8_t el) {
	twi_writeTo(CLOCK_ADDRESS, &el, 1, true, true);
	twi_readFrom(CLOCK_ADDRESS, &el, 1, true);
	return el;
}
static void setElement(uint8_t addr, uint8_t val) {
	uint8_t buffer[2] = { addr, val };
	twi_writeTo(CLOCK_ADDRESS, buffer, 2, true, true);
}
static inline uint8_t getRegisterE(void) { return getElement(0x0e); }	// 0
static inline uint8_t getRegisterF(void) { return getElement(0x0F); }	// 1
static inline void setRegisterE(uint8_t val) { setElement(0x0e, val); }	// 0
static inline void setRegisterF(uint8_t val) { setElement(0x0F, val); }	// 1

//
// Установить время второго будильника
//
static void setA2Time(const uint8_t A2Day, const uint8_t A2Hour, const uint8_t A2Minute, const uint8_t AlarmBits, const bool A2Dy) {
	uint8_t buffer [4];
	buffer[0] = 0xb; // Alarm 2 address
	buffer[1] = decToBcd(A2Minute) | ((AlarmBits & 0x10) << 3);
	buffer[2] = decToBcd(A2Hour) | ((AlarmBits & 0x20) << 2);
	buffer[3] = ((AlarmBits & 0x40) << 1) | decToBcd(A2Day);
	if (A2Dy) buffer[3] |= 0x40;
	twi_writeTo(CLOCK_ADDRESS, buffer, 4, true, true);
}

//
// Включить будильник
//
static void turnOnAlarm(const uint8_t Alarm) {
	setRegisterE(getRegisterE() | ((Alarm==1) ? 5 : 6));
}

//
// Выключить будильник
//
static void turnOffAlarm(const uint8_t Alarm) {
	setRegisterE(getRegisterE() & ((Alarm==1) ? 0xFE : 0xFD));
}

//
// Включить ежеминутные прерывания
//
static void EnableMinuteInterrupt(void) {
	setA2Time(1, 1, 1, 0x70, false);
	setRegisterF(getRegisterF() & (~2));
	setRegisterE(getRegisterE() | 4);
	turnOnAlarm(2);
}

//
// "Заткнуть" будильник № alarm
//
static void clearAlarmSignal(const uint8_t alarm) {
	setRegisterF(getRegisterF() & (~alarm));
}

//
// Проверка сработал ли будильник № Alarm
//
static bool checkIfAlarm(const uint8_t Alarm) {
	bool result;
	uint8_t temp_buffer = getRegisterF();
	if (Alarm == 1) {
		result = temp_buffer & 1;
		temp_buffer &= 0xFE;
	} else {
		result = temp_buffer & 2;
		temp_buffer &= 0xFD;
	}
	setRegisterF(temp_buffer);
	return result;
}

//
// Включается прерывание и заодно назначается ISR
//
inline static void _attachInterrupt0(void) {
	pinMode(PIN_SQW, INPUT);
	
	#if PIN_SQW == 2
			EICRA = bit(ISC01);	// FALLING edge
			EIMSK = bit(INT0);	// INT0 interrupt
		}
		ISR(INT0_vect)
	#else
			EICRA = bit(ISC11);	// FALLING edge
			EIMSK = bit(INT1);	// INT1 interrupt
		}
		ISR(INT1_vect)
	#endif
{
	const uint8_t oldSReg = SREG;
	sei();
	if (checkIfAlarm(2)) {
		// Если мы попали сюда, значит произошёл переход на новую минуту
		// Здесь можно обновить экран часов и т.д. и т.п.
		// в конце обязательно ...
		clearAlarmSignal(2); // очистить сигнал будильника
	}
	SREG = oldSReg;
}


void clockInit(void) {
	setRegisterE(getRegisterE() & 0x7F); // Запустить осциллятор
	setRegisterF(getRegisterF() & 0x7F); // Очистить OSF flag
	setElement(2, getElement(2) & 0xBF); // 24-часа
	clearAlarmSignal(2);	// Выключить будильник 2 (от греха)
	EnableMinuteInterrupt(); // Включить прерывания на переходе минуты
	_attachInterrupt0(); // назначить функцию обработчик прерывания
}

void setup(void) {
	clockInit();
}

void loop(void) {
}

Всё нормально, инициализирует часы, включает ежеминутное прерывание и слушает его. Чтобы "слушать" прерывание необходимо пин (второй или третий - в моем примере 2-ой) соединить с пином SQW часов.

Кстати, имейте в виду - слушание этого прерывания занимает будильник №2. Будильником №1 можете пользоваться по своему усмотрению, а №2 уже занят.

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

SLKH пишет:

где-то на просторах этого форума есть фраза (в пересказе) "Если можно обойтись без прерываний, лучше обойтись без прерываний". ИМХО, такой подход тоже имеет право на жизнь, особенно для начинающих.

С этой фразой согласиться не могу (на просторах этого форума понаписано много ... эээ ... спорных утверждений). Впрочем, не знаю, начинающим программистом я был 38 лет назад :)

maxvalin
Offline
Зарегистрирован: 22.02.2016

Евгений, после такого кода я ушёл на долго)))

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

Так берите библиотеку. Навеняка её нетрудно найти на гитхабе (типа, чтобы примеры были), а изменения в неё я уже сделал.

maxvalin
Offline
Зарегистрирован: 22.02.2016

часы тикают уже два месяца без проблем,

народ, подскажите пожалуйста как обойти проблему(она только для меня эта проблема)

с выводом инфы с часов в виде: 2017/9/27 12:34:5

Нужно: 2017/9/27 12:34:05
 
это уже для другого дела.
SLKH
Offline
Зарегистрирован: 17.08.2015

maxvalin пишет:

часы тикают уже два месяца без проблем,

народ, подскажите пожалуйста как обойти проблему(она только для меня эта проблема)

с выводом инфы с часов в виде: 2017/9/27 12:34:5

Нужно: 2017/9/27 12:34:05
 
это уже для другого дела.

А куда и как оно сейчас выводится?

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

Ну, Вы используете "библиотеку" <time.h>? Или <stdio,h> Что тас у Вас вообще под рукой есть? Найдётся ли с полкило свободной памяти в области программы?

maxvalin
Offline
Зарегистрирован: 22.02.2016

на OLED.(часы и не привычно видеть "без ноля")

место найдется .

а библиотека Sodaq_DS3231.h

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

Блин, ну давайте по шагам

1) Вы можете на свой OLED вывести строку описанну как массив символов? Если у Вас будет строка типа "05:51:00 28.09.2017" Вы сумеете её вывести?

2) Вы можете получить по отдельности как числа значние часов, минут, номер месяца там и всё остальное?

maxvalin
Offline
Зарегистрирован: 22.02.2016

Стоп, я протупил.

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

"2) Вы можете получить по отдельности как числа значние часов, минут, номер месяца там и всё остальное?"

конечно могу, там же разные команды для каждой величины.

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

Так строку можете вывести на экран? Вы не ответили

maxvalin
Offline
Зарегистрирован: 22.02.2016

найду способ. в принципе не проблема.

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

Ну, тогда, если считать, что часы. минуты и т.д. у находятся в переменных hours, munites, и т.д. Пишете что-то типа

char buffer[9];
sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds);

После этого строку buffer спокойно выводите на экран. Число 9 в первой строке - максимальная длина получаемой строки + 1. В Вашем случае максимальная длина - 8, стало быть 9

Если требуется также и дата, аналогично

char buffer[18];
sprintf(buffer, "%02d:%02d:%02d %02d.%02d.%02d", hours, minutes, seconds, day, month, year%100);

здесь год выводится без века.

Если разорётся, что не объявлена sprintf, вставьте в начало #include <stdio.h>

maxvalin
Offline
Зарегистрирован: 22.02.2016

тоисть типа:

sprintf(buffer, "%02d:%02d", now.hour(),now.minute());


если 
команда now.minute() - получить минуты
               now.hour() - получить часы

 

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

Ну, типа того. Тогда размер буфера - 6.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Евгений, скажите пожалуйста, вы хотите меня в сатанисты записать? ))))))))))

#include <SPI.h>
#include <OLED_I2C.h>     // подключение библиотеки для OLED
OLED  myOLED(9, 10);       // подключение дисплея 8 SDA  9 SCK
/////////////////////датчик температуры и влажности

#include "DHT.h"
#define DHTPIN 7     // вывод, к которому подключается датчик
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);
////////////////////////////////////#include <Wire.h>
#include "Sodaq_DS3231.h"  // подключение часов  Uno, Nano A4 (SDA), A5 (SCL)
extern uint8_t RusFont[]; // Русский шрифт
extern uint8_t SmallFont[];  // маленький шрифт
extern uint8_t MediumNumbers[]; //средний шрифт
extern uint8_t MegaNumbers[]; 
extern uint8_t MediumFont[];
extern uint8_t BigNumbers[];  //большой шрифт
#define fotorez A0   // фоторезистор с 10 коомным шунтирующим
#define vutyazhka 2 // включение вытяжки
#define fotorez A1   // включение подсветки через транзистор с рампса
//DateTime dt(2017, 8, 28, 11, 42, 0, 1);  // здесь установить дату и время  год.месяц.день.часы.минуты.секунды.день
int houre = 0;// переменная для часов
int minutu = 0;// переменная для минут
char buffer[6]; // масив для строки (для двух символов, на один идет 3)





void setup() {
    delay(300);
    Serial.begin(9600);
//    Wire.begin();
    rtc.begin();
    myOLED.begin();
    myOLED.setFont(RusFont); // подключаю русский шрифт
    myOLED.setFont(SmallFont);
    pinMode(vutyazhka, OUTPUT);
    pinMode(fotorez, OUTPUT);
    //rtc.setDateTime(dt);  // установка времени если понадобится
}

void loop() {
  DateTime now = rtc.now(); //Получить текущую дату-время
    float h = dht.readHumidity(); // Считывание влажности в процентах
    float t = dht.readTemperature()-3;  // Считывание температуры в цельсиях 
    houre = now.hour();//переменная для часов
    minutu = now.minute();//переменная для минут
    sprintf(buffer, "%02d:%02d", houre,minutu);
    myOLED.clrScr();               
    myOLED.setFont(RusFont); // подключаю русский шрифт
    myOLED.print("NTVGTHFNEHF DKF:YJCNM", CENTER, 0); // вывожу надпись "температура и влажность"
    myOLED.setFont(MediumNumbers);  // включаю средний шрифт цифр
    myOLED.printNumF(t, 1, 15, 10);// пишу на экране переменную температуры. один знак после запятой.25 пикселей отступа. 12 пикселейотступа с верху.
    myOLED.printNumF(h, 1, 80, 10); //тоже самое только влажность
    myOLED.setFont(MegaNumbers); //подключаю большие цифры
    myOLED.printNumI(buffer, 5, 27); 
    //myOLED.print("/", CENTER, 27); 
    //myOLED.printNumF(minutu,0, 75, 27);     
    myOLED.update();          
              
              
            Serial.print(now.year(), DEC);
            Serial.print('/');
            Serial.print(now.month(), DEC);
            Serial.print('/');
            Serial.print(now.date(), DEC);
            Serial.print(' ');
            Serial.print(now.hour(), DEC);
            Serial.print(':');
            Serial.print(now.minute(), DEC);
            Serial.print(':');
            Serial.print(now.second(), DEC); 
            Serial.println();// выводим время

            delay(200);

}

maxvalin
Offline
Зарегистрирован: 22.02.2016

да уж, не разбираюсь в тонкостях...

при строке:

Serial.print(buffer);

в сериал выводит нормально, правда сейчас 11:46 и ноля еще не увижу 15 минут (часы не охота сбивать)

на OLED наверное не правильно отсылаю

сейчас разберусь

 

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

maxvalin пишет:

в сериал выводит нормально, правда сейчас 11:46 и ноля еще не увижу 

Увидите. Формат %02d означает: число шириной 2 знака, при необходимости дополненное слева нулём. Так что, куда оно денется. А с OLED разбирайтесь, я не зря спрашивал можете ли Вы туда строку вывести :)

maxvalin
Offline
Зарегистрирован: 22.02.2016

все ок)

 

sprintf(buffer, "%02d/%02d", houre,minutu);  -  (символ / )

с ":"  был мусор.

сейчас 12:06 а не 12:6

СПАСИБО!!!

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

Вообще-то никакого мусора быть не должно. Разве что функция вывода из библиотеки OLED символ ':' как-то особо отрабатывает - этого я не знаю.