Operácie

Interaktívna lampička I: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
Riadok 31: Riadok 31:
- Rezistory:                    2x220 OHM zapojené pred LED Diódy
- Rezistory:                    2x220 OHM zapojené pred LED Diódy


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]
[[Súbor:ZariadenieIL1.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]


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.
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.

Verzia z 14:33, 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.

Vývojová doska Arduino Uno r3 s procesorom ATmega328p

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

Celkový pohľad na zariadenie.

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.

Schéma zapojenia.


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 (taktiež podľa LED na zvukovom module)
  • sledovaním stavu samotných LED diód, či svietia alebo nie aj keď by mali
  • sledovaním LEDky Tx na samotnom Arduino UNO, kedy doska zachytáva signál z mikrofónu, a kedy reaguje na vstupný zvuk

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.

Aplikácia.

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.