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

Аква Лого / мы на связи
Аква Лого в VK
Аква Лого в Телеграмм
Аква Лого в соцсетях

Судак-тудак

У дороги новый чибис

Идиакант

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 от наших китайских собратьев.

Добрый день,

 

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

 

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

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

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


Ссылка на сообщение

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

Вы сможете оставлять комментарии после авторизации



Войти

×
×
  • Создать...

Политика обработки персональных данных