Espruino:Примеры/Терморезистор: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Терморезистор<ref>[https://www.espruino.com/Thermistors www.espruino.com - Thermistors]</ref>= | ||
Это руководство подразумевает, что вы уже умеете загружать код на Espruino. Если вы этого ещё делать не умеете, советуем сначала пройти это руководство. | |||
'''Примечание:''' Теперь есть модуль Thermistor, который выполняет все эти вычисления за вас, но это руководство пошагово покажет вам, как он работает. | |||
== Введение == | |||
Одна из самых полезных особенностей современных микроконтроллеров – это возможность ввода аналоговых данных. У чипов STM32, которыми оснащаются Espruino, некоторые контакты поддерживают ввод 12-битных аналоговых данных, и в этом руководстве мы расскажем, как использовать их для расчёта температуры при помощи терморезистора. | |||
Терморезисторы относительно дёшевы. Они оснащены двумя проводами, а их сопротивление меняется в зависимости от их температуры. Они могут быть маленькими, но они также используются почти во всех автомобилях для определения атмосферного давления и температуры воды, и в этих случаях они упакованы в прочные водонепроницаемые модули. Я для этого руководства воспользовался терморезистором, который откопал в своей куче хлама. | |||
Терморезисторы бывают разных типов, и их сопротивление может меняться по-разному. Многие производители создают специальную таблицу, где связывают значения температуры и сопротивления своих терморезисторов, но вы также можете рассчитать температуру сами на основе сопротивления при помощи уравнения Стейнхарта-Харта. | |||
Чтобы понять, к какому типу принадлежит ваш резистор, сначала измерьте его сопротивление, заодно определив температуру, которая на него в данный момент воздействует. Затем погуглите «таблица сопротивления терморезисторов» и по ней примерно прикиньте, какой терморезистор лучше всего соответствует вашим данным (типы резисторов, как правило, получают свои названия по сопротивлению при температуре 25°C). Это должно быть очень просто – мой терморезистор показывал 6 кОм при 20°C, так что я определил его как 5 кОм при 25°C. | |||
Определив тип терморезистора, поищите в интернете уравнение – например, «5к терморезистор уравнение». В моём случае нашлось уравнение Стейнхарта-Харта и коэффициенты к нему: | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
W = log(R) | |||
T = 1 / (A + B*W + C*W3) | |||
A: 1.2874E-03 | |||
B: 2.3573E-04 | |||
C: 9.5052E-08 | |||
</syntaxhighlight> | |||
'''Примечание:'''Получившаяся температура будет в градусах Кельвина, так что вам нужно будет вычесть 273.15, чтобы получить градусы Цельсия. | |||
== Подсоединение == | |||
'''Дисклеймер:''' Это не самый аккуратный способ подключения терморезистора – но зато рабочий и очень простой! | |||
Найдите резистор, чьё сопротивление примерно соответствует сопротивлению вашего терморезистора. Я решил воспользоваться терморезистором на 5.6 кОм, т.к. это стандартное значение (а мой сопротивление моего терморезистора – 5 кОм). | |||
Выберите 3 находящихся рядом друг с другом контакта, но с учётом того, что средний из этих контактов должен поддерживать ввод аналоговых данных. Чтобы узнать, какие контакты вашей Espruino поддерживают ввод аналоговых данных, воспользуйтесь функцией analogRead(). Я использую Olimexino, так что решил воспользоваться контактами C0, C1 и C2. Если вы используете какие-то другие контакты, задайте именно их названия в коде ниже. | |||
Затем подключите эти контакты следующим образом: | |||
{| class="wikitable" | |||
|- | |||
! Название контакта !! Что подключать | |||
|- | |||
| C0 || Один из двух проводов терморезистора | |||
|- | |||
| C1 || Другой провод терморезистора А ТАКЖЕ один из проводов резистора | |||
|- | |||
| C2 || Другой провод резистора | |||
|} | |||
На первом контакте будет 0 вольт, на третьем – 3.3 вольта (напряжение чипа), а при помощи среднего контакта мы будем считывать напряжение. | |||
== Код == | |||
Теперь, когда всё подключено, давайте займёмся кодом! Во-первых, давайте подадим на первый и третий контакты, соответственно, 0 и 3.3 вольта: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
digitalWrite(C0, 0); | |||
digitalWrite(C2, 1); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
А на среднем контакте будем считывать напряжение: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
analogRead(C1) | |||
</syntaxhighlight> | |||
Это должно показать что-то вроде «0.543» (это значение между 0 и 1). | |||
Теперь мы на основе этого значения рассчитаем сопротивление в омах. Поскольку мы создали делитель напряжения, значение напряжения будет рассчитываться по следующей формуле: | |||
'''V = Rt / (Rt + Rr)''' | |||
Здесь Rt – это сопротивление терморезистора, а Rr – это сопротивление резистора. Теперь давайте применим немного алгебры и рассчитаем значение Rt. Оно будет таким: | |||
'''Rt = Rr*V / (1-V)''' | |||
А теперь давайте поместим всё это в функцию: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
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; // и возвращаем температуру | |||
} | |||
</syntaxhighlight> | |||
Теперь осталось написать лишь: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
getTemp() | |||
</syntaxhighlight> | |||
И эта функция покажет температуру в градусах Цельсия. | |||
Теперь вы можете, например, подключить вентилятор, и запрограммировать его включение, когда будет становиться слишком жарко. Я не буду описывать здесь подключение вентилятора – вместо этого мы просто будем включать светодиод. | |||
Давайте напишем функцию, которая будет каждую секунду проверять температуру, и если она будет выше 25°C – включать светодиод на плате. | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
function checkTemp() { | |||
var temp = getTemp(); | |||
digitalWrite(LED1, temp > 25); | |||
} | |||
setInterval(checkTemp, 1000); | |||
</syntaxhighlight> | |||
Готово! | |||
=См.также= | =См.также= |
Версия от 18:31, 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);
Готово!
См.также
Внешние ссылки