Блог

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

Опубликовано: 23.01.2018

Для управления электроприборами пользуются различными клавишными выключателями и тумблерами. Чтобы управлять такими электроприборами с помощью микроконтроллера существует специальный тип выключателей - электромеханические реле. В состав набора ИНТЕРНЕТ ВЕЩЕЙ ДЛЯ УМНОГО ДОМА входит Relay Shield (см. рис. 6.1), который содержит четыре реле с необходимой обвязкой и позволяет контроллерам управлять четырьмя электроприборами.
По своей сути реле — это просто механический рубильник, которым можно управлять при помощи микроконтроллера. При этом электрическая связь между управляющей электроникой и коммутируемой нагрузкой отсутствует. А это значит, что помехи не попадают на микроконтроллер и не сбивают управляющую программу.


 
Рис. 6.1. Relay Shield.

В модулях relay shield обычно используется n-канальное управление. При таком управлении реле включается подачей на вывод Arduino низкого уровня LOW, а выключается подачей высокого уровня HIGH.


Читать далее

● 6.2. Подключение блока реле к плате Arduino MEGA

Опубликовано: 23.01.2018

Рассмотрим подключение Relay Shield к плате Arduino MEGA.  Relay Shield мы будем использовать для включения/выключения света для освещения растений, вентилятора, насоса для полива растений. Включения/выключения вентилятора и помпы будет осуществляться в зависимости от значений температуры воздуха (вентилятор) и влажности почвы (мембранный вакуумный насос (см. рис. 6.2)).  Мембранный вакуумный насос будем использовать для полива почвы. Он предназначен для всасывания воды из емкости. Рабочее напряжение 12В, потребляемый рабочий ток  0.5 – 0.7А, расход 1.5 л/мин.


 
Рис. 6.2. Мембранный вакуумный насос

Управление светом будем осуществлять с сенсонного экрана  TFT 2.4" Shield (рассмотрим это в главе 6.3).
Схема соединений представлена на рис. 6.3.

Внимание!
Работа с высоким напряжением опасна для вашего здоровья и жизни. На плате существуют области, прикосновение к которым приведёт к поражению электрическим током. Это винты контактных колодок и места пайки выводов контактных колодок и реле. Не работайте с платой, если она подключена к бытовой сети. Для готового устройства используйте изолированный корпус.
Если вы сомневаетесь как подключить к реле электроприбор, работающий от общей сети 220 В и у вас есть сомнения, вопросы на тему того как это делается, остановитесь: вы можете устроить пожар или убить себя. Убедитесь, что у вас в голове — кристальное понимание принципа работы устройства и опасностей, которые связаны с высоким напряжением.



 
Рис. 6.3. Схема подключений relay shield к плате Arduino MEGA

Загрузим на плату Arduino MEGA скетч включения/выключения вентилятора и насоса в зависимости от данных температуры воздуха и влажности почвы.
Необходимо внести изменения в существующий скетч. Во первых добавляем массив пинов для подключения реле (пусть их будет 8, с запасом под расширения):

int pinrelays[]={27,29,31,33,35,37,39};

А также массив для хранения данных реле datarelays[] (0 – выключено, 1 –включено) и массив в котором будем хранить фактически подключенные устройства aktiverelays[] (1 – подлючено, 0 – выключено):

int aktiverelays[]={1,1,1,1,1,0,1,0};
int datarelays[]={0,0,0,0,0,0,0,0};

Необходимо добавить и константы в файл defines.h

Теперь в основной файл скетча в цикл loop() добавим код включения/выключения реле, управляющих вентилятором и помпой в зависимости от показаний датчиков температуры DS18B20 и увлажненности почвы SoilMoisture.
Содержимое данного фрагмента скетча представлено в листинге 6.1.
Листинг 6.1

void loop() {   
   …………
   // установка значений реле
   // вентилятор
   if(aktivesensors[1]==1 && datasensors[1]<999 
         && datasensors[1]>LIMIT_DS18B20MAX) {
      digitalWrite(pinrelays[2],RELAY_ON);
      datarelays[2]=1;
   }
   else {
      digitalWrite(pinrelays[2],RELAY_OFF);
      datarelays[2]=0;
   }
   // помпа
   if(aktivesensors[2]==1 && datasensors[2]<999 
         && datasensors[1]>MAXVALUESOILMOISTURE 900) {
      digitalWrite(pinrelays[1],RELAY_ON);
      datarelays[1]=1;
   }
   else {
      digitalWrite(pinrelays[1],RELAY_OFF);
      datarelays[1]=0;
   }
……..
}



После загрузки скетча на плату Arduino у Вас будет обеспечено автоматическое включение/выключение вентилятора и автоматический полив растений. Теперь рассмотрим отображение данных на дисплее и управление включением/выключением света (реле 0) с помощью touch дисплея.

Читать далее

● 6.3. Отображение данных о статусе исполнительных устройств на экране дисплея и управление с помощью сенсора

Опубликовано: 23.01.2018

В главе 5.2 мы рассматривали вывод данных, получаемых с датчиков на экран TFT 2.4" Shield. Теперь наv необходимо на экран дисплея выводить и данные о состоянии исполнительных устройств, подключенных к реле. Для этого нам необходимо формировать другие экраны, а также главный экран. Как мы будем делать переходы между экранами? Будем использовать сенсорный экран  TFT 2.4" Shield.
Сенсорная часть дисплея использует 4 контакта совместно с ЖКИ:

A1 – TOUCH_YP;
A0 –  TOUCH_XM;
D6 – TOUCH XP;
D7 / TOUCH YM.

Для работы с тачскрином будем использовать библиотеку Touch Screen. Рассмотрим какие изменения необходимо внести в код. Во первых подключим библиотеку Touch Screen:
#include "TouchScreen.h"
Создадим объект TouchScreen ts
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
Создадим новую переменную screen – текущий экран для отображения
int screen=0;     // 0 – главное меню
                   // 1 – датчики
                   // 2 – реле
                   // 3 – будильники
Сформируем код для формирования экранов – главного меню (view_display_main() ) и состояния реле (view_display_relays()) – см. листинг 6.2.
Листинг 6.2

// вывод главного экрана
void view_display_main() {
  // очистить экран
  tft.fillScreen(BLACK);
  // вывод заголовка экрана
  tft.setTextColor(MAGENTA);  
  tft.setTextSize(3);
  for(int i=0;i<6;i++) {
     tft.setCursor(15, xmenu[i]);
     tft.print(strM1[i]);
  } 
}
// вывод экрана с показаниями реле
void view_display_relays() {
  // очистить экран
  tft.fillScreen(BLACK);
  // вывод заголовка экрана
  tft.setCursor(10, 15);
  tft.setTextColor(MAGENTA);  
  tft.setTextSize(3);
  tft.println("Relays:");
  // вывод списка реле
  tft.setTextColor(YELLOW);  
  tft.setTextSize(2);
  for(int i=0;i<COUNT_RELAYS;i++) {
     tft.setCursor(10, xrelays[i]);
     tft.print(strR1[i]);
  } 
  // вывод списка значений 
  for(int i=0;i<COUNT_RELAYS;i++) {
     if(aktiverelays[i]==1) {
        Serial.print("COUNT_RELAYS=");Serial.println(i);
        if(datarelays[i]==1) {
            set_display_data_relay(i,datarelays[i],RED); 
        }
        else {
            set_display_data_relay(i,datarelays[i],YELLOW); 
        }        
     }
  }


  // ardyino-kit  
  tft.setTextSize(3);
  tft.setTextColor(MAGENTA);  
  tft.setCursor(10, 270);
  tft.print("arduino-kit");
  // вывод для возврата в главное меню  
}



А также процедуры для вывода меняющихся значений позиции реле (set_display_data_relay()).
void set_display_data_relay(int pos,float var,unsigned int color) {
   tft.setTextSize(2);
   tft.setTextColor(color);  
   tft.setCursor(100, xrelays[pos]);
   if(var==0)
      tft.print("OFF");
   else
      tft.print("ON");
   }
Теперь нам необходимо в цикле loop() добавить проверку текущего экрана перед выводом показаний на дисплей TFT 2.4" shield-а – листинг 6.3.
Листинг 6.3

void loop() {   
   ……..
     // для датчиков
         if(fvar<999 && screen==1) {
            set_display_data_sensor(teksensor, 
                     datasensors[teksensor],BLACK);
            datasensors[teksensor]=fvar;
            set_display_data_sensor(teksensor, 
                     datasensors[teksensor],YELLOW);           
          }
    ……..
    // для реле
    // вентилятор
    if(aktivesensors[1]==1 && datasensors[1]<999 
         && datasensors[1]>LIMIT_DS18B20MAX) {
      digitalWrite(pinrelays[2],RELAY_ON);
      if( aktiverelays[2]<1 && screen==2)
        set_display_data_relay(2,datarelays[2],RED); 
      aktiverelays[2]=1;
    }
    else {
      digitalWrite(pinrelays[2],RELAY_OFF);
      if( aktiverelays[2]>0 && screen==2)
        set_display_data_relay(2,datarelays[2],YELLOW); 
      aktiverelays[2]=0;
    }
    // помпа
    if(aktivesensors[2]==1 && datasensors[2]<999 
         && datasensors[1]>MAXVALUESOILMOISTURE 900) {
      digitalWrite(pinrelays[1],RELAY_ON);
      if( aktiverelays[1]<1 && screen==2)
        set_display_data_relay(1,datarelays[1],RED); 
      aktiverelays[1]=1;
    }
    else {
      digitalWrite(pinrelays[1],RELAY_OFF);
      if( aktiverelays[1]>0 && screen==2)
        set_display_data_relay(1,datarelays[1],YELLOW); 
      aktiverelays[1]=0;
    }
    ……..
}



И добавляем код для работы с сенсорным экраном. В основном цикле loop() проверяем, было ли нажатие на экран:

void loop() {   
   ……..
  // определяем нажатие на экран
  int tt=ts.pressure();
  if(tt > MINPRESSURE && tt < MAXPRESSURE) {
     Serial.println("touch");
     int x=ts.readTouchX();int y=ts.readTouchY();
     Serial.print("X = "); Serial.print(x);
     Serial.print("\tY = "); Serial.print(y);
     pinMode(XM, OUTPUT);pinMode(YP, OUTPUT);
     pinMode(XP, OUTPUT);pinMode(YM, OUTPUT);
     do_for_touch(x,y,screen) ;
     delay(1000);
  }  
  // возврат к назначениям пинов для вывода изображения 
  pinMode(XM, OUTPUT);pinMode(YP, OUTPUT);
  pinMode(XP, OUTPUT);pinMode(YM, OUTPUT);
    ……..
}



В случае нажатия – проверка попадания в нужную область (в зависимости от текущего экрана отображения) – процедура do_for_touch():
// по нажатии по экрану

// по нажатии по экрану
void do_for_touch(int x,int y,int res) {
    // главный экран
    if(res==0) {
        // на sensors
        if(x<370 && x>320 && y<680 && y>280 ) {
           screen=1;
           view_display_sensors();
        }
        // на relays
        if(x<470 && x>420 && y<680 && y>280 ) {
           screen=2;
           view_display_relays();
        }
    }
    // экран sensors
    else if(res==1) {
        // на main
        if(x<820 && x>780 && y<800 && y>160 ) {
           screen=0;
           view_display_main();
           Serial.println("00000000000");
       }
    }
    // экран relays
    else if(res==2) {
        // на main
        if(x<820 && x>780 && y<800 && y>160 ) {
           screen=0;
           view_display_main();
           Serial.println("00000000000");
       }  
    }    
    // экран alarms
    else if(res==3) {
       ;
    }    
    // 
    else ;
}



Загружаем скетч на плату и переходим по экранам по нажатии на нужные области (рис. 6.4, 6.5, 6.6). Выход на экран главного меню – по нажатии по надписи arduino-kit.

Рис. 6.4. Экран главного меню.

Рис. 6.5. Экран показаний сенсоров.
 

Рис. 6.6. Экран состояний реле.

Далее нам необходимо добавить код включения лампы по нажатии по сенсорному экрану. Для этого вносим изменения в процедуру do_for_touch(). Добавляем следующий код:

// экран relays
else if(res==2) {
    // на main
    if(x<820 && x>780 && y<800 && y>160 ) {
       screen=0;
       view_display_main();
    }
    // ON / OFF лампы
    else if(x<290 && x>270 && y<520 && y>440 ) {
       set_display_data_relay(0,datarelays[0],BLACK);
       datarelays[0]=1-datarelays[0];
       if(datarelays[0]==0) {
          digitalWrite(pinrelays[1],RELAY_OFF);
          set_display_data_relay(0,datarelays[0],YELLOW);
       }
       else {
          digitalWrite(pinrelays[1],RELAY_ON);
          set_display_data_relay(0,datarelays[0],RED);
       }
   }    
}    
// экран alarms



Теперь мы можем управлять включением/выключением лампы нажатием по сенсорному экрану.
Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке.



Читать далее

● 6.4. Подключение блока реле к модулю NodeMCU

Опубликовано: 23.01.2018

Теперь рассмотрим подключение Relay Shield к модулю NodeMCU.  Relay Shield мы будем использовать также – для включения/выключения света для освещения растений, вентилятора, насоса для полива растений. Светом будем управлять с помощью кнопки, включения/выключения вентилятора и помпы будет осуществляться в зависимости от значений температуры воздуха (вентилятор) и влажности почвы (мембранный вакуумный насос.
Схема соединений представлена на рис. 6.7.
 


Рис. 6.7. Схема подключений Relay Shield к модулю Node MCU.

Загрузим на плату Arduino MEGA скетч включения/выключения вентилятора и насоса в зависимости от данных температуры воздуха и влажности почвы, а также включения/выключения света с помощью кнопки.
Необходимо внести изменения в существующий скетч. Во первых добавляем массив пинов для подключения реле (пусть их будет 8, с запасом под расширения):

// массив для хранения данных состояний реле
int datarelays[]={0,0,0,0,0,0,0,0};

Т.к. реле, также как и светодиоды подключены через I2C расширитель выводов MCP23017 в setup производим настройку портов микросхемы MCP23017 (процедура ini_mcp23017().

void ini_mcp23017() {
  Wire.beginTransmission(0x20);  // i2c – адрес (A0-0,A1-0,A2-0)
  Wire.write(0x00); // IODIRA register
  Wire.write(0x00); // настроить PORT A как output (для светодиодов)
  Wire.endTransmission();
  Wire.beginTransmission(0x20);  
  Wire.write(0x01); // IODIRB register
  Wire.write(0x00); // настроить PORT B как output (для реле)
  Wire.endTransmission();
}



Необходимо добавить и константу в файл defines.h (пин подключения кнопки включения света).
#define BUTTONLIGHTPIN1         40
И переменные состояния кнопки
int lastButtons1=0;
int currentButtons1=0;
Теперь в основной файл скетча в цикл loop() добавим код включения/выключения реле, управляющих вентилятором и помпой в зависимости от показаний датчиков температуры DS18B20 и увлажненности почвы SoilMoisture и включения/выключения света по нажатию кнопки.
Содержимое данного фрагмента скетча представлено в листинге 6.1.
Листинг 6.4

void loop() {   
   …………
   // установка значений реле
   // вентилятор
   if(aktivesensors[1]==1 && datasensors[1]<999 
         && datasensors[1]>LIMIT_DS18B20MAX) {
      datarelays[2]=1;
      set_status_relays();
   }
   else {
      datarelays[2]=0;
      set_status_relays();
   }
   // помпа
   if(aktivesensors[2]==1 && datasensors[2]<999 
         && datasensors[1]>MAXVALUESOILMOISTURE 900) {
      datarelays[1]=1;
      set_status_relays();
   }
   else {
      datarelays[1]=0;
      set_status_relays();
   }
   // нажатие кнопки включения/выключения света
   currentButtons1 = debounce(lastButtons1, BUTTONLIGHTPIN1);
   if (lastButtons1 == 0 && currentButtons1 == 1) // если нажатие...
     {
     // изменить состояние реле
     datarelays[0]=1- datarelays[0];
     // вывести в порты MCP23017
     set_status_relays();
     }
   lastButtons1 = currentButtons1;
……..
}



Функция set_status_relays() осуществляет включение/выключение реле, установкой необходимых уровней на выходах порта B микросхемы MCP23017.

// управление реле
void set_status_relays() {
  int relays=0;
  for(int i=0;i<7;i++)
     relays=relays +( datarelays[i]<<i);
  // записать данные в PORT B
  Wire.beginTransmission(0x20);
  Wire.write(0x13); // address PORT B
  Wire.write(relays);    // PORT B
  Wire.endTransmission();
  delay(100); // пауза
}



Функция сглаживания дребезга debounce() принимает в качестве аргумента предыдущее состояние кнопки и выдает фактическое.
int debounce(int last,int pin1)

int debounce(int last,int pin1)
  {
  int current = digitalRead(pin1);   // Считать состояние кнопки
  if (last != current)               // если изменилось...
    {
    delay(5);                       // ждем 5мс
    current = digitalRead(pin1);   // считываем состояние кнопки
    return current;            // возвращаем состояние кнопки
    }
  }



После загрузки скетча на плату Arduino у Вас будет обеспечено автоматическое включение/выключение вентилятора и автоматический полив растений, а также включение/выключение света по нажатию клавиши.
Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке.

Читать далее

Главное меню

Каталог

Полезные ссылки

Цена
от
до