user4056530121
Published

Arduino Aquarium Controller

Control aquarium light - sunset, sunrise.

IntermediateProtip2 days17,263
Arduino Aquarium Controller

Things used in this project

Story

Read more

Schematics

scheme

sprint layout

ldd1.lay6

Code

Untitled file

Arduino
#include <Wire.h>
#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] = {15, 12, 13, 14, 15, 15};      // окончание рассвета по каналам час
int Minutes_End_Sunrise[6] = {0, 0, 0, 0, 0, 0};                  // окончание рассвета по каналам минута

int Hours_Start_Sunset[6] = {17, 20, 19, 18, 17, 17};    // начало заката по каналам час
int Minutes_Start_Sunset[6] = {0, 0, 0, 0, 0, 0};                // начало заката по каналам минута
int Hours_End_Sunset[6] = {21, 23, 22, 21, 21, 21};        // окончание заката по каналам час
int Minutes_End_Sunset[6] = {0, 0, 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 Midnight_PWM[6] = {0, 0, 0, 0, 0, 0};                                // минимальное значение ШИМ
int Current_PWM[6] = {0, 0, 0, 0, 0, 0};                                  // текущее значение ШИМ

/* ***************************************************** */
/* *                                                                                               * */
/* *    ШИМ пин для CW                   * */
/* *    Пин - 3  -                                       * */
/* *    Пин - 5  -                                     * */
/* *    Пин - 6  -                               * */
/* *    Пин - 7  -                                                * */
/* *    Пин - 10 -                                            * */
/* *    Пин - 11 -                                     * */
/* *                                                                                               * */
/* ***************************************************** */

int PWM_Pin[6] = {3, 5, 6, 9, 10, 11};                                  // ШИМ пин

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!");
           //RTC.adjust(DateTime(2012, 7, 12, 22, 48, 1));
           }
                //RTC.adjust(DateTime(2012, 7, 31, 21, 53, 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<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.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 () {

       
        Led_Dim_PWM();
        RalayOnOff();
   
        delay(60000);

}

Credits

user4056530121

user4056530121

1 project • 6 followers

Comments