Практическое использование термистора с Arduino

image

Здравствуй, Хабрасообщество. После прочтения нескольких статей на хабе Arduino я загорелся заполучить эту игрушку. И вот недавно получил посылку с платой. Затем побаловался со светодиодами и захотел чего-нибудь посерьёзнее. Решил сделать простейший термометр, используя всего термистор, резистор на 10 кОм и LCD дисплей. Кому интересно что получилось — прошу под кат.


Начало



Термистор — это переменный резистор, меняющий своё сопротивление в зависимости от температуры окружающей среды.

Нам потребуются следующие детали:
Arduino Uno — 1 шт
Термистор — 1 шт
Резистор c сопротивлением 10 кОм — 1 шт
LCD дисплей HJ1602A — 1 шт
Соединительные перемычки — несколько штук

Всё это у меня было, поэтому я сразу начал проектирование на breadboard.

Ножки к экрану я еще припаял в день покупки.
image

Затем присоединяем экран к выходам Arduino. У моего экрана распиновка такая.

1 (GND) GND — Земля
2 (VDD) 5v — Питание(+)
3 (VO/Contrast) — Управление контрастностью (сюда я подключил переменный резистор)
4 (RS) — 12 — Канал данных
5 (RW) — 11 — Канал данных
6 (E) — 10 — Канал данных
11 (DB4) — 5 — Канал данных
12 (DB5) — 4 — Канал данных
13 (DB6) — 3 — Канал данных
14 (DB7) — 2 — Канал данных
15 (BL1/Backlight1) — 13 — Питание подсветки(+)
16 (BL2/Backlight2) — GND — Земля(-)

Получилась вот такая картина.
image

Далее подключим одну ногу термистора к аналоговому входу A4 и резистор на 10 кОм в землю, а вторую ногу термистора к 5V.
image

В общем то и всё. Аппаратная часть готова. Вот схема.
image

Программирование



С программированием тут всё понятно. Исходный код скетча:

// подключаем две библиотеки для работы с LCD и математических вычислений
#include <LiquidCrystal.h>
#include <math.h>


LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD

int backLight = 13;

void setup(void) {
  pinMode(backLight, OUTPUT);
  
  digitalWrite(backLight, HIGH); 
  lcd.begin(16, 2);             
  lcd.clear();                  
  lcd.setCursor(0,0);   

}

 // создаем метод для перевода показаний сенсора в градусы Цельсия 
double Getterm(int RawADC) {
  double temp;
  temp = log(((10240000/RawADC) - 10000));
  temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
  temp = temp - 273.15;
  return temp;
}

// создаем метод для вывода на экран показаний сенсора
void printTemp(void) { 
  double temp = Getterm(analogRead(4));  // считываем показания с сенсора
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temperature is:");
  lcd.setCursor(0,1);
  lcd.print(temp);
  lcd.print(" C");
  
  }


void loop(void) {
  printTemp(); // вызываем метод, созданный ранее
  delay(1000);
}


Результат работы программы.
image

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 26

    +2
    Неплохое начало для новичка. У автора получилась незатейливая инструкция, по которой можно выполнить свой первый проект.
      +1
      Нуждается ли датчик в калибровке?
      Магические константы «0.001129148», «0.000234125» и «0.0000000876741» одни и те же для всех термисторов или только для конкретного типа/номинала?
      Если не сложно, расскажите подробнее, по каким законам сопротивление зависит от температуры.
        +7
        Нет, датчик я не калибровал, хотя заметил, что всё таки некоторая погрешность присутствует (± 1°C), поэтому калибровка желательна. Константы разные под разные термисторы. У меня термистор, сопротивление которого при 25°C равно 10 кОм. На википедии приводятся значения этих констант под термистор, сопротивление которого при 25°C равно 3 кОм en.wikipedia.org/wiki/Thermistor

        Зависимость сопротивления от температуры определяется формулой Стейнхарта и Харта
        1/T = a+b(lnR)+c(lnR)3

        T — температура в Кельвинах
        R — сопротивление
        a, b, c — константы термистора, выведенные эмпирически или найденные в документации к термистору.
        –2
        Хотелось бы поподробнее про подключение LCD, передачу данных и, непосредственно, отображение, а то как-то суховато («получилась такая картина»).
          +1
          Все LCD такого типа выполнены на базе контроллера HD44780 либо его аналоге.
          Вот он.
          В сети информации по нему огромное количество даже на русском т.к. выпускаются они уже наверно лет 15.
            0
            Все же есть в документации, да, и на хабре не раз описано было, например.
            +4
            Есть к чему еще стремиться! Советую следующим этапом усовершенствовать данную схему, включив в нее сдвиговый регистр 74HC595, что позволит сократить количество используемых пинов на ардуино и познакомит с SPI.
            Про саму 74HC595
            Удачи!
              +2
              Спасибо за ссылку! В следующем проекте постараюсь использовать сдвиговый регистр.
                0
                Коли так, то как автор вышеупомянутой статьи, предлагаю прочитать ещё вот эту статью, где я рассказал, как можно подключить LCD и сервомашинки через сдвиговый регистр. Но первая статья тоже нужна — для понимания принципа работы сдвигового регистра.
              +1
              Хорошая статья, но сразу скажу, что термистор — дрянь :) Я недавно возился с попытками подключить температурный сенсор KTY82 (фактически тот же термистор) к Ардуине и проклял тот день, когда за это взялся.

              Три разных экземпляра выдавали разные показания. Да и показания с него нужно снимать при токе 1 мА. Я сделал такой же делитель, как и у вас с резистором в 10К, но найти что-то близкое к 10К крайне сложно — так что у меня был 9.9К, что естественно давало свою погрешность. Молчу уже за то, что зависимость сопротивления от температуры у них нифига не линейная %)

              Короче, мой вам совет — используйте что-то типа DS18B20.
                +1
                В том то и дело, что я использовал термистор для того, чтобы понять как он работает и понять алгоритм перевода значений :) А так, если бы мне нужен был термометр, то я бы использовал стабильный и откалиброванный цифровой датчик температуры, например DHT11 или DS18B20.
                  0
                  Хм, я этот DS18B20 в банку с тающим снегом пихал — показывает +2 (впрочем в даташите так и написано: -+2 градуса). И вообще создалось впечатление что он всегда на 2 градуса завышает (или плавает?).
                  Вот интересно, если DS18B20 «откалибровать» в помощью DS1820 (у которого -+0.5 градуса) — мы не на конвейере, время есть — он будет показывать с такой же точностью? Или все-таки плавают у него показания?
                    0
                    термистор дрянь — так Вы, батенька, его бы через генератор тока запитывали (чтоб исключить изменение тока от изменения сопротивления) — глядишь точность бы и устроила, не?
                      0
                      все равно это не решает проблему не линейности сопротивления и возню с монструозными коэффициентами. Да и смысла нет ваять еще и генератор — дешевле будет DS1820 купить :)
                    –1
                    Молодцы, конечно. Не ради критики, но все же, чем ценна ваша статья для сообщества? Ведь статей уровня «мигание светодиодами» вагоны и маленькие тележки… да, и в документации подобный уровень описан.
                    Возьмите задачу поинтересней, чтобы и читать было интересно. И успехов вам в освоении мк и интересных идей!
                      0
                      Спасибо за комментарий. Интересную задачу уже себе взял на заметку, осталось докупить пару деталей и начну над ней работать.
                      0
                      Ой, воспользуюсь моментом и спрошу:
                      а вот это (вытащил из аккумулятора ноута toshiba):

                      термисторы?
                        0
                        Термопары? Не разобрать по фото.
                          0
                          Вряд ли термопары. Обрабатывать сигнал с них — еще больший геморрой. Их ставят только там, где нужна жаростойкость: во всякие печки и паяльники.
                          Так что, вероятнее всего, термисторы.
                        0
                        Электрическую схему представили бы (кстати в чем их лучше рисовать?)
                          0
                          Не могу понять что это на фотографии. По крайней мере я таких термисторов не встречал.
                          Схемы лучше рисовать во Fritzing.
                          0
                          лично я рисую в Eagle — замечательная вещь!
                            0
                            Можно также в DipTrace. Кстати, это единственный интуитивно понятный мне, программисту, пакет для разработки плат.
                            0
                            В свое время делал температурный регулятор вентилятора на основе Arduino
                              0
                              Подскажите, а откуда брали коэффициенты, по которым значение напряжения на А4 переводится в градусы? Имперический метод или есть какие-либо конкретные указания?
                                0
                                Я их нашел в документации к термистору.

                              Only users with full accounts can post comments. Log in, please.