Vzorové riešenie MIPS 2026
Zo stránky SensorWiki
Vzorové riešenie MIPS 2026
Praktická časť skúšky z predmetu MIPS / LS2026 - Richard Balogh
Zadanie
Dostali ste neznámu elektronickú súčiastku spolu s jej datasheet-om. Vašou úlohou je z datasheetu zistiť, o aký snímač ide, identifikovať jeho vývody a navrhnúť zapojenie k mikroprocesoru ATmega328P. Analógový výstup snímača pripojte na vstup ADC0 (pin PC0). Na LCD displeji EA-DOGM163 zobrazte aktuálnu teplotu podľa predpísaného formátu.
+----------------+ | Snimac teploty | | T = 25.3 °C | | Meno Priezvisk | +----------------+
K dispozícii máte:
- Rozširujúci modul s displejom EA-DOGM163
- Knižnice lcd.h / lcd.c a uart.h / uart.c z cvičení
- Datasheet obvodu LM35
Analýza a opis riešenia
Z datasheetu zistíme, že súčiastka LM35DZ je analógový snímač teploty v puzdre TO-92 s lineárnym výstupom 10 mV/°C. Má tri vývody — pri pohľade spredu (plochá strana k nám, nožičky smerujú dole) sú zľava: +Vs (napájanie), Vout (analógový výstup) a GND (zem). Napájací rozsah je 4–30 V, takže 5 V z dosky Acrob vyhovuje.
Zapojenie je jednoduché — napájanie na 5V, zem na GND a výstup Vout priamo na pin PC0 (ADC0). Nie je potrebný žiadny prídavný rezistor ani kondenzátor.
Schéma zapojenia LM35DZ k ATmega328P.
Ak sa zo schémy zapojenia neviete celkom zorientovať, možno vám pomôže fotografia zapojenia priamo na doštičke.

Zapojenie na doštičke.
Prepočet ADC na teplotu
ATmega328P má 10-bitový ADC prevodník (rozsah 0–1023). S referenčným napätím AVcc = 5 V je rozlíšenie jedného kroku:
5000 mV / 1024 = 4,88 mV/krok
Keďže LM35 dáva 10 mV/°C, rozlíšenie merania je približne 0,5 °C. Prepočet na teplotu v desatinách stupňa (celočíselná aritmetika):
t_x10 = adc_val × 5000 / 1024
Pozor na pretečenie — hodnota 1023 × 5000 = 5 115 000, čo sa nezmestí do 16-bitového typu (max 65 535). Preto je nutné pretypovanie na uint32_t:
uint16_t t_x10 = (uint32_t)adc_val * 5000 / 1024;
uint8_t cele = t_x10 / 10; // celá časť
uint8_t desatiny = t_x10 % 10; // desatinná časť
Algoritmus a program
Program najprv inicializuje UART (pre ladenie cez printf), LCD displej a ADC prevodník.
V hlavnej slučke periodicky číta hodnotu z ADC0, prepočíta ju na teplotu a zobrazí na displej.
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "uart.h"
#include "adc.h"
#include "lcd.h"
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
int main(void)
{
uart_init();
stdout = &mystdout;
lcd_init();
lcd_bklt(1);
lcd_command(0x0C);
adc_init();
char riadok[17];
while (1)
{
uint16_t adc_val = adc_read(0);
uint16_t t_x10 = (uint32_t)adc_val * 5000 / 1024;
uint8_t cele = t_x10 / 10;
uint8_t desatiny = t_x10 % 10;
printf("ADC=%4u T=%2u.%1u C\r\n", adc_val, cele, desatiny);
lcd_setCursor(1, 0);
lcd_puts(" Snimac teploty ");
sprintf(riadok, " T = %2u.%1u oC ", cele, desatiny);
lcd_setCursor(2, 0);
lcd_puts(riadok);
lcd_setCursor(3, 0);
lcd_puts(" Meno Priezvisko ");
_delay_ms(100);
}
return 0;
}
Overenie
Program fungoval na prvý pokus. Na videu je vidieť aktuálnu teplotu na displeji, ktorá reaguje na dotyk prsta (zahriatie).
