Электроника и железло

Измеритель температуры с Arduino

В прошлом посте я рассказал что такое делитель напряжения, мы научились его рассчитывать и узнали где его используют. Сегодня мы применим наши знания на деле, а именно — сделаем измеритель температуры, который будет выводить на экран монитора текущее значение температуры в условных единицах, а также, в определённых пределах — с ростом температуры мы заставим гореть светодиод ярче, а при понижении температуры — тусклее и тусклее. Поехали!

Для этого нам понадобятся следующие компоненты нашего Arduino

Необходимые компоненты

  • Резистор 10 [кОм]
  • Резистор 220 [Ом]
  • Термистор
  • Светодиод
Схема включения делителя напряжения

Схема включения делителя напряжения

Схема подключения представлена выше, контакт A подключаем к 5 вольтовому разъёму Arduino, контакт B к земле, а контакт b к первому аналоговому разъёму Arduino (A0). Вместо первого резистора (R1) подключаем термистор, а второй (R2) так и оставляем — резистор на 10 [кОм]. Кроме того, нам необходимо ещё подключить светодиод — запитываем его из 11 порта и соединяем через резистор 220 [Ом] с землёй.

// Указываем номер порта для датчика температуры (А0)
int tempPin = 0;
// Указываем номер порта для светодиода
int ledPin = 11;

//  Описываем настройки программы
void setup() {
  // Устанавливаем порт ledPin как выход
  pinMode(ledPin, OUTPUT);

  // Запускаем чтение данных с сериал порта со скоростью 9600 бод\сек (стандартная скорость)
  Serial.begin(9600);
}

//  Описываем цикл программы
void loop() {
  // Считываем значение с аналогового порта
  int temp = analogRead(tempPin);
  // Выводим на монитор считанное значение (ctrl+shift+M для просмотра консоли)
  Serial.println(temp);
  // Делаем задержку на 1 секунду
  delay(1000);

  // "обрезаем" значения температуры в пределах от 316 до 336. Всё что меньше нижнего предела станет равно 316, а всё что больше - 336
  temp = constrain(temp, 316, 336);
  // Соотносим шкалы: при значении переменной temp 316 - значение ledLevel будет равно 0, ну а при 336 - 255.
  int ledLevel = map(temp, 316, 336, 0, 255);

  // Передаём значение на светодиод
  analogWrite(ledPin, ledLevel);
}

Вот и всё! Таким образом, мы каждую секунду будем получать циферку в консоли (ctrl+shift+M), соответствующую изменению температуры, и в определённом интервале температуры наш светодиод будет гореть тем интенсивнее (или не гореть вообще), чем ближе температура к верхней границе этого интервала.

Аналогичным образом можно сделать простой ночник, который будет регулировать яркость светодиода в зависимости от освещённости в комнате. Всё что надо будет для этого поменять, так это заменить термистор на фоторезистор, и в функции map пере обозначить соответствие шкал — при увеличении освещённости — уменьшать к нулю яркость светодиода, и наоборот.

А какие результаты получились у вас? Пишите ваши комментарии, вопросы, пожелания и предложения в комментариях к этому посту — я обязательно на них отвечу.  И не забывайте рассказать о серии моих постов об Arduino вашим друзьям. До скорых встреч!

  • класс!
    по оси y какие ед. измерения в графике, вижу трёхзназные числа?
    илья, waiting for примеры с двигателем 🙂
    ещё эта среда http://www.openframeworks.cc работает с ардуино 🙂

    • Ответ для саша: Это значения напряжения на аналоговом входе от 0 до 1023. К сожалению, для идущего в комплекте с Arduino термистора, не удалось найти нормального datasheet. Обычно в них приведены пределы нормальной работы термисторов и таблица (график) сопротивления термистора в зависимости от температуры. То есть, имея эти данные — можно было бы построить по ним функцию зависимости R от T и заставить Arduino пересчитывать эти показания в градусы Целься например.

      Проблему можно решить покупкой термистора в хорошем магазине электроники — там обычно есть даташит.

      Примеры по двигателю постараюсь в течении августа выложить. Пока не удаётся совладать с хитрыми винтиками у жёстких дисков — обычной отвёрткой взял 5 винтиков из 6 — последний оказался героически сильно затянут. В итоге отломал отвёртку 🙂

    • В мечтах сделать робота. Набор с лего уже достал. Осталось разобраться с двигателем — изучить это дело, ну и сделать какую-то передачу от двигателя к колёсам.

  • чёткая статья, ед. только смутили 🙂

    конечно давай мехатрона делай 🙂

    • Ответ для саша: В маленьких диапазонах температур можно считать что дельта U = дельта T. Ведь вид зависимости сопротивления от температуры — экспоненциальный для всех типов термисторов и термо-проводников

  • Maxi

    как Вы построили график из данных, приходящих с ком порта?

    • Ответ для Maxi: График построен в экселе. Я использовал модуль для работы с SD-картами и записывал считанные данные в эксель файл, который потом скопировал с флэшки, открыл на компьютере и сам построил график. Посмотрите эту статью — http://www.zhitenev.ru/arduino-rabotaem-s-sd-kartami/ — там описан процесс и реализация этого устройства.