Главная » Микроконтроллеры » ATtiny13 — регистратор температуры с использованием LM35 и UART

ATtiny13 — регистратор температуры с использованием LM35 и UART

Этот проект посвящен простой системе регистрации температуры с использованием микроконтроллера ATtiny13 и программного обеспечения UART.

Блок питания 0...30 В / 3A
Набор для сборки регулируемого блока питания...
Подробнее

Система считывает температуру каждую секунду и отображает ее в монитор последовательного порта (скорость передачи 19200, настройки 8N1).

Температура отображается в градусах Цельсия. Датчиком температуры является микросхема LM35. Полный пример кода находится на GitHub.

Датчик температуры LM35

LM35 — трехконтактный линейный датчик температуры. Может измерять температуру от -55 °C до + 150 °C. Выходное напряжение LM35 увеличивается на 10 мВ при повышении температуры на градус Цельсия.

LM35 может работать от источника питания 5 В, а ток потребления в режиме ожидания составляет менее 60 мкА. Распиновка выводов LM35 показана на рисунке ниже:

Распиновка выводов LM35

Необходимые компоненты

  • ATtiny13 — плата разработки
  • LM35
  • USB-последовательный адаптер
Плата разработки Attiny13
Attiny13A, кнопка сброса, две отдельные кнопки, два светодиода, потенциометр, 5В или 3,3 В...
Подробнее

Принципиальная электрическая схема

Принципиальная электрическая схема

Код программы

Этот код написан на C и может быть скомпилирован с помощью avr-gcc. Более подробная информация о том, как скомпилировать этот проект, находится здесь.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "uart.h"

#define	LM35_DATA_PIN	PB4

static void LM35_init(void);
static int LM35_read(void);
static int analog_read(uint8_t pin);
static void uart_puttemp(int temp);

int
main(void)
{
  int temp;

  /* setup */
  LM35_init();

  /* loop */
  while (1) {
    temp = LM35_read();
    uart_puttemp(temp);
    _delay_ms(1000);
  }
}

void
LM35_init(void)
{

  DDRB &= ~_BV(LM35_DATA_PIN); // установить контакт данных как INPUT
}

int
LM35_read(void)
{
  int temp;

  temp = analog_read(LM35_DATA_PIN); // считать аналоговое значение с датчика
  temp = ((((uint32_t)temp * 1000UL) >> 10) * 5); // конвертировать значение
  using euqation temp = Vin * 1000 / 1024 * Vref [milivolts]

  return temp;
}

int
analog_read(uint8_t pin)
{
  uint8_t low, high;

  switch(pin) {
  case PB2: ADMUX = _BV(MUX0); break; // ADC1
        case PB4: ADMUX = _BV(MUX1); break; // ADC2
        case PB3: ADMUX = _BV(MUX0)|_BV(MUX1); break; // ADC3
        case PB5: // ADC0
  default: ADMUX = 0; break;
  }

  ADMUX &= ~_BV(REFS0); // VCC в качестве опорного напряжения (5В)
  ADCSRA |= _BV(ADEN);  // Включить АЦП
  ADCSRA |= _BV(ADSC);  // Выполнить однократное преобразование
  while(bit_is_set(ADCSRA, ADSC)); // Ждать выполнение преобразования

  // Read values
  low = ADCL;
        high = ADCH;

        // combine two bytes
        return (high << 8) | low;
}

void
uart_puttemp(int temp)
{
  int value = temp / 10;
  uart_puts("temp=");
  uart_putu(value);
  uart_putc('.');
  uart_putu(temp - (value * 10));
  uart_putc('\n');
}

Источник

Цифровой мультиметр AN8009
Большой ЖК-дисплей с подсветкой, 9999 отсчетов, измерение TrueRMS...
Подробнее

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

*