Автор Тема: Создание периодики на Arduino  (Прочитано 28851 раз)

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #120 : 27 Июль 2016, 01:25:54 »
блок клапанов необходимо выносить отдельно, но уж никак не устанаваливать рядом с управляющей электроникой.
Совершенно спереди! Малейшая протечка и загубите всю электронику и перцы тоже (быстро купить новую ардуину вряд ли получится). Не стОит этот риск любого фэншуя.

Оффлайн kido

Re: Создание периодики на Arduino
« Ответ #121 : 27 Июль 2016, 01:29:13 »
"Предлагаю дружить домами!"(с)  :drinks:
Пусть AlexYalta на практике проверит различные варинты и отпишется, успевают пр жаре растения напиться или нет.
Тогда все точки над "i" расставятся сами собой.


Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #122 : 27 Июль 2016, 01:39:57 »
"Предлагаю дружить домами!"(с)  :drinks:
Пусть AlexYalta на практике проверит различные варинты и отпишется, успевают пр жаре растения напиться или нет.
Тогда все точки над "i" расставятся сами собой.
Да, единственно правильный вариант.
Я бы не только на жаре, но в обычных режимах (при разных температурах) замерял бы время между моментом полива и моментом, когда растение начнет опускать листья.
Тогда уже можно будет более предметно говорить о режимах. Не знаю, будет ли AlexYalta это делать, но я бы сделал обязательно.
Не удивлюсь, если окажется, что ночью при температуре 18-20 и ниже можно вообще всю ночь не затапливать.
 :drinks:

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #123 : 27 Июль 2016, 12:11:12 »
По времени, все отлично! Но как я понимаю, помимо коэффициента времени, будет учтен и коэффициент с потенциометров?
Этот базовый интервал (как в примере 2 часа) мы будет выставлять как раз с помощью потенциометров.

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

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


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

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #124 : 27 Июль 2016, 12:13:10 »
Я все таки дизайнер, 
а я разработчик систем АСУТП :)

мне чтоб красиво было еще надо. Одно коробка с двумя отделениями блок управления- силовой и второй герметичный с клапанами :)
и вот это уж точно не по феншую!
если делать правильно, по феншую, ;) то блок клапанов необходимо выносить отдельно, но уж никак не устанаваливать рядом с управляющей электроникой.

пока еще не решил как все организовать, но то что будет зашита электроники от протечек это 100%. возможно это будет два независимых блока оледененных в одно целое...

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #125 : 27 Июль 2016, 12:15:46 »
"Предлагаю дружить домами!"(с)  :drinks:
Пусть AlexYalta на практике проверит различные варинты и отпишется, успевают пр жаре растения напиться или нет.
Тогда все точки над "i" расставятся сами собой.
Да, единственно правильный вариант.
Я бы не только на жаре, но в обычных режимах (при разных температурах) замерял бы время между моментом полива и моментом, когда растение начнет опускать листья.
Тогда уже можно будет более предметно говорить о режимах. Не знаю, будет ли AlexYalta это делать, но я бы сделал обязательно.
Не удивлюсь, если окажется, что ночью при температуре 18-20 и ниже можно вообще всю ночь не затапливать.
 :drinks:


буду обязательно!  инфа будет полезна не только мне но и другим кто захочет делать переодику. 

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #126 : 27 Июль 2016, 17:59:27 »
Ну вот, пока окончательный вариант, дальнейшие изменения уже после запуска системы. В начале перечислил нерешенные проблемы, чтобы не забыть (запуск видимо будет не скоро?), и решить в случае, если будет необходимость (а может и не будет).
1. По продолжительности затопления нужно будет Вам погуглить форумы, нужно ли, на какой период безопасно и т.д. Затем уже отрегулируем
2. Программа написана для клапанов НО, у Вас НЗ, в случае необходимости нужно будет переделать, если инверсия на реле по какой-то причине не устроит.
3. В программе не обыграно закрытие клапанов в период между затоплениями. Нужно ли это делать станет ясно уже после знакомства с их работой, сколько потребляют, насколько греются.
4. Программа завязана на внутренний таймер, емкость которого 50 суток. По достижении верхнего предела он обнуляется, и логика программы нарушается. Такая себе "проблема 2000" локального масштаба. Пока не делал, т.к. есть несколько вариантов, пока не решил, какой лучше (ввести доп. переменные, обнулять последнее время вместе с обнулением системного таймера, программно перезапускать ардуину в начале каждого дня, а может и вовсе привязаться к внешним часам), в общем после запуска прояснится. Пока просто перезапускать ардуину раз в 50 дней.
/*
 1. Не установлен коэффициент для продолжительности затопления в зависимости от времени суток
 2. Инверсия клапанов
 3. Не обыграно нормальное положение клапанов - закрытое.
 4. Проблема обнуления таймера.
*/

//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
float z_time = 0;
tmElements_t tm;
int current_hour = 0;                         //храним текущий час
float day_koef = 1;                           //коэффициент времени дня

//--------------Интерфейс---------------------
boolean sliv_flag = 0;                        // Флаг режима слива
float y_last_time = 0;                        //Для засечки таймера дребезга кнопки

int led_green = 1;                            // Главная "зеленая" переменная, частота затоплений
boolean led_green_flag = 0;                  
int led_green_current = 0;
float led_green_last_time = 0;

int led_blue = 1;                             //Продолжительность затопления
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

[color=red]int led_freq = 200; [/color]                          //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
[color=red]int led_pause = 2000;[/color]                         //Пауза между сериями миганий в мс

//----------------Помпа и клапаны-------------------------
[color=red]float base_dive_freq = 2000;[/color]                  //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную
float dive_freq = 0;                          //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;                //Засечка. Служебная

[color=red]float dive_const = 1000;[/color]                       //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
[color=red]float pereliv_const = 1000;[/color]                    //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                        
[color=red]float base_dive_time = 200;[/color]                     //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                            // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;                  //Засечка. Служебная

float dive_time_down = 0;                       // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;             //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                           //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                    //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

//****************************************************************************************                    
//****************************************************************************************
void setup() {
  Serial.begin(9600);
  pinMode(4, INPUT);                        //Пин для кнопки
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(A3, INPUT);                       //пин для потенциометра
  pinMode(A2, INPUT);                       //пин для потенциометра
  pinMode(8, OUTPUT);                       //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      //пин для верхнего клапана
}
//*****************************************************************************************
//*****************************************************************************************
void loop() {

//-----------Часы и Serial-------------------------
  if((millis() - z_time) > 1000){
    RTC.read(tm);
    //String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
    Serial.println ("Hour "+ String(tm.Second)+"   Koeff - " + String(day_koef));
    z_time = millis();

    current_hour = tm.Hour;
    //current_hour = tm.Second;                 //временная привязка к секундам для проверки правильности коэфф.
   [color=red] if (current_hour == 8 || current_hour == 9 || current_hour == 20 || current_hour == 21) day_koef = 1;           //коэфф. для часов дня
    if (current_hour == 10 || current_hour == 11 || current_hour == 18 || current_hour == 19) day_koef = 0.75;
    if (current_hour >=12 && current_hour <=17) day_koef = 0.5;
    if ((current_hour >=0 && current_hour <=7) || current_hour == 22 || current_hour == 23) day_koef = 2; [/color]
  }
  
//------------Вычисление времени работы------------------------
if (!sliv_flag){        
  dive_freq = base_dive_freq * led_green * day_koef;
  dive_time = dive_const + base_dive_time * led_blue;  
  dive_time_down = pereliv_const + base_dive_time * led_blue;    
                          
 
//------------Работа помпы и клапанов------------------------------
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                     //включаем помпу
    digitalWrite(10, 1);                                    //закрываем клапан
    dive_flag = 1;                                          //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                     //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                         //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                         //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                          //выключаем помпу
    dive_flag = 0;                                               //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                  //открываем верхний клапан
    clapan_up_flag = 0;                                                   //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                 //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){  //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                            //Открываем нижний клапан
    clapan_down_flag = 0;                                                          //выставляем флаг, что нижний клапан открыт
    }
}

//-------------------Слив----------------------------
if (sliv_flag){                                                                    
  digitalWrite(8, 0);                                                              
  digitalWrite(10, 0);
  digitalWrite(9, 0);  
  digitalWrite(6, 1);
  digitalWrite(7, 1);
  led_green_current = 0;
  led_blue_current = 0;
  led_green_flag = 0;
  led_blue_flag = 0;
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

//===================Интерфейс===================================

//-----------Чтение потенциометра-------------------------------
   led_green = (int)(analogRead(A3)/100) + 1;  
   led_blue = (int)(analogRead(A2)/100) + 1;  
 
//-------------Обработка кнопки и привязка-----------------------------
if((millis()-y_last_time)>200){                    
  if (digitalRead(4)){sliv_flag = 1- sliv_flag;}
  y_last_time = millis();
  }
                                                        
//-------------------Мигание диодов-------------------------
  if (!sliv_flag &&(millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(6, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!sliv_flag &&(millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(7, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;
      }
    }
}

[\code]
« Последнее редактирование: 27 Июль 2016, 23:59:58 от Ann »

Оффлайн kido

Re: Создание периодики на Arduino
« Ответ #127 : 27 Июль 2016, 23:24:41 »
4. Программа завязана на внутренний таймер, емкость которого 50 суток. По достижении верхнего предела он обнуляется, и логика программы нарушается. Такая себе "проблема 2000" локального масштаба.

Ann, а если попробовать так:
if(mills()>=0 && mills()<10){
dive_freq_last_time = dive_freq_last_time + interval - MAX_NUMBER;

где MAX_NUMBER - максимальное значение внутреннего счетчика миллисекунд
возможно придется вилочку подкорректировать таким образом, чтобы в нее программа гарантированно попала только один(!) раз
просто я не знаю быстродействия программы

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #128 : 27 Июль 2016, 23:59:00 »
4. Программа завязана на внутренний таймер, емкость которого 50 суток. По достижении верхнего предела он обнуляется, и логика программы нарушается. Такая себе "проблема 2000" локального масштаба.

Ann, а если попробовать так:
if(mills()>=0 && mills()<10){
dive_freq_last_time = dive_freq_last_time + interval - MAX_NUMBER;

где MAX_NUMBER - максимальное значение внутреннего счетчика миллисекунд
возможно придется вилочку подкорректировать таким образом, чтобы в нее программа гарантированно попала только один(!) раз
просто я не знаю быстродействия программы


Ну, предположим, что таймер у нас обнуляется при 1000, последняя засечка была сделана при 990, интервал 100. Тогда следующее срабатывание (включение помпы) должно произойти при 90 (после обнуления)
Ваша строка присвоит
dive_freq_last_time = 990 + 100 - 1000
Получится 90. dive_freq_last_time станет равно 90.
Но следующее срабатывание произойдет, когда текущее будет на 100 больше, чем dive_freq_last_time, т.е. при 190.
Таким образом произойдет пропуск одного цикла.

Отследить переполнение таймера можно строчкой
if((millis()-dive_freq_last_time) < 0){

А дальше можно тупо присвоить dive_freq_last_time = 0. Но здесь тоже один цикл будет большего интервала, чем нужно, примерно на 1-99% (в зависимости куда попала прошлая засечка).
Либо выставить флаг, что произошло обнуление счетчика, в этот момент один раз использовать Вашу же строчку
dive_freq_last_time = dive_freq_last_time + interval - MAX_NUMBER;
Но interval на одну итерацию приравнять нулю, затем убрать флаг, и вернуть interval его рабочее значение.

Да, честно говоря, поленился. Особой необходимости как-бы и нет, а вариантов несколько, а какой лучше, непонятно.
Я больше склоняюсь с ресету Ардуину каждые сутки программным путем. Дело в том, что эти коэфф. будут не совсем стабильно работать. Интервалы большие между затоплениями, коэффициенты будут меняться чаще, чем пройдет пауза между одним затоплением, в общем небольшой разброд и шатай получится. Думаю может просто жестко привязать начало суточного цикла к 8 утра например. Более предсказуемее работа получится. Тогда и проблема обнуления сама собой отпадет.
Но это все потом, пускай уже запустит сначала, а там в процессе будет виднее.


P.S. Опа! Этот форум тег [ code ] понимает ?! А я тут простыни выкладываю! Спасибо за подсказку.
« Последнее редактирование: 28 Июль 2016, 00:02:38 от Ann »

Оффлайн kido

Re: Создание периодики на Arduino
« Ответ #129 : 28 Июль 2016, 01:00:35 »
тогда так: dive_freq_last_time = dive_freq_last_time - MAX_NUMBER;
значение получится отрицательное, но при if((millis() - dive_freq_last_time) > dive_freq) { должно сработать без пропуска цикла

Цитировать
Я больше склоняюсь с ресету Ардуину каждые сутки программным путем
а я что-то пробежался глазами по доке, но программного ресета не нашел :(
может просто плохо смотрел...


p.s. а вот и тэг! ;)
« Последнее редактирование: 28 Июль 2016, 01:05:07 от kido »

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #130 : 28 Июль 2016, 01:12:02 »
тогда так: dive_freq_last_time = dive_freq_last_time - MAX_NUMBER;
значение получится отрицательное, но при if((millis() - dive_freq_last_time) > dive_freq) { должно сработать без пропуска цикла

Цитировать
Я больше склоняюсь с ресету Ардуину каждые сутки программным путем
а я что-то пробежался глазами по доке, но программного ресета не нашел :(
может просто плохо смотрел...


p.s. а вот и тэг! ;)
:D Блин, действительно! Как обычно, в голову лезут куча всевозможных решений, кроме самого элементарного :)

Там есть пин на ней под названием RESET, при подаче на него +5V, происходит он же. Вроде так, сам не пробовал.

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #131 : 30 Июль 2016, 12:53:20 »
Прошу прощения что пропал на пару дней, не до гидропоники было :(

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

Попозже попробую залить последнею версию скетча от Ann....

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #132 : 30 Июль 2016, 23:18:16 »
Так вроде все собрал, поправил чутка код и вроде все заработало.

только есть два вопроса:

1 клапана во время интервала между затоплениями, постоянно "открыты", это так и должно быть?
2 часы пока как я понял не пашут, не выставлены интервалы?

скетч после моих манипуляций:
/*
 1. Не установлен коэффициент для продолжительности затопления в зависимости от времени суток
 2. Инверсия клапанов
 3. Не обыграно нормальное положение клапанов - закрытое.
 4. Проблема обнуления таймера.
*/

//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
float z_time = 0;
tmElements_t tm;
int current_hour = 0;                         //храним текущий час
float day_koef = 1;                           //коэффициент времени дня

//--------------Интерфейс---------------------
boolean sliv_flag = 0;                        // Флаг режима слива
float y_last_time = 0;                        //Для засечки таймера дребезга кнопки

int led_green = 1;                            // Главная "зеленая" переменная, частота затоплений
boolean led_green_flag = 0;                 
int led_green_current = 0;
float led_green_last_time = 0;

int led_blue = 1;                             //Продолжительность затопления
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

int led_freq = 200;                         //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
int led_pause = 2000;                         //Пауза между сериями миганий в мс

//----------------Помпа и клапаны-------------------------
float base_dive_freq = 15000;           //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную
float dive_freq = 0;                          //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;                //Засечка. Служебная

float dive_const = 5000;                     //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 5000;                  //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                         
float base_dive_time = 3000;                   //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                            // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;                  //Засечка. Служебная

float dive_time_down = 0;                       // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;             //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                           //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                    //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

//****************************************************************************************                     
//****************************************************************************************
void setup() {
  Serial.begin(9600);
  pinMode(4, INPUT);                        //Пин для кнопки
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(A3, INPUT);                       //пин для потенциометра
  pinMode(A2, INPUT);                       //пин для потенциометра
 
 
 
  pinMode(8, OUTPUT);                         //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа       
  pinMode(10, OUTPUT);                       //пин верхнего клапана
  digitalWrite(9,HIGH);

}
//*****************************************************************************************
//*****************************************************************************************
void loop() {
 


//-----------Часы и Serial-------------------------
  if((millis() - z_time) > 1000){
    RTC.read(tm);
    //String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
    Serial.println ("Hour "+ String(tm.Second)+"   Koeff - " + String(day_koef));
    z_time = millis();

    current_hour = tm.Hour;
    //current_hour = tm.Second;                 //временная привязка к секундам для проверки правильности коэфф.
    if (current_hour == 8 || current_hour == 9 || current_hour == 20 || current_hour == 21) day_koef = 1;           //коэфф. для часов дня
    if (current_hour == 10 || current_hour == 11 || current_hour == 18 || current_hour == 19) day_koef = 0.75;
    if (current_hour >=12 && current_hour <=17) day_koef = 0.5;
    if ((current_hour >=0 && current_hour <=7) || current_hour == 22 || current_hour == 23) day_koef = 2;
  }
 
//------------Вычисление времени работы------------------------
if (!sliv_flag){         
  dive_freq = base_dive_freq * led_green * day_koef;
  dive_time = dive_const + base_dive_time * led_blue;   
  dive_time_down = pereliv_const + base_dive_time * led_blue;     
                         
 
//------------Работа помпы и клапанов------------------------------
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 0);                                     //включаем помпу
    digitalWrite(10, 1);                                    //закрываем клапан
    dive_flag = 1;                                          //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                     //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                         //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                         //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(9, 1);                                          //выключаем помпу
    dive_flag = 0;                                               //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                  //открываем верхний клапан
    clapan_up_flag = 0;                                                   //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                 //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){  //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                            //Открываем нижний клапан
    clapan_down_flag = 0;                                                          //выставляем флаг, что нижний клапан открыт
    }
}

//-------------------Слив----------------------------
if (sliv_flag){                                                                     
  digitalWrite(8, 0);                                                               
  digitalWrite(10, 0);
  digitalWrite(9, 1); 
  digitalWrite(5, 1);
  digitalWrite(6, 1);
  led_green_current = 0;
  led_blue_current = 0;
  led_green_flag = 0;
  led_blue_flag = 0;
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

//===================Интерфейс===================================

//-----------Чтение потенциометра-------------------------------
   led_green = (int)(analogRead(A3)/100) + 1; 
   led_blue = (int)(analogRead(A2)/100) + 1;   
 
//-------------Обработка кнопки и привязка-----------------------------
if((millis()-y_last_time)>200){                     
  if (digitalRead(4)){sliv_flag = 1- sliv_flag;}
  y_last_time = millis();
  }
                                                       
//-------------------Мигание диодов-------------------------
  if (!sliv_flag &&(millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(5, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!sliv_flag &&(millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(6, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;
      }
    }
}

« Последнее редактирование: 30 Июль 2016, 23:23:49 от AlexYalta »

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #133 : 31 Июль 2016, 01:53:11 »
 1. Ну да, я же писал, что когда подключите клапаны, понаблюдаете, если будет необходимость, будем закрывать.
2. Почему не работают. Если хотите увидеть часы, раскомментируйте (удалите косые черты в начале) следующую строку
//String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
Эта строка создает строку со временем и присваивает ее переменной ho.
А следующая строка напечатает ее в мониторе порта:
Serial.println (ho);
Добавьте ее следом ниже.
Я просто убрал ее, часы мы уже проверили, работают, нет необходимости на них смотреть.

Покажите видео, как это выглядит в реале.


Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #134 : 31 Июль 2016, 09:35:26 »
Спасибо!
А слона то я и не заметил :)

 Вечерком отсниму. А то я на "нагрузку" не совсем подходящий резистор впаял, они еле светятся, днем не видно толком нифига... 

зы. В скетче были куски от кода форума. Долго думал что за [колор ред] нафига он нужен и почему не компилируется. :)
« Последнее редактирование: 31 Июль 2016, 09:42:47 от AlexYalta »

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #135 : 11 Август 2016, 12:12:14 »
AlexYalta, как там продвигается создание Вашей установки, не забросили еще идею ?

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #136 : 11 Август 2016, 12:35:35 »
Конечно нет. Жду посылки из Китая, с клапанами-помпами(я с запасом взял :))  вроде получилось заказать.

Мало того, еще и управление светильником нужно будет заделать :)

зы. Видео никак отснять не могу, гребенный планшет не имеет экпокорекции, нифига не видно.

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #137 : 19 Август 2016, 12:13:42 »
заказывал племяшку на амперке  конструктор электронный, а себе под шумок заказал дисплейчик простенький:

http://amperka.ru/product/text-lcd-8x2

думаю можно будет попробовать его применить....

2 строки по 8 символов

верхняя - ИЗ(интервал затоплений)  индикация в минутах, пробел, последние два символа индикация режима Д(день) Н (ночь) УВ(утро-вечер)
нижняя - ПЗ (продолжительность затопления) индикация в минутах, пробел, последние два символа коофицент.

в режиме промывки корней, можно написать типа "промывка корней" в две строки... 




Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #138 : 23 Август 2016, 20:59:04 »
заказывал племяшку на амперке  конструктор электронный, а себе под шумок заказал дисплейчик простенький:
Как придет, маякните, попробуем разобраться с ним.

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #139 : 07 Сентябрь 2016, 21:51:54 »
Начал потихоньку паять. Не нравится как работают тактовые кнопки, да и монтировать их в корпус не с руки. Решил заменить за переключатели. Придется править код. И учитывая, что я как всегда сделал все через одно место, придется освещение пихать на реле ардуины. Я взял 12v переключатели. Не думаю что он выдержит нагрузку  драйвера :(

Вижу все как,  один переключатель №1  делает то что делала тактовая кнопка, 0 стандартный(рабочий) режим, 1 принудительное затопление-промывка.  Переключатель  №2 принудительное выключение света.
Сам свет будет включен постоянно на принижении скажем 10-12 часов в сутки. Под полный цикл "активной" работы системы затопления.



Дисплей приехал, впаял его первым, были сомнения:  
// Подключаем стандартную библиотеку LiquidCrystal
#include <LiquidCrystal.h>
 
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
// RS, E, DB4, DB5, DB6, DB7
LiquidCrystal lcd(6, 7, 3, 2, 5, 4);
 
void setup()
{
    // устанавливаем размер (количество столбцов и строк) экрана
    lcd.begin(8, 2);
    // печатаем первую строку
    lcd.print("  \xAB""\xA5""\xA7""\xA5");
    // устанавливаем курсор в колонку 0, строку 1. То есть на
    // самом деле это вторая строка, т.к. нумерация начинается с нуля
    lcd.setCursor(0, 1);
    // печатаем вторую строку
    lcd.print(" \xAA""\x4F""\x50""\xA9""\x4D");
}
 
void loop()
{}


Немного как всегда через одно место(в плане последовательности пинов). Но вписал эту последовательность в представленный скетчь, Показывает все корректно, "Чили форум" если быть точным. Хотел сфоткать но фотик на работе, завтра этим займусь.

Короче пока выходит

A5 SCL  для модуля часов
А4 SDA для модуля часов
А3 Потенциометр №1
А2 Потенциометр №2

D2-D7 дисплей.

d8 выкл №1
d9 выкл №2

D10-D13  выходы на реле.


Припаять осталось реле и переключатели, модуль часов, дисплей и потенциометры впаяны и работают корректно.

по комплектухе почти все приехало, правда  гребенные китайцы отправили 3 комплекта поворотников в для мопеда, вместо клапанов, придется подождать. Помпы просто зверь машина, диоды, драйвер, блок питания на 2А 12v, все сеть. завтра забираю радиаторный профиль для светильника и термоклей, мелочевка типа, розетки,  клейники, провода, штекера , все тоже уже пришло. Думаю за выходные смогу собрать блок управления и нагрузки. Правда корпус под это пока делается, будет фанера 4мм с вентиляцией и отверстиями под все входы,  переключатели, дисплей.
 

Схемы тоже в работе, нарисую уже по факту, максимально подробно по уже работающему устройству.  

ps. даташит на дисплей:

  http://files.amperka.ru/datasheets/MT-08S2A.pdf







« Последнее редактирование: 07 Сентябрь 2016, 22:28:36 от AlexYalta »