Теперь рассмотрим подключение 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 по ссылке.