Espruino:Примеры/Терморезистор

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Терморезистор[1]

Это руководство подразумевает, что вы уже умеете загружать код на Espruino. Если вы этого ещё делать не умеете, советуем сначала пройти это руководство.

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

Введение

Одна из самых полезных особенностей современных микроконтроллеров – это возможность ввода аналоговых данных. У чипов STM32, которыми оснащаются Espruino, некоторые контакты поддерживают ввод 12-битных аналоговых данных, и в этом руководстве мы расскажем, как использовать их для расчёта температуры при помощи терморезистора.

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

Терморезисторы бывают разных типов, и их сопротивление может меняться по-разному. Многие производители создают специальную таблицу, где связывают значения температуры и сопротивления своих терморезисторов, но вы также можете рассчитать температуру сами на основе сопротивления при помощи уравнения Стейнхарта-Харта.

Чтобы понять, к какому типу принадлежит ваш резистор, сначала измерьте его сопротивление, заодно определив температуру, которая на него в данный момент воздействует. Затем погуглите «таблица сопротивления терморезисторов» и по ней примерно прикиньте, какой терморезистор лучше всего соответствует вашим данным (типы резисторов, как правило, получают свои названия по сопротивлению при температуре 25°C). Это должно быть очень просто – мой терморезистор показывал 6 кОм при 20°C, так что я определил его как 5 кОм при 25°C.

Определив тип терморезистора, поищите в интернете уравнение – например, «5к терморезистор уравнение». В моём случае нашлось уравнение Стейнхарта-Харта и коэффициенты к нему:

W = log(R)
T = 1 / (A + B*W + C*W3)
A: 1.2874E-03 
B: 2.3573E-04 
C: 9.5052E-08

Примечание:Получившаяся температура будет в градусах Кельвина, так что вам нужно будет вычесть 273.15, чтобы получить градусы Цельсия.

Подсоединение

Дисклеймер: Это не самый аккуратный способ подключения терморезистора – но зато рабочий и очень простой!

Найдите резистор, чьё сопротивление примерно соответствует сопротивлению вашего терморезистора. Я решил воспользоваться терморезистором на 5.6 кОм, т.к. это стандартное значение (а мой сопротивление моего терморезистора – 5 кОм).

Выберите 3 находящихся рядом друг с другом контакта, но с учётом того, что средний из этих контактов должен поддерживать ввод аналоговых данных. Чтобы узнать, какие контакты вашей Espruino поддерживают ввод аналоговых данных, воспользуйтесь функцией analogRead(). Я использую Olimexino, так что решил воспользоваться контактами C0, C1 и C2. Если вы используете какие-то другие контакты, задайте именно их названия в коде ниже.

Затем подключите эти контакты следующим образом:

Название контакта Что подключать
C0 Один из двух проводов терморезистора
C1 Другой провод терморезистора А ТАКЖЕ один из проводов резистора
C2 Другой провод резистора

На первом контакте будет 0 вольт, на третьем – 3.3 вольта (напряжение чипа), а при помощи среднего контакта мы будем считывать напряжение.

Код

Теперь, когда всё подключено, давайте займёмся кодом! Во-первых, давайте подадим на первый и третий контакты, соответственно, 0 и 3.3 вольта:

digitalWrite(C0, 0);
digitalWrite(C2, 1);

А на среднем контакте будем считывать напряжение:

analogRead(C1)

Это должно показать что-то вроде «0.543» (это значение между 0 и 1).

Теперь мы на основе этого значения рассчитаем сопротивление в омах. Поскольку мы создали делитель напряжения, значение напряжения будет рассчитываться по следующей формуле:

V = Rt / (Rt + Rr)

Здесь Rt – это сопротивление терморезистора, а Rr – это сопротивление резистора. Теперь давайте применим немного алгебры и рассчитаем значение Rt. Оно будет таким:

Rt = Rr*V / (1-V)

А теперь давайте поместим всё это в функцию:

function getTemp() {
  digitalWrite(C0,0); // задаём 0 вольт на контакте C0
  digitalWrite(C2,1); // задаём 3.3 вольта на контакте C2
  var val = analogRead(C1); // считываем напряжение
  var ohms = 5600*val/(1-val); // рассчитываем омы
  var A = 0.0012874; // уравнение Стейнхарта-Харта 
  var B = 0.00023573;
  var C = 0.000000095052;
  var W = Math.log(ohms);
  var temp = 1 / (A + W * (B+C * W*W)) - 273.15;
  return temp; // и возвращаем температуру
}

Теперь осталось написать лишь:

getTemp()

И эта функция покажет температуру в градусах Цельсия.

Теперь вы можете, например, подключить вентилятор, и запрограммировать его включение, когда будет становиться слишком жарко. Я не буду описывать здесь подключение вентилятора – вместо этого мы просто будем включать светодиод.

Давайте напишем функцию, которая будет каждую секунду проверять температуру, и если она будет выше 25°C – включать светодиод на плате.

function checkTemp() {
 var temp = getTemp();
 digitalWrite(LED1, temp > 25);
}
setInterval(checkTemp, 1000);

Готово!

См.также

Внешние ссылки