Espruino:Примеры/Терморезистор: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
Строка 120: | Строка 120: | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 126: | Строка 126: | ||
<references /> | <references /> | ||
{{Навигационная таблица/Espruino | {{Навигационная таблица/Портал/Espruino}} | ||
Версия от 15:08, 20 мая 2023
Терморезистор[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);
Готово!
См.также
Внешние ссылки