Таймер на DS1307

Snecky
Offline
Зарегистрирован: 24.01.2012


Всем доброе время суток)) не могу понять почаму не отрабатывает таймер ?




#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> 
#define timePIN 13

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
}

void loop()
{

  int Hour = RTC.get(DS1307_HR,true); 
  int Minute = RTC.get(DS1307_MIN,true); 
  int Second = RTC.get(DS1307_SEC,false); 
  int FullMinutes = Hour * 60 + Minute;

  boolean Day = (FullMinutes >= 8 * 60 + 52 & FullMinutes <= 9 * 60 + 20);  
  digitalWrite(timePIN, (Day) ? HIGH:LOW);
  
  delay(1000);
  Serial.print(Hour);
  Serial.print(":");
  Serial.print(Minute);
  Serial.print(":");
  Serial.println(Second);
  delay(1000);
}

void SetTime()  
{ 
  if (Serial.read() == 't') 
  { 
    int h = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    Serial.read(); 
    int m = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    RTC.stop(); 
    RTC.set(DS1307_SEC,0); 
    RTC.set(DS1307_MIN,m); 
    RTC.set(DS1307_HR,h); 
    RTC.start(); 
  } 
  Serial.flush(); 
}

причем если  в строке bolean  время срабатывания на 2х значное число (например 14, 18,и т.д ) то работает хорошо. может кто поможет ?

maksim
Offline
Зарегистрирован: 12.02.2012
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> 
#define timePIN 13

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
}

void loop()
{

  int Hour = RTC.get(DS1307_HR,true); 
  int Minute = RTC.get(DS1307_MIN,true); 
  int Second = RTC.get(DS1307_SEC,false); 
  int FullMinutes = Hour * 60 + Minute;

  if(FullMinutes >= 8 * 60 + 52 && FullMinutes <= 9 * 60 + 20) digitalWrite(timePIN, HIGH); 
  else digitalWrite(timePIN, LOW);
  
  delay(1000);
  Serial.print(Hour);
  Serial.print(":");
  Serial.print(Minute);
  Serial.print(":");
  Serial.println(Second);
  delay(1000);
}

void SetTime()  
{ 
  if (Serial.read() == 't') 
  { 
    int h = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    Serial.read(); 
    int m = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    RTC.stop(); 
    RTC.set(DS1307_SEC,0); 
    RTC.set(DS1307_MIN,m); 
    RTC.set(DS1307_HR,h); 
    RTC.start(); 
  } 
  Serial.flush(); 
}

 

Snecky
Offline
Зарегистрирован: 24.01.2012

Максим у вас этот код работает ? я к тому что у меня он так же не захотел работать 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
if(FullMinutes >= 8 * 60 + 52 && FullMinutes <= 9 * 60 + 20) digitalWrite(timePIN, HIGH);

Я обычно пишу сложные выражения в скобках, поскольку это более читабельно и меньше шансов ошибиться с приоритетом выполнения операций. Например,

if( FullMinutes >= ( 8 * 60 + 52 ) && FullMinutes <= ( 9 * 60 + 20 ) ) digitalWrite(timePIN, HIGH);

У меня это уже просто привычка.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Snecky пишет:
причем если  в строке bolean  время срабатывания на 2х значное число (например 14, 18,и т.д ) то работает хорошо.
Куда вы эти числа подставляете?

Snecky
Offline
Зарегистрирован: 24.01.2012

 boolean Day = (FullMinutes >= 10 * 60 + 52 & FullMinutes <= 19 * 60 + 20); 

при такой постановки времени, таймер работает

 

Kisoft ни как  код не хочет работать правельно (((

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вы почему то упорно пишите так:

boolean Day = (FullMinutes >= 10 * 60 + 52 & FullMinutes <= 19 * 60 + 20);

хотя максим уже Вам подсказал, что нужно писать так:

boolean Day = (FullMinutes >= 10 * 60 + 52 && FullMinutes <= 19 * 60 + 20);

& - это бинарная операция И

&& - это логическая операция И

"a && b" - на выходе false только если одно из чисел (или оба) равно нулю, а "a & b" - например 0x11 & 0x10 = 0x01, т.е. true

 

Snecky
Offline
Зарегистрирован: 24.01.2012

сори  скопипастил и не заметил, пишу  как Максим посоветовал  и все те же камни (

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ок, тогда хотя бы что в Serial выводится?

Теоретически в Вашем скетче всё еорректно, однако библиотека RTC мне не знакома, поэтому, думаю, в этом и проблема.

Я посмотрел туториал здесь: http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit посмотрите, там отличий много, хотя, возможно, это другая либа.

UPD: Вполне возможно, что эта строка:

int Minute = RTC.get(DS1307_MIN,true);

должна быть такой:

int Minute = RTC.get(DS1307_MIN,false);

 

Snecky
Offline
Зарегистрирован: 24.01.2012

Serial monitor  выводит часы:минуты:секунды  правельные показания

 

насколько я понял в строчкe 

 int Minute = RTC.get(DS1307_MIN,true);

  true перестает игнорировать значения Minute 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В инете я видел именно то, что написал, первый вызов с true, остальные с false. Насколько я понял, true заставляет часы обновить внутренние данные, а false - читать зафиксированные данные

Snecky
Offline
Зарегистрирован: 24.01.2012

блин (( и все же если делать "врямя"  однозначное число  (9 или 5,6) то не срабатывает (( ну что за хрень то ?

maksim
Offline
Зарегистрирован: 12.02.2012

А как проявляется это "не работает" ?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Присоединяюсь к вопросу. Плюс, первое, что приходит в голову, вывести в сериал кроме времени:

1. FullMinutes
2. Константы, с которыми сравниваете
3. Признак сравнения

И уже на этом материале смотреть, что именно не изменяется в нужное время.

Кроме того, если уж совсем непонятно, тупо сравнивать отдельно часы и минуты, без сбора их в FullMinutes, хотя это уже из области фантастики.

 

maksim
Offline
Зарегистрирован: 12.02.2012

В общем дело не в том, что у вас таймер не срабатывает, а в том что когда вы проверяете работоспособность таймера вы устанавливаете время. Так? И вы вводите в сериал строку t7 59 или t7 4, так? Это не правильно, нужно вводить t07 59 или t07 04. Угадал?

Snecky
Offline
Зарегистрирован: 24.01.2012

убрал  полностью установку времени (void SetTime())  вродебы заработал ))

Snecky
Offline
Зарегистрирован: 24.01.2012

опять грабли ))) не ставится время через сериал монитор, по поводу таймера мне подсказали что начало интервала должно быть  меньше его конца

maksim
Offline
Зарегистрирован: 12.02.2012

Так естественно начало должно быть меньше конца... вы же выше показали как числа подставляете.

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

Snecky
Offline
Зарегистрирован: 24.01.2012

код который не работает 



#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> 
#define timePIN 10


void setup()
{
  Serial.begin(9600);
  pinMode(10, OUTPUT); 

}

void loop()
{
  if (Serial.available() > 0) SetTime();
  int Hour = RTC.get(DS1307_HR,true); 
  int Minute = RTC.get(DS1307_MIN,false); 
  int Second = RTC.get(DS1307_SEC,false); 
  int FullMinutes = Hour * 60 + Minute;

  boolean Day = (FullMinutes >= 8 * 60 + 15 && FullMinutes <= 16 * 60 + 40);  
  digitalWrite(timePIN, (Day) ? HIGH:LOW); 


  delay(1000);
  Serial.print(addZero(Hour));
  Serial.print(":");
  Serial.print(addZero(Minute));
  Serial.print(":");
  Serial.println(addZero(Second)); // Отправляем информацию о времени на COM 

}


void SetTime() // установка времени из шаблона tчч:мм 
{ 
  if (Serial.read() == 't') // Если первый символ t, то установим указанное время 
  { 
    int h = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    Serial.read(); 
    int m = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    RTC.stop(); 
    RTC.set(DS1307_SEC,0); //set the seconds 
    RTC.set(DS1307_MIN,m); //set the minutes 
    RTC.set(DS1307_HR,h); //set the hours 
    RTC.start(); 
  } 
  Serial.flush(); 
} 

String addZero(int val) // Добавим 0 перед значением часа/минуты/секунды, если оно меньше 10 
{ 
  if (val<10) return "0" + String(val);
  else return String(val); 
}

 

maksim
Offline
Зарегистрирован: 12.02.2012
if (Serial.available() > 5) SetTime();

И прочитайте описание Serial.flush() - она не очищает фуфер.

Snecky
Offline
Зарегистрирован: 24.01.2012

Ожидает окончания передачи исходящих данных (до версии Arduino 1.0 функция очищала буфер последовательного соединения). -работаю arduino 0.22

 

может кто поможет уже рабочим кодом ? 

maksim
Offline
Зарегистрирован: 12.02.2012

Я так понимаю вы моей помощью не довольны, что ж, тогда разбирайтесь сами.
Зачем мне насильно вам втюхивать свою помощь.

И вы все по прежнему упорно используете эту масло-маслянную конструкцию не имея малейшего понятия как она работает:

  boolean Day = (FullMinutes >= 8 * 60 + 15 && FullMinutes <= 16 * 60 + 40);  
  digitalWrite(timePIN, (Day) ? HIGH:LOW); 

 

Snecky
Offline
Зарегистрирован: 24.01.2012

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

 

к пину 10 ардуины подключена релюшака (реле рабочая, 1,5V)  заггружаю, ваще опубликованный код, что бы пин 10 включался в 8:30 и выключался в 16:40 с выводом инфо о времени через сириал монитор, так вот в задоный промежуток времени (когда он должен включатся) на пине 10. 0V (т.е. ардуино не дает сигнал на пин 10) на сериал монитор время отправляется нормаьно 

maksim
Offline
Зарегистрирован: 12.02.2012

В общем, что я вам рекомендую сделать - скачать Arduino IDE 1.0 или выше, если ваша библиотека не заведется, то скачайте отсюда, затем залейте этот скейтч и подробно опишите что делаете и что происходит.

#include "Arduino.h"
#include <Wire.h>
#include <DS1307.h> 
#define timePIN 13

void setup()
{
  Serial.begin(9600);
  pinMode(timePIN, OUTPUT); 
}

void loop()
{
  if(Serial.available()) SetTime();

  int Hour = RTC.get(DS1307_HR, true); 
  int Minute = RTC.get(DS1307_MIN, false); 
  int Second = RTC.get(DS1307_SEC, false); 
  int FullMinutes = Hour * 60 + Minute;
  int FullMinutesTimerOn = 8 * 60 + 30;
  int FullMinutesTimerOff = 16 * 60 + 40;

  if(FullMinutes >= FullMinutesTimerOn && FullMinutes <= FullMinutesTimerOff) digitalWrite(timePIN, HIGH); 
  else digitalWrite(timePIN, LOW);
  
  Print(); // ПОСЛЕ ОТЛАДКИ НУЖНО УДАЛИТЬ !!!
  Serial.print(addZero(Hour));
  Serial.print(":");
  Serial.print(addZero(Minute));
  Serial.print(":");
  Serial.println(addZero(Second));
  delay(1000);
}

void SetTime()  
{ 
  delay(10);
  if (Serial.read() == 't') 
  { 
    int h = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    Serial.read(); 
    int m = (Serial.read() - '0') * 10 + (Serial.read() - '0'); 
    RTC.stop(); 
    RTC.set(DS1307_SEC,0); 
    RTC.set(DS1307_MIN,m); 
    RTC.set(DS1307_HR,h); 
    RTC.start(); 
  } 
  while(Serial.available()) 
  {
    delay(2);
    Serial.read(); 
  }
}

String addZero(int val) // Добавим 0 перед значением часа/минуты/секунды, если оно меньше 10 
{ 
  if (val<10) return "0" + String(val);
  else return String(val); 
}

void Print() // ЭТУ ФУНКЦИЮ ПОСЛЕ ОТЛАДКИ НУЖНО УДАЛИТЬ !!!
{
  Serial.print(FullMinutesTimerOn);
  Serial.print(" >> ");
  Serial.print(FullMinutes);
  Serial.print(" << ");
  Serial.print(FullMinutesTimerOff);
  Serial.print("       ");
}

То есть залили, запустили сериал, каждую секунду должна появляться строка с FullMinutes и со временем, вводите в сериал-монитор строку t08:29, время должно измениться на 08:29:00 и ждете пока загорится светодиод на 13 выводе, загорелся, вводите в сериал-монитор строку t16:39 и ждете пока потухнет светодиод. Если не загорелся то выкладываете (копируете из сериал-монитора) сюда то что у вас в сериал-мониторе.

Snecky
Offline
Зарегистрирован: 24.01.2012

Максим спс! только работает наоборот ! в указанный диапозон  свветодиод выключается (разобрался)

если позволите еще один вопрос )  а как сделать так чтобы считовалось состояние timePIN  допусти если timePIN включен, то включался пин 9 к примеру

 

maksim
Offline
Зарегистрирован: 12.02.2012

Snecky пишет:
Максим спс! только работает наоборот ! в указанный диапозон  свветодиод выключается (разобрался)
Такого не может быть, с 8:30 до 16:40 светодиод на 13 выводе будет гореть.

Snecky пишет:
если позволите еще один вопрос )  а как сделать так чтобы считовалось состояние timePIN  допусти если timePIN включен, то включался пин 9 к примеру
Не понимаю о чем вы.

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

Можно поднять тему?  ))

Элементарный вопрос:  Как вытянуть сигнал с задержкой на 1сек один раз в минуту, но чтоб ровно. Потребность есть ( хотелось часы завести Стрела) Там реверсным 24 надо маятник кртутить, раз в минуту. Тема есть в гугле. Но мотелось бы без делай, там парень описывает что подбирать надо. А если например есть гтовый RTC модуль, может с него вытягивать сигнал раз в минуту, давать задержку на этот сигнал, потом на другой порт так же. И по очереди тикать одним то другим портом с секундной задержкой.

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

arDubino
Offline
Зарегистрирован: 12.01.2017

если вроде ж модули задержки. тупо даешь сигнал а на модуле задержка 1с и все сразу за раз.

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

не понял, в смысле реле времени?

 

arDubino
Offline
Зарегистрирован: 12.01.2017

maxvalin пишет:

не понял, в смысле реле времени?

 

https://ru.aliexpress.com/item/NE555-Timer-Switch-Adjustable-Module-Time...

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

Да не, не то. Городить придётся много. Решил нано взять и 4канала реле. Вот и спросил как из библиотеки вытянуть по минутный сигнал. Задержку через милис то сделаю а вот независимо тикать поминутно, пока что сложновато.

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

Ребята, помогите с поминуткой, а?

пробую билиотеку iarduino_RTC.h

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

Так понимаю что нужно создать old_min и new_min и сравнивать, как только new_min не равна old_min то digitalread xx/ вот это и будет четкий поминутный сигнал? 

evgta
Offline
Зарегистрирован: 02.09.2016

условие как-то так должно звучать

 

 

если б = 60 то б =1 (или 59мин и 0 минут)

считываем минуты

если a больше б, тогда включаем пин, ждем сколько надо, выключаем пин, б=a.

 

а можно так

считываем минуты

если a не равно б, тогда включаем пин, ждем сколько надо, выключаем пин, б=a.

arDubino
Offline
Зарегистрирован: 12.01.2017

не используйте левые библиотеки и все.

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

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

arDubino
Offline
Зарегистрирован: 12.01.2017
/*
  DS3231: Real-Time Clock. Alarm simple
  Read more: www.jarzebski.pl/arduino/komponenty/zegar-czasu-rzeczywistego-rtc-DS3231...
  GIT: https://github.com/jarzebski/Arduino-DS3231
  Web: http://www.jarzebski.pl
  (c) 2014 by Korneliusz Jarzebski
*/

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

DS3231 clock;
RTCDateTime dt;

void setup()
{
  Serial.begin(9600);
  
  // Initialize DS3231
  Serial.println("Initialize DS3231");;
  clock.begin();

  // Disarm alarms and clear alarms for this example, because alarms is battery backed.
  // Under normal conditions, the settings should be reset after power and restart microcontroller.
  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();
 
  // Manual (Year, Month, Day, Hour, Minute, Second)
  clock.setDateTime(2014, 4, 25, 0, 0, 0);

  // Set Alarm - Every second.
  // DS3231_EVERY_SECOND is available only on Alarm1.
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(0, 0, 0, 0, DS3231_EVERY_SECOND);

  // Set Alarm - Every full minute.
  // DS3231_EVERY_MINUTE is available only on Alarm2.
  // setAlarm2(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm2(0, 0, 0, 0, DS3231_EVERY_MINUTE);
  
  // Set Alarm1 - Every 20s in each minute
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  clock.setAlarm1(0, 0, 0, 20, DS3231_MATCH_S);

  // Set Alarm2 - Every 01m in each hour
  // setAlarm2(Date or Day, Hour, Minute, Mode, Armed = true)
  clock.setAlarm2(0, 0, 1,     DS3231_MATCH_M);

  // Set Alarm - Every 01m:25s in each hour
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(0, 0, 1, 25, DS3231_MATCH_M_S);

  // Set Alarm - Every 01h:10m:30s in each day
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(0, 1, 10, 30, DS3231_MATCH_H_M_S);

  // Set Alarm - 07h:00m:00s in 25th day in month
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(25, 7, 0, 0, DS3231_MATCH_DT_H_M_S);

  // Set Alarm - 10h:45m:30s in every Friday (1 - Mon, 7 - Sun)
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(5, 10, 40, 30, DS3231_MATCH_DY_H_M_S);
  
  // Check alarm settings
  checkAlarms();
}

void checkAlarms()
{
  RTCAlarmTime a1;  
  RTCAlarmTime a2;

  if (clock.isArmed1())
  {
    a1 = clock.getAlarm1();

    Serial.print("Alarm1 is triggered ");
    switch (clock.getAlarmType1())
    {
      case DS3231_EVERY_SECOND:
        Serial.println("every second");
        break;
      case DS3231_MATCH_S:
        Serial.print("when seconds match: ");
        Serial.println(clock.dateFormat("__ __:__:s", a1));
        break;
      case DS3231_MATCH_M_S:
        Serial.print("when minutes and sencods match: ");
        Serial.println(clock.dateFormat("__ __:i:s", a1));
        break;
      case DS3231_MATCH_H_M_S:
        Serial.print("when hours, minutes and seconds match: ");
        Serial.println(clock.dateFormat("__ H:i:s", a1));
        break;
      case DS3231_MATCH_DT_H_M_S:
        Serial.print("when date, hours, minutes and seconds match: ");
        Serial.println(clock.dateFormat("d H:i:s", a1));
        break;
      case DS3231_MATCH_DY_H_M_S:
        Serial.print("when day of week, hours, minutes and seconds match: ");
        Serial.println(clock.dateFormat("l H:i:s", a1));
        break;
      default: 
        Serial.println("UNKNOWN RULE");
        break;
    }
  } else
  {
    Serial.println("Alarm1 is disarmed.");
  }

  if (clock.isArmed2())
  {
    a2 = clock.getAlarm2();

    Serial.print("Alarm2 is triggered ");
    switch (clock.getAlarmType2())
    {
      case DS3231_EVERY_MINUTE:
        Serial.println("every minute");
        break;
      case DS3231_MATCH_M:
        Serial.print("when minutes match: ");
        Serial.println(clock.dateFormat("__ __:i:s", a2));
        break;
      case DS3231_MATCH_H_M:
        Serial.print("when hours and minutes match:");
        Serial.println(clock.dateFormat("__ H:i:s", a2));
        break;
      case DS3231_MATCH_DT_H_M:
        Serial.print("when date, hours and minutes match: ");
        Serial.println(clock.dateFormat("d H:i:s", a2));
        break;
      case DS3231_MATCH_DY_H_M:
        Serial.println("when day of week, hours and minutes match: ");
        Serial.print(clock.dateFormat("l H:i:s", a2));
        break;
      default: 
        Serial.println("UNKNOWN RULE"); 
        break;
    }
  } else
  {
    Serial.println("Alarm2 is disarmed.");
  }
}

void loop()
{
  dt = clock.getDateTime();

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

  // Call isAlarm1(false) if you want clear alarm1 flag manualy by clearAlarm1();
  if (clock.isAlarm1())
  {
    Serial.println("ALARM 1 TRIGGERED!");
  }

  // Call isAlarm2(false) if you want clear alarm1 flag manualy by clearAlarm2();
  if (clock.isAlarm2())
  {
    Serial.println("ALARM 2 TRIGGERED!");
  }
 
  delay(1000);
}

 

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

Ну это скетч  который выше трудноват для моего понимания.

Да и как то скрутил как знал по-своему, как говорится на что мозгов хватило, вот:

#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(4, OUTPUT);
    pinMode(5, OUTPUT);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
}
void loop(){
    if(millis()%1000==0) // если прошла 1 секунда
      Serial.println(time.gettime("m")); // выводим время
      uint8_t new_min ;  // локальная переменная для новых минут
      new_min = time.minutes; // new_min равна  текущим минутам
      if (new_min != old_min && flag == 1)
      { 
        digitalWrite(4, LOW);
        delay(2000); // задержка сигнала на 2 сек
        digitalWrite(4, HIGH);
        old_min = new_min;
        flag = 2 ;
        }
       if (new_min != old_min && flag == 2)
      { 
        digitalWrite(5, LOW);
        delay(2000); // задержка сигнала на 2 сек
        digitalWrite(5, HIGH);
        old_min = new_min;
        flag = 1 ;
        }
    

    
}

проверил, тикает! вот только еще одна дилема вылезла, получаетсяя если неугадать полярность при включении - часы не будут ходить сразу а перещелкнут спустя одну минуту. Но это ерунда)))

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

17 строка, не слишком ли точно?

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

ua6em пишет:

17 строка, не слишком ли точно?

if(millis()%1000==0) // если прошла 1 секунда

если чесно, я сам не понимаю эту строчку, взято из другого скетча (почему 1000%) а не 100...

Если знаете - подскажите подалуйста!

Ее можно использовать например в данном примере?

if ((digitalRead(enter) == LOW) && (millis() - previousMillis3 > 2000) )

А с ней вот так:

if ((digitalRead(enter) == LOW) && (millis()%100==2000) ) 

Это верно?

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

maxvalin пишет:
если чесно, я сам не понимаю эту строчку, взято из другого скетча (почему 1000%) а не 100...

Если знаете - подскажите подалуйста!


Оператор %

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

maxvalin пишет:

if ((digitalRead(enter) == LOW) && (millis()%100==2000) ) 

Это верно?

Это - в перлы!

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

andriano пишет:

maxvalin пишет:

if ((digitalRead(enter) == LOW) && (millis()%100==2000) ) 

Это верно?

Это - в перлы!

я правильно понимаю, это условие никогда не выполнится?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А Вы всерьез считаете, что остаток от деления на 100 может при каких то условиях быть равным 2000?

lean_74
Offline
Зарегистрирован: 22.12.2015

andriano пишет:

А Вы всерьез считаете, что остаток от деления на 100 может при каких то условиях быть равным 2000?

один раз в пятьдесят с лишним дней  должно быть, когда там миллис обнуляется, и не учитываю начало условия (digitalRead(enter) == LOW), пина enter  я не заметил среди определенных выше.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Про "обнуление миллис" ходят просто кошмарные слухи: оказывается, в момент обнуления сразу перестают выполняться ве арифметические операции, и отсаток от деления на 100 может стать равным 2000.

 

PS. Должен сообщить Вам крайне печальную новость: millis обновляется чаще, чем Вы думали. 

PPS. Я тоже не заметил - там процитирована всего одна строка, так что ничего "выше" нет в принципе.

lean_74
Offline
Зарегистрирован: 22.12.2015

andriano пишет:

PS. Должен сообщить Вам крайне печальную новость: millis обновляется чаще, чем Вы думали. 

PPS. Я тоже не заметил - там процитирована всего одна строка, так что ничего "выше" нет в принципе.

\

я и не думал ничего про миллис - просто процетировал http://arduino.ru/Reference/Millis, чаще, так чаще я так на долго его не использую, да и тут полно примеров защиты от его переполнения.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lean_74 пишет:

я и не думал ничего про миллис - просто процетировал http://arduino.ru/Reference/Millis

Вы не процитировали, Вы переврали.

Согласитесь, "приблизительно через 50 дней", "один раз в пятьдесят с лишним дней" и "примерно через 49,71027 дней" - это разные вещи.

lean_74
Offline
Зарегистрирован: 22.12.2015

andriano пишет:

Вы не процитировали, Вы переврали.

Согласитесь, "приблизительно через 50 дней", "один раз в пятьдесят с лишним дней" и "примерно через 49,71027 дней" - это разные вещи.

Да ладно придираться то, старый я ужо, память подводит и 50 плюс несколько(1,2,3,5) дней, не так и далеко от 50 - 1 (вернее минус где-то примерно 0,3)