Alex_M 89 Опубликовано 3 Октября 2014 Вроде, это последняя версия (еле нашел). #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(); } } 3 Поделиться этим сообщением Ссылка на сообщение
Юрий Н. 6 Опубликовано 29 Октября 2014 Как бы в этот скетч встроить ещё парочку таймеров? Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 29 Октября 2014 Как бы в этот скетч встроить ещё парочку таймеров? Добрый день,Не совсем понял вопрос для чего таймеры и какого типа. Но в общем варианте, напишите процедуру(ы) таймера(ов) с использованием RTC. Поделиться этим сообщением Ссылка на сообщение
Юрий Н. 6 Опубликовано 29 Октября 2014 Алексей, добрый день! Спасибо что отреагировали на мой вопрос. А возник он у меня из-за желания задействовать ещё два реле, т.к. у меня 4-х канальная сборка реле.... Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 29 Октября 2014 А какой алгоритм работы должен быть у этих таймеров? Если типа включен от хх:хх до уу:уу то написать такую процедуру не сложно. Поделиться этим сообщением Ссылка на сообщение
Юрий Н. 6 Опубликовано 29 Октября 2014 да, именно так- Если типа включен от хх:хх до уу:уу то написать такую процедуру не сложно. Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 29 Октября 2014 (изменено) Юрий, Очень быстро набросал, не тестировал, могут быть ошибки и глюки. Проверяйте Реле 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(); } } Изменено 29 Октября 2014 пользователем Alex_M (см. историю изменений) Поделиться этим сообщением Ссылка на сообщение
Юрий Н. 6 Опубликовано 29 Октября 2014 Да, где-то в середине есть ошибка а вот так, всё работает. Спасибо! #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(); } } ещё надо научиться скрытый текст делать... Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 29 Октября 2014 (изменено) Ну и отлично. Похоже, при копировании часть старого кода деформировался. Даже не знаю, как и почему это произошло. писал код в обычном notepad Для скрытого текста используете BB коды "spoiler" "/spoiler" Изменено 29 Октября 2014 пользователем Alex_M (см. историю изменений) Поделиться этим сообщением Ссылка на сообщение
karamel72d 0 Опубликовано 15 Ноября 2014 Алексей подскажите в чем может быть проблема. Собрал все по вашей схеме загрузил скейч,а все равно ни чего не работает,свет горит всегда. При запуске часов в сериал порте бегут какие то иероглифы. Очень хочется разобраться,но уже всю голову сломал. Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 16 Ноября 2014 1. Скорее всего нет общей "земли" для всех БП, драйверов и ардуины 2. Скорее всего не правильно выставлена скорость для сериал порт Поделиться этим сообщением Ссылка на сообщение
karamel72d 0 Опубликовано 16 Ноября 2014 Да нет земля одна общая, все питается от одного бп компьютерного, там разные выходы на 5в и 12в,а земля одна. А какая скорость нужна для сериал порта. Поделиться этим сообщением Ссылка на сообщение
karamel72d 0 Опубликовано 16 Ноября 2014 с программой разобрался часы идут в мониторе порта показывает ход программы,но свет все равно не гаснет,а драйвера LDD H при достижении шим 0 очень сильно нагреваются. Где проблема подскажите? Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 16 Ноября 2014 Если замкнуть шим ногу ldd на землю (лучше через 1-5 кОм) свет гаснет? Поделиться этим сообщением Ссылка на сообщение
karamel72d 0 Опубликовано 16 Ноября 2014 Нет не гаснет. Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 16 Ноября 2014 Значит проблема в "проводах", или нет общей земли, или где-то путаница в проводах Поделиться этим сообщением Ссылка на сообщение
karamel72d 0 Опубликовано 16 Ноября 2014 Земля вся приходит на один контакт и с arduino и с LDD а ноги на LDD идущие на светодиоды надо между собой спаевать или нет. Может в подключение LDD какой-то фокус есть? Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 17 Ноября 2014 Там все стандартно: Входы: 1 и 2 Минус (-) (земля) от БП, сюда же GND от ардуины 23 и 24 Плюс (+) от БП 22 ШИМ от ардуины Выходы: 11 и 12 Минус (-) на светодиоды 13 и 14 Плюс (+) на светодиоды Поделиться этим сообщением Ссылка на сообщение
karamel72d 0 Опубликовано 17 Ноября 2014 Да все так и есть,может провода слишком длинные, 20см. Примерно. Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 17 Ноября 2014 Установите ШИМ = 0, посмотрите потенциал (напряжение) между ногами LDD 1 и 22, должно быть 0. Установите ШИМ = 254, посмотрите потенциал (напряжение) между ногами LDD 1 и 22, должно быть 5. Установите ШИМ = 128, посмотрите потенциал (напряжение) между ногами LDD 1 и 22, должно быть примерно 2.5. 1 Поделиться этим сообщением Ссылка на сообщение
karamel72d 0 Опубликовано 17 Ноября 2014 Огромное спасибо,разобрался,но даже при шим 0 диоды слегка светятся. Что и куда еще надо поставить. Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 18 Ноября 2014 Причин может быть много. От «соплей» и наводок до засветки люминофора светодиодов. Все каналы ШИМ устанавливаем на 0. Шаг 1.Выбранный канал ШИМ ардуины отключаем от LDD, устанавливаем ШИМ = 0, замеряем потенциал между ногой ШИМ и GND на ардуине, должен быть 0. Шаг 2. Подключаем канал ШИМ ардуины к LDD, подключаем амперметр последовательно к светодиодам, устанавливаем ШИМ = 0, ток должен быть 0. Повторяем шаги 1 и 2 при установке на остальных каналах ШИМ = 254. Как вариант, можно, ногу ШИМ LDD притянуть к земле через 10-15 кОм. Это так же позволит избежать вспышки при инициализации ардуины. Поделиться этим сообщением Ссылка на сообщение
karamel72d 0 Опубликовано 19 Ноября 2014 Спасибо папробую,очень благодарен вам за помощь. Буду работать. Поделиться этим сообщением Ссылка на сообщение
Lik255 0 Опубликовано 20 Ноября 2014 Здравствуйте Алексей , у вас очень удачный контроллер. К нему можно добавить блютуз модуль и избавится от провода. Подключение простешее Rx ардуины к Tx модуля и Tx ардуины к Rx модуля через сопротивление для согласования уровней, питание 3.3В и земля. Bluetooth-модуль HC-05 от наших китайских собратьев. Поделиться этим сообщением Ссылка на сообщение
Alex_M 89 Опубликовано 21 Ноября 2014 Здравствуйте Алексей , у вас очень удачный контроллер. К нему можно добавить блютуз модуль и избавится от провода. Подключение простешее Rx ардуины к Tx модуля и Tx ардуины к Rx модуля через сопротивление для согласования уровней, питание 3.3В и земля. Bluetooth-модуль HC-05 от наших китайских собратьев. Добрый день, Спасибо за оценку. Добавить можно, но для меня это не актуально, т.к. я даже не помню, когда последний раз подключался к нему. Иными словами после финальной настройки расписания нет необходимости частного доступа к контроллеру. Поделиться этим сообщением Ссылка на сообщение