ARDUINO для автоматизации аквариума

<< 567891011 131415 >>

Свой на Aqa.ru




693 77
Выкса
9 мес. назад
ARDUINO для автоматизации аквариума
Создал отдельную тему по вопросам использования простых и не дорогих плат ARDUINO для целей автоматизации аквариума.
Идея такая - довести это устройство до полнофункционального контроллера для аквариума, в итоге - с WEB сервером для управления по сети в т.ч. Интернет, и GSM модулем с отправкой SMS.
Начало обсуждения в теме про дозатор :
http://www.aqa.ru/fo...

Информация будет, в основном, в виде конкретных примеров.

Пример 1. Использоание плат Arduino UNO и Arduino NANO для управления по времени суток устройствами в 2-х каналах посредством релейного модуля.
Предполагается использование для создания 2-х канального дозатора, но и для включения света, например подойдет, и для многих других целей также.

Используется модуль часов реального времени, для точного планирования по времени суток, и релейный модуль. В данном примере используется 4-канальный, но 2 канала не используются...

Схема коммутации в случае использования платы UNO R3:


Схема коммутации в случае использования платы NANO:


Программа для среды программирования Arduino:
//***************************************************
// Скетч для управления релейным модулем, в котором *
// использовано два канала. Используется также RTC *
// Релейный модуль - с инверсной логикой на входе *
// Автор: ZORS *
// Версия 1. Дата 21.12.2013 02:40 *
//***************************************************
//----------ИМПОРТ БИБЛИОТЕК-------------------------
#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC

RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC

//----------Объявляем разные переменные------------
const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля
//----------Настройки времени и продолжительности включения реле

//----------ПЕРВЫЙ канал----------------------------
const long StartRelCn_1 = 25200; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток)
//в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200)
const long DurationCh_1 = 10; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах)

//----------ВТОРОЙ канал----------------------------
const long StartRelCn_2 = 37800; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток)
//В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800)
const long DurationCh_2 = 15; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах)

//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях)
void setup(){

pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД

digitalWrite(RelayChn1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой



Wire.begin(); //Инициируем I2C интерфейс
RTC.begin(); //Инициирум RTC модуль

// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале,
//для того, чтобы загрузить в RTC дату и время на момент компиляции программы
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки
//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!!

} // КОНЕЦ ИНИЦИАЛИЗАЦИИ

//--------------------------------------------------
void loop() // ПРОГРАММЫй безусловный ЦИКЛ
{
DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла

//----------Раздел обработки реле по времени ----
long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX
utime %= 86400; //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках,
//Это дает количество секунд с начала текущих суток

//------------КАНАЛ 1------------------------------
if ((utime >= StartRelCn_1) &&
(utime < (StartRelCn_1+DurationCh_1)))
//Если секунд с начала суток больше, чем задано для включения
//Но, одновременно и меньше, чем задано для включения + длительность
{
digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else //во всех остальных случаях
{
digitalWrite(RelayChn1,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}

//------------КАНАЛ 2 - все аналогично -----------
if ((utime >= StartRelCn_2) &&
(utime < (StartRelCn_2+DurationCh_2)))
{
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}

}//------------Конец ЦИКЛА-----------------------------


(Редактор текста на данном сайте - к сожалению, "ломает" красивое форматирование.

PS: Выложил этот скетч на файлообменник :
http://my-files.ru/h...

В данной программе реализован, довольно-таки простой подход, а простота - основа надежности.

Каждое из 2-х реле срабатывают один раз в сутки в указанное время, причем время указывается в количестве секунд от начала суток, и удерживается указанное количество времени в секундах.
Такой способ задания времени - несколько сложен для понимания, но за это - не нагружает программу и процессор лишним функционалом, который понадобится всего один раз.
Для определения времени наступления события начала включения и выключения реле - используется время в формате UNIX.

Такой подход хорош тем, что даже если включение или перезагрузка платы произойдет в промежутке времени включения, то реле включится в оставшееся время.
В случае с дозированием, это не много что дает, но в случае, если по аналогии будет сделано управление светом, то при подаче напряжения на плату, например, после пропадания напряжения питания, или после посадки напряжения, или др. аналогичных событий, включение и выключение реле произойдет корректно.

У комплектных минутных и секундных таймеров "с розеткой" - об этом можно только мечтать....не реализован такой функционал, и еще у них есть один минус. Реле в таких таймерах - не удерживаемое, а переключаемое, со всеми вытекающими последствиями....

Для программирования нескольких включений каждого реле в течение суток - естественно, потребуется несколько другой подход....спрашивайте когда кому-то потребуется, пока не хочу все усложнять...
В принципе, можно добавить константных переменных, содержащих время и длительность срабатывания, и соответственно добавить проверку на условия.
Если количество необходимых срабатываний каждого реле в сутках больше чем 2 - лучше оформить проверку условий в отдельной функции. Как, говорил человек, учивший меня программированию - "все, что ты делаешь в программе больше двух раз - оформляй отдельной процедурой, или функцией".

Главное ограничение этого подхода - включение и выключение реле - должно произойти в одних сутках. Если необходимо чтобы, реле включилось в одних сутках, а выключилось в других - необходимо разбить это задание на 2 задания, или применить другой метод проверки условий наступления событий включения и выключения.

Весь этот пример тестировался на "живом" железе :

Для наглядности отладки был еще подключен LCD дисплей 16 сим в 2 строках.
Схема итоговая была такая:

Обратите внимание, что при использовании I2C последовательного интерфейса - соединения значительно упрощаются. И LCD дисплей подключен транзитом через модуль RTC (часов реального времени). Никаких паяных соединений нет вообще....все скоммутировано - проводами с разъемами.
Скетч - естественно, несколько другой использовался с добавлением строк инициализации и использования LCD 16x2.

Плата использовалась типа такой:
http://www.ebay.com/...
цена примерно 350 руб.

Релейный модуль
http://www.ebay.com/...
цена примерно 150 руб.

Модуль часов реального времени:
http://www.ebay.com/...
Цена примерно 55 руб.

Для сокращения бюджета можно использовать плату проще:
http://www.ebay.com/...
Цена примерно 200 руб.

Если есть потребность подключить ЖК дисплейчик, то лучше брать ЖК дисплей (LCD) c I2C интерфейсом - это сильно упрощает коммутацию, и сокращает количество использованных портов на микроконтроллере.
Например такой можно использовать :
http://www.ebay.com/...
цена около 180 руб.

На ЖК можно выводить статусную информацию, информацию об ошибках, диагностическую информацию. Все это, конечно, можно и в последовательный порт компьютера выводить, но это не всегда удобно (скорее наоборот), поэтому я всегда использую какой-нибудь девайс для вывода информации.

Для использования I2C интерфейса - необходима библиотека Wire. Она есть в стандартном дистрибутиве среды программирования Arduino.
Для использования модуля RTC на микросхеме DS1307 нужна библиотека RTClib.
Если ее не будет в стандартном дистрибутиве, то ее можно взять в интернет. Например здесь :
http://arduino-info....

Необходимо, скачать, и разархивировать zip-файл в папку с понятным названием, например RTCLib. Затем эту папку поместить в папку, где среда Arduino хранит свои библиотеки. Если ставили среду программирования с настройками по умолчанию, то этой папкой будет :
C:\Program Files\Arduino\libraries
Сюда и помещайте папки с подключаемыми библиотеками. Если на этот момент, среда программирования была запущена - ее необходимо закрыть, и запустить заново. После этого библиотека будет доступна в меню Скетч/Импортировать библиотеку.

Микросхема RTC модуля DS1307, как правило использует адрес на шине I2C равный 0x68
поэтому, необходимо проверить в библиотечных файлах, библиотеки RTClib наличие строки типа этой:
#define DS1307_ADDRESS 0x68

Если будет использоваться LCD 16x2 с I2C интерфейсом, то - понадобиться библиотека LiquidCrystal_I2C. Можно скачать здесь :
http://dvrobot.ru/lc...
Как подключить к среде программирования Arduino - см. выше

ВАЖНО : при использовании I2C устройств - в скетче, библиотека Wire - должна быть объявлена первой, иначе - будут ошибки компиляции.

По этому примеру - все....

в следующем - присоединение термо-датчика DS18B20, и создание несложного терморегулятора.....


Изменено 24.12.13 автор Z0RS
2013-12-21 добавлено 21/12/2013 15:57:48#1907148

Свой на Aqa.ru




1149 188
Ростов-на-Дону
23 час. назад
Z0RS

Рад приветствовать! Давно не было слышно. Ваша тема уже выросла в целое направление ардуинистов-аквариумистов
2015-07-06 добавлено 06/07/2015 21:57:14#2105720

Свой на Aqa.ru




693 77
Выкса
9 мес. назад
Дядька-рыбомор
Рад приветствовать! Давно не было слышно. Ваша тема уже выросла в целое направление ардуинистов-аквариумистов


Да. Спасибо Вам, что поддерживаете данную тему.
Мне, к сожаленью, не легко на это находить время. Изменилось многое в жизни, работа, место жительства и пр. обстоятельства. Даже банками жена занимается...еще тот аквариумист получился...
Извиниюсь за "не в тему"....

PS: Главного то не сказал...
Перечитал сейчас тему, и вообщем-то обнаружил, что в ней есть практически все, что нужно для построения несложного и довольно-таки надежного аквариумного контроллера, по среднестатистическим требованиям, и за не большие деньги.
Значит не зря...

Изменено 6.7.15 автор Z0RS
2015-07-06 добавлено 06/07/2015 22:19:00#2105725

Завсегдатай




306 106
Москва
23 час. назад
Z0RS
спасибо за код , завтра попробую-) но коль все здесь,ещё немного понаглею .
Но как теперь написать , что бы он озлаждал допустим на 1 градус до 25 и отключался . Ведь в данном случае он будет дёргаться он оф .
Или может проще иф темпер больше 26 , работать 20 мин . затем проверить значение температуры?
2015-07-06 добавлено 06/07/2015 22:27:39#2105730

Свой на Aqa.ru




1149 188
Ростов-на-Дону
23 час. назад
Bloody

К примеру, вот кусочек моего кода (там у меня еще одним условием было время, чтобы кулер не жужжал по ночам, но я его убрал, чтоб вас не путать).
if(temp > (t + tGist))
{ digitalWrite(TermRel,HIGH); }
else if (temp < (t1- tGist))
{ digitalWrite(TermRel,LOW); }
Понятно, что значения t ( у меня 27 гр) и гистерезиса tGist (у меня 0,25 гр), вывода TermRel заданы заранее. Т.е. при достижении 27,25 гр кулер включается, а при опускании до 26,75 гр - выключается. Т.е. вегда есть люфт в 0,5 градусов, и релешка не щелкает постоянно. На этой основе можно постоить вообще кучу всего, типа датчика движения, пардон, в сортире, и т.д.
2015-07-06 добавлено 06/07/2015 22:40:21#2105738

Завсегдатай




306 106
Москва
23 час. назад
Дядька-рыбомор

Всё работает ,всё теперь понятно . Но теперь хочется большего !!!
Хочется рассветзакат. Да да ,для начала бутафорная лента на крии 5050 диодах .
Всё это надо реализовывать на таких димирующих платах?
http://ru.aliexpress...
или есть на 1 канал? не могу найти .
2015-07-12 добавлено 12/07/2015 13:49:36#2107510

Постоянный посетитель




279 60
Ижевск
1 час. назад
Для светодиодной ленты не нужно никаких диммирующих плат.
Я для функции рассвет-закат использую одну полоску Warm White ленты (хватает), наклеенную спереди под крышкой аквариума. Нашёл место. 12 В управляю посредством ШИМ через полевой транзистор IRL520. После выключения основного света лента освещает аквариум до 22.00, потом закат на пол часа. Рассвет только в темные месяцы года. Летом рассвет натуральный. Ночью мягкая подсветка на 3, чтобы рыбкам не страшно было.

Изменено 13.7.15 автор Mr.Sim

Изменено 13.7.15 автор Mr.Sim
2015-07-13 добавлено 13/07/2015 19:08:18#2107816

Постоянный посетитель




279 60
Ижевск
1 час. назад
Bloody

Может Вам пригодиться как сделано у меня. Июнь был жарким, но в аквариуме вода выше 26 градусов не поднималась.
Кулер состоит из 4-х обычных компьютерных 80-ти мм. вентиляторов. Управление через ШИМ на том же IRL520.
Ниже приведена функция охлаждения. Кратко: f_temp - показания температурного датчика, f_tAqua - нужная температура в аквариуме. Остальные переменные, думаю, интуитивно понятны.
Логика такая:
void WaterCooling() {
static int fansValue = 0;
static boolean b_hotTrigger = 0;
boolean b_waterHot = f_temp > (f_tAqua + f_hotGist);
boolean b_waterNorm = !b_waterHot;
boolean b_waterHotToNorm = f_temp <= (f_tAqua + f_aquaGist);
boolean b_light_1 = digitalRead(pinMainLight) == ON;
boolean b_light_2 = digitalRead(pinAuxLight) == ON;
boolean b_coolingOn_1 = b_light_1 && !b_light_2;
boolean b_coolingOn_2 = b_light_1 && b_light_2;
boolean b_coolingOff = !(b_coolingOn_1 || b_coolingOn_2);

if (b_waterHot) { //Максимальное вращение вентиляторов
fansValue = 255; // при перегреве воды.
b_hotTrigger = 1;
}
if (b_hotTrigger && !b_waterHotToNorm) { //Охлаждаем на максимальных оборотах до температуры f_tAqua + f_aquaGist
fansValue = 255;
}
else if (b_waterHotToNorm && b_hotTrigger) {
b_hotTrigger = 0;
}
if (b_waterNorm && b_coolingOn_1 && !b_hotTrigger) { //Охлаждение ламп при норм. темп-ре воды.
fansValue = 80;
}
else if (b_waterNorm && b_coolingOn_2 && !b_hotTrigger) { //Включение дополнительного охлаждения при включении всех ламп.
fansValue = 120;
}
else if (b_waterNorm && b_coolingOff && !b_hotTrigger) {//Выключение охлаждения на ночь, если темп-ра в пределах нормы
fansValue = 0;
}
analogWrite(pinFans, fansValue);
}

Изменено 13.7.15 автор Mr.Sim

Изменено 14.7.15 автор Mr.Sim
2015-07-13 добавлено 13/07/2015 19:24:24#2107819

Новичок




13
Пермь
1 г. назад
2 DS18B20 на 2х каналах arduino
Добрый день , купил ардуино нано 3 дисплей олед, 8 канальное реле, часовой модуль, столкнулся с проблемой. Нашел пример как подключается 1 термодатчик и в зависимости от температуры включает или выключает вентилятор, не выходит переделать его в 2 датчика и 2 канала.
т.е. допустим термодатчики подключаю к цифровым входам 3 и 4
int TSensorPin1 = 3; //Определяем порт шины OneWire (IC) для температурного датчика DS18B20 1
int TSensorPin2 = 4; //Определяем порт шины OneWire (IC) для температурного датчика DS18B20 2
OneWire ds1(TSensorPin1); //Создаем соответсвующий объект 1 термодатчик
OneWire ds2(TSensorPin2); //Создаем соответсвующий объект 2 термодатчик
далее
const int RelayChn7 = 11; //Используем цифровой ПОРТ 8 для 7 канала релейного модуля Для включения охлаждения
const int RelayChn8 = 12; //Используем цифровой ПОРТ 8 для 8 канала релейного модуля Для включения охлаждения
---------------------
//----------Седьмой КАНАЛ----------------------------
float t0 = 26.5; // правильно ли задаю переменную t0 ?
float tGistrsis = 0.7; //Уставка гистерезиса - т.е отклонения от темп-ры уставки
//т.е. в данном случае 0,7 = плюс минус 0,35 градуса
//----------Восьмой КАНАЛ----------------------------
float t1 = 26.5; // правильно ли задаю переменную t1 ?
float tGistrsis = 0.7; //Уставка гистерезиса - т.е отклонения от темп-ры уставки
//т.е. в данном случае 0,7 = плюс минус 0,35 градуса
после

//------------КАНАЛ 7 Контроль температуры -------
if (temp < t0-tGistrsis/2)
{
digitalWrite(RelayChn7,LOW); //Устанавливаем на 7 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
lcd.setCursor(13, 1);
lcd.print("1");
}
else if (temp > t0+tGistrsis/2)
{
digitalWrite(RelayChn7,HIGH); //Устанавливаем на 7 входе релейного модуля ВЫСОКИЙ уровень - реле выключается
lcd.setCursor(13, 1);
lcd.print("0");
}

//------------КАНАЛ 8 Контроль температуры -------
if (temp < t1-tGistrsis/2)
{
digitalWrite(RelayChn8,LOW); //Устанавливаем на 8 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
lcd.setCursor(13, 1);
lcd.print("1");
}
else if (temp > t1+tGistrsis/2)
{
digitalWrite(RelayChn8,HIGH); //Устанавливаем на 8 входе релейного модуля ВЫСОКИЙ уровень - реле выключается
lcd.setCursor(13, 1);
lcd.print("0");
}
и даже если все что выше было верным то ниже уже не могу разобраться
//-------------Объявления и реализация функций---------
float getTemp(){ //функция чтения значения температуры с датчика DS18B20 по шине OneWire
byte data[12]; // Что это за адреса?
byte addr[8]; // Что это за адреса?

if ( !ds.search(addr)) { // тут тоже вроде понятно во втором случае все ds заменить на ds1
//no more sensors on chain, reset search
lcd.setCursor(0, 0);
lcd.print("NO more addrss!");

ds.reset_search();
return -1001;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
lcd.setCursor(0, 0);
lcd.print("CRC is not valid!");

return -1002;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
lcd.setCursor(0, 0);
lcd.print("NOT recognizd!");

return -1003;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1);

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE);


for (int i = 0; i < 9; i++) {
data[i] = ds.read();
}

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float TRead = ((MSB<<8) | LSB);
float Temperature = TRead / 16;

return Temperature;
}
2015-07-27 добавлено 27/07/2015 10:01:40#2111667

Новичок




12
Ukraine
1 г. назад
Код рассвета/заката
Добрый день. Оч. хочется посмотреть код рассвет/закат, который выкладывал Z0RS на второй-третей странице темы. К сожалению ссылки уже не работают. Если есть возможность, обновите ссылки пожалуйста. (SunRiseSunSet_2.rar удален из-за сбоя)

Изменено 29.9.15 автор Alex_T
2015-09-29 добавлено 29/09/2015 10:03:44#2132031

Новичок




1
Ukraine
1 г. назад
Доброго времени суток.
Очень замечательная тема, автору респект.
Волей случая , вместе с аквариумом досталась коробка с шилдами ардуино. а именно, Uno , модуль lcd с кнопками, часы, релюшки, датчик температуры.
Из темы всё понятно, что куда подключать, что писать, как проверить.
Только проблемма в том, что мой дисплей дисплей занимает все разьемы на Uno.
Подскажите, как происходит расключение всей остальной перефирии в таком случае?
Как то я далёк от этого((
Шилд LCD вот такой ВОЗМОЖНО СПАМ. Если вы хотите открыть ссылку, скопируйте ее в адресную строку самостоятельно

Спасибо.

Изменено 10.11.15 автор Aleksandr_N
2015-11-10 добавлено 10/11/2015 12:45:45#2147954

Постоянный посетитель




279 60
Ижевск
1 час. назад
Aleksandr_N
мой дисплей дисплей занимает все разьемы на Uno.

Поменять дисплей на такой (кнопки реализовать отдельно), либо купить такой порт-адаптер. Дисплей будет подключён по интерфейсу I2C, который, помимо двух проводов для питания, работает всего по двум проводам.
2015-11-10 добавлено 10/11/2015 13:56:37#2147987

Новичок




18 1
Борисоглебск
21 час. назад
Доброе время суток. Имеется Лед светильник, который питается от двух разных НИПТ. Т.е. половина СД питаются от НИПТ-64350, а вторая половина от НИПТ-125300/350. Хочу сделать контроллер закат-рассвет. Вот такие компаненты я подобрал: Arduino Nano и модуль часов и Реле.
Правильно ли я подобрал компоненты?
Или же мне придется менять источник питания?

Изменено 6.12.15 автор Sk13dust
2015-12-07 добавлено 07/12/2015 00:05:05#2158093

Посетитель




151 23
Москва
8 дн. назад
Sk13dust
Если позволите, часы лучше брать на DS3231, не будет проблем с точностью хода, и релейный блок достаточно на два реле (если только для света). Вы же ступенчатое управление светом хотите, правильно?

Изменено 7.12.15 автор fogary
2015-12-07 добавлено 07/12/2015 10:44:49#2158186

Новичок




18 1
Борисоглебск
21 час. назад
fogary
да, хочется рассвет- закат. Правильно-ли я понял что мои НИПТ подключаются к реле. Простите если задаю глупые вопросы, но честное слово, я читал тему и пытался понять, что к чему. Просто у автора на блок схеме дальше реле нет нечего.

Изменено 7.12.15 автор Sk13dust
2015-12-07 добавлено 07/12/2015 11:08:31#2158198

Посетитель




151 23
Москва
8 дн. назад
Sk13dust
Да, НИПТ подключаете через реле.

Вобщем-то, для Вашего случая достаточно использовать два таймера (для разетки). Подключаете НИПТ каждый к своему таймеру. Программируете один таймер на весь световой день. Второй так что бы включался позже, а выключался раньше на несколько часов.
2015-12-07 добавлено 07/12/2015 11:39:49#2158212

Новичок




18 1
Борисоглебск
21 час. назад
fogary

Это все понятно. Но мне нужно диммировать оба канала по средствам ардуино.

Изменено 7.12.15 автор Daxel
2015-12-07 добавлено 07/12/2015 11:54:32#2158223

Посетитель




151 23
Москва
8 дн. назад
Sk13dust
Вроде у Ваших НИПТ нет функции диммирования.
Если хотите использовать диммирование, то зачем тогда блок реле?
2015-12-07 добавлено 07/12/2015 12:54:11#2158240

Новичок




18 1
Борисоглебск
21 час. назад
fogary
Если хотите использовать диммирование, то зачем тогда блок реле?
А какой блок использовать? чтобы не убирать НИПТ? я понимаю, что нужно чтото вроде "реостата"))) под управлением ардуино.
2015-12-07 добавлено 07/12/2015 13:29:56#2158249

Завсегдатай




333 45
Подольск
2 дн. назад
Sk13dust

С неуправляемыми драйверами не получится регулировать яркость. Это не светодиодная лента с БП, где можно тупо в разрез воткнуть ШИМ-ключ.
Тут при отрубании нагрузки драйвер задерет напряжение на максимум и при подключении будет удар по диодам, пока не стабилизирует ток. И так много раз в секунду. Кому-то из них от такой работы может поплохеть.
Управлять надо самим драйвером.
2015-12-07 добавлено 07/12/2015 13:47:20#2158252

Новичок




18 1
Борисоглебск
21 час. назад
dkozyrev
Спасибо, понял.
2015-12-07 добавлено 07/12/2015 13:59:52#2158260

Новичок




1
Russian Federation
8 мес. назад
Здравствуйте!!!
Огромная просьба, у кого есть скетч ZORS-а (многопрограмный многокомандный таймер) скиньте пожалуйста на почту (gfi_gs21@mail.ru) или залейте на файлообменник.
Заранее спасибо.
2016-02-11 добавлено 11/02/2016 12:45:41#2184028

Новичок




5 1
Russian Federation
5 мес. назад
Z0RS
Для программирования нескольких включений каждого реле в течение суток - естественно, потребуется несколько другой подход....спрашивайте когда кому-то потребуется, пока не хочу все усложнять...

Здравствуйте господа хорошие. Возникла потребность в четвертом канале с включением реле два раза в течении дня. Освещение аквариума с 9-13 и с15-21 часа

Изменено 26.2.16 автор кикстартер
2016-02-26 добавлено 26/02/2016 19:09:40#2191869

Посетитель




119 3
Russian Federation
6 час. назад
Есть такой вариант:
const long OnRelPROTOKA1 = 18*hr+1800;
const long OnRelPROTOKA2 = 19*hr;
const long OnRelPROTOKA3 = 19*hr+1800;
const long OnRelPROTOKA4 = 20*hr;
const long OnRelPROTOKA5 = 20*hr+1800;
const long OnRelPROTOKA6 = 21*hr;
const long OnRelPROTOKA7 = 21*hr+1800;
const long DurationPROTOKA = 240;

Это в начале, пр определении переменных.

Далее в void loop()
if ((utime >= OnRelPROTOKA1) && (utime < (OnRelPROTOKA1+DurationPROTOKA))
or (utime >= OnRelPROTOKA2) && (utime < (OnRelPROTOKA2+DurationPROTOKA))
or (utime >= OnRelPROTOKA3) && (utime < (OnRelPROTOKA3+DurationPROTOKA))
or (utime >= OnRelPROTOKA4) && (utime < (OnRelPROTOKA4+DurationPROTOKA))
or (utime >= OnRelPROTOKA5) && (utime < (OnRelPROTOKA5+DurationPROTOKA))
or (utime >= OnRelPROTOKA6) && (utime < (OnRelPROTOKA6+DurationPROTOKA))
or (utime >= OnRelPROTOKA7) && (utime < (OnRelPROTOKA7+DurationPROTOKA)))
{ digitalWrite(RelPROTOKA,LOW);} else {digitalWrite(RelPROTOKA,HIGH);}



Изменено 27.2.16 автор Zebraj
2016-02-27 добавлено 27/02/2016 08:08:38#2192088

Посетитель




119 3
Russian Federation
6 час. назад
Еще есть вариант, через массив:
long OnRelPROTOKA[7]={18*hr+1800,19*hr,19*hr+1800,20*hr,20*hr+1800,21*hr,21*hr+1800};
void loop(){
boolean RelProtokaStatus = false;
for (int i=0;i<=6;i++){
if ((utime >= OnRelPROTOKA[i]) && (utime < (OnRelPROTOKA[i]+DurationPROTOKA)) && (!RelProtokaStatus)){ // условия проверяются только если ранее в цикле не было "успешной" проверки.
RelProtokaStatus = true;}
}
digitalWrite(RelPROTOKA,!RelProtokaStatus); // именно !RelProtokaStatus, включенному реле соответствует LOW.
}
Криво вставляется код на форум

Изменено 27.2.16 автор Zebraj
2016-02-27 добавлено 27/02/2016 08:13:20#2192091

Новичок




5 1
Russian Federation
5 мес. назад
БОЛЬШОЕ СПАСИБО за отклики но в программировании я "0", но зато очень хочется сотворить контроллер своими руками (руки чешутся ). Во втором варианте скетча уважаемый ZORS запустил третий канал под регулировку температуры воды. А вот четвертый канал с с двойным включения реле в течении суток для этого скетча с коментариями, вот что мне нужно!
2016-02-27 добавлено 27/02/2016 15:56:41#2192254

<< 567891011 131415 >> Создать новую темуБыстрый ответ