Espruino:Примеры/Терморезистор: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 11: | Строка 11: | ||
== Введение == | == Введение == | ||
Одна из самых полезных особенностей современных | Одна из самых полезных особенностей современных [[микроконтроллер]]ов – это возможность ввода аналоговых данных. У чипов [[STM32]], которыми оснащаются [[Espruino]], некоторые контакты поддерживают ввод 12-битных аналоговых данных, и в этом руководстве мы расскажем, как использовать их для расчёта температуры при помощи [[терморезистор]]а. | ||
[[Терморезистор]]ы относительно дёшевы. Они оснащены двумя проводами, а их сопротивление меняется в зависимости от их температуры. Они могут быть маленькими, но они также используются почти во всех автомобилях для определения атмосферного давления и температуры воды, и в этих случаях они упакованы в прочные водонепроницаемые модули. Я для этого руководства воспользовался [[терморезистор]]ом, который откопал в своей куче хлама. | |||
[[Терморезистор]]ы бывают разных типов, и их сопротивление может меняться по-разному. Многие производители создают специальную таблицу, где связывают значения температуры и сопротивления своих [[терморезистор]]ов, но вы также можете рассчитать температуру сами на основе сопротивления при помощи уравнения Стейнхарта-Харта. | |||
Определив тип | Чтобы понять, к какому типу принадлежит ваш [[резистор]], сначала измерьте его сопротивление, заодно определив температуру, которая на него в данный момент воздействует. Затем погуглите ''«таблица сопротивления терморезисторов»'' и по ней примерно прикиньте, какой [[терморезистор]] лучше всего соответствует вашим данным (типы [[резистор]]ов, как правило, получают свои названия по сопротивлению при температуре 25°C). Это должно быть очень просто – мой терморезистор показывал 6 кОм при 20°C, так что я определил его как 5 кОм при 25°C. | ||
Определив тип [[терморезистор]]а, поищите в интернете уравнение – например, ''«5к терморезистор уравнение»''. В моём случае нашлось уравнение Стейнхарта-Харта и коэффициенты к нему: | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
Строка 34: | Строка 35: | ||
'''Дисклеймер:''' Это не самый аккуратный способ подключения [[терморезистор]]а – но зато рабочий и очень простой! | '''Дисклеймер:''' Это не самый аккуратный способ подключения [[терморезистор]]а – но зато рабочий и очень простой! | ||
Найдите резистор, чьё сопротивление примерно соответствует сопротивлению вашего [[терморезистор]]а. Я решил воспользоваться терморезистором на 5.6 кОм, т.к. это стандартное значение (а мой сопротивление моего | Найдите резистор, чьё сопротивление примерно соответствует сопротивлению вашего [[терморезистор]]а. Я решил воспользоваться терморезистором на 5.6 кОм, т.к. это стандартное значение (а мой сопротивление моего [[терморезистор]]а – 5 кОм). | ||
Выберите 3 находящихся рядом друг с другом контакта, но с учётом того, что средний из этих контактов должен поддерживать ввод аналоговых данных. Чтобы узнать, какие контакты вашей [[Espruino]] поддерживают ввод аналоговых данных, воспользуйтесь функцией [[analogRead()]]. Я использую [[Olimexino]], так что решил воспользоваться контактами '''C0''', '''C1''' и '''C2'''. Если вы используете какие-то другие контакты, задайте именно их названия в коде ниже. | Выберите 3 находящихся рядом друг с другом контакта, но с учётом того, что средний из этих контактов должен поддерживать ввод аналоговых данных. Чтобы узнать, какие контакты вашей [[Espruino]] поддерживают ввод аналоговых данных, воспользуйтесь функцией [[analogRead()]]. Я использую [[Olimexino]], так что решил воспользоваться контактами '''C0''', '''C1''' и '''C2'''. Если вы используете какие-то другие контакты, задайте именно их названия в коде ниже. | ||
Строка 74: | Строка 75: | ||
'''V = Rt / (Rt + Rr)''' | '''V = Rt / (Rt + Rr)''' | ||
Здесь '''Rt''' – это сопротивление | Здесь '''Rt''' – это сопротивление [[терморезистор]]а, а '''Rr''' – это сопротивление [[резистор]]а. Теперь давайте применим немного алгебры и рассчитаем значение '''Rt'''. Оно будет таким: | ||
'''Rt = Rr*V / (1-V)''' | '''Rt = Rr*V / (1-V)''' | ||
Строка 103: | Строка 104: | ||
И эта функция покажет температуру в градусах Цельсия. | И эта функция покажет температуру в градусах Цельсия. | ||
Теперь вы можете, например, подключить вентилятор, и запрограммировать его включение, когда будет становиться слишком жарко. Я не буду описывать здесь подключение | Теперь вы можете, например, подключить вентилятор, и запрограммировать его включение, когда будет становиться слишком жарко. Я не буду описывать здесь подключение [[вентилятор]]а – вместо этого мы просто будем включать [[светодиод]]. | ||
Давайте напишем функцию, которая будет каждую секунду проверять температуру, и если она будет выше 25°C – включать светодиод на плате. | Давайте напишем функцию, которая будет каждую секунду проверять температуру, и если она будет выше 25°C – включать [[светодиод]] на плате. | ||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> |
Версия от 18:34, 14 июля 2021
Терморезистор[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);
Готово!
См.также
Внешние ссылки