Espruino:Примеры/Терморезистор: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
(Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...»)
 
Нет описания правки
 
(не показано 5 промежуточных версий 2 участников)
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


=<ref>[ www.espruino.com - ]</ref>=
=Терморезистор<ref>[https://www.espruino.com/Thermistors www.espruino.com - Thermistors]</ref>=


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


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


<syntaxhighlight lang="javascript" enclose="div">
== Введение ==


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


=См.также=
=См.также=


{{ads}}
 


=Внешние ссылки=
=Внешние ссылки=
Строка 19: Строка 126:
<references />
<references />


{{Навигационная таблица/Espruino}}
{{Навигационная таблица/Портал/Espruino}}
{{Навигационная таблица/Телепорт}}

Текущая версия от 15:12, 28 мая 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);

Готово!

См.также

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