Суточный таймер с DS1307, без экрана

yden
Offline
Зарегистрирован: 30.01.2016

Здравствуйте.

Опыта можно сказать 0. Подскажите пожалуйста код. Примеры которые пересмотрел - с использование экрана, у меня без него. А выпилить ненужное - ума не хватает.

Идея: uno, DS1307 и 4 канальное реле. Нужно каждый день в 20:00 включать реле один канал, в 5 утра выключать. DS1307 - время установлено.

С остальными каналами буду сам разбираться.

 

Спасибо

 

Нашел код, но он не фурычит:

#include <DS1307RTC.h>
#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68

const byte outPin = 7; // выход на реле

byte setMinClockOn; //
byte setHorClockOn;
byte setMinClockOff; //
byte setHorClockOff;

/////////// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));   
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));    
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}


void setup(){
  Wire.begin();
 
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, LOW);
 
}

void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
 
 
  // сравниваем время и управляем выходом//
  if (setMinClockOff == minute && setHorClockOff == hour
      && second == 0) digitalWrite(outPin, LOW);
  if (setMinClockOn == minute && setHorClockOn == hour
      && second == 0) digitalWrite(outPin, HIGH);   
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так:

#include <Wire.h>
#include <DS1307.h> //Подключение библиотеки для DS1307

const byte outPin = 7; // выход на реле


byte chasA = 0; //Переменная для Часа
byte minA = 0; //Переменная для  minut
// Следующие переменные нужны чтобы не сбить настройки
byte denA = 0; // Переменная номера дня недели
byte chisA = 0; // Переменная число
byte mesA = 0;  // Переменная месяц
byte godA = 0; // Переменная год
byte sekA = 0; // Переменная секунды

void setup()
{
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, LOW);

  //Serial.begin(9600);
}

//Объявляем функцию установки даты и времени
void ustanovkaChasov()
{
  RTC.stop();              // останавливаем ход часов
  RTC.set(DS1307_SEC, sekA);  // устанавливаем секунды
  RTC.set(DS1307_MIN, minA); // устанавливаем минуты
  RTC.set(DS1307_HR, chasA);  // устанавливаем часы
  RTC.set(DS1307_DOW, denA);  // устанавливаем номер дня недели
  RTC.set(DS1307_DATE, chisA); // устанавливаем число
  RTC.set(DS1307_MTH, mesA);  // устанавливаем месяц
  RTC.set(DS1307_YR, godA);   // устанавливаем год
  RTC.start();             // запускаем ход часов
}

//Объявляем функцию Читаем значения даты и времени
void pokazChasov()
{
  sekA = RTC.get(DS1307_SEC, true);   // Читаем значения секунды
  minA = RTC.get(DS1307_MIN, true);  // Читаем значения минуты
  chasA = RTC.get(DS1307_HR, true);  // Читаем значения часы
  denA = RTC.get(DS1307_DOW, true);   // Читаем значения номер дня недели
  chisA = RTC.get(DS1307_DATE, true);  // Читаем значения число
  mesA = RTC.get(DS1307_MTH, true);   // Читаем значения месяц
  godA = RTC.get(DS1307_YR, true);    // Читаем значения год
}

void loop()
{
  pokazChasov();

  if (chasA == 20)
  {
    if (minA == 0 && sekA == 0)digitalWrite(outPin, LOW);
  }
  if (chasA == 5)
  {
    if (minA == 0 && sekA == 0)digitalWrite(outPin, HIGH);
  }
}

 

yucan
Offline
Зарегистрирован: 20.04.2015

Тоже много времени потратил на создание подобного таймера, всё никак не мог добиться нужного. В итоге плюнул на ардуино и собрал на пике. Деталей - кот наплакал.

http://smartelectronix.biz/publ/prostoj_ciklicheskij_sutochnyj_tajmer_s_...

Там и на 3 канала есть

yden
Offline
Зарегистрирован: 30.01.2016

vosara пишет:

Попробуйте так:

#include <Wire.h>
#include <DS1307.h> //Подключение библиотеки для DS1307

const byte outPin = 7; // выход на реле


byte chasA = 0; //Переменная для Часа
byte minA = 0; //Переменная для  minut
// Следующие переменные нужны чтобы не сбить настройки
byte denA = 0; // Переменная номера дня недели
byte chisA = 0; // Переменная число
byte mesA = 0;  // Переменная месяц
byte godA = 0; // Переменная год
byte sekA = 0; // Переменная секунды

void setup()
{
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, LOW);

  //Serial.begin(9600);
}

//Объявляем функцию установки даты и времени
void ustanovkaChasov()
{
  RTC.stop();              // останавливаем ход часов
  RTC.set(DS1307_SEC, sekA);  // устанавливаем секунды
  RTC.set(DS1307_MIN, minA); // устанавливаем минуты
  RTC.set(DS1307_HR, chasA);  // устанавливаем часы
  RTC.set(DS1307_DOW, denA);  // устанавливаем номер дня недели
  RTC.set(DS1307_DATE, chisA); // устанавливаем число
  RTC.set(DS1307_MTH, mesA);  // устанавливаем месяц
  RTC.set(DS1307_YR, godA);   // устанавливаем год
  RTC.start();             // запускаем ход часов
}

//Объявляем функцию Читаем значения даты и времени
void pokazChasov()
{
  sekA = RTC.get(DS1307_SEC, true);   // Читаем значения секунды
  minA = RTC.get(DS1307_MIN, true);  // Читаем значения минуты
  chasA = RTC.get(DS1307_HR, true);  // Читаем значения часы
  denA = RTC.get(DS1307_DOW, true);   // Читаем значения номер дня недели
  chisA = RTC.get(DS1307_DATE, true);  // Читаем значения число
  mesA = RTC.get(DS1307_MTH, true);   // Читаем значения месяц
  godA = RTC.get(DS1307_YR, true);    // Читаем значения год
}

void loop()
{
  pokazChasov();

  if (chasA == 20)
  {
    if (minA == 0 && sekA == 0)digitalWrite(outPin, LOW);
  }
  if (chasA == 5)
  {
    if (minA == 0 && sekA == 0)digitalWrite(outPin, HIGH);
  }
}

 

Спасибо.

Ругается:

Arduino: 1.6.8 (Mac OS X), Плата:"Arduino/Genuino Uno"

 
/Users/Downloads/rele2/rele2.ino: In function 'void ustanovkaChasov()':
rele2:30: error: 'class DS1307RTC' has no member named 'stop'
   RTC.stop();              // останавливаем ход часов
       ^
rele2:31: error: 'DS1307_SEC' was not declared in this scope
   RTC.set(DS1307_SEC, sekA);  // устанавливаем секунды
           ^
rele2:32: error: 'DS1307_MIN' was not declared in this scope
   RTC.set(DS1307_MIN, minA); // устанавливаем минуты
           ^
rele2:33: error: 'DS1307_HR' was not declared in this scope
   RTC.set(DS1307_HR, chasA);  // устанавливаем часы
           ^
rele2:34: error: 'DS1307_DOW' was not declared in this scope
   RTC.set(DS1307_DOW, denA);  // устанавливаем номер дня недели
           ^
rele2:35: error: 'DS1307_DATE' was not declared in this scope
   RTC.set(DS1307_DATE, chisA); // устанавливаем число
           ^
rele2:36: error: 'DS1307_MTH' was not declared in this scope
   RTC.set(DS1307_MTH, mesA);  // устанавливаем месяц
           ^
rele2:37: error: 'DS1307_YR' was not declared in this scope
   RTC.set(DS1307_YR, godA);   // устанавливаем год
           ^
rele2:38: error: 'class DS1307RTC' has no member named 'start'
   RTC.start();             // запускаем ход часов
       ^
/Users/yunin/Downloads/rele2/rele2.ino: In function 'void pokazChasov()':
rele2:44: error: 'DS1307_SEC' was not declared in this scope
   sekA = RTC.get(DS1307_SEC, true);   // Читаем значения секунды
                  ^
rele2:45: error: 'DS1307_MIN' was not declared in this scope
   minA = RTC.get(DS1307_MIN, true);  // Читаем значения минуты
                  ^
rele2:46: error: 'DS1307_HR' was not declared in this scope
   chasA = RTC.get(DS1307_HR, true);  // Читаем значения часы
                   ^
rele2:47: error: 'DS1307_DOW' was not declared in this scope
   denA = RTC.get(DS1307_DOW, true);   // Читаем значения номер дня недели
                  ^
rele2:48: error: 'DS1307_DATE' was not declared in this scope
   chisA = RTC.get(DS1307_DATE, true);  // Читаем значения число
                   ^
rele2:49: error: 'DS1307_MTH' was not declared in this scope
   mesA = RTC.get(DS1307_MTH, true);   // Читаем значения месяц
                  ^
rele2:50: error: 'DS1307_YR' was not declared in this scope
   godA = RTC.get(DS1307_YR, true);    // Читаем значения год
                  ^
exit status 1
'class DS1307RTC' has no member named 'stop'
 
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Может у Вас библиотека другая, у меня скомпилировалось без проблем "arduino-1.6" Но принцып я думаю понятен

yden
Offline
Зарегистрирован: 30.01.2016

Можно у вас попросить выложить куда-нибудь вашу библиотеку?

Спасибо

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
yden
Offline
Зарегистрирован: 30.01.2016

 

Не получается ничего. С ваше библиотекой ошибка:

 

n file included from /Users/111Dropbox/ihouse/sketch_may08a/sketch_may08a.ino:1:0:

/Users/1111/Documents/Arduino/libraries/DS1307/DS1307.h:43:26: fatal error: ../Wire/Wire.h: No such file or directory
 #include <../Wire/Wire.h>
yden
Offline
Зарегистрирован: 30.01.2016

Другие же библитеки дают ошибки:

 

sketch_may08a:35: error: 'class DS1307RTC' has no member named 'stop'

   RTC.stop();              // останавливаем ход часов
       ^
sketch_may08a:36: error: 'DS1307_SEC' was not declared in this scope
   RTC.set(DS1307_SEC, sekA);  // устанавливаем секунды
yden
Offline
Зарегистрирован: 30.01.2016

Где-то нашел библитеку, поставил, заработала.

yden
Offline
Зарегистрирован: 30.01.2016

Другая проблема: отключаю питание, DS1307 останавливается:

#include <Wire.h>
#include <DS1307.h> //Подключение библиотеки для DS1307

const byte outPin = 7; // выход на реле


byte chasA = 0; //Переменная для Часа
byte minA = 0; //Переменная для  minut
// Следующие переменные нужны чтобы не сбить настройки
byte denA = 0; // Переменная номера дня недели
byte chisA = 0; // Переменная число
byte mesA = 0;  // Переменная месяц
byte godA = 0; // Переменная год
byte sekA = 0; // Переменная секунды

void setup()
{
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, HIGH);

  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);

  Serial.begin(9600);
  
}

//Объявляем функцию установки даты и времени
//void ustanovkaChasov()
//{
////  RTC.stop();              // останавливаем ход часов
////  RTC.set(DS1307_SEC, sekA);  // устанавливаем секунды
////  RTC.set(DS1307_MIN, minA); // устанавливаем минуты
////  RTC.set(DS1307_HR, chasA);  // устанавливаем часы
////  RTC.set(DS1307_DOW, denA);  // устанавливаем номер дня недели
////  RTC.set(DS1307_DATE, chisA); // устанавливаем число
////  RTC.set(DS1307_MTH, mesA);  // устанавливаем месяц
////  RTC.set(DS1307_YR, godA);   // устанавливаем год
//  RTC.start();             // запускаем ход часов
//}

//Объявляем функцию Читаем значения даты и времени
void pokazChasov()
{
  sekA = RTC.get(DS1307_SEC, true);   // Читаем значения секунды
  minA = RTC.get(DS1307_MIN, true);  // Читаем значения минуты
  chasA = RTC.get(DS1307_HR, true);  // Читаем значения часы
  denA = RTC.get(DS1307_DOW, true);   // Читаем значения номер дня недели
  chisA = RTC.get(DS1307_DATE, true);  // Читаем значения число
  mesA = RTC.get(DS1307_MTH, true);   // Читаем значения месяц
  godA = RTC.get(DS1307_YR, true);    // Читаем значения год
}

void loop()
{
  pokazChasov();
Serial.print("Hour: ");
Serial.println(chasA);
Serial.print("Minute: ");
Serial.println(minA);
  if (chasA >= 18 && minA >= 15 && chasA <= 18 && minA <= 16)  {
    digitalWrite(outPin, HIGH);
  }
    else {
    digitalWrite(outPin, LOW);
  }
  
  // мигание светодиодом
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a seconddigitalWrite(13, HIGH);   
  
}

Не пойму зачем в этом коде "Объявляем функцию установки даты и времени"?