Espruino:Примеры/Терморезистор
Терморезистор[1]
Это руководство подразумевает, что вы уже умеете загружать код на Espruino. Если вы этого ещё делать не умеете, советуем сначала пройти это руководство.
Введение
Одна из самых полезных особенностей современных микроконтроллеров – это возможность ввода аналоговых данных. У чипов 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
Подсоединение
Дисклеймер: Это не самый аккуратный способ подключения терморезистора – но зато рабочий и очень простой!
Найдите резистор, чьё сопротивление примерно соответствует сопротивлению вашего терморезистора. Я решил воспользоваться терморезистором на 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);
Готово!
См.также
Внешние ссылки