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