Interaktívna lampička I: Rozdiel medzi revíziami
Zo stránky SensorWiki
| Riadok 297: | Riadok 297: | ||
<li>sledovaním stavu samotných LED diód, či svietia alebo nie</li> | <li>sledovaním stavu samotných LED diód, či svietia alebo nie</li> | ||
<li>sledovaním LEDky Tx na samotnom Arduino UNO, kedy doska zachytáva signál z mikrofónu, a kedy reaguje na vstupný zvuk</li> | <li>sledovaním LEDky Tx na samotnom Arduino UNO, kedy doska zachytáva signál z mikrofónu, a kedy reaguje na vstupný zvuk</li> | ||
<li>správnou reakciou na 1 tlesk, čo znamená --> zasvieť červenú LED </li> | |||
<li>správnou reakciou na 2 tlesky, čo znamená --> zasvieť zelenú LED. Toto bolo trošku náročnejšie, lebo bolo treba nastaviť debounce a čas snímania tlesku na správne hodnoty</li> | |||
<li>správnou reakciou na 3 tlesky, čo znamená --> Reaguj na 1 a 2 tlesky a zároveň zapni obe LEDky, alebo opak --> Ignoruj 1 a 2 tlesky a zároveň vypni obe LEDky </li> | |||
</ul> | </ul> | ||
Verzia z 14:42, 5. jún 2026
Záverečný projekt predmetu MIPS / LS2026 - Matúš Grúň
Zadanie
Zadaím projektu bolo naprogramovať Interaktívnu lampičku, ktorá bude na niečo reagovať. Moja lampička bude reagovať na zvuk napríklad tlesk, ktorým sa ovláda.

Literatúra:
Analýza a opis riešenia
OPoužité súčiastky:
- Arduino Uno R3: Riadiaca jednotka
- Červená LED Dióda Červené Svetlo
- Zelená LED Dióda Zelené Svetlo
- Mikrofónový modul KY-037 Snímač Zvuku (tlesk)
- vodiče: Prepojenie periférií
- Rezistory: 2x220 OHM zapojené pred LED Diódy

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 sledovanie stavu mikrofónu na pine PD7. Program pri každom tlesknutí zachytí nábehovú hranu (zmenu z 0 na 1) a zvýši počítadlo tlesknutí. Aby program nerátal jedno tlesknutie viackrát, používa ochranu proti zákmitom — čaká aspoň 200ms medzi tlesknutiami. Po uplynutí časového okna 1500ms sa pozrie koľko tlesknutí prišlo a podľa toho niečo vykoná.
Základné funkcie sú nastav_led(), ktorá zapína alebo vypína červenú LED na pine PD6 a zelenú LED na pine PD5 podľa toho aký je aktuálny stav, a vyhodnot(), ktorá skontroluje počet tlesknutí a rozhodne čo sa má stať. Tieto funkcie sa volajú z hlavnej slučky main() — vyhodnot() vždy keď uplynie časové okno, a nastav_led() vždy keď sa zmení stav niektorej LED.
Logika systému funguje tak, že program má dva stavy — vypnutý a zapnutý. Tri tlesky prepnú medzi týmito stavmi. Keď je systém zapnutý, jedno tlesknutie prepne červenú LED a dve tlesky prepnú zelenú LED. Keď sa systém zapne, obe LED sa automaticky rozsvietia, keď sa vypne, obe zhasnú. 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;
}
/* ************************************************************************* */
/* FileName: uart.c */
/* ************************************************************************* */
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
#define F_CPU 16000000UL
#define BAUD 9600
void uart_init( void )
{
// for different BAUD rate change the project settings, or uncomment
// following two lines:
// #undef BAUD // avoid compiler warning
#include <util/setbaud.h> // requires defined BAUD
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X // defined in setbaud.h
UCSR0A |= (1 << U2X0);
#else
UCSR0A &= ~(1 << U2X0);
#endif
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
UCSR0B = _BV(RXEN0) | _BV(TXEN0); /* Enable RX and TX */
}
int uart_putc( char c, FILE *stream )
{
if (c == '\n')
uart_putc('\r',stream);
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
UDR0 = c;
return 0;
}
void uart_puts(const char *s, FILE *stream)
{
while(*s)
{
uart_putc(*s++, stream);
}
}
char uart_getc(void)
{
loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
return UDR0;
}
void delay(int delay) // vlastna funkcia pre dlhsie casy
{
for (int i=1; i<=delay; i++)
_delay_ms(1);
}
/* ************************************************************************* */
/* FileName: uart.h */
/* ************************************************************************* */
#define LED PB5 // internal on-board LED
#define F_CPU 16000000UL
#define BAUD 9600
/* na testovanie su uz zadefinovane */
// bit_is_set(PINB, SW1)
// bit_is_clear(PINB, SW1)
/* na cakanie su preddefinovane slucky */
// loop_until_bit_is_set(PINB, SW1); // cakanie na uvolnenie tlacitka
// loop_until_bit_is_clear(PINB, SW1); // cakanie na stlacenie tlacitka
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#ifndef UART_H_
#define UART_H_
#include <stdio.h>
#define BAUD_PRESCALE 103 // vzor?ek z datasheetu
void hw_init( void );
void uart_init( void );
/* Following definition is compatible with STDIO.H, for more
* information see https://www.appelsiini.net/2011/simple-usart-with-avr-libc/
*/
int uart_putc( char c, FILE *stream );
void uart_puts( const char *s, FILE *stream);
char uart_getc( void );
void delay(int delay);
#endif /* UART_H_ */
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: Interaktivna lampa 1.zip
Overenie
Funkčnosť programu bola overená testovaním na reálnom zariadení, a to nasledovne:
- sledovaním LEDky na module mikrofónu, ktorá sa zasvieti ak sníma zvuk
- nastavovaním senzitivity mikrofónu pomocou potenciometra, ktorý je súčasťou modulu mikrofónu(taktiež podľa LED na module mikrofónu)
- sledovaním stavu samotných LED diód, či svietia alebo nie
- sledovaním LEDky Tx na samotnom Arduino UNO, kedy doska zachytáva signál z mikrofónu, a kedy reaguje na vstupný zvuk
- správnou reakciou na 1 tlesk, čo znamená --> zasvieť červenú LED
- správnou reakciou na 2 tlesky, čo znamená --> zasvieť zelenú LED. Toto bolo trošku náročnejšie, lebo bolo treba nastaviť debounce a čas snímania tlesku na správne hodnoty
- správnou reakciou na 3 tlesky, čo znamená --> Reaguj na 1 a 2 tlesky a zároveň zapni obe LEDky, alebo opak --> Ignoruj 1 a 2 tlesky a zároveň vypni obe LEDky
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.