всё, связанное с DC1302

kakakakakakak
Offline
Зарегистрирован: 09.03.2019

Привет, задумал такой проект: есть кнопка, есть реле, есть DC1302 и ардуино. нужно чтобы реле включалось на некоторое время которое будет отсчитывать DC1302. И вот вопрос: КАК ИСПОЛЬЗОВАТЬ ТО ВРЕМЯ КОTОРОЕ ДАЁТ DC1302? я думал через переменную но не знаю как это осуществить.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Разумеется написать скетч. А если не знаете как написать скетч, то почитать соответствующую литературу.

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

Почитайте в интернете про unix time. 

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

kakakakakakak пишет:
КАК ИСПОЛЬЗОВАТЬ ТО ВРЕМЯ КОTОРОЕ ДАЁТ DC1302?
Складывать в компостную яму, а потом на удобрения.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

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

kakakakakakak пишет:
КАК ИСПОЛЬЗОВАТЬ ТО ВРЕМЯ КОTОРОЕ ДАЁТ DC1302?
Складывать в компостную яму, а потом на удобрения.

Думаешь там само рапарситься?

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

Ну, если чо, так добавить туда мочевины или дрожжей - куда оно денется-то?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

... и превратиться строка в массив.

Седой
Offline
Зарегистрирован: 19.02.2019

kakakakakakak пишет:

Привет, задумал такой проект: есть кнопка, есть реле, есть DC1302 и ардуино. нужно чтобы реле включалось на некоторое время которое будет отсчитывать DC1302. И вот вопрос: КАК ИСПОЛЬЗОВАТЬ ТО ВРЕМЯ КОTОРОЕ ДАЁТ DC1302? я думал через переменную но не знаю как это осуществить.

А какой смысл от DC1302, можно воспользоваться счетчиком самой ардуино т. к. нет привязки к реальному времени. Но намой взляд это тоже перебор, задача плевая хватит тупо поставить NE555 и будет радость, а то и на одном транзисторе можно сделать. А как использовать DC1302 доступно написано в примере в ардуиноиде.

kakakakakakak
Offline
Зарегистрирован: 09.03.2019

Всё чуточку поменялось: нужно чтобы реле включалось на два часа каждые сутки, собираюсь использовать уже DS3231(говорят они более точные, и у них функционал больше). + нужно пристроить тактовую кнопку при нажатии на которую реле включится на два часа, независимо какое сейчас время. Немогу написать код, пишу-пишу а толку нету работает либо то, либо то, пытался исправлять - то же самое. Использовал пример из библиотеки, пытался пристроить его, но нет. вот скетч, да и там немного грязно:

#define key 9                                                    // Присваиваем 9 пину имя key
#define relay 8                                                  // Присваиваем 8 пину имя relay
#include <iarduino_RTC.h>                                        // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
    iarduino_RTC time(RTC_DS1302, 10, 12, 11);                   // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
void setup(){                                                    //
    pinMode(relay , OUTPUT);                                     // Реле на 8 пине
    pinMode(key , INPUT_PULLUP);                                 // Кнопка на 9 пине
    Serial.begin(9600);                                          // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
    time.begin();                                                // Инициируем работу с модулем.
    //time.settime(0 , 02 , 18 , 11 , 3 , 19 , 1);               // настройка даты и времени
}                                                                //
void loop(){                                                     //
    if(millis()%1000==0)                                         // Если прошла 1 секунда.
      Serial.println(time.gettime("d-m-Y, H:i:s, D"));           // Выводим время.
                                                                 //   
     if (time.Hours == 21 && time.minutes == 7) digitalWrite(relay , HIGH);
      if(millis()%5000==0)
     digitalWrite(relay , LOW);
     //else digitalWrite(8 , LOW);                                 // Иначе выключить реле
     //if (time.Hours == 20 && time.minutes == 52)   digitalWrite(relay , LOW);           // Если сейчас четыре часа ночи, то выключить реле
     //else digitalWrite(8 , LOW);                                 // Иначе выключить реле (на всякий :) 
     boolean KEY = !digitalRead(9);                              // Создать переменную хранящюю значения кнопки             ! обработка нажатия кнопки
     if(KEY == 1){  digitalWrite(relay, HIGH); delay(60000); }   // Если кнопка нажата, включить реле и подождать 1 min     ! обработка нажатия кнопки
     else digitalWrite(relay , LOW);                             // Иначе выключить реле                                    ! обработка нажатия кнопки
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Похоже Мыши плакали, кололись, но продолжали грызть кактус. Вот зачем вы начали трогать часы. millis() использовать не кормфильно.

kakakakakakak
Offline
Зарегистрирован: 09.03.2019

Я новичок, и подумал по незнанию что это можно использовать

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Проблему полночи Вы как собираетесь решать. Дребезг кнопки как удалять.  Опять же цифровые автоматы понимать надо.

kakakakakakak
Offline
Зарегистрирован: 09.03.2019

может кто поможет с кодом? Хоть подтолкните в нужную сторону.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Нажал на кнопку горит 2 секунды

const byte btnPin = 2;
const byte ledPin = 13;
// кнопка
bool btn;
unsigned long btnPast;
// лампочка
bool state;
const unsigned long time2s = 2000;
unsigned long past;
void set(bool s) {
  state = s;
  past = millis();
  switch (s) {
    case false:
      digitalWrite(ledPin, LOW);
      break;
    case true:
      digitalWrite(ledPin, HIGH);
      break;
  }
}
void setup() {
  pinMode(btnPin, INPUT_PULLUP); // кнопка
  pinMode(ledPin, OUTPUT); // лампа
  set(false);
}
void loop() {
  if (millis() - btnPast >= 100) {
    switch (btn) {
      case false:
        if (!digitalRead(btnPin)) {
          btnPast = millis();
          btn = true;
          set(true);
        }
        break;
      case true:
        if (digitalRead(btnPin)) {
          btnPast = millis();
          btn = false;
        }
        break;
    }
  }
  switch (state) {
    case false:
      break;
    case true:
      // истекло 2 секунды
      if (millis() - past >= time2s)set(false);
      break;
  }
}

 

Седой
Offline
Зарегистрирован: 19.02.2019

Про подключение кнопки почитай в поиске там понятно написано, а с часов считывай время, переводи в секунды и сравнивай, я так реле времени делал, просто и работает

kakakakakakak
Offline
Зарегистрирован: 09.03.2019

Ладно, спасибо! Буду разбираться. Отпишусь если будут проблемы.

Седой
Offline
Зарегистрирован: 19.02.2019
  long t_on, t_off, t_real; //время включения, отключения, реальное время
  byte sum, sum1;// переменные для определения изменения одного из каналов
  byte h, m, s, h_on, m_on, h_off, m_off, can; // промежуточные переменные для вычисления времени в секундах(сразу вставлять формулу считает не коректно хз почему)on_off- переменная для устранения бага с мерцающим светодиодом
  h = time.Hours;
  m = time.minutes;
  s = time.seconds;
  t_real = h * 3600 + m * 60 + s ; // реальное время в секундах
  for (int i = 100; i < 900; i = i + 100) //цикл перебора значений времени
  {
    h_on = EEPROM.read(i + 10);// загружаем из памяти час включения, +10 поправка на ячейку в памяти
    m_on = EEPROM.read(i + 15);//загружаем из памяти минуту включения, +15 поправка на ячейку в памяти
    t_on = h_on * 3600 + m_on * 60; // время включения в секундах
    h_off = EEPROM.read(i + 20);// загружаем из памяти час выключения, +20 поправка на ячейку в памяти
    m_off = EEPROM.read(i + 25);// загружаем из памяти минуту выключения, +25 поправка на ячейку в памяти
    t_off = h_off * 3600 + m_off * 60; //время отключения в секундах
    can = i / 100 + 1;// переменная номера цифрового вывода к которому подключен канал, +1 смещение так как используется со 2-9 вывод
    if (EEPROM.read(i) == 1)//проверяем включен ли канал
    {
      if (sost_cnal[i / 100] == 0) // смотрим состояние канала, если канал выключен
      {
        if (t_on <= t_real) // если время включения меньше реального то включаем канал
        {
          sost_cnal[i / 100] = 1;// заносим в массив значение состояния канала
        }
      }
      if (sost_cnal[i / 100] == 1) //смотрим состояние канала, если канал включен
      {
        if (t_off <= t_real && t_on >= t_real)// проверяем условие в случае когда время выключения в секундах меньше чем время включения
        {
          sost_cnal[i / 100] = 0;// заносим в массив значение состояния канала
        }
        if (t_on <= t_off && t_off <= t_real)// проверяем условие в случае когда время выключения в секундах больше чем время включения
        {
          sost_cnal[i / 100] = 0;// заносим в массив значение состояния канала
        }
      }
    }
    if (EEPROM.read(i) == 0)//проверяем включен ли канал
    {
      sost_cnal[i / 100] = 0;// заносим в массив значение состояния канала
      }
  }
  for (byte q = 1; q < 9; q = +1)
  { sum = sum + sost_cnal[q];
  }
  if (sum != sum1)
  {
    for ( byte w = 1; w < 9; w = w + 1)
    {
      if (sost_cnal[w] == 1)// включаем реле
      {
        digitalWrite(w, LOW);// переводим вывод в низкое состояние
      }
      else if (sost_cnal[w] == 0)//выключаем реле
      {
        digitalWrite(w, HIGH);// переводим вывод в высокое состояние
      }
    }

    sum1 = sum;
  }

 

Седой
Offline
Зарегистрирован: 19.02.2019

Принцип действия, вроде должен понять

kakakakakakak
Offline
Зарегистрирован: 09.03.2019

а что если через переменную? То есть запросить время, перезаписать в переменную, и дальше работать с условиями (if)

 

kakakakakakak
Offline
Зарегистрирован: 09.03.2019

наверно это бред, да?