Как стать автором
Поиск
Написать публикацию
Обновить

Термометр на Arduino с использованием LCD

В ходе этой статьи я покажу как сделать комнатный термометр на Arduino, от подключения приборов и до кода.

image
Нам понадобится:
  1. Arduino (в моем случае — Leonardo, но может быть и любая другая)
  2. LCD-дисплей совместимый с HD44780 (16 символов, две строки)
  3. Макетная плата
  4. Потенциометр на 10кОм
  5. Датчик DS18B20, DS18S20 или же DS1822
  6. Резистор на 4.7кОм
  7. Соединительные провода


image

Для начала стоит отметить, что все LCD1602 идут без ножек с ходом в 2.54мм, так что стоит взять 16 таких ножек и припаять их к отверстиям на вашем LCD. Сделать это не сложно и справится с этим любой советский паяльник.

Нужно распределить все компоненты по макетной плате и подключить соединительные провода. Для начала воткнем LCD в макетную плату и подключим ножки «Vss» к -, а «Vdd» к +5В, тоже проделаем и с предпоследней и последней ножной — «А» к плюсу, а «К» к минусу.

Теперь нужно включить потенциометр — крайние ножки соединяем с + и — (полярность не важна), а центральную ножку подключим к «Vo» на дисплее. Теперь крутя ручку потенциометра можно регулировать контрастность.

Продолжим подключать дисплей — «RW» к минусу, «RS» — к 12 пину ардуино, а «E» — к 11.
От «D0» до «D3» не трогаем, а вот ножки от «D4» до «D7» соединяем с 5-2 пином соответственно.

Остается подключить DS18B20 или схожую модель — между ножками + и data ставим резистор на 4.7кОм, плюс и минус подключаем к плюсу и минусу Arduino, а вот data к 8 пину

Готово! Выглядит это так:

image
(на фото я загрузил в Arduino «hello, world!» из примеров к библиотеке LiquidCrystal.h)

Перед написанием кода скачайте библиотеку OneWire, она нам понадобится.

Перейдем к коду:
#include <LiquidCrystal.h>
#include <OneWire.h>

OneWire  ds(8);  // Подключаем датчик к 8 цифровому пину

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Подключаем LCD


void setup(void) 
{
  Serial.begin(9600);// Связь с ПК
  lcd.begin(16, 2); //16 знаков, 2 строки
  lcd.print("Temperature:"); //Печатаем верхнюю строку LCD
}

void loop(void) 
{
  byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  // Ищем алрес датчика
  if ( !ds.search(addr)) 
  {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  // Проверяем не было ли помех при передаче
  if (OneWire::crc8(addr, 7) != addr[7]) 
  {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // Определяем серию датчика
  switch (addr[0]) 
  {
    case 0x10:
      Serial.println("  Chip = DS18S20");  
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();            
  ds.select(addr);       // Выбираем адрес
  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
  delay(1000);    
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Считываем оперативную память датчика

  for ( i = 0; i < 9; i++) 
  {           
    data[i] = ds.read(); // Заполняем массив считанными данными
  }  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
  int16_t raw = (data[1] << 8) | data[0]; // Переводим температуру в шкалы по Цельсию и Фаренгейту  
  if (type_s) 
  {
    raw = raw << 3; 
  }
  if (data[7] == 0x10) 
  {
    raw = (raw & 0xFFF0) + 12 - data[6];
  } else {
    byte cfg =  (data[4] & 0x60);
    if (cfg == 0x00) 
      raw = raw << 3; 
    else if  (cfg == 0x20) 
      raw = raw << 2; 
    else if  (cfg == 0x40) \
      raw = raw << 1;
  }  
  celsius =  (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0; 
  
  Serial.print("Temp = "); //Пишем в ПК информацию
  Serial.print(celsius);
  Serial.print(" C, ");
  Serial.print(fahrenheit);
  Serial.println(" F");
  
  lcd.setCursor(0, 1); //Пишем в LCD на 2 строке
  lcd.print("C:"); 
  lcd.setCursor(2, 1); 
  lcd.print(celsius); //Цельсии
  lcd.setCursor(8, 1);
  lcd.print("F:");
  lcd.setCursor(10, 1); 
  lcd.print(fahrenheit); //Фаренгейты
 }


Остается загрузить код в Arduino, и мы увидим такое:

image
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.