Interaktívna lampička I: Rozdiel medzi revíziami
Zo stránky SensorWiki
| (32 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
| Riadok 4: | Riadok 4: | ||
== Zadanie == | == Zadanie == | ||
Zadaním projektu je naprogramovať interaktívnu lampičku, ktorá reaguje na zvolený podnet. Ako podnet som si vybral zvuk — konkrétne tlieskanie. Lampička sníma zvuk pomocou mikrofónového senzora a ovláda sa počtom tleskov v časovom okne: 3 tlesky prepínajú systém medzi aktívnym a uspávacím režimom, 1 tlesk ovláda červenú LED a 2 tlesky ovládajú zelenú LED. | |||
[[Obrázok:Arduino-uno.jpg|400px|thumb|center|Vývojová doska Arduino Uno r3 s procesorom ATmega328p]] | [[Obrázok:Arduino-uno.jpg|400px|thumb|center|Vývojová doska Arduino Uno r3 s procesorom ATmega328p]] | ||
[[Obrázok:KY-037.jpg|400px|thumb|center|Mikrofónový modul KY-037]] | |||
'''Literatúra:''' | '''Literatúra:''' | ||
| Riadok 17: | Riadok 18: | ||
== Analýza a opis riešenia == | == Analýza a opis riešenia == | ||
'''Použité súčiastky:''' | |||
- Arduino Uno R3: Riadiaca jednotka | - Arduino Uno R3: Riadiaca jednotka | ||
| Riadok 31: | Riadok 32: | ||
- Rezistory: 2x220 OHM zapojené pred LED Diódy | - Rezistory: 2x220 OHM zapojené pred LED Diódy | ||
- Stará lampa: Dodá projektu formu | |||
[[Súbor:ZariadenieIL1.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]] | |||
'''Interaktívna lampička — popis funkcionality a zostrojenia:'''<br> | |||
Zariadenie predstavuje stolnú lampičku ovládanú tlieskaním, postavenú na mikrokontroléri ATmega328P — konkrétne na verzii Arduina Uno R3. Zvuk sníma mikrofónový modul KY-037 pripojený na digitálny pin 7. Modul obsahuje elektretový mikrofón s komparátorom, ktorý pri prekročení nastavenej hlasitostnej úrovne vyšle na výstupe logickú jednotku. Firmware túto udalosť zaznamená ako tlesknutie. <br> | |||
<br> | |||
Aby systém vedel rozlíšiť jedno tlesknutie od série, pracuje s časovým oknom približne 800 milisekúnd. Po prvom zachytenom tlesknutí sa okno spustí a počítadlo sa zvyšuje s každým ďalším impulzom. Po vypršaní okna sa počet impulzov vyhodnotí: jedno tlesknutie prepne červenú LED na pine 5, dve tlesknutia prepnú zelenú LED na pine 6 a tri tlesknutia slúžia ako hlavný vypínač — pri aktívnom systéme ho uspí a zhasne obe LED, pri uspatom systéme ho prebudí a obe LED automaticky rozsvieti. Debounce navyše krátko ignoruje signál po detekcii impulzu, aby ozvena alebo mechanický šum nespôsobili falošný záznam. <br> | |||
<br> | |||
Funkčnosť celého konceptu bola najprv overená na breadboarde s Arduinom a modulom KY037. Až po spoľahlivom odladení logiky sa pristúpilo k zabudovaniu do skutočnej lampičky. Cez telo stolnej lampy boli pretiahnuté tri vodiče: jeden pre pin 6, jeden pre pin 5 a spoločná zem. Na ich koncoch boli priletované LED diódy, každá so sériovým ochranným odporom 220 ohmov, ktorý obmedzuje prúd na hodnotu bezpečnú pre výstupné piny Arduina. Arduino zostalo mimo viditeľnej časti lampy — do nej vstupujú len tri tenké kábliky. | |||
[[Súbor:SchemaIL1.jpg|400px|thumb|center|Schéma zapojenia.]] | [[Súbor:SchemaIL1.jpg|400px|thumb|center|Schéma zapojenia.]] | ||
| Riadok 40: | Riadok 48: | ||
=== Algoritmus a program === | === 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ň | 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ň 50ms medzi tlesknutiami. Po uplynutí časového okna 800ms 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. | 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 | 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 dva 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. | Výpis kódu je nižšie. | ||
| Riadok 63: | Riadok 71: | ||
/* --- casovanie --- */ | /* --- casovanie --- */ | ||
#define DEBOUNCE | #define DEBOUNCE 50 | ||
#define OKNO | #define OKNO 800 | ||
/* --- makra z uart.h --- */ | /* --- makra z uart.h --- */ | ||
FILE uart_out = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); | FILE uart_out = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); | ||
| Riadok 123: | Riadok 129: | ||
printf(">> system spi, ignorujem\r\n"); | printf(">> system spi, ignorujem\r\n"); | ||
} | } | ||
printf("ms pri vyhodnoteni: %lu\r\n", ms); | |||
pocet = 0; | pocet = 0; | ||
} | } | ||
| Riadok 174: | Riadok 180: | ||
/* FileName: uart.c */ | /* FileName: uart.c */ | ||
/* ************************************************************************* */ | /* ************************************************************************* */ | ||
#define F_CPU 16000000UL | |||
#define BAUD 9600 | |||
#include <avr/io.h> | #include <avr/io.h> | ||
#include <util/delay.h> | #include <util/delay.h> | ||
#include "uart.h" | #include "uart.h" | ||
| Riadok 284: | Riadok 290: | ||
</tabs> | </tabs> | ||
Zdrojový kód: [[Médiá:Interaktivna_lampa_1.zip|Interaktivna lampa 1]] | |||
Zdrojový kód: [[Médiá: | |||
=== Overenie === | === Overenie === | ||
| Riadok 294: | Riadok 298: | ||
<ul> | <ul> | ||
<li>sledovaním LEDky na module mikrofónu, ktorá sa zasvieti ak sníma zvuk</li> | <li>sledovaním LEDky na module mikrofónu, ktorá sa zasvieti ak sníma zvuk</li> | ||
<li>nastavovaním senzitivity mikrofónu (taktiež podľa LED na | <li>nastavovaním senzitivity mikrofónu pomocou potenciometra, ktorý je súčasťou modulu mikrofónu(taktiež podľa LED na module mikrofónu)</li> | ||
<li>sledovaním stavu samotných LED diód, či svietia alebo nie | <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> | ||
'''Video:''' | '''Video:''' | ||
<center><youtube> | <center><youtube>GG_nnK2SsiM</youtube></center> | ||
== Čo by som urobil inak == | == Č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. | 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: <br> | ||
Projekt sa mi podarilo vyhotoviť bez väčších problémov, avšak musel som sa inšpirovať zapojeniami a videami na internete, kde chvalabohu takéto projekty sú. Ak by som mal niečo spraviť inak, dal by som tam miesto dvoch LED rôznej farby jednu RGB LEDku a skúsil sa pohrať s tým. Ďalšia možnosť by bola použiť LED pásik a bolo by to omnoho použiteľnejšie. | |||
Aktuálna revízia z 09:18, 6. jún 2026
Záverečný projekt predmetu MIPS / LS2026 - Matúš Grúň
Zadanie
Zadaním projektu je naprogramovať interaktívnu lampičku, ktorá reaguje na zvolený podnet. Ako podnet som si vybral zvuk — konkrétne tlieskanie. Lampička sníma zvuk pomocou mikrofónového senzora a ovláda sa počtom tleskov v časovom okne: 3 tlesky prepínajú systém medzi aktívnym a uspávacím režimom, 1 tlesk ovláda červenú LED a 2 tlesky ovládajú zelenú LED.


Literatúra:
Analýza a opis riešenia
Použ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
- Stará lampa: Dodá projektu formu

Interaktívna lampička — popis funkcionality a zostrojenia:
Zariadenie predstavuje stolnú lampičku ovládanú tlieskaním, postavenú na mikrokontroléri ATmega328P — konkrétne na verzii Arduina Uno R3. Zvuk sníma mikrofónový modul KY-037 pripojený na digitálny pin 7. Modul obsahuje elektretový mikrofón s komparátorom, ktorý pri prekročení nastavenej hlasitostnej úrovne vyšle na výstupe logickú jednotku. Firmware túto udalosť zaznamená ako tlesknutie.
Aby systém vedel rozlíšiť jedno tlesknutie od série, pracuje s časovým oknom približne 800 milisekúnd. Po prvom zachytenom tlesknutí sa okno spustí a počítadlo sa zvyšuje s každým ďalším impulzom. Po vypršaní okna sa počet impulzov vyhodnotí: jedno tlesknutie prepne červenú LED na pine 5, dve tlesknutia prepnú zelenú LED na pine 6 a tri tlesknutia slúžia ako hlavný vypínač — pri aktívnom systéme ho uspí a zhasne obe LED, pri uspatom systéme ho prebudí a obe LED automaticky rozsvieti. Debounce navyše krátko ignoruje signál po detekcii impulzu, aby ozvena alebo mechanický šum nespôsobili falošný záznam.
Funkčnosť celého konceptu bola najprv overená na breadboarde s Arduinom a modulom KY037. Až po spoľahlivom odladení logiky sa pristúpilo k zabudovaniu do skutočnej lampičky. Cez telo stolnej lampy boli pretiahnuté tri vodiče: jeden pre pin 6, jeden pre pin 5 a spoločná zem. Na ich koncoch boli priletované LED diódy, každá so sériovým ochranným odporom 220 ohmov, ktorý obmedzuje prúd na hodnotu bezpečnú pre výstupné piny Arduina. Arduino zostalo mimo viditeľnej časti lampy — do nej vstupujú len tri tenké kábliky.

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ň 50ms medzi tlesknutiami. Po uplynutí časového okna 800ms 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 dva 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 50
#define OKNO 800
/* --- makra z uart.h --- */
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");
}
printf("ms pri vyhodnoteni: %lu\r\n", ms);
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 */
/* ************************************************************************* */
#define F_CPU 16000000UL
#define BAUD 9600
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
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_ */
Zdrojový kód: Interaktivna lampa 1
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:
Projekt sa mi podarilo vyhotoviť bez väčších problémov, avšak musel som sa inšpirovať zapojeniami a videami na internete, kde chvalabohu takéto projekty sú. Ak by som mal niečo spraviť inak, dal by som tam miesto dvoch LED rôznej farby jednu RGB LEDku a skúsil sa pohrať s tým. Ďalšia možnosť by bola použiť LED pásik a bolo by to omnoho použiteľnejšie.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.