внесение в код таймера для реле

kishin
Offline
Зарегистрирован: 08.03.2017

Здраствуйте. хотелось бы в этот код 

#include <TimeAlarms.h> // Подключаем библиотеку для работы с таймерами
#include <DHT.h>         // Подключаем библиотеку для работы с датчиками температуры/влажности на базе чипов AM23xx
#define DHTPIN 12        // Цифровой пин, к которому подключен датчик тепрературы/влажности (12 = D12)
#define DHTTYPE DHT22 // Модель датчика (AM2301 = DHT21, AM2302 и AM2321 = DHT22)
#define CLKPIN 10        // Цифровые пины для подключения дисплея
#define DIOPIN 11
#define S_ON 0 // Значение пина для ВКЛЮЧЕНИЯ розетки
#define S_OFF 1 // Значение пина для ВЫКЛЮЧЕНИЯ розетки

// Режим включения нагрузки
#define NO_ACTION        0 // Значение датчика не учитывается
#define IN_RANGE         1 // Включать нагрузку, когда значение В ПРЕДЕЛАХ диапазона
#define OUT_RANGE        2 // Включать нагрузку, когда значение ВНЕ ПРЕДЕЛОВ ДИАПАЗОНА

// Определяем структуру, в которой содержатся условия для подключения розетки.
typedef struct RunCondition {
int socketPin; // Пин, который управляет розеткой
float tempBegin; // Температура. Начало диапазона.
float tempEnd; // Температура. Конец диапазона.
int tempMode;    // Режим включения нагрузки по температуре
float humBegin; // Влажность. Начало диапазона.
float humEnd;    // Влажность. Конец диапазона.
int humMode;     // Режим включения нагрузки по влажности.
};
#define NUM_SOCKETS 3 // Количество розеток в системе
// Определяем массив структур, определяющих условия для 3-х розеток
RunCondition sockets[NUM_SOCKETS] = {
{
2,       // Розетка №1: Приточный вентилятор. Управляющий пин - D2.
30.0,    // Минимальная температура
100.0, // Максимальная температура
IN_RANGE, // Вентилятор включается, если температура более 30 градусов и менее 100.
0.0,
0.0,
NO_ACTION // Влажность не учитывается
},
{
3,       // Розетка №2: Обогреватель. Управляющий пин - D3.
-50.0, // Минимальная температура
16.0,    // Максимальная температура
IN_RANGE, // Обогреватель включается, если температура больше -50 и меньше 16 градусов
0.0,
0.0,
NO_ACTION // Влажность не учитывается
},
{
4,       // Розетка №3: Увлажнитель. Управляющий пин - D4.
20.0,    // Минимальная температура
100.0, // Максимальная температура
IN_RANGE, // Увлажнитель включается только если температура в диапазоне от 20 до 60 градусов
0.0,     // Минимальная влажность (в %)
50.0,    // Максимальная влажность
IN_RANGE // Увлажнитель включается, если влажность в диапазоне от 0% до 50%
}
};

int socketStatus[NUM_SOCKETS]; // Определяем массив переменных, в которых хранится текущее состояние розеток. S_OFF - выключено, S_ON - включено.
DHT dht(DHTPIN, DHTTYPE); // Создаем объект для работы с датчиком
// Определяем глобальные переменные, в которых будем хранить показания датчиков
float temp = 0;
float hum = 0;
void setSockets() {
// Эта функция устанавливает состояние розеток
for (int i = 0; i < NUM_SOCKETS; i++) {
// Перебираем все определенные ранее розетки, устанавливая для них соответствующий статус
digitalWrite(sockets[i].socketPin, socketStatus[i]);
}
}
void printSensors() {
// Эта функция выводит в консоль состояние датчиков для помощи при отладке.
Serial.print("[ >> ] Temperature: "); Serial.print(temp); Serial.print(" C;\tHumidity: "); Serial.print(hum); Serial.println("%");
}
void setup() {
// Эта функция выполняется один раз при включении контроллера.

Serial.begin(115200); // Подключаем COM-порт для вывода информации из контроллера в консоль.
Serial.println("[ ++ ] WeedLife Air Controller Lite v.1.1.d");
dht.begin(); // Инициализируем датчик температуры/влажности.
for (int i = 0; i < NUM_SOCKETS; i++) {
socketStatus[i] = S_OFF; // Устанавливаем розетку в ВЫКЛЮЧЕНО по умолчанию
pinMode(sockets[i].socketPin, OUTPUT); // Переключаем управляющие пины всех определенных ранее розеток в режим "выход"
}
setSockets(); // Переводим розетки в состояние по умолчанию
}

void loop() {
// Эта функция выполняется по бесконечному кругу. Здесь мы будем проверять показания датчиков и управлять нагрузками.
Alarm.delay(1000); // Вносим задержку в 1 секунду, чтобы датчик успел передать предыдущие данные
temp = dht.readTemperature(); // Получаем текущую температуру
hum = dht.readHumidity(); // Получаем текущую влажность

if (isnan(temp) || isnan(hum)) {
// Что-то пошло не так, потому что данные с датчика не поступают! Отключаем все нагрузки и возвращаемся в начало!
for (int i = 0; i < NUM_SOCKETS; i++) socketStatus[i] = S_OFF;
setSockets();
Serial.println("[FAIL] Can't read sensor data! Turn everithing OFF!");
return;
}
// Теперь сравним полученные данные с условиями, заданными для каждой розетки
for (int s = 0; s < NUM_SOCKETS; s++) {
// Проверяем условия для включения розетки по датчику температуры
int tempStatus = S_OFF;
switch (sockets[s].tempMode) {
         case NO_ACTION:
         tempStatus = S_ON;
         break;
         case IN_RANGE:
         if ((temp >= sockets[s].tempBegin) && (temp <= sockets[s].tempEnd)) tempStatus = S_ON;
         break;
         case OUT_RANGE:
         if ((temp <= sockets[s].tempBegin) || (temp >= sockets[s].tempEnd)) tempStatus = S_ON;
         break; 
}
// Проверяем условия для включения розетки по датчику влажности
int humStatus = S_OFF;
switch (sockets[s].humMode) {
         case NO_ACTION:
         humStatus = S_ON;
         break;
         case IN_RANGE:
         if ((hum >= sockets[s].humBegin) && (hum <= sockets[s].humEnd)) humStatus = S_ON;
         break;
         case OUT_RANGE:
         if ((hum <= sockets[s].humBegin) || (hum >= sockets[s].humEnd)) humStatus = S_ON;
         break; 
}
// Объединяем оба результата в один новый статус розетки
int newStatus = S_OFF;
if ((tempStatus == S_ON) && (humStatus == S_ON)) newStatus = S_ON;

if (socketStatus[s] != newStatus) {
         // Статус розетки изменился! Отправим сообщение об этом в консоль и установим новое значение.
         Serial.print("[ OK ] Socket #"); Serial.print(s); Serial.print(" status has changed to "); Serial.println(newStatus);
         socketStatus[s] = newStatus;
}
// Обновляем статусы розеток
setSockets();
}
// Конец функции loop. Сейчас контроллер запустит ее снова.
}

Внести изменения и вместо включение по показателям влажности и температуры,вторая и третья розетка включались на время  допустим на 16 часов и 8 часов отдыха

 

был найден такой код но совместить не хватает навыков

#define NASOS_PIN 13 // Вывод к котрому подключена нагрузка
#define TIME_ON_NASOS 10000  // Время в течении, которого на выводе 1
#define TIME_OFF_NASOS 180000 // Время в течении, которого на выводе 0
boolean state_nasos = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_nasos = millis(); // Переменная для хранения времени

#define SVET_PIN 10 // Вывод к котрому подключена нагрузка
#define TIME_ON_SVET 1000 // Время в течении, которого на выводе 1
#define TIME_OFF_SVET 3000 // Время в течении, которого на выводе 0
boolean state_svet = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_svet = millis(); // Переменная для хранения времени

void setup() {
  pinMode(NASOS_PIN, OUTPUT); // Настраиваем вывод на выход     
  pinMode(SVET_PIN, OUTPUT);  // Настраиваем вывод на выход  
}

void loop(){ 
// Управление насосом:
  if(millis() > new_millis_nasos){
    state_nasos = !state_nasos;
    digitalWrite(NASOS_PIN, state_nasos);
    if(state_nasos){
      new_millis_nasos = millis() + TIME_ON_NASOS;
    }
    else{
      new_millis_nasos = millis() + TIME_OFF_NASOS;
    }
  }
  
// Управление светом:
  if(millis() > new_millis_svet){
    state_svet = !state_svet;
    digitalWrite(SVET_PIN, state_svet);
    if(state_svet){
      new_millis_svet = millis() + TIME_ON_SVET;
    }
    else{
      new_millis_svet = millis() + TIME_OFF_SVET;
    }
  }
  
}


 

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

что вам вообще надо то?! зачем натягивать чужие решения на свои задача.

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

про временные интервалы для включения 

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

хаха не работает ссылка :)))

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

во проправил

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

хрен. автор движка просто жжет. короче там пробел удалите в название добавляется и не работает перевод каретки что ли в ссылке не удаляется

kishin
Offline
Зарегистрирован: 08.03.2017

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

но свет и насос просто дожны включатся по таймеру а модуля реального времени нет и ждать его долго

sshmel
Offline
Зарегистрирован: 08.02.2017
kishin
Offline
Зарегистрирован: 08.03.2017

и опять же по ссылке человек работает с RTC