1 (edited by alchi26 2018-04-10 11:57:41)

Topic: Одноканальная система автоматического полива

Добрый день, меня зовут Сергей!
Хочу представить один из первых проектов, реализованных мной с помощью сервиса RemoteXY

Система автоматического полива растений

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

Состав системы:
Контроллер Arduino UNO;
BT модуль HC-06;
Датчик влажности;
Драйвер LM298;
Модуль реле одноканальный;
Насос стеклоомывателя ВАЗ 2108, 12 В;
Блок питания 12 В, 3 А;
Корпус;
Провода;
Разъемы.

На экране приложения размещены основные элементы управления системой, а именно:
1. Счетчик «Общее количество поливов» (бордовый фон). Максимальное количество 32000, при переполнение счетчика происходит его обнуление.
2. Текущее (измеренное) значение влажности с датчика, подключенного к аналоговому порту А0, в диапазоне от 0 до 100% (бордовый фон). Влажность измеряется в условных единицах!
3. Задатчик минимального значения влажности в диапазоне от 0 до 40%. Влажность измеряется в условных единицах!
4. Задатчик максимального значения влажности в диапазоне от 50 до 100%. Влажность измеряется в условных единицах!
5. Задатчик времени полива в диапазоне от 5 до 50 с и индикатор текущего времени полива (бордовый фон).
6. Задатчик времени ожидания в диапазоне от 1 до 96 ч и индикатор текущего времени ожидания (бордовый фон).
7. Задатчик мощности насоса в диапазоне от 50 от 100%. При мощности ниже 50% насос не сможет создать требуемое давление.
8. Кнопка «ОТКЛ/ВКЛ» управляет включением и выключением системы. В выключенном состоянии происходит полное отключение нагрузки.
9. Кнопка «ПОДАЧА» служит для подачи воды в ручном режиме. При нажатии и удержании кнопки  происходит подача воды с заданной мощностью насоса. В случае отпускания кнопки произойдет отключение насоса.
10. переключатель режимов работы системы: «влажность», «время» и «ручной».

Полив  реализуется следующими режимами работы:
«Влажность»: Для измерения текущего значения влажности используется внешний датчик, подключенный к аналоговому порту А0. Как только текущее значение влажности становится меньше заданного минимального, происходит включение насоса с заданной мощностью. При достижении заданного максимального уровня влажности насос выключается.
«Время»: Задается время полива и время ожидания. По окончанию времени ожидания происходит включение насоса.  По окончанию времени полива  происходит выключение насоса с заданной мощностью.
«Ручной»: Оператор может самостоятельно  включать и выключать насос нажатием на кнопку «ПОДАЧА». В данном режиме индикатор, расположенный на кнопке «ПОДАЧА», будет светиться зеленым цветом.

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

Дополнительно с аналоговым выходом работает дискретный выход D6, для подключения внешней нагрузки с помощью реле (например насос 220 В).

https://thumb.ibb.co/essO7H/Screenshot_2018_04_10_16_18_36_262_com_shevauto_remotexy_pro_1.png

Позже скину код для arduino и фото процесса сборки устройства.

2

Re: Одноканальная система автоматического полива

Добавил светодиод состояния связи. Также при включение насоса или нагрузки происходит включение светодиода. Данные светодиоды устанавливаются на корпусе устройства. Это позволит визуально контролировать состояние устройства.
Сейчас проектирую корпус, а после займусь окончательной сборкой устройства. Будут фото и код.

3 (edited by alchi26 2018-04-20 15:47:55)

Re: Одноканальная система автоматического полива

Всем привет!
По-маленьку собираю опытный образец:
Фото:
https://thumb.ibb.co/jwPNnS/IMG_20180420_224017.jpg https://thumb.ibb.co/nzHa7S/IMG_20180420_224025.jpg https://thumb.ibb.co/cGATSS/IMG_20180420_224038.jpg https://thumb.ibb.co/kEsWgn/IMG_20180420_224050.jpg

4

Re: Одноканальная система автоматического полива

https://thumb.ibb.co/eo8yES/IMG_20180428_103551.jpg https://thumb.ibb.co/ieqZon/IMG_20180428_103557.jpg

5

Re: Одноканальная система автоматического полива

ссылка на видео: https://my.mail.ru/mail/alchi26/video/_myvideo/14.html

6

Re: Одноканальная система автоматического полива

Nice wink

7 (edited by alchi26 2018-05-04 02:25:33)

Re: Одноканальная система автоматического полива

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

// определение режима соединения и подключение библиотек
#define REMOTEXY_MODE__SOFTSERIAL
#include <SoftwareSerial.h>
#include <TimerOne.h>
#include <RemoteXY.h>
#include <EEPROM.h> 

// настройки соединения 
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600

// конфигурация интерфейса  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,8,0,102,0,222,2,8,200,1,
  130,0,1,1,61,6,96,130,0,1,
  37,61,10,96,130,0,1,70,30,14,
  96,2,1,2,75,28,8,2,26,16,
  31,32,208,146,208,154,208,155,0,208,
  158,208,162,208,154,208,155,0,130,0,
  1,85,30,14,96,129,0,6,86,21,
  3,24,208,160,209,131,209,135,208,189,
  208,176,209,143,32,208,191,208,190,208,
  180,208,176,209,135,208,176,0,1,2,
  2,90,28,8,2,16,208,159,208,158,
  208,148,208,144,208,167,208,144,32,32,
  32,32,32,0,130,0,1,48,61,10,
  96,130,0,1,8,61,6,96,130,0,
  32,70,30,29,96,130,0,1,26,61,
  10,96,130,0,1,15,61,10,96,130,
  0,1,59,61,10,96,129,0,2,60,
  31,3,24,208,156,208,190,209,137,208,
  189,208,190,209,129,209,130,209,140,32,
  208,189,208,176,209,129,208,190,209,129,
  208,176,44,32,37,0,129,0,2,16,
  42,3,24,208,146,208,187,208,176,208,
  182,208,189,208,190,209,129,209,130,209,
  140,32,208,188,208,184,208,189,208,184,
  208,188,208,176,208,187,209,140,208,189,
  208,176,209,143,44,32,37,0,129,0,
  2,27,43,3,24,208,146,208,187,208,
  176,208,182,208,189,208,190,209,129,209,
  130,209,140,32,208,188,208,176,208,186,
  209,129,208,184,208,188,208,176,208,187,
  209,140,208,189,208,176,209,143,44,32,
  37,0,129,0,2,10,34,3,24,208,
  146,208,187,208,176,208,182,208,189,208,
  190,209,129,209,130,209,140,32,209,130,
  208,181,208,186,209,131,209,137,208,176,
  209,143,44,32,37,0,129,0,2,38,
  25,3,24,208,146,209,128,208,181,208,
  188,209,143,32,208,191,208,190,208,187,
  208,184,208,178,208,176,44,32,209,129,
  0,129,0,2,49,29,3,24,208,146,
  209,128,208,181,208,188,209,143,32,208,
  190,208,182,208,184,208,180,208,176,208,
  189,208,184,209,143,44,32,209,135,0,
  4,128,2,63,47,5,32,26,4,128,
  2,19,47,5,204,26,4,128,2,30,
  47,5,1,26,4,128,2,52,47,5,
  217,26,4,128,2,41,47,5,135,26,
  3,131,33,75,28,10,2,26,129,0,
  33,87,20,3,24,208,144,32,45,32,
  34,208,146,208,155,208,144,208,150,208,
  157,208,158,208,161,208,162,208,172,34,
  0,129,0,33,91,18,3,24,66,32,
  45,32,34,208,146,208,160,208,149,208,
  156,208,175,34,0,129,0,33,95,15,
  3,24,208,161,32,45,32,34,208,160,
  208,163,208,167,208,157,208,158,208,153,
  34,0,67,5,50,9,11,4,2,32,
  11,67,5,50,16,11,8,2,26,11,
  67,5,50,27,11,8,2,26,11,67,
  5,50,38,11,4,2,26,11,67,5,
  50,49,11,4,2,26,11,67,5,50,
  60,11,8,2,26,11,129,0,43,71,
  9,3,24,208,160,208,181,208,182,208,
  184,208,188,0,129,0,12,71,10,3,
  24,208,160,208,176,208,177,208,190,209,
  130,208,176,0,67,5,50,42,11,4,
  2,32,11,67,5,50,53,11,4,2,
  32,11,67,5,50,2,11,4,2,32,
  11,129,0,2,3,40,3,24,208,158,
  208,177,209,137,208,181,208,181,32,208,
  186,208,190,208,187,208,184,209,135,208,
  181,209,129,209,130,208,178,208,190,32,
  208,191,208,190,208,187,208,184,208,178,
  208,190,208,178,0,65,7,23,91,6,
  6 };
  
// структура определяет все переменные вашего интерфейса управления 
struct {

  // входные переменные
  uint8_t switch_1; // =1 если переключатель включен и =0 если отключен 
  uint8_t button_1; // =1 если кнопка нажата, иначе =0 
  int8_t slider_5; // =0..100 положение слайдера 
  int8_t slider_1; // =0..100 положение слайдера 
  int8_t slider_2; // =0..100 положение слайдера 
  int8_t slider_4; // =0..100 положение слайдера 
  int8_t slider_3; // =0..100 положение слайдера 
  uint8_t select_1; // =0 если переключатель в положении A, =1 если в положении B, =2 если в положении C, ... 

  // выходнные переменные
  char text_1[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_2[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_3[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_4[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_5[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_6[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_7[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_8[11];  // =строка UTF8 оканчивающаяся нулем 
  char text_9[11];  // =строка UTF8 оканчивающаяся нулем 
  uint8_t led_1_r; // =0..255 яркость красного цвета индикатора 
  uint8_t led_1_g; // =0..255 яркость зеленого цвета индикатора 
  uint8_t led_1_b; // =0..255 яркость синего цвета индикатора 

  // дополнительные переменные
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)

// переменные проекта
int h=0;
boolean s=false;
unsigned long time=0;  
byte h_min, h_max, t_p, t_o, p, w, on, m, mm, n;
byte h_min_e, h_max_e, t_p_e, t_o_e, p_e, w_e, on_e, mm_e, n_e;

// настройка
void setup() 
{
  RemoteXY_Init (); 
  Serial.begin(9600);
  Timer1.initialize(); 
  Timer1.attachInterrupt(Timer1_action);  
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  
  h_min_e=EEPROM.read(0);
  h_max_e=EEPROM.read(1);
  t_p_e=EEPROM.read(2);
  t_o_e=EEPROM.read(3);
  p_e=EEPROM.read(4);
  w_e=EEPROM.read(5);
  mm_e=EEPROM.read(6);
  n=n_e=EEPROM.read(7);
  
  RemoteXY.slider_1=h_min_e;
  RemoteXY.slider_2=h_max_e;
  RemoteXY.slider_3=t_p_e;
  RemoteXY.slider_4=t_o_e;
  RemoteXY.slider_5=p_e;
  RemoteXY.switch_1=w_e;
  RemoteXY.select_1=mm_e;        
}

// цикл
void loop() 
{ 
  RemoteXY_Handler ();

  digitalWrite(7, RemoteXY.connect_flag);
  
  h=100-analogRead(0)/10.24;
  
  h_min=RemoteXY.slider_1;
  if (h_min!=h_min_e) 
  { 
    EEPROM.write(0, h_min); 
    h_min_e=h_min;
  }
  h_max=RemoteXY.slider_2;
  if (h_max!=h_max_e) 
  { 
    EEPROM.write(1, h_max); 
    h_max_e=h_max;
  }
  t_p=RemoteXY.slider_3;
  if (t_p!=t_p_e) 
  { 
    EEPROM.write(2, t_p); 
    t_p_e=t_p;
  }
  t_o=RemoteXY.slider_4;
  if (t_o!=t_o_e) 
  { 
    EEPROM.write(3, t_o); 
    t_o_e=t_o;
  }
  p=RemoteXY.slider_5;
  if (p!=p_e) 
  { 
    EEPROM.write(4, p); 
    p_e=p;
  }
  w=RemoteXY.switch_1;
  if (w!=w_e) 
  { 
    EEPROM.write(5, w); 
    w_e=w;
  }
  mm=RemoteXY.select_1;
  if (mm!=mm_e) 
  { 
    EEPROM.write(6, mm); 
    mm_e=mm;
  }
  
  on=RemoteXY.button_1;
  
  itoa(h, RemoteXY.text_1, 10);
  itoa(h_min/2.5, RemoteXY.text_2, 10);
  itoa((h_max+100)/2, RemoteXY.text_3, 10);
  itoa(t_p/2.2+5, RemoteXY.text_4, 10);
  itoa(t_o/1.0417+1, RemoteXY.text_5, 10);
  itoa((p+100)/2, RemoteXY.text_6, 10);
  
  if (n==255) { n=0; }
  itoa(n, RemoteXY.text_9, 10);
  if (n!=n_e) 
  { 
    EEPROM.write(7, n); 
    n_e=n;
  }
  if (s==true && m==1)
  {
    itoa(time, RemoteXY.text_7, 10);
    itoa(t_o/1.0417+1, RemoteXY.text_8, 10);
  }
  if (s==false && m==1)
  {
    itoa(t_p/2.2+5, RemoteXY.text_7, 10);
    itoa(time, RemoteXY.text_8, 10);
  }
  if (m!=1 && w==1)
  {
    itoa(t_p/2.2+5, RemoteXY.text_7, 10);
    itoa(t_o/1.0417+1, RemoteXY.text_8, 10);    
  }
  if (mm!=m) 
  {
    m=mm;
    analogWrite(5,0);
    time=0;
    s=false;    
    itoa(t_p/2.2+5, RemoteXY.text_7, 10);
    itoa(t_o/1.0417+1, RemoteXY.text_8, 10);       
    RemoteXY.led_1_r=20;
    RemoteXY.led_1_g=20;
    RemoteXY.led_1_r=20;
  }
    
  if (w==0 )
  {
    analogWrite(5,0);
    digitalWrite(6, LOW);
    digitalWrite(8, HIGH);
    time=0;
    s=false;    
    itoa(t_p/2.2+5, RemoteXY.text_7, 10);
    itoa(t_o/1.0417+1, RemoteXY.text_8, 10);    
    RemoteXY.led_1_r=20;
    RemoteXY.led_1_g=20;
    RemoteXY.led_1_r=20;
  }

  if (w==1)
  {
    switch (m)
    {
      // режим "Влажность"
      case 0:
        if (h<h_min && s==false) 
        {
          n++;
          s=true;
          analogWrite(5, p*2.55);
          digitalWrite(6, HIGH);
          digitalWrite(8, LOW);
        }
        if (h>=h_max && s==true) 
        {
          s=false;
          analogWrite(5, 0);        
          digitalWrite(6, LOW);
          digitalWrite(8, HIGH);
        }
      break;
      
      // режим "Время" 
      case 1:
        if (time>=(t_o/1.0417+1)/**3600*/ && s==false) 
        {
          analogWrite(5, p*2.55);
          digitalWrite(6, HIGH);
          digitalWrite(8, LOW);
          time=0;  
          s=true;
          n++;
        }
        if (time>=t_p/2.2+5 && s==true) 
        {
          analogWrite(5, 0);       
          digitalWrite(6, LOW);
          digitalWrite(8, HIGH);
          time=0;  
          s=false;
        }
      break;
       
      // режим "Ручной"
      case 2:
        RemoteXY.led_1_r=0;
        RemoteXY.led_1_g=255;
        RemoteXY.led_1_r=0;
        if (on==1) 
        {
          analogWrite(5, p*2.55);
          digitalWrite(6, HIGH);
          digitalWrite(8, LOW);
        }
        else 
        {
          analogWrite(5, 0);
          digitalWrite(6, LOW);
          digitalWrite(8, HIGH);
        }
      break;
    }
  }
}

void Timer1_action()
{  
  time++;
}

Всех с наступающим Днем Победы!

8

Re: Одноканальная система автоматического полива

Ссылка на проект:
http://remotexy.com/ru/editor/8879bf6d6 … 3b5cd7b3f/

9

Re: Одноканальная система автоматического полива

Guillaume wrote:

Nice wink

THANKS smile

10 (edited by alchi26 2018-05-16 12:28:11)

Re: Одноканальная система автоматического полива

В прошивке нашел ошибку (некритичную), скину новую версию кода по-позже!

Порция Видео готового устройства:
Интерфейс https://my.mail.ru/mail/alchi26/video/_myvideo/15.html
Устройство https://my.mail.ru/mail/alchi26/video/_myvideo/16.html
Устройство https://my.mail.ru/mail/alchi26/video/_myvideo/17.html

11

Re: Одноканальная система автоматического полива

Фото:
https://thumb.ibb.co/fMnT6J/IMG_20180514_115502.jpg
https://thumb.ibb.co/m3O1RJ/IMG_20180514_115525.jpg https://thumb.ibb.co/j1rALd/IMG_20180514_120026.jpg
https://thumb.ibb.co/fCmo6J/IMG_20180514_120401.jpg