Суточный таймер с DS1307, без экрана
- Войдите на сайт для отправки комментариев
Втр, 03/05/2016 - 15:54
Здравствуйте.
Опыта можно сказать 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);
}
Попробуйте так:
#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); } }Тоже много времени потратил на создание подобного таймера, всё никак не мог добиться нужного. В итоге плюнул на ардуино и собрал на пике. Деталей - кот наплакал.
http://smartelectronix.biz/publ/prostoj_ciklicheskij_sutochnyj_tajmer_s_...
Там и на 3 канала есть
Попробуйте так:
#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"
Может у Вас библиотека другая, у меня скомпилировалось без проблем "arduino-1.6" Но принцып я думаю понятен
Можно у вас попросить выложить куда-нибудь вашу библиотеку?
Спасибо
https://www.dropbox.com/sh/iixwfdg4qcmedl8/AAAWPRX5M1_Qqxr_Lps6_Jhya?dl=0
https://www.dropbox.com/sh/iixwfdg4qcmedl8/AAAWPRX5M1_Qqxr_Lps6_Jhya?dl=0
Не получается ничего. С ваше библиотекой ошибка:
n file included from /Users/111Dropbox/ihouse/sketch_may08a/sketch_may08a.ino:1:0:
Другие же библитеки дают ошибки:
sketch_may08a:35: error: 'class DS1307RTC' has no member named 'stop'
Где-то нашел библитеку, поставил, заработала.
Другая проблема: отключаю питание, 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); }Не пойму зачем в этом коде "Объявляем функцию установки даты и времени"?