Перейти к контенту
МОРСКОЙ АКВАРИУМ - форум Аква Лого

Хризиптеры желтобрюхая и желтохвостая (М) – 895 руб.! Хризиптеры – некрупные и очень яркие рыбы. Они идеально смотрятся в рифовом аквариуме даже небольшого размера.
Подробнее
Alex_M

Лед светильник 70Вт. для DMS 500PL (72л.)

Рекомендуемые сообщения

Вроде, это последняя версия (еле нашел).

 

#include
#include "RTClib.h"

RTC_DS1307 RTC;

int Hours_Start_Sunrise[6] = {11, 9, 10, 11, 12, 12}; // начало рассвета по каналам час
int Minutes_Start_Sunrise[6] = {0, 0, 0, 0, 0, 0}; // начало рассвета по каналам минута
int Hours_End_Sunrise[6] = {14, 11, 12, 13, 14, 14}; // окончание рассвета по каналам час
int Minutes_End_Sunrise[6] = {0, 0, 0, 0, 0, 0}; // окончание рассвета по каналам минута

int Hours_Start_Sunset[6] = {18, 21, 20, 19, 18, 18}; // начало заката по каналам час
int Minutes_Start_Sunset[6] = {0, 0, 0, 0, 0, 0}; // начало заката по каналам минута
int Hours_End_Sunset[6] = {21, 22, 22, 21, 21, 21}; // окончание заката по каналам час
int Minutes_End_Sunset[6] = {0, 30, 0, 0, 0, 0}; // окончание заката по каналам минута

int MinuteDay_Start_Sunrise[6]; // день в минутах для начала рассвета
int MinuteDay_End_Sunrise[6]; // день в минутах для окончания рассвета

int MinuteDay_Start_Sunset[6]; // день в минутах для начала заката
int MinuteDay_End_Sunset[6]; // день в минутах для окончания заката

int Current_MinuteDay; // текущая минута суток
int Current_Period[6]; // текущая часть суток 1-рассвет, 2-день, 3-закат, 4-ночь для каждого ШИМ

//int Meridian_PWM[6] = {128, 192, 192, 192, 128, 128}; // максимальное значение ШИМ
int Meridian_PWM[6] = {255, 255, 255, 255, 5, 255}; // максимальное значение ШИМ
int Midnight_PWM[6] = {0, 0, 0, 0, 0, 0}; // минимальное значение ШИМ
int Current_PWM[6] = {0, 0, 0, 0, 0, 0}; // текущее значение ШИМ

/* ***************************************************** */
/* * * */
/* * ШИМ пин для CW, TV, RB, NB, DR, NG * */
/* * Пин - 3 - CW - Cool White * */
/* * Пин - 5 - TV - True Violet * */
/* * Пин - 6 - RB - Royal Blue * */
/* * Пин - 7 - NB - Blue * */
/* * Пин - 10 - DR - Deep Red * */
/* * Пин - 11 - NG - Green * */
/* * * */
/* ***************************************************** */

int PWM_Pin[6] = {3, 5, 6, 9, 10, 11}; // ШИМ пин для CW, TV, RB, NB, DR, NG

int Relay1 = 7; //вент
int Relay2 = 8; //луна
byte Relay1Status=false;
byte Relay2Status=false;

void setup()
{

Serial.begin(57600);
Wire.begin();
RTC.begin();

if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(2013, 1, 1, 12, 59, 1));
}
//RTC.adjust(DateTime(2013, 1, 1, 12, 59, 1));


for (int i=0; i<=5; i++)
{
pinMode(PWM_Pin[i], OUTPUT); // Установка пин для ШИМ
}

for (int i=0; i<=5; i++)
{
analogWrite(PWM_Pin[i], Midnight_PWM[i]); // Установка минимального значения ШИМ
Current_PWM[i]=Midnight_PWM[i]; // установка текущих значений ШИМ в минимум
}

for (int i=0; i<=5; i++)
{
MinuteDay_Start_Sunrise[i]=60*Hours_Start_Sunrise[i] + Minutes_Start_Sunrise[i]; // Расчет минуты суток для начала рассвета
MinuteDay_End_Sunrise[i]=60*Hours_End_Sunrise[i] + Minutes_End_Sunrise[i]; // Расчет минуты суток для окончания рассвета
MinuteDay_Start_Sunset[i]=60*Hours_Start_Sunset[i] + Minutes_Start_Sunset[i]; // Расчет минуты суток для начала заката
MinuteDay_End_Sunset[i]=60*Hours_End_Sunset[i] + Minutes_End_Sunset[i]; // Расчет минуты суток для окончания заката
}
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, HIGH);

}

// Процедура расчета текущего периода и значения PWM по каналам
void Led_Dim_PWM()
{
DateTime now = RTC.now();
Current_MinuteDay = (now.hour() * 60) + now.minute();

for (int i=0; i<=5; i++)
{
Current_Period[i]=4;
if (Current_MinuteDay>=MinuteDay_Start_Sunrise[i] && Current_MinuteDay<=MinuteDay_End_Sunrise[i]) {Current_Period[i]=1;}
if (Current_MinuteDay>MinuteDay_End_Sunrise[i] && Current_MinuteDay if (Current_MinuteDay>=MinuteDay_Start_Sunset[i] && Current_MinuteDay<=MinuteDay_End_Sunset[i]) {Current_Period[i]=3;}

if (Current_Period[i]==1)
{
Current_PWM[i]=(float)(((float)Current_MinuteDay-MinuteDay_Start_Sunrise[i])/((float)MinuteDay_End_Sunrise[i]-MinuteDay_Start_Sunrise[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
if (Current_PWM[i] analogWrite(PWM_Pin[i], Current_PWM[i]);
}

if (Current_Period[i]==2)
{
if (Current_PWM[i]!=Meridian_PWM[i])
{
Current_PWM[i]=Meridian_PWM[i];
analogWrite(PWM_Pin[i], Current_PWM[i]);
}
}

if (Current_Period[i]==3)
{
Current_PWM[i]=(float)(((float)MinuteDay_End_Sunset[i]-Current_MinuteDay)/((float)MinuteDay_End_Sunset[i]-MinuteDay_Start_Sunset[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
analogWrite(PWM_Pin[i], Current_PWM[i]);
}

if (Current_Period[i]==4)
{
if (Current_PWM[i]!=Midnight_PWM[i])
{
Current_PWM[i]=Midnight_PWM[i];
if (Current_PWM[i] analogWrite(PWM_Pin[i], Current_PWM[i]);
}
}
}

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.print(" Current_MinuteDay: ");
Serial.print(Current_MinuteDay, DEC);
Serial.println();

for (int i=0; i<=5; i++)
{
Serial.print("Channel #");
Serial.print(i, DEC);
// Serial.println();
Serial.print(", Current Period: ");
if (Current_Period[i]==1) {Serial.print("Sunrise");}
if (Current_Period[i]==2) {Serial.print("Meridian");}
if (Current_Period[i]==3) {Serial.print("Sunset");}
if (Current_Period[i]==4) {Serial.print("Midnight");}
Serial.print(", Current PWM: ");
Serial.print(Current_PWM[i], DEC);
Serial.println();
}
Serial.println();
}

void RalayOnOff()
{
int SumPWM=0;

for (int i=0; i<=5; i++)
{
SumPWM=SumPWM+Current_PWM[i];
}
if (SumPWM>=50 && Relay1Status==false)
{
Relay1Status=true;
Relay2Status=false;
digitalWrite(Relay1, HIGH);
digitalWrite(Relay2, LOW);
}

if (SumPWM<50 && Relay1Status==true)
{
Relay1Status=false;
Relay2Status=true;
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, HIGH);
}
}
void loop () {

if ( ( millis() % 30000 ) == 0 )
{
Led_Dim_PWM();
RalayOnOff();
}

}

 

  • Upvote 3

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как бы в этот скетч встроить ещё парочку таймеров? ;)

Добрый день,

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

Но в общем варианте, напишите процедуру(ы) таймера(ов) с использованием RTC. ;)

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Алексей, добрый день! Спасибо что отреагировали на мой вопрос.

А возник он у меня из-за желания задействовать ещё два реле, т.к. у меня 4-х канальная сборка реле....

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

А какой алгоритм работы должен быть у этих таймеров?

Если типа включен от хх:хх до уу:уу то написать такую процедуру не сложно.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

да, именно так-

Если типа включен от хх:хх до уу:уу то написать такую процедуру не сложно.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Юрий,

Очень быстро набросал, не тестировал, могут быть ошибки и глюки. Проверяйте :)

 

Реле 3 и 4 повесил на 4 и 12 выходы arduino nano.

 

Время включения и выключения реле 3 и 4 в этих строчках:

int Hours_Start_Relay34[2] = {11, 12}; // включение реле 3 и 4 час
int Minutes_Start_Relay34[2] = {0, 0}; // включение реле 3 и 4 минута
int Hours_End_Relay34[2] = {20, 21}; // выключение реле 3 и 4 час
int Minutes_End_Relay34[2] = {0, 0}; // выключение реле 3 и 4 минута

 

Сам скетч ниже

 

#include
#include "RTClib.h"

RTC_DS1307 RTC;

int Hours_Start_Relay34[2] = {11, 12}; // включение реле 3 и 4 час
int Minutes_Start_Relay34[2] = {0, 0}; // включение реле 3 и 4 минута
int Hours_End_Relay34[2] = {20, 21}; // выключение реле 3 и 4 час
int Minutes_End_Relay34[2] = {0, 0}; // выключение реле 3 и 4 минута

int MinuteDay_Start_Relay34[2]; // день в минутах для включения реле 3 и 4
int MinuteDay_End_Relay34[2]; // день в минутах для выключения реле 3 и 4

int Hours_Start_Sunrise[6] = {11, 9, 10, 11, 12, 12}; // начало рассвета по каналам час
int Minutes_Start_Sunrise[6] = {0, 0, 0, 0, 0, 0}; // начало рассвета по каналам минута
int Hours_End_Sunrise[6] = {14, 11, 12, 13, 14, 14}; // окончание рассвета по каналам час
int Minutes_End_Sunrise[6] = {0, 0, 0, 0, 0, 0}; // окончание рассвета по каналам минута

int Hours_Start_Sunset[6] = {18, 21, 20, 19, 18, 18}; // начало заката по каналам час
int Minutes_Start_Sunset[6] = {0, 0, 0, 0, 0, 0}; // начало заката по каналам минута
int Hours_End_Sunset[6] = {21, 22, 22, 21, 21, 21}; // окончание заката по каналам час
int Minutes_End_Sunset[6] = {0, 30, 0, 0, 0, 0}; // окончание заката по каналам минута

int MinuteDay_Start_Sunrise[6]; // день в минутах для начала рассвета
int MinuteDay_End_Sunrise[6]; // день в минутах для окончания рассвета

int MinuteDay_Start_Sunset[6]; // день в минутах для начала заката
int MinuteDay_End_Sunset[6]; // день в минутах для окончания заката

int Current_MinuteDay; // текущая минута суток
int Current_Period[6]; // текущая часть суток 1-рассвет, 2-день, 3-закат, 4-ночь для каждого ШИМ

//int Meridian_PWM[6] = {128, 192, 192, 192, 128, 128}; // максимальное значение ШИМ
int Meridian_PWM[6] = {255, 255, 255, 255, 5, 255}; // максимальное значение ШИМ
int Midnight_PWM[6] = {0, 0, 0, 0, 0, 0}; // минимальное значение ШИМ
int Current_PWM[6] = {0, 0, 0, 0, 0, 0}; // текущее значение ШИМ

/* ***************************************************** */
/* * * */
/* * ШИМ пин для CW, TV, RB, NB, DR, NG * */
/* * Пин - 3 - CW - Cool White * */
/* * Пин - 5 - TV - True Violet * */
/* * Пин - 6 - RB - Royal Blue * */
/* * Пин - 7 - NB - Blue * */
/* * Пин - 10 - DR - Deep Red * */
/* * Пин - 11 - NG - Green * */
/* * * */
/* ***************************************************** */

int PWM_Pin[6] = {3, 5, 6, 9, 10, 11}; // ШИМ пин для CW, TV, RB, NB, DR, NG

int Relay1 = 7; //вент
int Relay2 = 8; //луна
byte Relay1Status=false;
byte Relay2Status=false;

int Relay34[2] = {4, 12}; //Реле 3 и 4
byte Relay34Status[2] = {false, false};

void setup()
{

Serial.begin(57600);
Wire.begin();
RTC.begin();

if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(2013, 1, 1, 12, 59, 1));
}
//RTC.adjust(DateTime(2013, 1, 1, 12, 59, 1));


for (int i=0; i<=5; i++)
{
pinMode(PWM_Pin[i], OUTPUT); // Установка пин для ШИМ
}

for (int i=0; i<=5; i++)
{
analogWrite(PWM_Pin[i], Midnight_PWM[i]); // Установка минимального значения ШИМ
Current_PWM[i]=Midnight_PWM[i]; // установка текущих значений ШИМ в минимум
}

for (int i=0; i<=5; i++)
{
MinuteDay_Start_Sunrise[i]=60*Hours_Start_Sunrise[i] + Minutes_Start_Sunrise[i]; // Расчет минуты суток для начала рассвета
MinuteDay_End_Sunrise[i]=60*Hours_End_Sunrise[i] + Minutes_End_Sunrise[i]; // Расчет минуты суток для окончания рассвета
MinuteDay_Start_Sunset[i]=60*Hours_Start_Sunset[i] + Minutes_Start_Sunset[i]; // Расчет минуты суток для начала заката
MinuteDay_End_Sunset[i]=60*Hours_End_Sunset[i] + Minutes_End_Sunset[i]; // Расчет минуты суток для окончания заката
}

for (int i=0; i<=1; i++)
{
MinuteDay_Start_Relay34[i]=60*Hours_Start_Relay34[i] + Minutes_Start_Relay34[i]; // Расчет минуты суток для включения реле 3 и 4
MinuteDay_End_Relay34[i]=60*Hours_End_Relay34[i] + Minutes_End_Relay34[i]; // Расчет минуты суток для выключения реле 3 и 4
pinMode(Relay34[i], OUTPUT);
digitalWrite(Relay34[i], LOW);
}

pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, HIGH);
}

// Процедура расчета текущего периода и значения PWM по каналам
void Led_Dim_PWM()
{
DateTime now = RTC.now();
Current_MinuteDay = (now.hour() * 60) + now.minute();

for (int i=0; i<=5; i++)
{
Current_Period[i]=4;
if (Current_MinuteDay>=MinuteDay_Start_Sunrise[i] && Current_MinuteDay<=MinuteDay_End_Sunrise[i]) {Current_Period[i]=1;}
if (Current_MinuteDay>MinuteDay_End_Sunrise[i] && Current_MinuteDay if (Current_MinuteDay>=MinuteDay_Start_Sunset[i] && Current_MinuteDay<=MinuteDay_End_Sunset[i]) {Current_Period[i]=3;}

if (Current_Period[i]==1)
{
Current_PWM[i]=(float)(((float)Current_MinuteDay-MinuteDay_Start_Sunrise[i])/((float)MinuteDay_End_Sunrise[i]-MinuteDay_Start_Sunrise[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
if (Current_PWM[i] analogWrite(PWM_Pin[i], Current_PWM[i]);
}

if (Current_Period[i]==2)
{
if (Current_PWM[i]!=Meridian_PWM[i])
{
Current_PWM[i]=Meridian_PWM[i];
analogWrite(PWM_Pin[i], Current_PWM[i]);
}
}

if (Current_Period[i]==3)
{
Current_PWM[i]=(float)(((float)MinuteDay_End_Sunset[i]-Current_MinuteDay)/((float)MinuteDay_End_Sunset[i]-MinuteDay_Start_Sunset[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
analogWrite(PWM_Pin[i], Current_PWM[i]);
}

if (Current_Period[i]==4)
{
if (Current_PWM[i]!=Midnight_PWM[i])
{
Current_PWM[i]=Midnight_PWM[i];
if (Current_PWM[i] analogWrite(PWM_Pin[i], Current_PWM[i]);
}
}
}

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.print(" Current_MinuteDay: ");
Serial.print(Current_MinuteDay, DEC);
Serial.println();

for (int i=0; i<=5; i++)
{
Serial.print("Channel #");
Serial.print(i, DEC);
// Serial.println();
Serial.print(", Current Period: ");
if (Current_Period[i]==1) {Serial.print("Sunrise");}
if (Current_Period[i]==2) {Serial.print("Meridian");}
if (Current_Period[i]==3) {Serial.print("Sunset");}
if (Current_Period[i]==4) {Serial.print("Midnight");}
Serial.print(", Current PWM: ");
Serial.print(Current_PWM[i], DEC);
Serial.println();
}
Serial.println();
}

void RalayOnOff()
{
int SumPWM=0;

for (int i=0; i<=5; i++)
{
SumPWM=SumPWM+Current_PWM[i];
}
if (SumPWM>=50 && Relay1Status==false)
{
Relay1Status=true;
Relay2Status=false;
digitalWrite(Relay1, HIGH);
digitalWrite(Relay2, LOW);
}

if (SumPWM<50 && Relay1Status==true)
{
Relay1Status=false;
Relay2Status=true;
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, HIGH);
}
}

void Ralay34OnOff()
{
for (int i=0; i<=1; i++)
{
if (Current_MinuteDay>=MinuteDay_Start_Relay34[i] && Current_MinuteDay<=MinuteDay_End_Relay34[i])
{
if (Relay34Status[i]==false)
{
Relay34Status[i]=true;
digitalWrite(Relay34[i], HIGH);
}
}
if (Current_MinuteDay<MinuteDay_Start_Relay34[i] || Current_MinuteDay>MinuteDay_End_Relay34[i])
{
if (Relay34Status[i]==true)
{
Relay34Status[i]=false;
digitalWrite(Relay34[i], LOW);
}
}
}
}

void loop () {

if ( ( millis() % 30000 ) == 0 )
{
Led_Dim_PWM();
RalayOnOff();
Ralay34OnOff();
}

}

 

Изменено пользователем Alex_M (см. историю изменений)

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, где-то в середине есть ошибка :)

а вот так, всё работает.

Спасибо!

 

 

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
int Hours_Start_Relay34[2] = {11, 12}; // включение реле 3 и 4 час
int Minutes_Start_Relay34[2] = {0, 0}; // включение реле 3 и 4 минута
int Hours_End_Relay34[2] = {20, 21}; // выключение реле 3 и 4 час
int Minutes_End_Relay34[2] = {0, 0}; // выключение реле 3 и 4 минута
int MinuteDay_Start_Relay34[2]; // день в минутах для включения реле 3 и 4
int MinuteDay_End_Relay34[2]; // день в минутах для выключения реле 3 и 4
int Hours_Start_Sunrise[6] = {11, 9, 10, 11, 12, 12}; // начало рассвета по каналам час
int Minutes_Start_Sunrise[6] = {0, 0, 0, 0, 0, 0}; // начало рассвета по каналам минута
int Hours_End_Sunrise[6] = {14, 11, 12, 13, 14, 14}; // окончание рассвета по каналам час
int Minutes_End_Sunrise[6] = {0, 0, 0, 0, 0, 0}; // окончание рассвета по каналам минута
int Hours_Start_Sunset[6] = {18, 21, 20, 19, 18, 18}; // начало заката по каналам час
int Minutes_Start_Sunset[6] = {0, 0, 0, 0, 0, 0}; // начало заката по каналам минута
int Hours_End_Sunset[6] = {21, 22, 22, 21, 21, 21}; // окончание заката по каналам час
int Minutes_End_Sunset[6] = {0, 30, 0, 0, 0, 0}; // окончание заката по каналам минута
int MinuteDay_Start_Sunrise[6]; // день в минутах для начала рассвета
int MinuteDay_End_Sunrise[6]; // день в минутах для окончания рассвета
int MinuteDay_Start_Sunset[6]; // день в минутах для начала заката
int MinuteDay_End_Sunset[6]; // день в минутах для окончания заката
int Current_MinuteDay; // текущая минута суток
int Current_Period[6]; // текущая часть суток 1-рассвет, 2-день, 3-закат, 4-ночь для каждого ШИМ
//int Meridian_PWM[6] = {128, 192, 192, 192, 128, 128}; // максимальное значение ШИМ
int Meridian_PWM[6] = {255, 255, 255, 255, 5, 255}; // максимальное значение ШИМ
int Midnight_PWM[6] = {0, 0, 0, 0, 0, 0}; // минимальное значение ШИМ
int Current_PWM[6] = {0, 0, 0, 0, 0, 0}; // текущее значение ШИМ
/* ***************************************************** */
/* * * */
/* * ШИМ пин для CW, TV, RB, NB, DR, NG * */
/* * Пин - 3 - CW - Cool White * */
/* * Пин - 5 - TV - True Violet * */
/* * Пин - 6 - RB - Royal Blue * */
/* * Пин - 7 - NB - Blue * */
/* * Пин - 10 - DR - Deep Red * */
/* * Пин - 11 - NG - Green * */
/* * * */
/* ***************************************************** */
int PWM_Pin[6] = {3, 5, 6, 9, 10, 11}; // ШИМ пин для CW, TV, RB, NB, DR, NG
int Relay1 = 7; //вент
int Relay2 = 8; //луна
byte Relay1Status=false;
byte Relay2Status=false;
int Relay34[2] = {4, 12}; //Реле 3 и 4
byte Relay34Status[2] = {false, false};
void setup()
{
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(2013, 1, 1, 12, 59, 1));
}
//RTC.adjust(DateTime(2013, 1, 1, 12, 59, 1));

for (int i=0; i<=5; i++)
{
pinMode(PWM_Pin[i], OUTPUT); // Установка пин для ШИМ
}
for (int i=0; i<=5; i++)
{
analogWrite(PWM_Pin[i], Midnight_PWM[i]); // Установка минимального значения ШИМ
Current_PWM[i]=Midnight_PWM[i]; // установка текущих значений ШИМ в минимум
}
for (int i=0; i<=5; i++)
{
MinuteDay_Start_Sunrise[i]=60*Hours_Start_Sunrise[i] + Minutes_Start_Sunrise[i]; // Расчет минуты суток для начала рассвета
MinuteDay_End_Sunrise[i]=60*Hours_End_Sunrise[i] + Minutes_End_Sunrise[i]; // Расчет минуты суток для окончания рассвета
MinuteDay_Start_Sunset[i]=60*Hours_Start_Sunset[i] + Minutes_Start_Sunset[i]; // Расчет минуты суток для начала заката
MinuteDay_End_Sunset[i]=60*Hours_End_Sunset[i] + Minutes_End_Sunset[i]; // Расчет минуты суток для окончания заката
}
for (int i=0; i<=1; i++)
{
MinuteDay_Start_Relay34[i]=60*Hours_Start_Relay34[i] + Minutes_Start_Relay34[i]; // Расчет минуты суток для включения реле 3 и 4
MinuteDay_End_Relay34[i]=60*Hours_End_Relay34[i] + Minutes_End_Relay34[i]; // Расчет минуты суток для выключения реле 3 и 4
pinMode(Relay34[i], OUTPUT);
digitalWrite(Relay34[i], LOW);
}
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, HIGH);
}
// Процедура расчета текущего периода и значения PWM по каналам
void Led_Dim_PWM()
{
DateTime now = RTC.now();
Current_MinuteDay = (now.hour() * 60) + now.minute();

for (int i=0; i<=5; i++)
{
	 Current_Period[i]=4;
	 if (Current_MinuteDay>=MinuteDay_Start_Sunrise[i] && Current_MinuteDay<=MinuteDay_End_Sunrise[i]) {Current_Period[i]=1;}
	 if (Current_MinuteDay>MinuteDay_End_Sunrise[i] && Current_MinuteDay<MinuteDay_Start_Sunset[i]) {Current_Period[i]=2;}
	 if (Current_MinuteDay>=MinuteDay_Start_Sunset[i] && Current_MinuteDay<=MinuteDay_End_Sunset[i]) {Current_Period[i]=3;}
	 if (Current_Period[i]==1)
	 {
			 Current_PWM[i]=(float)(((float)Current_MinuteDay-MinuteDay_Start_Sunrise[i])/((float)MinuteDay_End_Sunrise[i]-MinuteDay_Start_Sunrise[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
			 if (Current_PWM[i]<Midnight_PWM[i]) {Current_PWM[i]=Midnight_PWM[i];}
			 analogWrite(PWM_Pin[i], Current_PWM[i]);																																													
	 }
	 if (Current_Period[i]==2)
	 {
			 if (Current_PWM[i]!=Meridian_PWM[i])
			 {
				 Current_PWM[i]=Meridian_PWM[i];
				 analogWrite(PWM_Pin[i], Current_PWM[i]);
			 }
	 }
	 if (Current_Period[i]==3)
	 {
			 Current_PWM[i]=(float)(((float)MinuteDay_End_Sunset[i]-Current_MinuteDay)/((float)MinuteDay_End_Sunset[i]-MinuteDay_Start_Sunset[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
			 analogWrite(PWM_Pin[i], Current_PWM[i]);
	 }

	 if (Current_Period[i]==4)
		 {
			 if (Current_PWM[i]!=Midnight_PWM[i])
			 {
				 Current_PWM[i]=Midnight_PWM[i];
				 if (Current_PWM[i]<Midnight_PWM[i]) {Current_PWM[i]=Midnight_PWM[i];}
				 analogWrite(PWM_Pin[i], Current_PWM[i]);
			 }
		 }
	 }
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.print(" Current_MinuteDay: ");
Serial.print(Current_MinuteDay, DEC);
Serial.println();
for (int i=0; i<=5; i++)
{
Serial.print("Channel #");
Serial.print(i, DEC);
// Serial.println();
Serial.print(", Current Period: ");
if (Current_Period[i]==1) {Serial.print("Sunrise");}
if (Current_Period[i]==2) {Serial.print("Meridian");}
if (Current_Period[i]==3) {Serial.print("Sunset");}
if (Current_Period[i]==4) {Serial.print("Midnight");}
Serial.print(", Current PWM: ");
Serial.print(Current_PWM[i], DEC);
Serial.println();
}
Serial.println();
}
void RalayOnOff()
{
int SumPWM=0;
for (int i=0; i<=5; i++)
{
SumPWM=SumPWM+Current_PWM[i];
}
if (SumPWM>=50 && Relay1Status==false)
{
Relay1Status=true;
Relay2Status=false;
digitalWrite(Relay1, HIGH);
digitalWrite(Relay2, LOW);
}
if (SumPWM<50 && Relay1Status==true)
{
Relay1Status=false;
Relay2Status=true;
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, HIGH);
}
}
void Ralay34OnOff()
{
for (int i=0; i<=1; i++)
{
if (Current_MinuteDay>=MinuteDay_Start_Relay34[i] && Current_MinuteDay<=MinuteDay_End_Relay34[i])
{
if (Relay34Status[i]==false)
{
Relay34Status[i]=true;
digitalWrite(Relay34[i], HIGH);
}
}
if (Current_MinuteDay<MinuteDay_Start_Relay34[i] || Current_MinuteDay>MinuteDay_End_Relay34[i])
{
if (Relay34Status[i]==true)
{
Relay34Status[i]=false;
digitalWrite(Relay34[i], LOW);
}
}
}
}
void loop () {
if ( ( millis() % 30000 ) == 0 )
{
Led_Dim_PWM();
RalayOnOff();
Ralay34OnOff();
}
}

 

ещё надо научиться скрытый текст делать...

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну и отлично. :)

Похоже, при копировании часть старого кода деформировался. Даже не знаю, как и почему это произошло. :blush: писал код в обычном notepad

 

Для скрытого текста используете BB коды "spoiler" "/spoiler"

Изменено пользователем Alex_M (см. историю изменений)

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

При запуске часов в сериал порте бегут какие то иероглифы. Очень хочется разобраться,но уже всю голову сломал.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. Скорее всего нет общей "земли" для всех БП, драйверов и ардуины

2. Скорее всего не правильно выставлена скорость для сериал порт

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да нет земля одна общая, все питается от одного бп компьютерного, там разные выходы на 5в и 12в,а земля одна. А какая скорость нужна для сериал порта.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

с программой разобрался часы идут в мониторе порта показывает ход программы,но свет все равно не гаснет,а драйвера LDD H при достижении шим 0 очень сильно нагреваются. Где проблема подскажите?

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если замкнуть шим ногу ldd на землю (лучше через 1-5 кОм) свет гаснет?

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Значит проблема в "проводах", или нет общей земли, или где-то путаница в проводах

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Земля вся приходит на один контакт и с arduino и с LDD а ноги на LDD идущие на светодиоды надо между собой спаевать или нет. Может в подключение LDD какой-то фокус есть?

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

post-20976-0-38859500-1416208271_thumb.jpg

 

Там все стандартно:

 

Входы:

1 и 2 Минус (-) (земля) от БП, сюда же GND от ардуины

23 и 24 Плюс (+) от БП

22 ШИМ от ардуины

 

Выходы:

11 и 12 Минус (-) на светодиоды

13 и 14 Плюс (+) на светодиоды

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да все так и есть,может провода слишком длинные, 20см. Примерно.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Установите ШИМ = 0, посмотрите потенциал (напряжение) между ногами LDD 1 и 22, должно быть 0.

Установите ШИМ = 254, посмотрите потенциал (напряжение) между ногами LDD 1 и 22, должно быть 5.

Установите ШИМ = 128, посмотрите потенциал (напряжение) между ногами LDD 1 и 22, должно быть примерно 2.5.

  • Upvote 1

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Огромное спасибо,разобрался,но даже при шим 0 диоды слегка светятся. Что и куда еще надо поставить.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Причин может быть много. От «соплей» и наводок до засветки люминофора светодиодов.

 

Все каналы ШИМ устанавливаем на 0.

Шаг 1.Выбранный канал ШИМ ардуины отключаем от LDD, устанавливаем ШИМ = 0, замеряем потенциал между ногой ШИМ и GND на ардуине, должен быть 0.

Шаг 2. Подключаем канал ШИМ ардуины к LDD, подключаем амперметр последовательно к светодиодам, устанавливаем ШИМ = 0, ток должен быть 0.

 

Повторяем шаги 1 и 2 при установке на остальных каналах ШИМ = 254.

 

Как вариант, можно, ногу ШИМ LDD притянуть к земле через 10-15 кОм. Это так же позволит избежать вспышки при инициализации ардуины.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо папробую,очень благодарен вам за помощь. Буду работать.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте Алексей , у вас очень удачный контроллер. К нему можно добавить блютуз модуль и избавится от провода. Подключение простешее Rx ардуины к Tx модуля и Tx ардуины к Rx модуля через сопротивление для согласования уровней, питание 3.3В и земля. Bluetooth-модуль HC-05 от наших китайских собратьев.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте Алексей , у вас очень удачный контроллер. К нему можно добавить блютуз модуль и избавится от провода. Подключение простешее Rx ардуины к Tx модуля и Tx ардуины к Rx модуля через сопротивление для согласования уровней, питание 3.3В и земля. Bluetooth-модуль HC-05 от наших китайских собратьев.

Добрый день,

 

Спасибо за оценку.

 

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

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти

×