Блог

● 5.3. Светодиодная индикация и звуковая сигнализация о критических параметрах датчиков для Arduino MEGA

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

Введем светодиодную индикацию и звуковую сигнализацию, чтобы информировать вас о наступлении неблагоприятных климатических условиях или условиях, представляющих опасность для дома (пожар, утечка газов). Для светодиодной индикации будем использовать обычные светодиоды, которые подсоединим к цифровым выводам (26-32) Arduino Mega (используем ограничительные резисторы номиналом 220 Ом). Для звуковой индикации будем использовать небольшой динамик (рис. 5.5). При подключении динамика к выводу Arduino Mega используем npn-транзистор и резистор номиналом 510 Ом. Схема соединений для подключения светодиодов и динамика к плате Arduino Mega показана на рис. 5.6.


 
Рис. 5.5. Динамик для звуковой сигнализации


 
Рис. 5.6. Схема подключения светодиодов и динамика к плате Arduino Mega

Внесем дополнительный функционал в наш скетч. Создадим константы  граничных значений датчиков. В файл defines.h добавим:

// параметры датчиков для срабатывания
// светодиодной индикации и звуковой сигнализации
#define LIMIT_DHT22MIN 18             // влажность воздуха низкая
#define LIMIT_DHT22MAX 90             // влажность воздуха высокая
#define LIMIT_DS18B20MIN 15           // температура низкая
#define LIMIT_DS18B20MAX 30           // температура высокая
#define LIMIT_SOILMOISTUREMIN 300     // влажность почвы - чрезмерная влажность
#define LIMIT_SOILMOISTUREMAX 600     // влажность почвы - сухость
#define LIMIT_LEVELWATER 100          // вода
#define LIMIT_FAIR 100                // огонь
#define LIMIT_MQ2P 30                 // пропан
#define LIMIT_MQ2M 30                 // метан
#define LIMIT_MQ2S 30                 // дым
#define LIMIT_MQ7 30                  // CO



А также пин подключения динамика

// пин, к которому подключен динамик
#define SOUNDPIN         42



Далее в файле 05_03.ino создадим массивы пинов для подключения светодиодов, а также частот для звуковых оповещений:

// массив для хранения данных пинов светодиодов
int pinleds[]={26,28,30,32,34,36,38};
// массив для хранения частот и длительностей
// для звуковых оповещений
int freq[]={293,329,349,370,392,440,494};
int durations[]={3000,3000,3000,4000,4000,4000,4000};



в цикле loop() после получения данных с датчика делаем обращение к процедуре проверке данных датчиков на критические значения:

// проверка данных на критичность
void control_data_limit(int par) {
   float val;
  
   switch(par) {
      case 0:  // DHT22
           val=datasensors[0];
           if((val<LIMIT_DHT22MIN || val>LIMIT_DHT22MAX) 
               && aktivesensors[0]==1) {
             set_status_leds(0,HIGH);
             set_status_sound(0);
           }
           else
              set_status_leds(0,LOW);
         break;        
      case 1:  // DS18B20
           val=datasensors[1];
           if((val<LIMIT_DS18B20MIN || val>LIMIT_DS18B20MAX)
               && aktivesensors[1]==1) {
             set_status_leds(1,HIGH);
             set_status_sound(1);
           }
           else
              set_status_leds(1,LOW);
         break;        
      case 2:  // SoilMoisture
           val=datasensors[2];
           if((val<LIMIT_SOILMOISTUREMIN
               || val>LIMIT_SOILMOISTUREMAX) 
                && aktivesensors[2]==1) {
             set_status_leds(2,HIGH);
             set_status_sound(2);
           }
           else
              set_status_leds(2,LOW);
         break;        
      case 3:  // waterlevel
           val=datasensors[3];
           if(val>LIMIT_LEVELWATER && aktivesensors[3]==1) {
             set_status_leds(3,HIGH);
             set_status_sound(3);
           }
           else
              set_status_leds(3,LOW);
         break;        
      case 4:  // fire
           val=datasensors[4];
           if(val>LIMIT_FAIR && aktivesensors[4]==1) {
             set_status_leds(4,HIGH);
             set_status_sound(4);
           }
           else
              set_status_leds(4,LOW);
         break;        
      case 5:  // mq2
           val=datasensors[5];
           if((datasensors[5]>LIMIT_MQ2P 
               || datasensors[6]>LIMIT_MQ2M
               || datasensors[7]>LIMIT_MQ2S)
               && aktivesensors[5]==1) {
             set_status_leds(5,HIGH);
             set_status_sound(5);
           }
           else
              set_status_leds(5,LOW);
         break;   
      case 6:  // mq7
           val=datasensors[8];
           if(val>LIMIT_MQ7 && aktivesensors[6]==1) {
             set_status_leds(6,HIGH);
             set_status_sound(6);
           }
           else
              set_status_leds(6,LOW);
         break;   
      default:     
         break;
   }
}



Функции set_status_leds() и set_status_sound() отвечают за свечение светодиода и вывод на динамик звука с помощью встроенной функции tone().

// индикация на светодиоды
void set_status_leds(int par,int val) {
     digitalWrite(pinleds[par],val);   
}

// звуковая сигнализация
void set_status_sound(int par) {
   tone(SOUNDPIN,freq[par],durations[par]);
}



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

int freq[]={293,329,349,370,392,440,494};
int durations[]={3000,3000,3000,4000,4000,4000,4000};

Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке .

Читать далее

● 5.4. Расширение цифровых портов для NodeMCU ESP8266 с помощью микросхемы MCP23017

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

Введем светодиодную индикацию и звуковую сигнализацию и при использовании в качестве контроллера умного дома модуля Nodemcu. Количество выводов у модуля Nodemcu гораздо меньше, чем у Arduino Mega, поэтому нам понадобится микросхема расширителя входов  MCP23017.  Микросхема MCP23017 добавляет 16 портов,которые можно настроить как на вход,так и на выход (рис. 5.7). Микросхема использует популярную двухпроводную шину I2C.
MCP23017
 
Рис. 5.7. Выводы микросхемы MCP23017

Адрес микросхемы MCP23017 для протокола I2C можно установить комбинацией сигналов на цифровых входах A0 – A2 (рис. 5.8), что позволяет к микроконтроллеру подключиь одновременно 8 микросхем MCP23017, соответственно 16*8=128 контактов.


 
Рис. 5.8. Установка адреса микросхемы MCP23017

Микросхема имеет 2 банка портов A (GPA0- GPA7) и  B (GPB0- GPAB), каждый из которых можно настроить на ввод или вывод.
В листинге 5.3. показан пример настройки банков выводов A и B.

Листинг 5.3

// подключение библиотеки Wire.h 
#include <Wire.h> 
byte input=0;
void setup()
{
  Serial.begin(9600);
  Wire.begin(0,2);     // запуск I2C 
  Wire.beginTransmission(0x20);  // i2c – адрес (A0-0,A1-0,A2-0)
  Wire.write(0x00); // IODIRA register
  Wire.write(0x00); // настроить PORT A как output
  Wire.endTransmission();
}
 
void loop()
{
  // чтение данных из PORT B
  Wire.beginTransmission(0x20);
  Wire.write(0x13);
  Wire.endTransmission();
  Wire.requestFrom(0x20, 1);
  input=Wire.read();
 
  // записать полученные данные в PORT A
  Wire.beginTransmission(0x20);
  Wire.write(0x12); // address PORT A
  Wire.write(input);    // PORT A
  Wire.endTransmission();
  delay(100); // пауза
}



Использование микросхемы MCP23017 позволит расширить количество цифровых контактов модуля Nodemcu на 16 и позволит организовать светодиодную индикацию и звуковую сигнализацию о критических параметрах датчиков.  



Читать далее

● 5.5. Светодиодная индикация и звуковая сигнализация о критических параметрах датчиков для NodeMCU

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

Для светодиодной индикации будем использовать обычные светодиоды, которые подсоединим к микросхеме расширителя входов  MCP23017 (банку A выводы GPA0- GPA7). При подключении светодиодов используем ограничительные резисторы номиналом 150 Ом.  Для звуковой индикации будем использовать небольшой динамик (рис. 5.5). При подключении динамика к выводу NodeMcu используем npn-транзистор и резистор номиналом 510 Ом. Схема соединений для подключения светодиодов и динамика к модулю NodeMcu показана на рис. 5.9.


 
Рис. 5.9. Схема подключения светодиодов и динамика к модулю NodeMCU

Внесем дополнительный функционал в наш скетч. Создадим константы  граничных значений датчиков. В файл defines.h добавим:

// параметры датчиков для срабатывания
// светодиодной индикации и звуковой сигнализации
#define LIMIT_DHT22MIN 18           // влажность воздуха низкая
#define LIMIT_DHT22MAX 90           // влажность воздуха высокая
#define LIMIT_DS18B20MIN 15         // температура низкая
#define LIMIT_DS18B20MAX 30         // температура высокая
#define LIMIT_SOILMOISTUREMIN 300 // влажность почвы –
                                  // чрезмерная влажность
#define LIMIT_SOILMOISTUREMAX 600     // влажность почвы –
                                     // сухость
#define LIMIT_LEVELWATER 100          // вода
#define LIMIT_FAIR 100                // огонь
#define LIMIT_MQ2P 30                 // пропан
#define LIMIT_MQ2M 30                 // метан
#define LIMIT_MQ2S 30                 // дым
#define LIMIT_MQ7 30                  // CO



А также пин подключения динамика

// пин, к которому подключен динамик
#define SOUNDPIN         14



Далее в файле 05_05.ino создадим массивы состояний светодиодов, а также частот для звуковых оповещений:

// массив для хранения данных состояний светодиодов
int statusleds[]={0,0,0,0,0,0,0};
// массив для хранения частот и длительностей
// для звуковых оповещений
int freq[]={293,329,349,370,392,440,494};
int durations[]={3000,3000,3000,4000,4000,4000,4000};



Т.к. светодиоды подключены через 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();
}



Далее в цикле loop() после получения данных с датчика делаем обращение к процедуре проверке данных датчиков на критические значения:

// проверка данных на критичность
void control_data_limit(int par) {
   float val;
  
   switch(par) {
      case 0:  // DHT22
           val=datasensors[0];
           if((val<LIMIT_DHT22MIN || val>LIMIT_DHT22MAX) 
               && aktivesensors[0]==1) {
             set_status_sound(0);
             statusleds[0]=1;
           }
           else
             statusleds[0]=0;
           set_status_leds();
         break;        
      case 1:  // DS18B20
           val=datasensors[1];
           if((val<LIMIT_DS18B20MIN || val>LIMIT_DS18B20MAX)
               && aktivesensors[1]==1) {
             set_status_sound(1);
             statusleds[1]=1;
           }
           else
             statusleds[1]=0;
           set_status_leds();
         break;        
      case 2:  // SoilMoisture
           val=datasensors[2];
           if((val<LIMIT_SOILMOISTUREMIN
               || val>LIMIT_SOILMOISTUREMAX) 
                && aktivesensors[2]==1) {
             set_status_sound(2);
             statusleds[2]=1;
           }
           else
             statusleds[2]=0;
           set_status_leds();
         break;        
      case 3:  // waterlevel
           val=datasensors[3];
           if(val>LIMIT_LEVELWATER && aktivesensors[3]==1) {
             set_status_sound(3);
             statusleds[3]=1;
           }
           else
             statusleds[3]=0;
           set_status_leds();
         break;        
      case 4:  // fire
           val=datasensors[4];
           if(val>LIMIT_FAIR && aktivesensors[4]==1) {
             set_status_sound(4);
             statusleds[4]=1;
           }
           else
             statusleds[4]=0;
           set_status_leds();
         break;        
      case 5:  // mq2
           val=datasensors[5];
           if((datasensors[5]>LIMIT_MQ2P 
               || datasensors[6]>LIMIT_MQ2M
               || datasensors[7]>LIMIT_MQ2S)
               && aktivesensors[5]==1) {
             set_status_sound(5);
             statusleds[5]=1;
           }
           else
             statusleds[5]=0;
           set_status_leds();
         break;   
      case 6:  // mq7
           val=datasensors[8];
           if(val>LIMIT_MQ7 && aktivesensors[6]==1) {
             set_status_sound(6);
             statusleds[6]=1;
           }
           else
             statusleds[6]=0;
           set_status_leds();
         break;   
      default:     
         break;
   }
}



Функции set_status_leds() и set_status_sound() отвечают за свечение светодиода и вывод на динамик звука с помощью встроенной функции tone().
// индикация на светодиоды
void set_status_leds() {
  int leds=0;
  for(int i=0;i<7;i++)
     leds=leds+( statusleds[5]<<i);
  // записать данные в PORT A
  Wire.beginTransmission(0x20);
  Wire.write(0x12); // address PORT A
  Wire.write(leds);    // PORT A
  Wire.endTransmission();
  delay(100); // пауза
}
Встроенной функции tone() для ESP8266 нет, поэтому вывод звука происходит иначе.
// звуковая сигнализация
void set_status_sound(int par) {
  analogWriteFreq(freq[par]);
  analogWrite(SOUNDPIN,512);
  delay(durations[par]);
  analogWrite(SOUNDPIN,0);        
}
Для каждого датчика в случае критических значений выводится звук частотой и длительностью, определенной в массивах
int freq[]={293,329,349,370,392,440,494};
int durations[]={3000,3000,3000,4000,4000,4000,4000};

Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке.

 

Читать далее

● 6. Управление исполнительными устройствами

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

В предыдущих главах мы рассмотрели подключение датчиков – "органов чувств" нашего умного дома, которые позволяют контроллеру получать необходимые данные для создания необходимых условий комфорта и безопасности. Теперь мы рассмотрим следующую задачу – управление исполнителными устройствами.
Исполнительные устройства — это элементы автоматики, создающие управляющее воздействие на объект управления. Они изменяют положение или состояние регулирующего органа объекта управления таким образом, чтобы управляемый параметр соответствовал заданному значению. Исполнительное устройство или механизм (actuator) преобразует электрическую энергию в механическую или в физическую величину для воздействия на управляемый процесс. Это могут быть световые и звуковые устройства, электромагнитные клапаны, DC и AC моторы, сервоприводы, релейные системы и многое другое.
В нашем умном доме нам потребуются исполнительные устройсва для управление освещением умного дома, вентилятором для создания прохлады, увлажнителем для управления влажностью воздуха, помпой для полива растений, возможно для автоматического открытия/закрытия входных и гаражных дверей.
Рассмотрим организацию управления исполнительными устройствами нашего умного дома с контроллеров Arduino Mega и модуля NodeMCU.

Читать далее

Главное меню

Каталог

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

Цена
от
до