This project is about a simple temperature logging system using ATtiny13 and the Software UART. The system reads the temperature every second and shows it on the serial console (baudrate 19200, settings 8N1). The temperature is shown in °Celsius. LM35 has been used as the temperature sensor. Complete example code is on GitHub.
LM35 Temperature Sensor
LM35 is three terminal linear temperature sensor. It can measure temperature from- 55°C to +150°C. The voltage output of the LM35 increases 10mV per degree Celsius rise in temperature. LM35 can be operated from a 5V supply and the stand by current is less than 60μA. The pin out of LM35 is shown in the figure below.
Parts
- ATtiny13 – i.e. MBAVR-1 development board
- LM35
- USB to serial adapter
Circuit Diagram
Firmware
This code is written in C and can be compiled using the avr-gcc. More details on how compile this project is here. Complete example code is on GitHub.
/**
* Copyright (c) 2017, Łukasz Marcin Podkalicki <lpodkalicki@gmail.com>
* ATtiny13/029
* Read temperature (0°C to 100°C) using analog sensor LM35
* and log the data to Software UART (baudrate 19200, 8N1) once per second.
*
* Settings:
* FUSE_L=0x6A
* FUSE_H=0xFF
* F_CPU=1200000
*/
#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); // set data pin as INPUT
}
int
LM35_read(void)
{
int temp;
temp = analog_read(LM35_DATA_PIN); // read analog value from sensor
temp = ((((uint32_t)temp * 1000UL) >> 10) * 5); // convert value 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); // explicit set VCC as reference voltage (5V)
ADCSRA |= _BV(ADEN); // Enable ADC
ADCSRA |= _BV(ADSC); // Run single conversion
while(bit_is_set(ADCSRA, ADSC)); // Wait conversion is done
// 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');
}



Thank you!
I managed to have it working yet it is not accurate enough. Probably the outputs will get better with a minute or two delay in measurement.
In the diagram, I think you meant for the TX pin PB3 to go to the RXD pin of the FTDI so I got confused at the beginning.
Thanks again and please keep up with the great projects of ATtiny13a
Greetings !
Thank you so much for the nice work !
I tried to compile the program using the command (I changed the value of the MCU to “MCU=attiny13a” in the uart.h file as well):
$sudo avr-gcc -Wall -g -Os -mmcu=attiny13a -DF_CPU=1200000 -I. -DUART_BAUDRATE=19200 main.c -o main.bin
I end up with this error:
…/blog-master/avr/attiny13/029_log_temperature_lm35_to_software_uart/main.c:91: undefined reference to `uart_puts’
…/blog-master/avr/attiny13/029_log_temperature_lm35_to_software_uart/main.c:92: undefined reference to `uart_putu’
…/blog-master/avr/attiny13/029_log_temperature_lm35_to_software_uart/main.c:93: undefined reference to `uart_putc’
…/blog-master/avr/attiny13/029_log_temperature_lm35_to_software_uart/main.c:94: undefined reference to `uart_putu’
…/blog-master/avr/attiny13/029_log_temperature_lm35_to_software_uart/main.c:95: undefined reference to `uart_putc’
collect2: error: ld returned 1 exit status
Please help
Thank you !
Hi! You need to compile uart.c and link it with main.o. Also, you don’t need to compile it with “sudo”.
$avr-gcc -Wall -g -Os -mmcu=attiny13a -DF_CPU=1200000 -I. -DUART_BAUDRATE=19200 main.c uart.c -o main.binSee the Makefile (…/blog-master/avr/attiny13/029_log_temperature_lm35_to_software_uart/Makefile).