Да конечно мне интересен сейчас любой код по этой теме, лучше в котором есть комментарии :) так легче разобраться с нуля :)
// программа имеет два канала упраления 1- по времени.....2 - в промежутке включения реле времени включается контроль по темперетуре........... время(дискретность 30 мин) и температура(дискретность 1 градус) ВКЛ и ВЫКЛ устанавливается через блютуф c Android девайса
// контролер Duemilanove на 168, время берется с DS3231, температура с DHT11. блютуф HC-05. время и температура ВКЛ и ВЫКЛ 5 раз в сутки при изменеии сохраняются в eeprom на DS3231
// есть тест вкл\выкл реле.
#include <Wire.h>
#include <DS3231.h>
DS3231 Clock;
#include <dht11.h> // библиотека DHT11
dht11 DHT; // Объявление переменной класса dht11
#define DHT11_PIN 4 // Датчик DHT11 подключен к цифровому пину номер 4
int Curent_Time, On_Time, Off_Time;//текущее время в минутах // время вкл в минутах // время выкл в минутах
Вообшем собрал я солянку из чужих скетчей) Пока черновик но как ни странно работает!))) спасибо всем за помощь, ваши скетчи тоже буду изучать
Задача: в определенный заданный интервал времени, один раз ночью, первое реле должно включить нагрев ёмкости на 5 минут. Но наргрев должен происходить только до определенной температуры и реле должно поддерживать заданную температуру эти 5 минут.
Во все другое время суток нагрев не должен включаться ни при каких обстоятельсвах.
После того как время работы первого реле истекет, и жидкость будет нужной нужной температуры - то тут включается второе реле, приводя в действие водянную помпу на несколько секнд, что бы та налила нужное количество жидкости.
//----------ИМПОРТ БИБЛИОТЕК-------------------------
#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
#include <OneWire.h> //Подключаем библиотеку для использования однопроводного интерфейса
OneWire oneWire(10); //Подключаем датчик DS18B20 на цифровой пин 10
#include <DallasTemperature.h> //Температурного датчика DS18B20
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC
DallasTemperature sensors(&oneWire); //Создаем объект sensors, подключенный по OneWire
//Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress; //переменная для хранения адреса датчика
float temp=0; //переменная для текущего значения температуры
const int t0 = 55; //Уставка температуры включения первого реле
const int tGistrsis = 1; //Уставка гистерезиса - т.е отклонения от темп-ры уставки
//т.е. в данном случае 1 = плюс минус 0.5 градус
RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC
//----------Объявляем разные переменные--------------
const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля
//----------Настройки времени и продолжительности включения реле
//----------ПЕРВЫЙ канал----------------------------
const long StartRelCn_1 = 76860; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток)
//в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200)
const long DurationCh_1 = 300; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах)
//----------ВТОРОЙ канал----------------------------
const long StartRelCn_2 = 77200; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток)
//В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800)
const long DurationCh_2 = 14; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах)
//----------ТРЕТИЙ КАНАЛ----------------------------
//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях)
void setup(){
//Инициализируем термодатчик и установим разрешающую способность 12 бит
sensors.begin();
sensors.getAddress(tempDeviceAddress, 0);
//digitalWrite(TSensorPin,HIGH);
pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД
digitalWrite(RelayChn1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой
Wire.begin(); //Инициируем I2C интерфейс
RTC.begin(); //Инициирум RTC модуль
}
//--------------------------------------------------
void loop()
{
//Запуск процедуры измерения температуры
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
sensors.setWaitForConversion(true);
//Считывание значения температуры
sensors.getAddress(tempDeviceAddress, 0);
temp=sensors.getTempC(tempDeviceAddress);
DateTime myTime = RTC.now(); //Читаем данные времени из RTC
//----------Раздел обработки реле по времени ----
long utime = myTime.unixtime(); //сохраняем время в формате UNIX
utime %= 86400; //Сохраняем в переменной остаток деления на кол-во секнд в сутках,
//Это дает количество секунд с начала текущих суток
//------------КАНАЛ 1 (Контроль температуры по времени) -------
sensors.requestTemperatures();
if ((((utime >= StartRelCn_1) && //Если секунд с начала суток больше, чем задано для включения
(utime < (StartRelCn_1+DurationCh_1)))) && //Но одновременно и меньше, чем задано для включения + длительность
(temp < t0-tGistrsis/2)) //И при этом температура ниже чем заданная минус половина гистерезиса
{
digitalWrite(RelayChn1,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else if (temp > t0+tGistrsis/2) //Температура выше чем заданная плюс половина гистерезиса
{ //И во всех остальных случаях, в том числе и если время на работу реле истекло
digitalWrite(RelayChn1,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 2 (Включение насоса)------------------------------
if ((utime >= StartRelCn_2) &&
(utime < (StartRelCn_2+DurationCh_2)))
//Если секунд с начала суток больше, чем задано для включения
//Но, одновременно и меньше, чем задано для включения + длительность
{
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
}//------------Конец ЦИКЛА-----------------------------
//------------КАНАЛ 1 (Контроль температуры по времени) -------
sensors.requestTemperatures();
if ((((utime >= StartRelCn_1) && //Если секунд с начала суток больше, чем задано для включения
(utime < (StartRelCn_1+DurationCh_1)))) && //Но одновременно и меньше, чем задано для включения + длительность
(temp < t0-tGistrsis/2)) //И при этом температура ниже чем заданная минус половина гистерезиса
{
digitalWrite(RelayChn1,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else if (temp > t0+tGistrsis/2) //Температура выше чем заданная плюс половина гистерезиса
{ //И во всех остальных случаях, в том числе и если время на работу реле истекло
digitalWrite(RelayChn1,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 2 (Включение насоса)------------------------------
if ((utime >= StartRelCn_2) &&
(utime < (StartRelCn_2+DurationCh_2)))
//Если секунд с начала суток больше, чем задано для включения
//Но, одновременно и меньше, чем задано для включения + длительность
{
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//----------Настройки времени и продолжительности включения реле
//----------ПЕРВЫЙ канал----------------------------
const long StartRelCn_1 = 76860; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток)
//в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200)
const long DurationCh_1 = 300; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах)
//----------ВТОРОЙ канал----------------------------
const long StartRelCn_2 = 77200; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток)
//В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800)
const long DurationCh_2 = 14; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах)
информативней этого :
time relay_1_on(20, 26, 0); // 20:26:0
time relay_1_off(20, 26, 10); // 20:26:10
time relay_2_on(20, 26, 30);
time relay_2_off(20, 26, 40);
?
Очень странно....
Можно ещё в класс добавить пару строк, и вот это :
TСтранно. Неужели вот это выглядит симпатичнее этого :
да нет конечно :) мне ваш метод работы с временем понравился больше, только я его не использовал в этом черновике :) сам вообще удивился что этот код заработал :)
в конечном результате время переделаю на как вы говорили ;)
//----------ИМПОРТ БИБЛИОТЕК-------------------------
#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
#include <OneWire.h> //Подключаем библиотеку для использования однопроводного интерфейса
#include <DallasTemperature.h> //Температурного датчика DS18B20
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC
//----------Объявляем разные переменные--------------
#define RelayChn1 6 // Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
#define RelayChn2 7 // Используем цифровой ПОРТ 6 для ВТОРОГО канала релейного модуля
OneWire oneWire(10); //Подключаем датчик DS18B20 на цифровой пин 10
DallasTemperature sensors(&oneWire); //Создаем объект sensors, подключенный по OneWire
//Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress; //переменная для хранения адреса датчика
float temp=0; //переменная для текущего значения температуры (то что показывает датчик)
const int t0 = 25; //Уставка температуры включения первого реле
const int tGistrsis = 1; //Уставка гистерезиса - т.е отклонения от темп-ры уставки
//т.е. в данном случае 1 = плюс минус 0.5 градус
//------------------------------------------------------------------
class time{
public:
time(unsigned char h=0, unsigned char m=0, unsigned char s=0){
set_time(h, m, s);
}
time& operator = (time &t){hour = t.hour; min = t.min; sec = t.sec; seconds = t.seconds; return *this;}
boolean operator ==(time &t){return seconds==t.get_time();}
boolean operator !=(time &t){return !(*this==t);}
boolean operator > (time &t){return seconds>t.get_time();}
boolean operator < (time &t){return seconds<t.get_time();}
boolean operator >=(time &t){return seconds>=t.get_time();}
boolean operator <=(time &t){return seconds<=t.get_time();}
void set_time(unsigned char h, unsigned char m, unsigned char s){
hour=h; min=m; sec=s;
seconds=(unsigned long)h*1440 + (unsigned long)m*60 + s;
}
unsigned long get_time(){return seconds;};
void print() {Serial.print(hour); Serial.print(':');Serial.print(min); Serial.print(':');Serial.println(sec);}
private:
unsigned char hour;
unsigned char min;
unsigned char sec;
unsigned long seconds;
};
//------------------------------------------------------------------
class relay{
public:
relay(unsigned char pin){
pin_num = pin;
pinMode(pin_num, OUTPUT);
digitalWrite(pin_num, 1);
state=0;
}
void operator =(boolean val) {digitalWrite(pin_num, !val); state=val;}
operator boolean() {return state;}
private:
unsigned char pin_num;
boolean state;
};
//------------------------------------------------------------------
RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC
time cur_time;
time relay_1_on(13, 32, 0); // Время включения 1-ого реле
time relay_1_off(13, 35, 10); // Время отключения 1-ого реле
time relay_2_on(13, 35, 20); // Время включения 2-ого реле
time relay_2_off(13, 36, 40); // Время отключения 2-ого реле
relay relay_1(RelayChn1); // Реле 1
relay relay_2(RelayChn2); // Реле 2
//--------------------------------------------------
void setup(){
sensors.begin(); //Инициализируем термодатчик
sensors.getAddress(tempDeviceAddress, 0);
Wire.begin(); //Инициируем I2C интерфейс
RTC.begin(); //Инициирум RTC модуль
Serial.begin(9600);
Serial.println("Hello !");
Serial.print("Relay_1 ON =");
relay_1_on.print();
Serial.print("Relay_1 OFF =");
relay_1_off.print();
Serial.print("Relay_2 ON =");
relay_2_on.print();
Serial.print("Relay_2 OFF =");
relay_2_off.print();
}
//--------------------------------------------------
void loop()
{
delay(1000); // Задержка 1 сек. Чтобы не печаталось быстро
//Запуск процедуры измерения температуры
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
sensors.setWaitForConversion(true);
//Считывание значения температуры
sensors.getAddress(tempDeviceAddress, 0);
temp=sensors.getTempC(tempDeviceAddress);
DateTime myTime = RTC.now(); // Получаем текущее время из DS1307
cur_time.set_time(myTime.hour(), myTime.minute(), myTime.second()); // Устанавливаем часы, минут, секунды в cur_time
cur_time.print(); // Выводим текущее время
//------------КАНАЛ 1 (Контроль температуры по времени) -------
sensors.requestTemperatures();
relay_1 = ((cur_time>=relay_1_on) && (cur_time<relay_1_off) && (temp < t0-tGistrsis/2)); // Состояние реле 1 = нахождение текущего времени в диапазоне от relay_1_on до relay_1_off и в диапазоне заданных температур
//------------КАНАЛ 2 (Включение насоса)------------------------------
relay_2 = (cur_time>=relay_2_on) && (cur_time<relay_2_off); // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_2_on до relay_2_off
}//------------Конец ЦИКЛА-----------------------------
Правда мне кажется что с температурой в "void loop" я мог написать чего то лишнего :)))
Я правильно понимаю что классы служат нам для упращения работы в дальнейшем? Типо написал один раз класс в начале кода и потом весь код пишется проще? Если так то это конечно красивее, но для меня как новичка то что написано в классе выглядит как дремучий лес :) Я там ни чего практический не понимаю из написанного :) Но буду учить матчасть как говориться.
Потому и сначала написал более приметивный вариант кода, потому что мне там почти все строки понятны были :)
Спасибо, код с вашими примерами тоже работает как надо. Единственно хочу уточнить по незнанию, в строке
relay_1 = ((cur_time>=relay_1_on) && (cur_time<relay_1_off) && (temp < t0-tGistrsis/2)); // Состояние реле 1 = нахождение текущего времени в диапазоне от relay_1_on до relay_1_off и в диапазоне заданных температур
не нужно для безопастности добавить строку типо "во всех остальных случаях реле выключено"?
не нужно для безопастности добавить строку типо "во всех остальных случаях реле выключено"?
Нет, не нужно. Состояние реле определяется выражением после знака "=". У него будет 2 состояния - включено (когда выражение == false) или включено (выражение == true).
Цитата:
Я правильно понимаю что классы служат нам для упращения работы в дальнейшем? Типо написал один раз класс в начале кода и потом весь код пишется проще?
Ну смотрите. Вы в коде пишите :
relay=1; // Включить реле
if(rele){ // Узнаём состояние реле
а класс уже сам делает всю низкоуровневую работу с портом. Вы просто работаете с объектом как с переменной.
Так же и со временем, всю рутинную работу берёт на себя класс, Вам остаётся только вставлять в код имя объекта.
Сегодня писал для себя. У меня DS1302. В коде конечно работа реле по часам, минуты не прикручивал. С 6 утра начинает работать программа, до 21 часа. Каждый час вкл и выкл.
// DS1302: RST pin -> Arduino Digital 10
// DAT pin -> Arduino Digital 12
// CLK pin -> Arduino Digital 13
#include <DS1302.h>
const int Relay1 = 5;
int State = LOW;
long previousMillis = 0;
long Work = 3600000; // 1час в миллисекундах (1000*60*60)
// Init the DS1302
DS1302 rtc(10, 12, 13);
Time t;
void setup()
{
// Set the clock to run-mode, and disable the write protection
rtc.halt(false);
rtc.writeProtect(true);
// Setup Serial connection
Serial.begin(9600);
// The following lines can be commented out to use the values already stored in the DS1302
rtc.setDOW(2); // Set Day-of-Week to FRIDAY
rtc.setTime(6, 33, 0); // Set the time to 12:00:00 (24hr format)
rtc.setDate(31, 5, 2016); // Set the date to August 6th, 2010
pinMode(Relay1, OUTPUT);
}
void loop()
{
t = rtc.getTime();
Serial.print(t.hour);
Serial.print(":");
Serial.print(t.min, DEC);
Serial.print(":");
Serial.print(t.sec);
Serial.println();
unsigned long currentMillis = millis();
//Serial.print(currentMillis);
if (t.hour>=6){
if (currentMillis-previousMillis > Work){
previousMillis = currentMillis;
if (State == LOW){
State = HIGH;
}
else{
State = LOW;
}
}
//digitalWrite(Relay1,State);
// delay (Work);
}
if (t.hour>21){
if (State == LOW){
State = HIGH;
}
}
digitalWrite(Relay1,State);
}
Ответов и комментов как я понимаю небудет, думал форум ускорит мою работу. Хоть под вторым ником регистрируйся и отвечай на свои же вопросы.
Конечно, не будет.
Вы всерьёъз считаете, что кто-то будет читать столько букв сплошного текста. а потом писать Вам что-то ссылаясь на номера строк, посчитанные пальчиком от начала или от конца поста?
Опубликуйте скетч как положено, тогда может быть кто-то и ответит.
Да конечно мне интересен сейчас любой код по этой теме, лучше в котором есть комментарии :) так легче разобраться с нуля :)
ПОЧТА.....ПРОГА К АДРОИДУ НАДО? НО ТАМ HC-05 НАДО БУДЕТ
ВОТ ПОСМОТРИ
https://drive.google.com/open?id=0B9rTcUo5hhxQWVVMWm5kcW1pOXM
Да конечно мне интересен сейчас любой код по этой теме, лучше в котором есть комментарии :) так легче разобраться с нуля :)
Вообшем собрал я солянку из чужих скетчей) Пока черновик но как ни странно работает!))) спасибо всем за помощь, ваши скетчи тоже буду изучать
Задача: в определенный заданный интервал времени, один раз ночью, первое реле должно включить нагрев ёмкости на 5 минут. Но наргрев должен происходить только до определенной температуры и реле должно поддерживать заданную температуру эти 5 минут.
Во все другое время суток нагрев не должен включаться ни при каких обстоятельсвах.
После того как время работы первого реле истекет, и жидкость будет нужной нужной температуры - то тут включается второе реле, приводя в действие водянную помпу на несколько секнд, что бы та налила нужное количество жидкости.
Странно. Неужели вот это :
выглядит симпатичнее этого :
А это :
информативней этого :
?
Очень странно....
Можно ещё в класс добавить пару строк, и вот это :
сведётся к одной строке :
TСтранно. Неужели вот это выглядит симпатичнее этого :
да нет конечно :) мне ваш метод работы с временем понравился больше, только я его не использовал в этом черновике :) сам вообще удивился что этот код заработал :)
в конечном результате время переделаю на как вы говорили ;)
Ну вот собрал черновик по вашему примеру кода:
Правда мне кажется что с температурой в "void loop" я мог написать чего то лишнего :)))
Я правильно понимаю что классы служат нам для упращения работы в дальнейшем? Типо написал один раз класс в начале кода и потом весь код пишется проще? Если так то это конечно красивее, но для меня как новичка то что написано в классе выглядит как дремучий лес :) Я там ни чего практический не понимаю из написанного :) Но буду учить матчасть как говориться.
Потому и сначала написал более приметивный вариант кода, потому что мне там почти все строки понятны были :)
Спасибо, код с вашими примерами тоже работает как надо. Единственно хочу уточнить по незнанию, в строке
не нужно для безопастности добавить строку типо "во всех остальных случаях реле выключено"?
не нужно для безопастности добавить строку типо "во всех остальных случаях реле выключено"?
Я правильно понимаю что классы служат нам для упращения работы в дальнейшем? Типо написал один раз класс в начале кода и потом весь код пишется проще?
а класс уже сам делает всю низкоуровневую работу с портом. Вы просто работаете с объектом как с переменной.
Так же и со временем, всю рутинную работу берёт на себя класс, Вам остаётся только вставлять в код имя объекта.
.
Сегодня писал для себя. У меня DS1302. В коде конечно работа реле по часам, минуты не прикручивал. С 6 утра начинает работать программа, до 21 часа. Каждый час вкл и выкл.
Если это не то, что тебе нужно. Прошу прощения.
.
.
.
.
Ответов и комментов как я понимаю небудет, думал форум ускорит мою работу. Хоть под вторым ником регистрируйся и отвечай на свои же вопросы.
Ответов и комментов как я понимаю небудет, думал форум ускорит мою работу. Хоть под вторым ником регистрируйся и отвечай на свои же вопросы.
Конечно, не будет.
Вы всерьёъз считаете, что кто-то будет читать столько букв сплошного текста. а потом писать Вам что-то ссылаясь на номера строк, посчитанные пальчиком от начала или от конца поста?
Опубликуйте скетч как положено, тогда может быть кто-то и ответит.
.
.