Interaktívna lampička I: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
| Riadok 34: | Riadok 34: | ||
<tabs> | <tabs> | ||
<tab name=" | <tab name="main.c"><syntaxhighlight lang="c++" style="background: LightYellow;"> | ||
#define F_CPU 16000000UL | |||
#define BAUD 9600 | |||
#include <avr/io.h> | #include <avr/io.h> | ||
#include <util/delay.h> | |||
#include <stdio.h> | |||
#include "uart.h" | |||
/* --- piny --- */ | |||
#define MIC PD7 | |||
#define R_LED PD6 | |||
#define G_LED PD5 | |||
/* --- casovanie --- */ | |||
#define DEBOUNCE 200 | |||
#define OKNO 1500 | |||
/* --- makra z uart.h --- */ | |||
/* set_bit / clear_bit su uz v uart.h, nepridavaj znova */ | |||
FILE uart_out = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); | |||
/* --- globalne premenne --- */ | |||
uint8_t pocet = 0; | |||
uint8_t aktivny = 0; | |||
uint8_t cervena = 0; | |||
uint8_t zelena = 0; | |||
uint8_t mic_pred = 0; | |||
uint32_t t_posledny = 0; | |||
uint32_t ms = 0; /* citac milisekund */ | |||
/* --- aktualizuj LEDky --- */ | |||
void nastav_led(void) | |||
{ | |||
if (cervena) set_bit(PORTD, R_LED); | |||
else clear_bit(PORTD, R_LED); | |||
if (zelena) set_bit(PORTD, G_LED); | |||
else clear_bit(PORTD, G_LED); | |||
} | |||
/* --- vyhodnotenie tleskov --- */ | |||
void vyhodnot(void) | |||
{ | |||
printf("tlesky: %d\r\n", pocet); | |||
if (pocet == 3) { | |||
aktivny = !aktivny; | |||
if (aktivny) { | |||
cervena = 1; | |||
zelena = 1; | |||
nastav_led(); | |||
printf(">> AKTIVNY - obe LED zapnute\r\n"); | |||
} else { | |||
cervena = 0; | |||
zelena = 0; | |||
nastav_led(); | |||
printf(">> USPENY - obe LED zhasnute\r\n"); | |||
} | |||
} | |||
else if (aktivny) { | |||
if (pocet == 1) { | |||
cervena = !cervena; | |||
printf(">> cervena: %s\r\n", cervena ? "ON" : "OFF"); | |||
} | |||
if (pocet == 2) { | |||
zelena = !zelena; | |||
printf(">> zelena: %s\r\n", zelena ? "ON" : "OFF"); | |||
} | |||
nastav_led(); | |||
} | |||
else { | |||
printf(">> system spi, ignorujem\r\n"); | |||
} | |||
pocet = 0; | |||
} | |||
int main(void) | int main(void) | ||
{ | { | ||
/* nastavenie pinov */ | |||
set_bit(DDRD, R_LED); /* vystup - cervena */ | |||
set_bit(DDRD, G_LED); /* vystup - zelena */ | |||
clear_bit(DDRD, MIC); /* vstup - mikrofon */ | |||
clear_bit(PORTD, R_LED); | |||
clear_bit(PORTD, G_LED); | |||
uart_init(); | |||
stdout = &uart_out; | |||
printf("system USPENY. 3x tlesk = zapni\r\n"); | |||
while (1) | |||
{ | |||
_delay_ms(1); | |||
ms++; | |||
uint8_t mic_teraz = bit_is_set(PIND, MIC) ? 1 : 0; | |||
/* nabezna hrana + debounce */ | |||
if (mic_teraz == 1 && mic_pred == 0) { | |||
if ((ms - t_posledny) > DEBOUNCE) { | |||
pocet++; | |||
t_posledny = ms; | |||
printf("tlesk #%d\r\n", pocet); | |||
} | |||
} | |||
mic_pred = mic_teraz; | |||
/* po uplynutí okna vyhodno? */ | |||
if (pocet > 0 && (ms - t_posledny) > OKNO) { | |||
vyhodnot(); | |||
} | |||
} | |||
return 0; | |||
} | } | ||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
</tabs> | </tabs> | ||
Verzia z 16:50, 4. jún 2026
Záverečný projekt predmetu MIPS / LS2026 - Matúš Grúň
Zadanie
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie

Literatúra:
Analýza a opis riešenia
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami... Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.

Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.

Algoritmus a program
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... Výpis kódu je nižšie...
#define F_CPU 16000000UL
#define BAUD 9600
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "uart.h"
/* --- piny --- */
#define MIC PD7
#define R_LED PD6
#define G_LED PD5
/* --- casovanie --- */
#define DEBOUNCE 200
#define OKNO 1500
/* --- makra z uart.h --- */
/* set_bit / clear_bit su uz v uart.h, nepridavaj znova */
FILE uart_out = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
/* --- globalne premenne --- */
uint8_t pocet = 0;
uint8_t aktivny = 0;
uint8_t cervena = 0;
uint8_t zelena = 0;
uint8_t mic_pred = 0;
uint32_t t_posledny = 0;
uint32_t ms = 0; /* citac milisekund */
/* --- aktualizuj LEDky --- */
void nastav_led(void)
{
if (cervena) set_bit(PORTD, R_LED);
else clear_bit(PORTD, R_LED);
if (zelena) set_bit(PORTD, G_LED);
else clear_bit(PORTD, G_LED);
}
/* --- vyhodnotenie tleskov --- */
void vyhodnot(void)
{
printf("tlesky: %d\r\n", pocet);
if (pocet == 3) {
aktivny = !aktivny;
if (aktivny) {
cervena = 1;
zelena = 1;
nastav_led();
printf(">> AKTIVNY - obe LED zapnute\r\n");
} else {
cervena = 0;
zelena = 0;
nastav_led();
printf(">> USPENY - obe LED zhasnute\r\n");
}
}
else if (aktivny) {
if (pocet == 1) {
cervena = !cervena;
printf(">> cervena: %s\r\n", cervena ? "ON" : "OFF");
}
if (pocet == 2) {
zelena = !zelena;
printf(">> zelena: %s\r\n", zelena ? "ON" : "OFF");
}
nastav_led();
}
else {
printf(">> system spi, ignorujem\r\n");
}
pocet = 0;
}
int main(void)
{
/* nastavenie pinov */
set_bit(DDRD, R_LED); /* vystup - cervena */
set_bit(DDRD, G_LED); /* vystup - zelena */
clear_bit(DDRD, MIC); /* vstup - mikrofon */
clear_bit(PORTD, R_LED);
clear_bit(PORTD, G_LED);
uart_init();
stdout = &uart_out;
printf("system USPENY. 3x tlesk = zapni\r\n");
while (1)
{
_delay_ms(1);
ms++;
uint8_t mic_teraz = bit_is_set(PIND, MIC) ? 1 : 0;
/* nabezna hrana + debounce */
if (mic_teraz == 1 && mic_pred == 0) {
if ((ms - t_posledny) > DEBOUNCE) {
pocet++;
t_posledny = ms;
printf("tlesk #%d\r\n", pocet);
}
}
mic_pred = mic_teraz;
/* po uplynutí okna vyhodno? */
if (pocet > 0 && (ms - t_posledny) > OKNO) {
vyhodnot();
}
}
return 0;
}
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:
Zdrojový kód: zdrojaky.zip
Overenie
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku hotového zariadenia.

Video:
Čo by som urobil inak
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.