Изучаем Arduino: инструметы и методы технического волшебства - [17]

Шрифт
Интервал

- 74 -

Прежде всего, определите приемлемый для вас температурный диапазон. Используя программу из листинга 3.1, определите аналоговые значения для верхнего и нижнего порогов температуры. Для меня нижний порог комфортной температуры составляет 20°С, что соответствует аналоговому значению 143. У вас эта цифра может быть другой. Следите за показаниями в мониторе последовательного порта при наступлении нижнего и верхнего предела температуры. Эти значения можно получить из графика на рис. 3.7 или из формулы, связывающей температуру (в °С) с входным напряжением (в мВ):

Температура (°С)х10 = Напряжение (мВ)- 500.

Напряжение 700 мВ соответствует температуре 20°С. Расчет по формуле (или просто анализ показаний монитора последовательного порта) дает для 22°С цифровое значение 147, для 18°С- 139. Эти величины выберем для нижнего и верхнего значений комфортной температуры, чтобы изменять цвет светодиода. Функция analogRead() будет считывать показания датчика температуры, digitalWrite() устанавливать цвет светодиода.

Совет Рекомендую вам не копировать листинг 3.2, а попробовать написать текст программы самостоятельно, чтобы убедиться в своих силах. Сравните свой результат с приведенным далее.

Листинг 3.2. Программа температурного оповещателя - tempalert.ino

// Температурный оповещатель

// Контакт

const int BLED=9; // Контакт 9 для вывода BLUE RGB-светодиода

const int GLED=10; // Контакт 9 для вывода GREEN RGB-светодиода

const int RLED=11; // Контакт 9 для вывода RED RGB-светодиода

const int TEMP=0; // A0 для подключения датчика температуры

const int LOWER_BOUND=139; // Нижний порог

const int UPPER_BOUND=147; // Верхний порог

int val = 0; // Переменная для чтения аналогового значения


void setup()

{

pinMode(BLED, OUTPUT); // Сконфигурировать BLUE контакт светодиода как выход

pinMode(GLED, OUTPUT); // - - GREEN - -

pinMode(RLED, OUTPUT); // - - RED - -

}

void loop()

{

val = analogRead(TEMP);

- 75 -

if (val < LOWER_BOUND)

{

digitalWrite(RLED, LOW);

digitalWrite(GLED, LOW);

digitalWrite(BLED, HIGH);

}

else if (val > UPPER_BOUND)

{

digitalWrite(RLED, HIGH);

digitalWrite(GLED, LOW);

digitalWrite(BLED, LOW);

}

else

{

digitalWrite(RLED, LOW);

digitalWrite(GLED, HIGH);

digitalWrite(BLED, LOW);

}

}

В коде листинга 3.2 нет ничего принципиально нового, он сочетает в себе все изложенное ранее о системах, взаимодействующих с окружающей средой и платой Arduino.

3.8. Использование переменных резисторов для создания собственных аналоговых датчиков

Благодаря достижениям в области физики, мы имеем множество материалов, способных изменять сопротивление в результате физического воздействия. Например, проводящие краски изменяют свое сопротивление при изгибе и скручивании, полупроводники меняют сопротивление под действием света ( фоторезисторы), сопротивление некоторых материалов зависит от нагрева и охлаждения (термисторы).

Это всего лишь несколько примеров, которые позволят создать свои собственные аналоговые датчики.

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

3.9. Резистивный делитель напряжения

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

- 76 -

Рассмотрим нерегулируемый резистивный делитель (рис. 3.9) и напряжение на его выходе. Обозначение A0 на рис. 3.9- это аналоговый вход A0 на плате Arduino.

Зависимость выходного напряжения делителя от входного:

U>вых = U>вх (R2/(R1 + R2)).

В нашем случае на вход делителя подано напряжение 5 В, а выход подключен к аналоговому контакту A0 платы Arduino. Если R1 и R2 одинаковы (как, например, 10 кОм), то 5 В делится пополам, и на аналоговом входе будет 2,5 В. Проверьте это, подставив значения в формулу:

U>вых = 5 В (10 кОм/(10 кОм+ 10 кОм))= 2,5 В.


Рис. 3.9. Простой делитель напряжения

Рис. 3.10. Фоторезистор

Теперь предположим, что один из этих резисторов переменный, например фоторезистор (рис. 3.1 0). Сопротивление фоторезистора зависит от интенсивности падающего на него света. Я использовал фоторезистор с номинальным сопротивлением 200 кОм. В полной темноте его сопротивление около 200 кОм, при ярком свете оно падает почти до нуля. От того, какой резистор (R1 или R2) поменять на фоторезистор, и от номинала постоянного резистора будет зависеть масштаб и точность показаний. Попробуйте поэкспериментировать с различными конфигурациями и посмотрите через монитор последовательного порта, как меняются показания.

В качестве примера заменим R1 на фоторезистор, а R2 возьмем постоянным с номиналом 10 кОм (рис. 3.11 ). Для данного упражнения можно оставить на плате RGB-светодиод и подключить его как одноцветный.

Загрузите программу считывания аналоговых данных и выдачи результата в последовательный порт ( см. листинг 3.1) и поменяйте освещенность фоторезистора. Вы не сможете получить весь диапазон значений от 0 до 1023, потому что у фоторезистора никогда не будет нулевого сопротивления. В результате вы определите минимальное и максимальное значения напряжения на выходе. Эти данные потребуются, чтобы сделать "интеллектуальный" ночник, который будет светить более ярко в темном помещении, и наоборот. Выберите аналоговые значения для вашей комнаты, соответствующие темноте и максимальной освещенности. У меня это бы