Пожарная сигнализация

В этом примере мы соберем пожарную сигнализацию с применением термистора и буззера. Контроллер будет отслеживать температуру окружающей среды, измеряя сопротивление термистора, и включать сигнал тревоги, если температура превысит установленный предел. В качестве порога примем сопротивление термистора при комнатной температуре.
Используемый термистор принадлежит к NTC типу, значит его сопротивление падает с ростом температуры. Во время пожара воздух в помещении, а значит и корпус термистора нагревается, при этом сопротивление термистора падает. Для нагрева термистора мы не будем устраивать настоящий пожар. Достаточно взять термистор двумя пальцами или подышшать на него теплым воздухом. Температура тела примерно на 10 градусов выше комнатной температуры и этого вполне хватит для проведения эксперимента.
Для опыта необходимо сначала откалибровать датчик. Для этого соберем макетсхему и напишем программу для калибровки. Она будет точно такой же, как и программа для калибровки фоторезистора.

#define THERMISTOR_PIN A3
//Переменная для хранения значения АЦП
int value = 0;
void setup() {
  pinMode(THERMISTOR_PIN, INPUT);
  //Открытие соединения на скорости 9600
}
Serial.begin(9600);
void loop() {
  //Читаем результат полученный от АЦП
  value = analogRead(THERMISTOR_PIN);
  //Отправляем данные в терминал.
  Serial.println(value);
  delay(200);
}

Загрузите программу в контроллер и, открыв терминал, проведите калибровку, записав показания. В нашем случае эксперимент показал, что при комнатной температуре показания АЦП равны 478, если взять термистор пальцами, показания остепенно увеличиваются до 530, а если подышать на термистор, значение измеренное АЦП, переваливает за отметку 560. Это объяснимо, ведь температура пальцев всегда ниже, чем температура дыхания. Кроме того, в вашем случае данные могут немного отличаться.
Чтобы не было ложного срабатывания, примем в качестве порогового значения не 478, а немного большее значение, например, 490. Теперь напишем программу и загрузим в контроллер.

#define THERMISTOR_PIN A3
#define BUZZER_PIN 9
#define VALUE_LIMIT 490
//Границы диапазона значений АЦП
#define VALUE_MIN 490
#define VALUE_MAX 550
//Границы диапазона изменения периода/100, чтобы переключение было ступенчатым
//Так интереснее
#define MAX_BEEP_TIME 5
#define MIN_BEEP_TIME 1
int value = 0;
//Период в включения сигнала
int beepTime = 0;
bool isBeepOn = false;
void setup(){
pinMode(THERMISTOR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop(){
//Читаем результат измерения АЦП
value = analogRead(THERMISTOR_PIN);
//Меняем частоту звучания буззера
if (value > VALUE_LIMIT) {
beepTime = 100 * map(value,VALUE_MAX, VALUE_MIN,MIN_BEEP_TIME, MAX_BEEP_TIME);
if (isBeepOn) {
noTone(BUZZER_PIN);
} else {
tone(BUZZER_PIN, 5000);
}
isBeepOn = !isBeepOn;
delay(beepTime);
} else {
noTone(BUZZER_PIN);
delay(1000);
}
}