Первичные часы на ардуино.

Serious Sam
Offline
Зарегистрирован: 04.07.2020

Здравствуйте уважаемые форумчане. Прошу помощи, так как только начал изучать arduino, и возникла необходимость создать проект который мне не по зубам. Суть проекта - имеется LCD 1602 с платой i2c, arduino uno, кнопки 3 шт., RTC 3231. из этого железа делаются часы с 2я выходными сигналами, каждую четную минуту включается 1 канал на 1 сек, каждую нечетную минуту 2ой канал на 1 сек. И эта функция должна быть жестко привязана к часам, даже когда мы в режиме установки времени - при изменении минут - выводился сигнал согласно вышеуказанному алгоритму, при изменении часов - выводилось 60 сигналов (по 30 на каждый канал). Проектов по изготовлению часов в сети огромное множество, за основу взял код ниже, можно ли его доработать до требуемого результата?

// Подключаем библиотеки:
#include <Wire.h>                            // подключаем библиотеку для работы с шиной I2C
#include <LiquidCrystal_I2C.h>               // подключаем библиотеку для работы с LCD дисплеем
#include <iarduino_RTC.h>                    // подключаем библиотеку для работы с RTC модулем
LiquidCrystal_I2C lcd(0x27,16,2);            // объявляем  переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
iarduino_RTC time(RTC_DS3231);               // объявляем  переменную для работы с RTC модулем,  указывая название модуля
// Объявляем переменные и константы:
const uint8_t PIN_button_SET  = 2;           // указываем номер вывода arduino, к которому подключена кнопка SET
const uint8_t PIN_button_UP   = 3;           // указываем номер вывода arduino, к которому подключена кнопка UP
const uint8_t PIN_button_DOWN = 4;           // указываем номер вывода arduino, к которому подключена кнопка DOWN
      uint8_t VAR_mode_SHOW   = 1;           // режим вывода: 1-время 2-дата
      uint8_t VAR_mode_SET    = 0;           // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели
void setup() {
  pinMode(PIN_button_SET,  INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
  pinMode(PIN_button_UP,   INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
  pinMode(PIN_button_DOWN, INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
  delay(300);                                // ждем 300мс
  time.begin();                              // инициируем RTC модуль
  lcd.init();                                // инициируем LCD дисплей
  lcd.backlight();                           // включаем подсветку LCD дисплея
}
void loop(){
  if(millis()%500==0){                      // если прошла 1 секунда
      lcd.setCursor(0, 0);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print("Moscow (GMT +3)");              // выводим текст 
      lcd.setCursor(0, 1);                   // устанавливаем курсор в позицию: столбец 0, строка 1
    if(VAR_mode_SHOW==1){                    // если установлен режим вывода времени
      lcd.print(time.gettime("H:i:s"));      // выводим время
    }
    if(VAR_mode_SHOW==2){                    // если установлен режим вывода даты
      lcd.print(time.gettime("d-m-Y   D"));  // выводим дату
    }
    delay(1);                                // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
  }
  Func_buttons_control();                    // передаём управление кнопкам
}
// Функция управления кнопками:
void Func_buttons_control(){
  uint8_t i=0;
  time.blinktime(VAR_mode_SET);                                  // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0)
//Если часы находятся в режиме установки даты/времени
  if(VAR_mode_SET){
//  Если нажата кнопка UP
    if(digitalRead(PIN_button_UP  )){
      while(digitalRead(PIN_button_UP)){delay(50);}              // ждём пока мы не отпустим кнопку UP
      switch (VAR_mode_SET){                                     // инкремент (увеличение) устанавливаемого значения
      /* сек */ case 1: time.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
      /* мин */ case 2: time.settime(-1, (time.minutes==59?0:time.minutes+1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: time.settime(-1, -1, (time.Hours==23?0:time.Hours+1),     -1, -1, -1, -1); break;
      /* дни */ case 4: time.settime(-1, -1, -1, (time.day==31?1:time.day+1),         -1, -1, -1); break;
      /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==12?1:time.month+1),     -1, -1); break;
      /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==99?0:time.year+1),       -1); break;
      /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==6?0:time.weekday+1) ); break;
      }
    }
//  Если нажата кнопка DOWN
    if(digitalRead(PIN_button_DOWN)){
      while(digitalRead(PIN_button_DOWN)){delay(50);}            // ждём пока мы её не отпустим
      switch (VAR_mode_SET){                                     // декремент (уменьшение) устанавливаемого значения
      /* сек */ case 1: time.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
      /* мин */ case 2: time.settime(-1, (time.minutes==0?59:time.minutes-1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: time.settime(-1, -1, (time.Hours==0?23:time.Hours-1),     -1, -1, -1, -1); break;
      /* дни */ case 4: time.settime(-1, -1, -1, (time.day==1?31:time.day-1),         -1, -1, -1); break;
      /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==1?12:time.month-1),     -1, -1); break;
      /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==0?99:time.year-1),       -1); break;
      /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==0?6:time.weekday-1) ); break;
      }
    }
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
      while(digitalRead(PIN_button_SET)){                        // ждём пока мы её не отпустим
        delay(10);
        if(i<200){i++;}else{lcd.clear();}                        // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
      }
      if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
        VAR_mode_SET++;                                          // переходим к следующему устанавливаемому параметру
        if(VAR_mode_SHOW==1 && VAR_mode_SET>3){VAR_mode_SET=1;}  // возвращаемся к первому устанавливаемому параметру
        if(VAR_mode_SHOW==2 && VAR_mode_SET>7){VAR_mode_SET=4;}  // возвращаемся к первому устанавливаемому параметру
      }else{                                                     // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени
        VAR_mode_SET=0;                                          // выходим из режима установки даты/времени
      }
    }
//Если часы находятся в режиме вывода даты/времени
  }else{
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
      while(digitalRead(PIN_button_SET)){delay(10);              // ждём пока мы её не отпустим
        if(i<200){i++;}else{lcd.clear();}                        // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
      }
      if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
        lcd.clear();                                             // стираем экран
        VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;                      // меняем режим вывода: дата/время
      }else{                                                     // если 
        if(VAR_mode_SHOW==1){VAR_mode_SET=1;}                    // если установлен режим вывода времени, то устанавливаемый параметр - секунды
        if(VAR_mode_SHOW==2){VAR_mode_SET=4;}                    // если установлен режим вывода даты,    то устанавливаемый параметр - день
      }
    }
  }
}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Сделай сначала праэкт, который тебе по зубам. Потом и до этого дойдешь.

Serious Sam
Offline
Зарегистрирован: 04.07.2020

DetSimen пишет:

Сделай сначала праэкт, который тебе по зубам. Потом и до этого дойдешь.

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

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

Serious Sam пишет:
Пойду светодиодами на ардуинке поморгаю.
Вам ещё рано! Сказано же, начинайте с того, что по зубам!

Первым делом изучите самую верхнюю тему в разделе "Песочница", и только потом попробуйте перезадать свои вопросы в этой теме!

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

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

Serious Sam пишет:

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


не надо этого неуместного сарказма. Сначала оформите свой вопрос как положено - вставьте код по правилам и нормально сформулируйте алгоритм, а потом будете предъявлять претензии к форуму

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

можно доработать проект любых часиков под первичные

nik182
Offline
Зарегистрирован: 04.05.2015

Были уже темы про первичные часы. Даже проект есть. Поиск рулит.

Serious Sam
Offline
Зарегистрирован: 04.07.2020

nik182 пишет:
Были уже темы про первичные часы. Даже проект есть. Поиск рулит.

Если вы про этот http://arduino.ru/forum/proekty/pervichnye-chasy то как видите он не рабочий. А обращаются на форум обычно приходится, когда весь интернет перерыт. Нормального проекта нет. И еще раз спасибо за очередной "дельный" совет!

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

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

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

b707 пишет:
можно довести до рабочего состояния
Надеюсь, Вы не будете делать это, считая строки пальцем? Надо всё же приучать, а то "пацаки уже на голову сели". 

Serious Sam
Offline
Зарегистрирован: 04.07.2020

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

b707 пишет:
можно довести до рабочего состояния
Надеюсь, Вы не будете делать это, считая строки пальцем? Надо всё же приучать, а то "пацаки уже на голову сели". 

Регистрируясь на данном ресурсе, надежд особых не возлагал, на форумах редко кто помогает - только советчики обычно находятся которые баллы себе накручивают глупыми ответами, типа погугли, или подрастешь - все сможешь и т.д. Единственный ответ был прекрасен и по делу - что необходимо правильно оформить свой вопрос, в остальном - хочешь изменить мир, начни с себя "ПАЦАК"

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

b707 пишет:
можно довести до рабочего состояния
Надеюсь, Вы не будете делать это, считая строки пальцем? Надо всё же приучать, а то "пацаки уже на голову сели". 

Женя! Ну отредактируй ТСу его первое сообщение, убрав код. Не доходит до болезного необходимость вставки кода по правилам!

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

Serious Sam пишет:

Регистрируясь на данном ресурсе, надежд особых не возлагал, на форумах редко кто помогает - только советчики обычно находятся которые баллы себе накручивают глупыми ответами, типа погугли, или подрастешь - все сможешь и т.д. Единственный ответ был прекрасен и по делу - что необходимо правильно оформить свой вопрос, в остальном - хочешь изменить мир, начни с себя "ПАЦАК"

ну... что ж, хотите по гамбургскому счёту ... давайте по гамбургскому.

Давайте я отвечу на все Ваш вопросы. Отвечу правильно. Только ... вот беда, В Вашем коде нет номеров строк, потому, вместо номеров строк я буду везде писать ХЗ. Хотите попробовать?

Или всё-таки снизойдёте до нас - грешных, и соизволите вставить код, как положено?

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

wdrakula пишет:

Женя! Ну отредактируй ТСу его первое сообщение

Я не умею. Александр мне таких функций не доверяет :-)

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

Serious Sam пишет:

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


и что же? Где он, ваш правильно оформленный вопрос? Не осилили? Только язвить горазды...

Serious Sam
Offline
Зарегистрирован: 04.07.2020

Вы извините что задаю этот вопрос в этой ветке, не вижу 1. как изменить и оформить свой вопрос. 2. как написать личное сообщение. Еще раз прошу прощение за неправильно оформленный изначально вопрос.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

1) Новым сообщением
2) Никак

vvadim
Offline
Зарегистрирован: 23.05.2012

Serious Sam пишет:

Вы извините что задаю этот вопрос в этой ветке, не вижу 1. как изменить и оформить свой вопрос. 2. как написать личное сообщение. Еще раз прошу прощение за неправильно оформленный изначально вопрос.

вам же указали почитать раздел "Песочница".
гордость не позволяет  ?
 

лички на этом форуме нет.

 

Morroc
Offline
Зарегистрирован: 24.10.2016

Serious Sam пишет:
И эта функция должна быть жестко привязана к часам, даже когда мы в режиме установки времени - при изменении минут - выводился сигнал согласно вышеуказанному алгоритму, при изменении часов - выводилось 60 сигналов (по 30 на каждый канал).

Если отклонения в десятки мс не критичны и приведенный в первом посте скетч рабочий, то и он годится за основу. У вас идеи то есть какие нибудь ? Программировать умеете вообще ?