Таймер и ШИМ

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Подскажите пожалуйста кусочком кода.

Есть 20 каналов с ШИМ, ардуина и часы реального времени на ds1307

как привязать ШИМ ко времени, чтобы каналы плавно разждигались по очереди в определенное время и поочередно гасли в определенное время.

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

nevkon
Offline
Зарегистрирован: 20.01.2015

Шим скольки разрядный?

Шим_макс - (Шим_макс-Шим_мин)*время_прошедшее/время_заката

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

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Шим будет на pca9685, от "0" до "4095".
"Код самый обычный" и есть для меня загадка.
(I==0, I<=4095, I++) это я освоил, но это, если без delay происходит быстро и не получается привязать ко времени от часов.

nevkon
Offline
Зарегистрирован: 20.01.2015

Вы мою формулу даже не прочитали. Сколько бы раз вы ее не выполнили результат будет зависеть от прошедшего времени. delay тут ни при чем.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Читал я вашу формулу.

Но как на програмном языке выглядит "Шим_макс - (Шим_макс-Шим_мин)*время_прошедшее/время_заката"?

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Ни кто не может/не хочет подсказать новичку как привязать шим к часам реального времени?

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

SERgunCHIK пишет:
Ни кто не может/не хочет подсказать новичку как привязать шим к часам реального времени?

if (шим) {часы};

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

При рассвете в 8:00 что то типа
if(analog.write(9)100){time.hour(8)} ?

arduinec
Offline
Зарегистрирован: 01.09.2015

задержка = длительность рассвета / 4096
если наступило время рассвета
{
for(i=0; i<=4095; i++)
  {
  вывод значения i в ШИМ первого канала
  delay( задержка );
  }
for(i=0; i<=4095; i++)
  {
  вывод значения i в ШИМ второго канала
  delay( задержка );
  }
и т.д. для остальных каналов
}

Аналогично для заката.
 

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Спасибо реально за отклик, но именно от этих delay я и пытаюсь избавиться для вклинивания других функций контролеру аквариума.
Началось у меня с подобного кода тут "http://arduino.ru/forum/programmirovanie/pomogite-razobratsya-novichku-1"
Сейчас я пытаюсь уйти от внешнего таймера, задающего сухим контактом режим день/ночь.
Планирую добавить канал на ультрафиолет, добавить 2 датчика температуры, по ним крутить 2 вентилятора.
А еще в планах прикрутить автоматическую подмену воды. В общем все это заствляет избавляться от delay.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Кстати, еще ( наверно глупый) вопрос.
В функции for второй аргумент - это потолок яркости канала, верно?

arduinec
Offline
Зарегистрирован: 01.09.2015

SERgunCHIK пишет:
В функции for второй аргумент - это потолок яркости канала, верно?

Там максимальное значение канала ШИМ.

nevkon
Offline
Зарегистрирован: 20.01.2015

Переведу на русский:

Перебирать значение i от 0 до 4095 с шагом 1, i содержит значение яркости свечения (0 - полная тьма, 4095 - яркое солнце, максимум)

Перед переходом на следующее значение задержаться на ... миллисекунд.

Честно, советую сначала прочитать базу из http://arduino.ru/Reference после чего многое встанет на свои места.

Как уйти от делай:

if ((Time_now > Time_Up)&&(Time_now < Time_Up + Timer_up)) {
  Shim = round(Shim_min + (Shim_max - Shim_min)*(Time_now - Time_Up)/Timer_up);
  AnalogWrite(Shim_pin, Shim);
}

Это для рассвета. Как видите никаких делай. Только запись шима нужно будет по вашему делать. В сетапе или при ините переменных должны быть присвоены стартовые значения.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Пока код в процессе написания, уперся в проблемку:

На Arduino Pro Micro код работает, на Arduino Mega2560 не работает (в сериал ни чего не шлет)

#include <Wire.h>                      // Библиотека I2C
#include <PCA9685.h>                   // Бибилиотека регистров 
#include <Time.h>                      // Библиотека часов
#include <DS1307RTC.h>                 // Библиотека часов
#include <OneWire.h>                   // Библиотека шины 1wire
#include <DallasTemperature.h>         // Библиотека термометров
#define ONE_WIRE_BUS 19                // вход датчиков 18b20 (в меге будет 19)
// #define SQW  18                        // SQW ds1307 на всякий случай
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1 = {0x28, 0x0, 0xFB, 0x5F, 0x6, 0x0, 0x0, 0x5B}; // Заранее известный адрес датчика 1
DeviceAddress sensor2 = {0x28, 0xE70, 0x66, 0x60, 0x6, 0x0, 0x0, 0x4A}; // Заранее известный адрес датчика 2
#define MoonPin  A0  // Фоторезистор подключен 0-му аналоговому входу
// #define WaterBank  22 // датчик перебора воды в аквариуме
// #define WaterSumpInHi  24 // датчик перебора воды во входной секции сампа
// #define WaterSumpOutHi  26 // датчик перебора воды в основной секции сампа
// #define WaterSumpOutNorm  28 // датчик нормального уровня воды в основной секции сампа
// #define WaterSumpOutLow  30 // датчик критически низкого уровня воды в сампе
// #define WaterInSump  2  // счетчик воды, подаваемой из водопровода
// #define WaterPres 32 // Датчик давления воды в водопроводе
// #define WaterPump  34 // Реле включения помпы, подающей из сампа в аквариум
// #define WaterClap  36 // Реле клапана, подачи воды из водопровода в самп
int cool1; // переменная оборотов вентилятора 1
int cool2; // переменная оборотов вентилятора 2
int vremya = 0;
PCA9685 ledDriver1; // шильд ШИМ 1
PCA9685 ledDriver2; // шильд ШИМ 2
void setup()
{
  Serial.begin(9600); // Старт сериала (для отладки)
  Wire.begin();           // Старт I2C
  sensors.begin();
  sensors.setResolution(sensor1, 10); // температура радиаторов света
  sensors.setResolution(sensor2, 10); // температура радиаторов света
  ledDriver1.begin(B000000); // адрес шильда ШИМ 1 (перемычек нет)
  ledDriver1.init();
  ledDriver2.begin(B000001); // адрес шильда ШИМ 2 (перемычка 1)
  ledDriver2.init();
}
void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop()

{ tmElements_t tm;
  //   requestTemperatures(); // считываем температуру с датчиков

  int  Moon = analogRead(MoonPin);  // считываем значение с фоторезистора
  RTC.read(tm);
  Serial.print("Svet ");
  Serial.println(Moon);
  Serial.print("Time ");
  Serial.print(tm.Hour);
  Serial.write(':');
  Serial.print(tm.Minute);
  Serial.write(':');
  Serial.print(tm.Second);
  Serial.println();
  sensors.requestTemperatures();
  Serial.print("Temperatura1 ");
  printTemperature(sensor1);
  Serial.print("Temperatura2 ");
  printTemperature(sensor2);
  cool1 = (sensors.getTempC(sensor1) - 24) * 200; // расчитываем ШИМ для вентилятора 1
  if (cool1 <= 400)
    cool1 = 0;
    else if (cool1 >= 4095)
    cool1 = 4095;
  cool2 = (sensors.getTempC(sensor2) - 24) * 200; // расчитываем ШИМ для вентилятора 2
  if (cool2 <= 400)
    cool2 = 0;
        else if (cool2 >= 4095)
    cool2 = 4095;
  Serial.print ("Coolers ");
  Serial.print(cool1 );
  Serial.print (",");
  Serial.println(cool2);
  
   if(8<= tm.Hour&&tm.Hour <=20)
   {vremya = 1;
    Serial.print ("day ");}
    else
   {vremya = 2;
    Serial.print ("Night ");}
    Serial.println (vremya);
    Serial.println();


    ledDriver2.setLEDDimmed(9,cool1);   //(вторая плата PCA9685 канал 9) вентилятор 1
    ledDriver2.setLEDDimmed(10,cool2);  //(вторая плата PCA9685 канал 9) вентилятор 2
    
    ledDriver2.writeLED(0, 4095, 1023 ); //белый, центр
  delay(1000);

}

/*    
    {
        ledDriver2.writeLED(0, 1023, 1023 ); //белый, центр
        delay(50);
        ledDriver2.writeLED(1, 1023, 1023 ); //белый 1 -
        delay(50);
        ledDriver2.writeLED(2, 1023, 1023 ); //белый 2
        delay(50);
        ledDriver2.writeLED(3, 1023, 1023 ); //белый 3 -
        delay(50);
        ledDriver2.writeLED(4, 1023, 1023 ); //белый 4
        delay(50);
        ledDriver2.writeLED(5, 1023, 1023 ); //белый 5
        delay(50);
        ledDriver2.writeLED(6, 1023, 1023 ); //белый 6
        delay(50);
        ledDriver2.writeLED(7, 1023, 1023 ); //белый 7
        delay(50);
        // ledDriver2.setLEDDimmed(8,1023); // ультрафиолет
      
        //ledDriver2.setLEDDimmed(10,1023);  // вентилятор 2
        //delay(50);
        //ledDriver2.setLEDDimmed(11,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(12,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(13,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(14,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(15,1023);  // не используется
        //delay(100);
        ledDriver1.writeLED(0, 1023, 10); // синий 1
        delay(50);
        ledDriver1.writeLED(1, 1023, 1018); // зеленый 1
        delay(50);
        ledDriver1.writeLED(2, 1023, 1022); // красный 1
        delay(50);
        ledDriver1.writeLED(3, 1023, 1018); // синий 2
        delay(50);
        ledDriver1.writeLED(4, 1023, 1018); // зеленый 2
        delay(50);
        ledDriver1.writeLED(5, 1023, 1022); // красный 2
        delay(50);
        ledDriver1.writeLED(6, 1023, 1018); // синий 3
        delay(50);
        ledDriver1.writeLED(7, 1023, 1018); // зеленый 3
        delay(50);
        ledDriver1.writeLED(8, 1023, 1022); // красный 3
        delay(50);
        ledDriver1.writeLED(9, 1023, 1018); // синий 4
        delay(50);
        ledDriver1.writeLED(10, 1023, 1018); // зеленый 4 -
        delay(50);
        ledDriver1.writeLED(11, 1023, 1022); // красный 4
        //delay(500);
        //ledDriver1.setLEDDimmed(12,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(13,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(14,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(15,1023);
        //delay(100);
      }
    else
    {
        ledDriver2.writeLED(0, 1023, 10); //белый, центр
        delay(50);
        ledDriver2.setLEDDimmed(1, 1023);  //белый 1 -
        delay(50);
        ledDriver2.setLEDDimmed(2, 1023); //белый 2
        delay(50);
        ledDriver2.setLEDDimmed(3, 1023); //белый 3 -
        delay(50);
        ledDriver2.setLEDDimmed(4, 1023); //белый 4
        delay(50);
        ledDriver2.setLEDDimmed(5, 1023); //белый 5
        delay(50);
        ledDriver2.setLEDDimmed(6, 1023); //белый 6
        delay(50);
        ledDriver2.setLEDDimmed(7, 1023); //белый 7
        delay(50);
        // ledDriver2.setLEDDimmed(8,1023); // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(9,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(10,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(11,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(12,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(13,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(14,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(15,1023);  // не используется
        //delay(100);
        ledDriver1.writeLED(0, 1023, 10); // синий 1
        delay(50);
        ledDriver1.writeLED(1, 1023, 1018); // зеленый 1
        delay(50);
        ledDriver1.writeLED(2, 1023, 1022); // красный 1
        delay(50);
        ledDriver1.writeLED(3, 1023, 1018); // синий 2
        delay(50);
        ledDriver1.writeLED(4, 1023, 1018); // зеленый 2
        delay(50);
        ledDriver1.writeLED(5, 1023, 1022); // красный 2
        delay(50);
        ledDriver1.writeLED(6, 1023, 1018); // синий 3
        delay(50);
        ledDriver1.writeLED(7, 1023, 1018); // зеленый 3
        delay(50);
        ledDriver1.writeLED(8, 1023, 1022); // красный 3
        delay(50);
        ledDriver1.writeLED(9, 1023, 1018); // синий 4
        delay(50);
        ledDriver1.writeLED(10, 1023, 1018); // зеленый 4 -
        delay(50);
        ledDriver1.writeLED(11, 1023, 1022); // красный 4
        delay(50);
        ledDriver1.writeLED(12, 1023, 1022); // ультрафиолет
        //delay(50);
        //ledDriver1.setLEDDimmed(13,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(14,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(15,1023);
        //delay(100);
      }
    }
}*/

Хотя со стандартных примеров мега в сериал шлет нормально.

В чем может быть загвоздка?

nevkon
Offline
Зарегистрирован: 20.01.2015

А вы на меге2560 как смотрите сериал порт? Учтите что порты I2C будут на разных ногах контроллеров.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Разобрался я с портом.

Питания Меге не хватало от ЮСБ, подключил внешний блок питания 12в и все заработало.

Осталась проблема с привязкой " ledDriver2.writeLED(0, 1023, 1023 ); //белый, центр  " и т.д. к часам реального времени.

 

nevkon
Offline
Зарегистрирован: 20.01.2015

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

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

"vremya" - переменная, для заката/рассвета.
А на длительность я не знаю как прописать.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

В строках 80-85 прописал.
Не так?

GraninDm
Offline
Зарегистрирован: 01.08.2013
SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Человек на tlc 5940 делает. К ней есть очень удобная библиотека. pca9685 навороченней, дороже и от того менее разжеванна на просторах ее тема.
Но не нашел я в свое время платы с tlc 5940 и теперь мучительно строю на том, что купил.
Вообще он очень похожее строит, спасибо за ссылочку. Правда многое в его коде я так и не понял.

GraninDm
Offline
Зарегистрирован: 01.08.2013

SERgunCHIK пишет:

Есть 20 каналов с ШИМ, ардуина и часы реального времени на ds1307

как привязать ШИМ ко времени, чтобы каналы плавно разждигались по очереди в определенное время и поочередно гасли в определенное время.

Посмотрите по ссылке мое 14 сообщение. Код проще некуда. Там код для генерации мощности освещения для определенного времени суток.

А уж как вы это значение запихнете в шим это тело ваше.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015
Спасибо большое за:

struct day {
  long int sunRiseStart;
  long int sunRiseFinish;
  long int sunSetStart;
  long int sunSetFinish;
  byte power;
  bool inversion;
} day;

#define ARRAY_LENGTH 6
#define MIN_POWER    20

struct day array[ARRAY_LENGTH];

long int seconds;

void setup() {
  DS1307 rtc(A0, A1);
  array[0].sunRiseStart = 600 * 60;
  array[0].sunRiseFinish = 630 * 60;
  array[0].sunSetStart = 700 * 60;
  array[0].sunSetFinish = 730 * 60;
  array[0].power = 100;
  array[0].inversion = 0;

  // i tak dalee
  //array[1].sunRiseStart = 0;
  //array[1].sunRiseFinish = 0;
  //array[1].sunSetStart = 0;
  //array[1].sunSetFinish = 0;
  //array[1].power = 0;
  //array[1].inversion = 0;
    
}
void loop() {
    Time time = rtc.getTime();
     seconds = time.hour * 3600 + time.min * 60 + time.sec;
     for (byte i = 0; i < ARRAY_LENGTH; i++){
       if (seconds < array[i].sunRiseStart || seconds > array[i].sunSetFinish ) {
         powerValue = MIN_POWER;
       }
       else if (seconds > array[i].sunRiseFinish && seconds < array[i].sunSetStart) {
         powerValue = array[i].power;
       }
       else if (seconds > array[i].sunRiseStart && seconds < array[i].sunRiseFinish) {
         // set proportional sun rise
         long int powerValue = (seconds - array[i].sunRiseStart) * 1024 / 
           (array[i].sunRiseFinish - array[i].sunRiseStart ) * 
           (array[i].power - MIN_POWER);
           powerValue = powerValue / 1024 + MIN_POWER;
       }
       else if (seconds > array[i].sunSetStart && seconds < array[i].sunSetFinish) {
         // set proportional sun set
         long int powerValue = (seconds - array[i].sunSetStart) * 1024 / 
           (array[i].sunSetFinish - array[i].sunSetStart) * 
           (array[i].power - MIN_POWER);
           powerValue = array[i].power - powerValue / 1024;
       }
     }
     
}

Но для кого проще некуда, а для кого и не все понятно. Раскоментируйте пожалуйста, если Вас не затруднит.

GraninDm
Offline
Зарегистрирован: 01.08.2013
struct day { // В этой структуре храниться информация о сутках
  long int sunRiseStart; // Начало рассвета в секундах от начала суток
  long int sunRiseFinish; // Конец рассвета
  long int sunSetStart; // Начало заката
  long int sunSetFinish; // Конец заката
  byte power; // Полная мощность излучения днем
  bool inversion; // инверсия Это я не знаю для чего нужно. Было в другой теме
} day;

#define ARRAY_LENGTH 6  // Количество каналов ШИМ
#define MIN_POWER    20  // Минимальная мощность днем для всех каналов

struct day array[ARRAY_LENGTH]; // Массив структур для управления каналами

long int seconds;

void setup() {
  DS1307 rtc(A0, A1); // Подключаем часы
// Заполняем информацию по каналам
  array[0].sunRiseStart = 600 * 60; 
  array[0].sunRiseFinish = 630 * 60;
  array[0].sunSetStart = 700 * 60;
  array[0].sunSetFinish = 730 * 60;
  array[0].power = 100;
  array[0].inversion = 0;

  // и так далее по все каналам
  //array[1].sunRiseStart = 0;
  //array[1].sunRiseFinish = 0;
  //array[1].sunSetStart = 0;
  //array[1].sunSetFinish = 0;
  //array[1].power = 0;
  //array[1].inversion = 0;
    
}
void loop() {
    Time time = rtc.getTime(); // Получаем текущее время
     seconds = time.hour * 3600 + time.min * 60 + time.sec; // Вычисляем количество секунд с начала суток
     for (byte i = 0; i < ARRAY_LENGTH; i++){ // пробегаемся по каналам
       if (seconds < array[i].sunRiseStart || seconds > array[i].sunSetFinish ) { // Если текущее время меньше времени начала рассвета или больше времени конца заката, то устанавливаем минимальную мощность 
         powerValue = MIN_POWER;
       }
       else if (seconds > array[i].sunRiseFinish && seconds < array[i].sunSetStart) { // если Текущее время находится между концом рассвета и началом заката, то устанавливаем максимальную мощность
         powerValue = array[i].power;
       }
       else if (seconds > array[i].sunRiseStart && seconds < array[i].sunRiseFinish) { // Если рассвет вычисляем мощность пропорционально времени рассвета 
         // set proportional sun rise
         long int powerValue = (seconds - array[i].sunRiseStart) * 1024 / 
           (array[i].sunRiseFinish - array[i].sunRiseStart ) * 
           (array[i].power - MIN_POWER);
           powerValue = powerValue / 1024 + MIN_POWER;
       }
       else if (seconds > array[i].sunSetStart && seconds < array[i].sunSetFinish) { // Если закат, то вычисляем мощность пропорционльно времени заката
         // set proportional sun set
         long int powerValue = (seconds - array[i].sunSetStart) * 1024 / 
           (array[i].sunSetFinish - array[i].sunSetStart) * 
           (array[i].power - MIN_POWER);
           powerValue = array[i].power - powerValue / 1024;
       }
// тут устанавливаем ШИМ для i-го канал как функцию от вычисленного powerValue
     }
     
}

 

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Большое спасибо, теперь многое понятнее. Буду сегодня ломать голову над тем как это пристроить к моему.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Верно ли я понимаю,что при условии, что PCA9685 - PWM 12 bit, в строках 48,51,55,58 заменяем 1024 на 4096.

Так-же я добавил  "Serial.println(seconds);" а оно почему-то ведет обратный отсчет, это нормально?

nevkon
Offline
Зарегистрирован: 20.01.2015

Верно, у вас будет 4096. Или нужно переключить в 10 битный режим.

А если выводить Serial.println(time.sec); ? Тоже обратный отсчет?

GraninDm
Offline
Зарегистрирован: 01.08.2013

Нет.

Значения мощности будут от MIN_POWER до array[i].power.

Применяйте map или по формуле пропорционально.

На 1024 я умножаю потому что мы имеем дело с целыми числами, и без *1024 при делении мы будем получать значение в диапазоне 0,000-1,000

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Она отказывается компилировать Serial.println(time.sec);

Ругается Arduino: 1.6.5 (Windows 7), Плата"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

 
my_old_sketch_aquas_time.ino: In function 'void loop()':
my_old_sketch_aquas_time:153: error: request for member 'sec' in 'time', which is of non-class type 'int'
request for member 'sec' in 'time', which is of non-class type 'int'
 
  Это сообщение будет содержать больше информации чем
  "Отображать вывод во время компиляции"
  включено в Файл > Настройки
 
GraninDm
Offline
Зарегистрирован: 01.08.2013

Про seconds не понял. Какие значение у вас выводятся?

GraninDm
Offline
Зарегистрирован: 01.08.2013

Я же написал, что это не готовый код, а заготовка

GraninDm
Offline
Зарегистрирован: 01.08.2013
SERgunCHIK
Offline
Зарегистрирован: 11.02.2015
Time 14:17:10              - текущее время
Temperatura1 25.00     - с термодатчика
Temperatura2 25.00     - с термодатчика
Coolers 0,0                    - ШИМ вентиляторов
seconds -14106             - загадочные "seconds"
array[0].power 100
 
nevkon
Offline
Зарегистрирован: 20.01.2015

Вы оставили объявление часов в сетапе? И на ногах А0 и А1?

Лучше положите код который пробуете чтобы не гадать на кофейной гуще. Только свернуть не забудьте.

GraninDm
Offline
Зарегистрирован: 01.08.2013

Потому что переменная long int, а выводится int.

 

  RTC.read(tm);
  Serial.print("Svet ");
  Serial.println(Moon);
  Serial.print("Time ");
  Serial.print(tm.Hour);
  Serial.write(':');
  Serial.print(tm.Minute);
  Serial.write(':');
  Serial.print(tm.Second);

Возьмите получение времени из вашего кода.

Я этими часами не пользовался.

nevkon
Offline
Зарегистрирован: 20.01.2015

какой тип данных seconds? Добавьте при объявлении спереди unsigned.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015
<div>#include <Wire.h> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Библиотека I2C</div><div>#include <PCA9685.h> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Бибилиотека регистров&nbsp;</div><div>#include <Time.h> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Библиотека часов</div><div>#include <DS1307RTC.h> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Библиотека часов</div><div>#include <OneWire.h> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Библиотека шины 1wire</div><div>#include <DallasTemperature.h> &nbsp; &nbsp; &nbsp; &nbsp; // Библиотека термометров</div><div>#define ONE_WIRE_BUS 19 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// вход датчиков 18b20 (в меге будет 19)</div><div>#define SQW &nbsp;18 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// SQW ds1307 на всякий случай</div><div>OneWire oneWire(ONE_WIRE_BUS);</div><div>DallasTemperature sensors(&oneWire);</div><div>DeviceAddress sensor1 = {0x28, 0x0, 0xFB, 0x5F, 0x6, 0x0, 0x0, 0x5B}; // Заранее известный адрес датчика 1</div><div>DeviceAddress sensor2 = {0x28, 0xE70, 0x66, 0x60, 0x6, 0x0, 0x0, 0x4A}; // Заранее известный адрес датчика 2</div><div>#define MoonPin A0 &nbsp;// Фоторезистор подключен 0-му аналоговому входу</div><div>#define WaterBank 22 // датчик перебора воды в аквариуме</div><div>#define WaterSumpInHi 24 // датчик перебора воды во входной секции сампа</div><div>#define WaterSumpOutHi 26 // датчик перебора воды в основной секции сампа</div><div>#define WaterSumpOutNorm 28 // датчик нормального уровня воды в основной секции сампа</div><div>#define WaterSumpOutLow 30 // датчик критически низкого уровня воды в сампе</div><div>#define WaterInSump 2 &nbsp;// счетчик воды, подаваемой из водопровода</div><div>#define WaterPres 32 // Датчик давления воды в водопроводе</div><div>#define WATERPUMP 34 // Реле включения помпы, подающей из сампа в аквариум</div><div>#define WaterClap 36 // Реле клапана, подачи воды из водопровода в самп</div><div>int cool1; // переменная оборотов вентилятора 1</div><div>int cool2; // переменная оборотов вентилятора 2</div><div>int TimE;</div><div>int powerValue;</div><div>PCA9685 ledDriver1; // шильд ШИМ 1</div><div>PCA9685 ledDriver2; // шильд ШИМ 2</div><div>struct Day { // В этой структуре храниться информация о сутках</div><div>&nbsp; long int sunRiseStart; // Начало рассвета в секундах от начала суток</div><div>&nbsp; long int sunRiseFinish; // Конец рассвета</div><div>&nbsp; long int sunSetStart; // Начало заката</div><div>&nbsp; long int sunSetFinish; // Конец заката</div><div>&nbsp; byte power; // Полная мощность излучения днем</div><div>&nbsp; bool inversion; // инверсия Это я не знаю для чего нужно. Было в другой теме</div><div>} Day;</div><div>#define ARRAY_LENGTH 21 &nbsp;// Количество каналов ШИМ</div><div>#define MIN_POWER &nbsp; &nbsp;0 &nbsp;// Минимальная мощность днем для всех каналов</div><div>struct Day array[ARRAY_LENGTH]; // Массив структур для управления каналами</div><div>long int seconds;</div><div>
</div><div>void setup()</div><div>{</div><div>&nbsp; Serial.begin(9600); // Старт сериала (для отладки)</div><div>&nbsp; Serial.println("start");</div><div>&nbsp; Wire.begin(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Старт I2C</div><div>&nbsp; sensors.begin();</div><div>&nbsp; sensors.setResolution(sensor1, 10); // температура радиаторов света</div><div>&nbsp; sensors.setResolution(sensor2, 10); // температура радиаторов света</div><div>&nbsp; ledDriver1.begin(B000000); // адрес шильда ШИМ 1 (перемычек нет)</div><div>&nbsp; ledDriver1.init();</div><div>&nbsp; ledDriver2.begin(B000001); // адрес шильда ШИМ 2 (перемычка 1)</div><div>&nbsp; ledDriver2.init();</div><div>&nbsp; pinMode(WaterBank, INPUT);</div><div>&nbsp; pinMode(WaterSumpInHi, INPUT);</div><div>&nbsp; pinMode(WaterSumpOutHi, INPUT);</div><div>&nbsp; pinMode(WaterSumpOutNorm, INPUT);</div><div>&nbsp; pinMode(WaterSumpOutLow, INPUT);</div><div>&nbsp; pinMode(WaterPres, INPUT);</div><div>&nbsp; pinMode(WATERPUMP, OUTPUT);</div><div>&nbsp; pinMode(WaterClap, OUTPUT);</div><div>&nbsp; array[0,8,9,10].sunRiseStart = 480 * 60 , 480 * 60 , 480 * 60 , 480 * 60;</div><div>&nbsp; array[0].sunRiseFinish = 490 * 60;</div><div>&nbsp; array[0].sunSetStart = 820 * 60;</div><div>&nbsp; array[0].sunSetFinish = 880 * 60;</div><div>&nbsp; array[0].power = 100;</div><div>&nbsp; array[0].inversion = 0;</div><div>&nbsp; array[1].sunRiseStart = 485 * 60;</div><div>&nbsp; array[1].sunRiseFinish = 495 * 60;</div><div>&nbsp; array[1].sunSetStart = 820 * 60;</div><div>&nbsp; array[1].sunSetFinish = 880 * 60;</div><div>&nbsp; array[1].power = 100;</div><div>&nbsp; array[1].inversion = 0;</div><div>&nbsp; array[2].sunRiseStart = 490 * 60;</div><div>&nbsp; array[2].sunRiseFinish = 500 * 60;</div><div>&nbsp; array[2].sunSetStart = 820 * 60;</div><div>&nbsp; array[2].sunSetFinish = 880 * 60;</div><div>&nbsp; array[2].power = 100;</div><div>&nbsp; array[2].inversion = 0;</div><div>&nbsp; array[3].sunRiseStart = 495 * 60;</div><div>&nbsp; array[3].sunRiseFinish = 510 * 60;</div><div>&nbsp; array[3].sunSetStart = 820 * 60;</div><div>&nbsp; array[3].sunSetFinish = 880 * 60;</div><div>&nbsp; array[3].power = 100;</div><div>&nbsp; array[3].inversion = 0;</div><div>&nbsp; array[4].sunRiseStart = 500 * 60;</div><div>&nbsp; array[4].sunRiseFinish = 510 * 60;</div><div>&nbsp; array[4].sunSetStart = 820 * 60;</div><div>&nbsp; array[4].sunSetFinish = 880 * 60;</div><div>&nbsp; array[4].power = 100;</div><div>&nbsp; array[4].inversion = 0;</div><div>&nbsp; array[5].sunRiseStart = 505 * 60;</div><div>&nbsp; array[5].sunRiseFinish = 515 * 60;</div><div>&nbsp; array[5].sunSetStart = 820 * 60;</div><div>&nbsp; array[5].sunSetFinish = 880 * 60;</div><div>&nbsp; array[5].power = 100;</div><div>&nbsp; array[5].inversion = 0;</div><div>&nbsp; array[6].sunRiseStart = 510 * 60;</div><div>&nbsp; array[6].sunRiseFinish = 520 * 60;</div><div>&nbsp; array[6].sunSetStart = 820 * 60;</div><div>&nbsp; array[6].sunSetFinish = 880 * 60;</div><div>&nbsp; array[6].power = 100;</div><div>&nbsp; array[6].inversion = 0;</div><div>&nbsp; array[7].sunRiseStart = 515 * 60;</div><div>&nbsp; array[7].sunRiseFinish = 525 * 60;</div><div>&nbsp; array[7].sunSetStart = 820 * 60;</div><div>&nbsp; array[7].sunSetFinish = 880 * 60;</div><div>&nbsp; array[7].power = 100;</div><div>&nbsp; array[7].inversion = 0;</div><div>
</div><div>}</div><div>void printTemperature(DeviceAddress deviceAddress) {</div><div>&nbsp; float tempC = sensors.getTempC(deviceAddress);</div><div>&nbsp; Serial.println(tempC);</div><div>}</div><div>void loop()</div><div>
</div><div>{ tmElements_t tm;</div><div>&nbsp; // &nbsp; requestTemperatures(); // считываем температуру с датчиков</div><div>&nbsp;TimE = RTC.read(tm); // Получаем текущее время</div><div>&nbsp;seconds = tm.Hour * 3600 + tm.Minute * 60 + tm.Second; // Вычисляем количество секунд с начала суток</div><div>&nbsp; int &nbsp;Moon = analogRead(MoonPin); &nbsp;// считываем значение с фоторезистора</div><div>&nbsp; RTC.read(tm);</div><div>&nbsp; Serial.print("Svet ");</div><div>&nbsp; Serial.println(Moon);</div><div>&nbsp; Serial.print("Time ");</div><div>&nbsp; Serial.print(tm.Hour);</div><div>&nbsp; Serial.write(':');</div><div>&nbsp; Serial.print(tm.Minute);</div><div>&nbsp; Serial.write(':');</div><div>&nbsp; Serial.print(tm.Second);</div><div>&nbsp; Serial.println();</div><div>&nbsp; sensors.requestTemperatures();</div><div>&nbsp; Serial.print("Temperatura1 ");</div><div>&nbsp; printTemperature(sensor1);</div><div>&nbsp; Serial.print("Temperatura2 ");</div><div>&nbsp; printTemperature(sensor2);</div><div>&nbsp; cool1 = (sensors.getTempC(sensor1) - 25.00) * 200; // расчитываем ШИМ для вентилятора 1</div><div>&nbsp; if (cool1 <= 400)</div><div>&nbsp; &nbsp; cool1 = 0;</div><div>&nbsp; else if (cool1 >= 4095)</div><div>&nbsp; &nbsp; cool1 = 4095;</div><div>&nbsp; cool2 = (sensors.getTempC(sensor2) - 25.00) * 200; // расчитываем ШИМ для вентилятора 2</div><div>&nbsp; if (cool2 <= 400)</div><div>&nbsp; &nbsp; cool2 = 0;</div><div>&nbsp; else if (cool2 >= 4095)</div><div>&nbsp; &nbsp; cool2 = 4095;</div><div>&nbsp; Serial.print ("Coolers ");</div><div>&nbsp; Serial.print(cool1 );</div><div>&nbsp; Serial.print (",");</div><div>&nbsp; Serial.println(cool2);</div><div>&nbsp; Serial.print("seconds");</div><div>&nbsp; Serial.println(seconds);</div><div>&nbsp; &nbsp;if(digitalRead(WaterSumpOutLow)== LOW)</div><div>&nbsp; digitalWrite(WATERPUMP, LOW);</div><div>&nbsp; else if((digitalRead(WaterSumpOutLow)== HIGH)&&(digitalRead(WaterSumpOutNorm)== HIGH))</div><div>&nbsp; &nbsp;digitalWrite(WATERPUMP, HIGH);</div><div>&nbsp; ledDriver2.setLEDDimmed(9, cool1); &nbsp;//(вторая плата PCA9685 канал 9) вентилятор 1</div><div>&nbsp; ledDriver2.setLEDDimmed(10, cool2); //(вторая плата PCA9685 канал 9) вентилятор 2</div><div>
</div><div>&nbsp; &nbsp;for (byte i = 0; i < ARRAY_LENGTH; i++){ // пробегаемся по каналам</div><div>&nbsp; &nbsp; &nbsp; &nbsp;if (seconds < array[i].sunRiseStart || seconds > array[i].sunSetFinish ) { // Если текущее время меньше времени начала рассвета или больше времени конца заката, то устанавливаем минимальную мощность&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;powerValue = MIN_POWER;</div><div>&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp; &nbsp; &nbsp; &nbsp;else if (seconds > array[i].sunRiseFinish && seconds < array[i].sunSetStart) { // если Текущее время находится между концом рассвета и началом заката, то устанавливаем максимальную мощность</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;powerValue = array[i].power;</div><div>&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp; &nbsp; &nbsp; &nbsp;else if (seconds > array[i].sunRiseStart && seconds < array[i].sunRiseFinish) { // Если рассвет вычисляем мощность пропорционально времени рассвета&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;long int powerValue = (seconds - array[i].sunRiseStart)*4096 / (array[i].sunRiseFinish - array[i].sunRiseStart )*(array[i].power - MIN_POWER);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;powerValue = powerValue / 4096 + MIN_POWER;</div><div>&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp; &nbsp; &nbsp; &nbsp;else if (seconds > array[i].sunSetStart && seconds < array[i].sunSetFinish) { // Если закат, то вычисляем мощность пропорционльно времени заката</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;long int powerValue = (seconds - array[i].sunSetStart)*4096 / (array[i].sunSetFinish - array[i].sunSetStart) * (array[i].power - MIN_POWER);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;powerValue = array[i].power - powerValue / 4096;</div><div>&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>// тут устанавливаем ШИМ для i-го канал как функцию от вычисленного powerValue</div><div>&nbsp; &nbsp; &nbsp;}</div><div>&nbsp; &nbsp; &nbsp;Serial.print("array[0].power");</div><div>&nbsp; Serial.println(array[0].power);</div><div>&nbsp; &nbsp; Serial.println(".");</div><div>&nbsp; delay(1000);</div><div>
</div><div>}</div><div>
</div><div>/*</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(0, 1023, 1023 ); //белый, центр</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(1, 1023, 1023 ); //белый 1 -</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(2, 1023, 1023 ); //белый 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(3, 1023, 1023 ); //белый 3 -</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(4, 1023, 1023 ); //белый 4</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(5, 1023, 1023 ); //белый 5</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(6, 1023, 1023 ); //белый 6</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(7, 1023, 1023 ); //белый 7</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; // ledDriver2.setLEDDimmed(8,1023); // ультрафиолет</div><div>
</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(10,1023); &nbsp;// вентилятор 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(11,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(12,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(13,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(14,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(15,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(100);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(0, 1023, 10); // синий 1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(1, 1023, 1018); // зеленый 1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(2, 1023, 1022); // красный 1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(3, 1023, 1018); // синий 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(4, 1023, 1018); // зеленый 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(5, 1023, 1022); // красный 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(6, 1023, 1018); // синий 3</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(7, 1023, 1018); // зеленый 3</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(8, 1023, 1022); // красный 3</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(9, 1023, 1018); // синий 4</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(10, 1023, 1018); // зеленый 4 -</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(11, 1023, 1022); // красный 4</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(500);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver1.setLEDDimmed(12,1023);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver1.setLEDDimmed(13,1023);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver1.setLEDDimmed(14,1023);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver1.setLEDDimmed(15,1023);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(100);</div><div>&nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; else</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.writeLED(0, 1023, 10); //белый, центр</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.setLEDDimmed(1, 1023); &nbsp;//белый 1 -</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.setLEDDimmed(2, 1023); //белый 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.setLEDDimmed(3, 1023); //белый 3 -</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.setLEDDimmed(4, 1023); //белый 4</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.setLEDDimmed(5, 1023); //белый 5</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.setLEDDimmed(6, 1023); //белый 6</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver2.setLEDDimmed(7, 1023); //белый 7</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; // ledDriver2.setLEDDimmed(8,1023); // не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(9,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(10,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(11,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(12,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(13,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(14,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver2.setLEDDimmed(15,1023); &nbsp;// не используется</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(100);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(0, 1023, 10); // синий 1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(1, 1023, 1018); // зеленый 1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(2, 1023, 1022); // красный 1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(3, 1023, 1018); // синий 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(4, 1023, 1018); // зеленый 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(5, 1023, 1022); // красный 2</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(6, 1023, 1018); // синий 3</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(7, 1023, 1018); // зеленый 3</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(8, 1023, 1022); // красный 3</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(9, 1023, 1018); // синий 4</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(10, 1023, 1018); // зеленый 4 -</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(11, 1023, 1022); // красный 4</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ledDriver1.writeLED(12, 1023, 1022); // ультрафиолет</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver1.setLEDDimmed(13,1023);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver1.setLEDDimmed(14,1023);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(50);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //ledDriver1.setLEDDimmed(15,1023);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //delay(100);</div><div>&nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div>}*/</div>
GraninDm
Offline
Зарегистрирован: 01.08.2013

У меня код в #36 отображается разметкой страницы. Ничего не понятно.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

строка 40, сделал по совету "nevkon"

тип данных unsigned и все пошло в правильном направлении

 

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015
#include <Wire.h>                      // Библиотека I2C
#include <PCA9685.h>                   // Бибилиотека регистров 
#include <Time.h>                      // Библиотека часов
#include <DS1307RTC.h>                 // Библиотека часов
#include <OneWire.h>                   // Библиотека шины 1wire
#include <DallasTemperature.h>         // Библиотека термометров
#define ONE_WIRE_BUS 19                // вход датчиков 18b20 (в меге будет 19)
#define SQW  18                        // SQW ds1307 на всякий случай
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1 = {0x28, 0x0, 0xFB, 0x5F, 0x6, 0x0, 0x0, 0x5B}; // Заранее известный адрес датчика 1
DeviceAddress sensor2 = {0x28, 0xE70, 0x66, 0x60, 0x6, 0x0, 0x0, 0x4A}; // Заранее известный адрес датчика 2
#define MoonPin A0  // Фоторезистор подключен 0-му аналоговому входу
#define WaterBank 22 // датчик перебора воды в аквариуме
#define WaterSumpInHi 24 // датчик перебора воды во входной секции сампа
#define WaterSumpOutHi 26 // датчик перебора воды в основной секции сампа
#define WaterSumpOutNorm 28 // датчик нормального уровня воды в основной секции сампа
#define WaterSumpOutLow 30 // датчик критически низкого уровня воды в сампе
#define WaterInSump 2  // счетчик воды, подаваемой из водопровода
#define WaterPres 32 // Датчик давления воды в водопроводе
#define WATERPUMP 34 // Реле включения помпы, подающей из сампа в аквариум
#define WaterClap 36 // Реле клапана, подачи воды из водопровода в самп
int cool1; // переменная оборотов вентилятора 1
int cool2; // переменная оборотов вентилятора 2
int TimE;
int powerValue;
PCA9685 ledDriver1; // шильд ШИМ 1
PCA9685 ledDriver2; // шильд ШИМ 2
struct Day { // В этой структуре храниться информация о сутках
  long int sunRiseStart; // Начало рассвета в секундах от начала суток
  long int sunRiseFinish; // Конец рассвета
  long int sunSetStart; // Начало заката
  long int sunSetFinish; // Конец заката
  byte power; // Полная мощность излучения днем
  bool inversion; // инверсия Это я не знаю для чего нужно. Было в другой теме
} Day;
#define ARRAY_LENGTH 21  // Количество каналов ШИМ
#define MIN_POWER    0  // Минимальная мощность днем для всех каналов
struct Day array[ARRAY_LENGTH]; // Массив структур для управления каналами
unsigned int seconds;

void setup()
{
  Serial.begin(9600); // Старт сериала (для отладки)
  Serial.println("start");
  Wire.begin();           // Старт I2C
  sensors.begin();
  sensors.setResolution(sensor1, 10); // температура радиаторов света
  sensors.setResolution(sensor2, 10); // температура радиаторов света
  ledDriver1.begin(B000000); // адрес шильда ШИМ 1 (перемычек нет)
  ledDriver1.init();
  ledDriver2.begin(B000001); // адрес шильда ШИМ 2 (перемычка 1)
  ledDriver2.init();
  pinMode(WaterBank, INPUT);
  pinMode(WaterSumpInHi, INPUT);
  pinMode(WaterSumpOutHi, INPUT);
  pinMode(WaterSumpOutNorm, INPUT);
  pinMode(WaterSumpOutLow, INPUT);
  pinMode(WaterPres, INPUT);
  pinMode(WATERPUMP, OUTPUT);
  pinMode(WaterClap, OUTPUT);
  array[0,8,9,10].sunRiseStart = 480 * 60 , 480 * 60 , 480 * 60 , 480 * 60;
  array[0].sunRiseFinish = 490 * 60;
  array[0].sunSetStart = 820 * 60;
  array[0].sunSetFinish = 880 * 60;
  array[0].power = 100;
  array[0].inversion = 0;
  array[1].sunRiseStart = 485 * 60;
  array[1].sunRiseFinish = 495 * 60;
  array[1].sunSetStart = 820 * 60;
  array[1].sunSetFinish = 880 * 60;
  array[1].power = 100;
  array[1].inversion = 0;
  array[2].sunRiseStart = 490 * 60;
  array[2].sunRiseFinish = 500 * 60;
  array[2].sunSetStart = 820 * 60;
  array[2].sunSetFinish = 880 * 60;
  array[2].power = 100;
  array[2].inversion = 0;
  array[3].sunRiseStart = 495 * 60;
  array[3].sunRiseFinish = 510 * 60;
  array[3].sunSetStart = 820 * 60;
  array[3].sunSetFinish = 880 * 60;
  array[3].power = 100;
  array[3].inversion = 0;
  array[4].sunRiseStart = 500 * 60;
  array[4].sunRiseFinish = 510 * 60;
  array[4].sunSetStart = 820 * 60;
  array[4].sunSetFinish = 880 * 60;
  array[4].power = 100;
  array[4].inversion = 0;
  array[5].sunRiseStart = 505 * 60;
  array[5].sunRiseFinish = 515 * 60;
  array[5].sunSetStart = 820 * 60;
  array[5].sunSetFinish = 880 * 60;
  array[5].power = 100;
  array[5].inversion = 0;
  array[6].sunRiseStart = 510 * 60;
  array[6].sunRiseFinish = 520 * 60;
  array[6].sunSetStart = 820 * 60;
  array[6].sunSetFinish = 880 * 60;
  array[6].power = 100;
  array[6].inversion = 0;
  array[7].sunRiseStart = 515 * 60;
  array[7].sunRiseFinish = 525 * 60;
  array[7].sunSetStart = 820 * 60;
  array[7].sunSetFinish = 880 * 60;
  array[7].power = 100;
  array[7].inversion = 0;
 
}
void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop()

{ tmElements_t tm;
  //   requestTemperatures(); // считываем температуру с датчиков
 TimE = RTC.read(tm); // Получаем текущее время
 seconds = tm.Hour * 3600 + tm.Minute * 60 + tm.Second; // Вычисляем количество секунд с начала суток
  int  Moon = analogRead(MoonPin);  // считываем значение с фоторезистора
  RTC.read(tm);
  Serial.print("Svet ");
  Serial.println(Moon);
  Serial.print("Time ");
  Serial.print(tm.Hour);
  Serial.write(':');
  Serial.print(tm.Minute);
  Serial.write(':');
  Serial.print(tm.Second);
  Serial.println();
  sensors.requestTemperatures();
  Serial.print("Temperatura1 ");
  printTemperature(sensor1);
  Serial.print("Temperatura2 ");
  printTemperature(sensor2);
  cool1 = (sensors.getTempC(sensor1) - 25.00) * 200; // расчитываем ШИМ для вентилятора 1
  if (cool1 <= 400)
    cool1 = 0;
  else if (cool1 >= 4095)
    cool1 = 4095;
  cool2 = (sensors.getTempC(sensor2) - 25.00) * 200; // расчитываем ШИМ для вентилятора 2
  if (cool2 <= 400)
    cool2 = 0;
  else if (cool2 >= 4095)
    cool2 = 4095;
  Serial.print ("Coolers ");
  Serial.print(cool1 );
  Serial.print (",");
  Serial.println(cool2);
  Serial.print("seconds");
  Serial.println(seconds);
   if(digitalRead(WaterSumpOutLow)== LOW)
  digitalWrite(WATERPUMP, LOW);
  else if((digitalRead(WaterSumpOutLow)== HIGH)&&(digitalRead(WaterSumpOutNorm)== HIGH))
   digitalWrite(WATERPUMP, HIGH);
  ledDriver2.setLEDDimmed(9, cool1);  //(вторая плата PCA9685 канал 9) вентилятор 1
  ledDriver2.setLEDDimmed(10, cool2); //(вторая плата PCA9685 канал 9) вентилятор 2

   for (byte i = 0; i < ARRAY_LENGTH; i++){ // пробегаемся по каналам
       if (seconds < array[i].sunRiseStart || seconds > array[i].sunSetFinish ) { // Если текущее время меньше времени начала рассвета или больше времени конца заката, то устанавливаем минимальную мощность 
         powerValue = MIN_POWER;
       }
       else if (seconds > array[i].sunRiseFinish && seconds < array[i].sunSetStart) { // если Текущее время находится между концом рассвета и началом заката, то устанавливаем максимальную мощность
         powerValue = array[i].power;
       }
       else if (seconds > array[i].sunRiseStart && seconds < array[i].sunRiseFinish) { // Если рассвет вычисляем мощность пропорционально времени рассвета 
         long int powerValue = (seconds - array[i].sunRiseStart)*4096 / (array[i].sunRiseFinish - array[i].sunRiseStart )*(array[i].power - MIN_POWER);
           powerValue = powerValue / 4096 + MIN_POWER;
       }
       else if (seconds > array[i].sunSetStart && seconds < array[i].sunSetFinish) { // Если закат, то вычисляем мощность пропорционльно времени заката
         long int powerValue = (seconds - array[i].sunSetStart)*4096 / (array[i].sunSetFinish - array[i].sunSetStart) * (array[i].power - MIN_POWER);
           powerValue = array[i].power - powerValue / 4096;
       }
// тут устанавливаем ШИМ для i-го канал как функцию от вычисленного powerValue
     }
     Serial.print("array[0].power");
  Serial.println(array[0].power);
    Serial.println(".");
  delay(1000);

}

/*
    {
        ledDriver2.writeLED(0, 1023, 1023 ); //белый, центр
        delay(50);
        ledDriver2.writeLED(1, 1023, 1023 ); //белый 1 -
        delay(50);
        ledDriver2.writeLED(2, 1023, 1023 ); //белый 2
        delay(50);
        ledDriver2.writeLED(3, 1023, 1023 ); //белый 3 -
        delay(50);
        ledDriver2.writeLED(4, 1023, 1023 ); //белый 4
        delay(50);
        ledDriver2.writeLED(5, 1023, 1023 ); //белый 5
        delay(50);
        ledDriver2.writeLED(6, 1023, 1023 ); //белый 6
        delay(50);
        ledDriver2.writeLED(7, 1023, 1023 ); //белый 7
        delay(50);
        // ledDriver2.setLEDDimmed(8,1023); // ультрафиолет

        //ledDriver2.setLEDDimmed(10,1023);  // вентилятор 2
        //delay(50);
        //ledDriver2.setLEDDimmed(11,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(12,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(13,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(14,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(15,1023);  // не используется
        //delay(100);
        ledDriver1.writeLED(0, 1023, 10); // синий 1
        delay(50);
        ledDriver1.writeLED(1, 1023, 1018); // зеленый 1
        delay(50);
        ledDriver1.writeLED(2, 1023, 1022); // красный 1
        delay(50);
        ledDriver1.writeLED(3, 1023, 1018); // синий 2
        delay(50);
        ledDriver1.writeLED(4, 1023, 1018); // зеленый 2
        delay(50);
        ledDriver1.writeLED(5, 1023, 1022); // красный 2
        delay(50);
        ledDriver1.writeLED(6, 1023, 1018); // синий 3
        delay(50);
        ledDriver1.writeLED(7, 1023, 1018); // зеленый 3
        delay(50);
        ledDriver1.writeLED(8, 1023, 1022); // красный 3
        delay(50);
        ledDriver1.writeLED(9, 1023, 1018); // синий 4
        delay(50);
        ledDriver1.writeLED(10, 1023, 1018); // зеленый 4 -
        delay(50);
        ledDriver1.writeLED(11, 1023, 1022); // красный 4
        //delay(500);
        //ledDriver1.setLEDDimmed(12,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(13,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(14,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(15,1023);
        //delay(100);
      }
    else
    {
        ledDriver2.writeLED(0, 1023, 10); //белый, центр
        delay(50);
        ledDriver2.setLEDDimmed(1, 1023);  //белый 1 -
        delay(50);
        ledDriver2.setLEDDimmed(2, 1023); //белый 2
        delay(50);
        ledDriver2.setLEDDimmed(3, 1023); //белый 3 -
        delay(50);
        ledDriver2.setLEDDimmed(4, 1023); //белый 4
        delay(50);
        ledDriver2.setLEDDimmed(5, 1023); //белый 5
        delay(50);
        ledDriver2.setLEDDimmed(6, 1023); //белый 6
        delay(50);
        ledDriver2.setLEDDimmed(7, 1023); //белый 7
        delay(50);
        // ledDriver2.setLEDDimmed(8,1023); // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(9,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(10,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(11,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(12,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(13,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(14,1023);  // не используется
        //delay(50);
        //ledDriver2.setLEDDimmed(15,1023);  // не используется
        //delay(100);
        ledDriver1.writeLED(0, 1023, 10); // синий 1
        delay(50);
        ledDriver1.writeLED(1, 1023, 1018); // зеленый 1
        delay(50);
        ledDriver1.writeLED(2, 1023, 1022); // красный 1
        delay(50);
        ledDriver1.writeLED(3, 1023, 1018); // синий 2
        delay(50);
        ledDriver1.writeLED(4, 1023, 1018); // зеленый 2
        delay(50);
        ledDriver1.writeLED(5, 1023, 1022); // красный 2
        delay(50);
        ledDriver1.writeLED(6, 1023, 1018); // синий 3
        delay(50);
        ledDriver1.writeLED(7, 1023, 1018); // зеленый 3
        delay(50);
        ledDriver1.writeLED(8, 1023, 1022); // красный 3
        delay(50);
        ledDriver1.writeLED(9, 1023, 1018); // синий 4
        delay(50);
        ledDriver1.writeLED(10, 1023, 1018); // зеленый 4 -
        delay(50);
        ledDriver1.writeLED(11, 1023, 1022); // красный 4
        delay(50);
        ledDriver1.writeLED(12, 1023, 1022); // ультрафиолет
        //delay(50);
        //ledDriver1.setLEDDimmed(13,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(14,1023);
        //delay(50);
        //ledDriver1.setLEDDimmed(15,1023);
        //delay(100);
      }
    }
}*/

 

GraninDm
Offline
Зарегистрирован: 01.08.2013

unsigned int от 0 до 65535

А в сутках 24*3600 86400 секунд.

GraninDm
Offline
Зарегистрирован: 01.08.2013

И еще, заполняйте так

#define HOURS *3600
#define MINUTES *60

...
array[0].sunRiseStart = 6 HOURS + 20 MINUTES;
...

Не нужно будет вычислять 

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Значит можно  unsigned long, но как сделать, чтобы она от начала текущих суток считала?

 

GraninDm
Offline
Зарегистрирован: 01.08.2013

Она так и считает от начала суток.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015
Time 14:55:56
Temperatura1 25.50
Temperatura2 25.50
Coolers 0,0
seconds4294955516
GraninDm
Offline
Зарегистрирован: 01.08.2013

Вот так видимо нужно использовать

dec2bcd(tm.Hour) * 3600 + dec2bcd(tm.Minute) * 60 + dec2bcd(tm.Second)

 

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

dec2bcd(tm.Hour) * 3600 + dec2bcd(tm.Minute) * 60 + dec2bcd(tm.Second)

не работает

dec2bcd - надо декларировать? 

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015
  RTC.read(tm); // Получаем текущее время
 long min0 = tm.Hour * 60;
 long min1 = tm.Minute;
 seconds = (min0 + min1) * 60 + tm.Second;   // Вычисляем количество секунд с начала суток

Победило проблему. 

sinnpriest
Offline
Зарегистрирован: 16.09.2015

О, такой же, как и я )))

Спасибо местным гуру...

Знак инверсии нужен для инвертирования ШИМ-сигнала. Т.к. разные драйвера воспринимают в точности до наоборот. Какой то драйвер открыт при ШИМ=0, какой то открыт при ШИМ=4095. Чтоб не ломать скетч и есть инвертор, который ставит ШИМ сигнал зеркально.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

sinnpriest 

свои наработки не покажешь?

А я ... блин после PCA90685 на DLL350H оптопарами инвертирую.

sinnpriest
Offline
Зарегистрирован: 16.09.2015

И для ТС: я вот тут пытаюсь изложить для аквариумистов как повторить то, что я делаю... http://reefcentral.ru/forum/topic/20560-prostoj-kontroller/

Первый сектч в вышеприведенной теме работает на 100%, но там ШИМ- 8 бит.

Правда, последний скетч правно рассветает и правно закарывается только при условии, что время заката и рассвета меньше пяти минут. На десяти минутах какие то глюки...