Таймер и ШИМ
- Войдите на сайт для отправки комментариев
Пнд, 14/09/2015 - 15:22
Подскажите пожалуйста кусочком кода.
Есть 20 каналов с ШИМ, ардуина и часы реального времени на ds1307
как привязать ШИМ ко времени, чтобы каналы плавно разждигались по очереди в определенное время и поочередно гасли в определенное время.
Дисплеев и кнопочек в устройстве не будет, просто определенное заданное время начала "рассвета" , длительность "рассвета", начала "заката", длительности "заката" и так по 20ти каналам.
Шим скольки разрядный?
Шим_макс - (Шим_макс-Шим_мин)*время_прошедшее/время_заката
Аналогично и для рассвета. Код самый обычный - нарисуйте блок-схему, код по ней написать уже будет оч. легко.
Шим будет на pca9685, от "0" до "4095".
"Код самый обычный" и есть для меня загадка.
(I==0, I<=4095, I++) это я освоил, но это, если без delay происходит быстро и не получается привязать ко времени от часов.
Вы мою формулу даже не прочитали. Сколько бы раз вы ее не выполнили результат будет зависеть от прошедшего времени. delay тут ни при чем.
Читал я вашу формулу.
Но как на програмном языке выглядит "Шим_макс - (Шим_макс-Шим_мин)*время_прошедшее/время_заката"?
Ни кто не может/не хочет подсказать новичку как привязать шим к часам реального времени?
if (шим) {часы};
При рассвете в 8:00 что то типа
if(analog.write(9)100){time.hour(8)} ?
задержка = длительность рассвета / 4096
если наступило время рассвета
{
for(i=0; i<=4095; i++)
{
вывод значения i в ШИМ первого канала
delay( задержка );
}
for(i=0; i<=4095; i++)
{
вывод значения i в ШИМ второго канала
delay( задержка );
}
и т.д. для остальных каналов
}
Аналогично для заката.
Спасибо реально за отклик, но именно от этих delay я и пытаюсь избавиться для вклинивания других функций контролеру аквариума.
Началось у меня с подобного кода тут "http://arduino.ru/forum/programmirovanie/pomogite-razobratsya-novichku-1"
Сейчас я пытаюсь уйти от внешнего таймера, задающего сухим контактом режим день/ночь.
Планирую добавить канал на ультрафиолет, добавить 2 датчика температуры, по ним крутить 2 вентилятора.
А еще в планах прикрутить автоматическую подмену воды. В общем все это заствляет избавляться от delay.
Кстати, еще ( наверно глупый) вопрос.
В функции for второй аргумент - это потолок яркости канала, верно?
Там максимальное значение канала ШИМ.
Переведу на русский:
Перебирать значение 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); }Это для рассвета. Как видите никаких делай. Только запись шима нужно будет по вашему делать. В сетапе или при ините переменных должны быть присвоены стартовые значения.
Пока код в процессе написания, уперся в проблемку:
На 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); } } }*/Хотя со стандартных примеров мега в сериал шлет нормально.
В чем может быть загвоздка?
А вы на меге2560 как смотрите сериал порт? Учтите что порты I2C будут на разных ногах контроллеров.
Разобрался я с портом.
Питания Меге не хватало от ЮСБ, подключил внешний блок питания 12в и все заработало.
Осталась проблема с привязкой "
ledDriver2.writeLED(0, 1023, 1023 ); //белый, центр" и т.д. к часам реального времени.Не вижу переменных на время восхода/заката и их длительность.
"vremya" - переменная, для заката/рассвета.
А на длительность я не знаю как прописать.
В строках 80-85 прописал.
Не так?
http://arduino.ru/forum/apparatnye-voprosy/kontroller-svetodiodnogo-svetilnika-dlya-morskogo-akvariuma-tlc5940-arduino
Вы не одно и то же делаете?
Человек на tlc 5940 делает. К ней есть очень удобная библиотека. pca9685 навороченней, дороже и от того менее разжеванна на просторах ее тема.
Но не нашел я в свое время платы с tlc 5940 и теперь мучительно строю на том, что купил.
Вообще он очень похожее строит, спасибо за ссылочку. Правда многое в его коде я так и не понял.
Есть 20 каналов с ШИМ, ардуина и часы реального времени на ds1307
как привязать ШИМ ко времени, чтобы каналы плавно разждигались по очереди в определенное время и поочередно гасли в определенное время.
Посмотрите по ссылке мое 14 сообщение. Код проще некуда. Там код для генерации мощности освещения для определенного времени суток.
А уж как вы это значение запихнете в шим это тело ваше.
Спасибо большое за: 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; } } }Но для кого проще некуда, а для кого и не все понятно. Раскоментируйте пожалуйста, если Вас не затруднит.
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 } }Большое спасибо, теперь многое понятнее. Буду сегодня ломать голову над тем как это пристроить к моему.
Верно ли я понимаю,что при условии, что PCA9685 - PWM 12 bit, в строках 48,51,55,58 заменяем 1024 на 4096.
Так-же я добавил "Serial.println(seconds);" а оно почему-то ведет обратный отсчет, это нормально?
Верно, у вас будет 4096. Или нужно переключить в 10 битный режим.
А если выводить Serial.println(time.sec); ? Тоже обратный отсчет?
Нет.
Значения мощности будут от MIN_POWER до array[i].power.
Применяйте map или по формуле пропорционально.
На 1024 я умножаю потому что мы имеем дело с целыми числами, и без *1024 при делении мы будем получать значение в диапазоне 0,000-1,000
Она отказывается компилировать Serial.println(time.sec);
Ругается Arduino: 1.6.5 (Windows 7), Плата"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
Про seconds не понял. Какие значение у вас выводятся?
Я же написал, что это не готовый код, а заготовка
http://playground.arduino.cc/code/time
time.seconds()
Вы оставили объявление часов в сетапе? И на ногах А0 и А1?
Лучше положите код который пробуете чтобы не гадать на кофейной гуще. Только свернуть не забудьте.
Потому что переменная 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);Возьмите получение времени из вашего кода.
Я этими часами не пользовался.
какой тип данных seconds? Добавьте при объявлении спереди unsigned.
<div>#include <Wire.h> // Библиотека I2C</div><div>#include <PCA9685.h> // Бибилиотека регистров </div><div>#include <Time.h> // Библиотека часов</div><div>#include <DS1307RTC.h> // Библиотека часов</div><div>#include <OneWire.h> // Библиотека шины 1wire</div><div>#include <DallasTemperature.h> // Библиотека термометров</div><div>#define ONE_WIRE_BUS 19 // вход датчиков 18b20 (в меге будет 19)</div><div>#define SQW 18 // 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 // Фоторезистор подключен 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 // счетчик воды, подаваемой из водопровода</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> long int sunRiseStart; // Начало рассвета в секундах от начала суток</div><div> long int sunRiseFinish; // Конец рассвета</div><div> long int sunSetStart; // Начало заката</div><div> long int sunSetFinish; // Конец заката</div><div> byte power; // Полная мощность излучения днем</div><div> bool inversion; // инверсия Это я не знаю для чего нужно. Было в другой теме</div><div>} Day;</div><div>#define ARRAY_LENGTH 21 // Количество каналов ШИМ</div><div>#define MIN_POWER 0 // Минимальная мощность днем для всех каналов</div><div>struct Day array[ARRAY_LENGTH]; // Массив структур для управления каналами</div><div>long int seconds;</div><div> </div><div>void setup()</div><div>{</div><div> Serial.begin(9600); // Старт сериала (для отладки)</div><div> Serial.println("start");</div><div> Wire.begin(); // Старт I2C</div><div> sensors.begin();</div><div> sensors.setResolution(sensor1, 10); // температура радиаторов света</div><div> sensors.setResolution(sensor2, 10); // температура радиаторов света</div><div> ledDriver1.begin(B000000); // адрес шильда ШИМ 1 (перемычек нет)</div><div> ledDriver1.init();</div><div> ledDriver2.begin(B000001); // адрес шильда ШИМ 2 (перемычка 1)</div><div> ledDriver2.init();</div><div> pinMode(WaterBank, INPUT);</div><div> pinMode(WaterSumpInHi, INPUT);</div><div> pinMode(WaterSumpOutHi, INPUT);</div><div> pinMode(WaterSumpOutNorm, INPUT);</div><div> pinMode(WaterSumpOutLow, INPUT);</div><div> pinMode(WaterPres, INPUT);</div><div> pinMode(WATERPUMP, OUTPUT);</div><div> pinMode(WaterClap, OUTPUT);</div><div> array[0,8,9,10].sunRiseStart = 480 * 60 , 480 * 60 , 480 * 60 , 480 * 60;</div><div> array[0].sunRiseFinish = 490 * 60;</div><div> array[0].sunSetStart = 820 * 60;</div><div> array[0].sunSetFinish = 880 * 60;</div><div> array[0].power = 100;</div><div> array[0].inversion = 0;</div><div> array[1].sunRiseStart = 485 * 60;</div><div> array[1].sunRiseFinish = 495 * 60;</div><div> array[1].sunSetStart = 820 * 60;</div><div> array[1].sunSetFinish = 880 * 60;</div><div> array[1].power = 100;</div><div> array[1].inversion = 0;</div><div> array[2].sunRiseStart = 490 * 60;</div><div> array[2].sunRiseFinish = 500 * 60;</div><div> array[2].sunSetStart = 820 * 60;</div><div> array[2].sunSetFinish = 880 * 60;</div><div> array[2].power = 100;</div><div> array[2].inversion = 0;</div><div> array[3].sunRiseStart = 495 * 60;</div><div> array[3].sunRiseFinish = 510 * 60;</div><div> array[3].sunSetStart = 820 * 60;</div><div> array[3].sunSetFinish = 880 * 60;</div><div> array[3].power = 100;</div><div> array[3].inversion = 0;</div><div> array[4].sunRiseStart = 500 * 60;</div><div> array[4].sunRiseFinish = 510 * 60;</div><div> array[4].sunSetStart = 820 * 60;</div><div> array[4].sunSetFinish = 880 * 60;</div><div> array[4].power = 100;</div><div> array[4].inversion = 0;</div><div> array[5].sunRiseStart = 505 * 60;</div><div> array[5].sunRiseFinish = 515 * 60;</div><div> array[5].sunSetStart = 820 * 60;</div><div> array[5].sunSetFinish = 880 * 60;</div><div> array[5].power = 100;</div><div> array[5].inversion = 0;</div><div> array[6].sunRiseStart = 510 * 60;</div><div> array[6].sunRiseFinish = 520 * 60;</div><div> array[6].sunSetStart = 820 * 60;</div><div> array[6].sunSetFinish = 880 * 60;</div><div> array[6].power = 100;</div><div> array[6].inversion = 0;</div><div> array[7].sunRiseStart = 515 * 60;</div><div> array[7].sunRiseFinish = 525 * 60;</div><div> array[7].sunSetStart = 820 * 60;</div><div> array[7].sunSetFinish = 880 * 60;</div><div> array[7].power = 100;</div><div> array[7].inversion = 0;</div><div> </div><div>}</div><div>void printTemperature(DeviceAddress deviceAddress) {</div><div> float tempC = sensors.getTempC(deviceAddress);</div><div> Serial.println(tempC);</div><div>}</div><div>void loop()</div><div> </div><div>{ tmElements_t tm;</div><div> // requestTemperatures(); // считываем температуру с датчиков</div><div> TimE = RTC.read(tm); // Получаем текущее время</div><div> seconds = tm.Hour * 3600 + tm.Minute * 60 + tm.Second; // Вычисляем количество секунд с начала суток</div><div> int Moon = analogRead(MoonPin); // считываем значение с фоторезистора</div><div> RTC.read(tm);</div><div> Serial.print("Svet ");</div><div> Serial.println(Moon);</div><div> Serial.print("Time ");</div><div> Serial.print(tm.Hour);</div><div> Serial.write(':');</div><div> Serial.print(tm.Minute);</div><div> Serial.write(':');</div><div> Serial.print(tm.Second);</div><div> Serial.println();</div><div> sensors.requestTemperatures();</div><div> Serial.print("Temperatura1 ");</div><div> printTemperature(sensor1);</div><div> Serial.print("Temperatura2 ");</div><div> printTemperature(sensor2);</div><div> cool1 = (sensors.getTempC(sensor1) - 25.00) * 200; // расчитываем ШИМ для вентилятора 1</div><div> if (cool1 <= 400)</div><div> cool1 = 0;</div><div> else if (cool1 >= 4095)</div><div> cool1 = 4095;</div><div> cool2 = (sensors.getTempC(sensor2) - 25.00) * 200; // расчитываем ШИМ для вентилятора 2</div><div> if (cool2 <= 400)</div><div> cool2 = 0;</div><div> else if (cool2 >= 4095)</div><div> cool2 = 4095;</div><div> Serial.print ("Coolers ");</div><div> Serial.print(cool1 );</div><div> Serial.print (",");</div><div> Serial.println(cool2);</div><div> Serial.print("seconds");</div><div> Serial.println(seconds);</div><div> if(digitalRead(WaterSumpOutLow)== LOW)</div><div> digitalWrite(WATERPUMP, LOW);</div><div> else if((digitalRead(WaterSumpOutLow)== HIGH)&&(digitalRead(WaterSumpOutNorm)== HIGH))</div><div> digitalWrite(WATERPUMP, HIGH);</div><div> ledDriver2.setLEDDimmed(9, cool1); //(вторая плата PCA9685 канал 9) вентилятор 1</div><div> ledDriver2.setLEDDimmed(10, cool2); //(вторая плата PCA9685 канал 9) вентилятор 2</div><div> </div><div> for (byte i = 0; i < ARRAY_LENGTH; i++){ // пробегаемся по каналам</div><div> if (seconds < array[i].sunRiseStart || seconds > array[i].sunSetFinish ) { // Если текущее время меньше времени начала рассвета или больше времени конца заката, то устанавливаем минимальную мощность </div><div> powerValue = MIN_POWER;</div><div> }</div><div> else if (seconds > array[i].sunRiseFinish && seconds < array[i].sunSetStart) { // если Текущее время находится между концом рассвета и началом заката, то устанавливаем максимальную мощность</div><div> powerValue = array[i].power;</div><div> }</div><div> else if (seconds > array[i].sunRiseStart && seconds < array[i].sunRiseFinish) { // Если рассвет вычисляем мощность пропорционально времени рассвета </div><div> long int powerValue = (seconds - array[i].sunRiseStart)*4096 / (array[i].sunRiseFinish - array[i].sunRiseStart )*(array[i].power - MIN_POWER);</div><div> powerValue = powerValue / 4096 + MIN_POWER;</div><div> }</div><div> else if (seconds > array[i].sunSetStart && seconds < array[i].sunSetFinish) { // Если закат, то вычисляем мощность пропорционльно времени заката</div><div> long int powerValue = (seconds - array[i].sunSetStart)*4096 / (array[i].sunSetFinish - array[i].sunSetStart) * (array[i].power - MIN_POWER);</div><div> powerValue = array[i].power - powerValue / 4096;</div><div> }</div><div>// тут устанавливаем ШИМ для i-го канал как функцию от вычисленного powerValue</div><div> }</div><div> Serial.print("array[0].power");</div><div> Serial.println(array[0].power);</div><div> Serial.println(".");</div><div> delay(1000);</div><div> </div><div>}</div><div> </div><div>/*</div><div> {</div><div> ledDriver2.writeLED(0, 1023, 1023 ); //белый, центр</div><div> delay(50);</div><div> ledDriver2.writeLED(1, 1023, 1023 ); //белый 1 -</div><div> delay(50);</div><div> ledDriver2.writeLED(2, 1023, 1023 ); //белый 2</div><div> delay(50);</div><div> ledDriver2.writeLED(3, 1023, 1023 ); //белый 3 -</div><div> delay(50);</div><div> ledDriver2.writeLED(4, 1023, 1023 ); //белый 4</div><div> delay(50);</div><div> ledDriver2.writeLED(5, 1023, 1023 ); //белый 5</div><div> delay(50);</div><div> ledDriver2.writeLED(6, 1023, 1023 ); //белый 6</div><div> delay(50);</div><div> ledDriver2.writeLED(7, 1023, 1023 ); //белый 7</div><div> delay(50);</div><div> // ledDriver2.setLEDDimmed(8,1023); // ультрафиолет</div><div> </div><div> //ledDriver2.setLEDDimmed(10,1023); // вентилятор 2</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(11,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(12,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(13,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(14,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(15,1023); // не используется</div><div> //delay(100);</div><div> ledDriver1.writeLED(0, 1023, 10); // синий 1</div><div> delay(50);</div><div> ledDriver1.writeLED(1, 1023, 1018); // зеленый 1</div><div> delay(50);</div><div> ledDriver1.writeLED(2, 1023, 1022); // красный 1</div><div> delay(50);</div><div> ledDriver1.writeLED(3, 1023, 1018); // синий 2</div><div> delay(50);</div><div> ledDriver1.writeLED(4, 1023, 1018); // зеленый 2</div><div> delay(50);</div><div> ledDriver1.writeLED(5, 1023, 1022); // красный 2</div><div> delay(50);</div><div> ledDriver1.writeLED(6, 1023, 1018); // синий 3</div><div> delay(50);</div><div> ledDriver1.writeLED(7, 1023, 1018); // зеленый 3</div><div> delay(50);</div><div> ledDriver1.writeLED(8, 1023, 1022); // красный 3</div><div> delay(50);</div><div> ledDriver1.writeLED(9, 1023, 1018); // синий 4</div><div> delay(50);</div><div> ledDriver1.writeLED(10, 1023, 1018); // зеленый 4 -</div><div> delay(50);</div><div> ledDriver1.writeLED(11, 1023, 1022); // красный 4</div><div> //delay(500);</div><div> //ledDriver1.setLEDDimmed(12,1023);</div><div> //delay(50);</div><div> //ledDriver1.setLEDDimmed(13,1023);</div><div> //delay(50);</div><div> //ledDriver1.setLEDDimmed(14,1023);</div><div> //delay(50);</div><div> //ledDriver1.setLEDDimmed(15,1023);</div><div> //delay(100);</div><div> }</div><div> else</div><div> {</div><div> ledDriver2.writeLED(0, 1023, 10); //белый, центр</div><div> delay(50);</div><div> ledDriver2.setLEDDimmed(1, 1023); //белый 1 -</div><div> delay(50);</div><div> ledDriver2.setLEDDimmed(2, 1023); //белый 2</div><div> delay(50);</div><div> ledDriver2.setLEDDimmed(3, 1023); //белый 3 -</div><div> delay(50);</div><div> ledDriver2.setLEDDimmed(4, 1023); //белый 4</div><div> delay(50);</div><div> ledDriver2.setLEDDimmed(5, 1023); //белый 5</div><div> delay(50);</div><div> ledDriver2.setLEDDimmed(6, 1023); //белый 6</div><div> delay(50);</div><div> ledDriver2.setLEDDimmed(7, 1023); //белый 7</div><div> delay(50);</div><div> // ledDriver2.setLEDDimmed(8,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(9,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(10,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(11,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(12,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(13,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(14,1023); // не используется</div><div> //delay(50);</div><div> //ledDriver2.setLEDDimmed(15,1023); // не используется</div><div> //delay(100);</div><div> ledDriver1.writeLED(0, 1023, 10); // синий 1</div><div> delay(50);</div><div> ledDriver1.writeLED(1, 1023, 1018); // зеленый 1</div><div> delay(50);</div><div> ledDriver1.writeLED(2, 1023, 1022); // красный 1</div><div> delay(50);</div><div> ledDriver1.writeLED(3, 1023, 1018); // синий 2</div><div> delay(50);</div><div> ledDriver1.writeLED(4, 1023, 1018); // зеленый 2</div><div> delay(50);</div><div> ledDriver1.writeLED(5, 1023, 1022); // красный 2</div><div> delay(50);</div><div> ledDriver1.writeLED(6, 1023, 1018); // синий 3</div><div> delay(50);</div><div> ledDriver1.writeLED(7, 1023, 1018); // зеленый 3</div><div> delay(50);</div><div> ledDriver1.writeLED(8, 1023, 1022); // красный 3</div><div> delay(50);</div><div> ledDriver1.writeLED(9, 1023, 1018); // синий 4</div><div> delay(50);</div><div> ledDriver1.writeLED(10, 1023, 1018); // зеленый 4 -</div><div> delay(50);</div><div> ledDriver1.writeLED(11, 1023, 1022); // красный 4</div><div> delay(50);</div><div> ledDriver1.writeLED(12, 1023, 1022); // ультрафиолет</div><div> //delay(50);</div><div> //ledDriver1.setLEDDimmed(13,1023);</div><div> //delay(50);</div><div> //ledDriver1.setLEDDimmed(14,1023);</div><div> //delay(50);</div><div> //ledDriver1.setLEDDimmed(15,1023);</div><div> //delay(100);</div><div> }</div><div> }</div><div>}*/</div>У меня код в #36 отображается разметкой страницы. Ничего не понятно.
строка 40, сделал по совету "nevkon"
тип данных unsigned и все пошло в правильном направлении
#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); } } }*/unsigned int от 0 до 65535
А в сутках 24*3600 86400 секунд.
И еще, заполняйте так
Не нужно будет вычислять
Значит можно unsigned long, но как сделать, чтобы она от начала текущих суток считала?
Она так и считает от начала суток.
Вот так видимо нужно использовать
dec2bcd(tm.Hour) * 3600 + dec2bcd(tm.Minute) * 60 + dec2bcd(tm.Second)
не работает
dec2bcd - надо декларировать?
Победило проблему.
О, такой же, как и я )))
Спасибо местным гуру...
Знак инверсии нужен для инвертирования ШИМ-сигнала. Т.к. разные драйвера воспринимают в точности до наоборот. Какой то драйвер открыт при ШИМ=0, какой то открыт при ШИМ=4095. Чтоб не ломать скетч и есть инвертор, который ставит ШИМ сигнал зеркально.
sinnpriest
свои наработки не покажешь?
А я ... блин после PCA90685 на DLL350H оптопарами инвертирую.
И для ТС: я вот тут пытаюсь изложить для аквариумистов как повторить то, что я делаю... http://reefcentral.ru/forum/topic/20560-prostoj-kontroller/
Первый сектч в вышеприведенной теме работает на 100%, но там ШИМ- 8 бит.
Правда, последний скетч правно рассветает и правно закарывается только при условии, что время заката и рассвета меньше пяти минут. На десяти минутах какие то глюки...