Operácie

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

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
Riadok 6: Riadok 6:
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.
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.


[[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|center|]]


'''Literatúra:'''  
'''Literatúra:'''  

Verzia z 13:50, 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

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.

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.