5.3. Светодиодная индикация и звуковая сигнализация о критических параметрах датчиков для Arduino MEGA
Введем светодиодную индикацию и звуковую сигнализацию, чтобы информировать вас о наступлении неблагоприятных климатических условиях или условиях, представляющих опасность для дома (пожар, утечка газов). Для светодиодной индикации будем использовать обычные светодиоды, которые подсоединим к цифровым выводам (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 по ссылке .



1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33 





 

Вверх