5.5. Светодиодная индикация и звуковая сигнализация о критических параметрах датчиков для NodeMCU
Для светодиодной индикации будем использовать обычные светодиоды, которые подсоединим к микросхеме расширителя входов  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]<   // записать данные в 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 по ссылке.




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 

 

Вверх