Operácie

Zámok na kód II.: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
 
(5 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 35: Riadok 35:




Opis schémy:
== Opis schémy ==


Základom obvodu je Arduino Uno.  
Základom obvodu je Arduino Uno.  
Riadok 53: Riadok 53:
<tabs>
<tabs>
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include "uart_P.h"
// tlačidlá
#define BTN_D12 PB4
#define BTN_D8  PB0
#define BTN_D5  PD5
#define BTN_D2  PD2
// LED
#define LED_YELLOW PB5  // D13
#define LED_RED    PB3  // D11
int read_button(void)
{
    if (!(PINB & (1 << BTN_D12))) return 12;
    if (!(PIND & (1 << BTN_D5)))  return 5;
    if (!(PIND & (1 << BTN_D2)))  return 2;
    if (!(PINB & (1 << BTN_D8)))  return 8;
    return 0;
}
void wait_release(void)
{
    while (read_button() != 0);
    _delay_ms(150);
}


int main(void)
int main(void)
{
{
  unsigned int measuredValue;
    uart_init();
 
    int correct[4] = {12, 5, 2, 8};
    int entered[4];
    int index = 0;
    int button;
    int i;
    int ok;
 
    // LED výstupy
    DDRB |= (1 << LED_YELLOW);
    DDRB |= (1 << LED_RED);
 
    // tlačidlá vstupy
    DDRB &= ~(1 << BTN_D12);
    DDRB &= ~(1 << BTN_D8);
    DDRD &= ~(1 << BTN_D5);
    DDRD &= ~(1 << BTN_D2);
 
    // pull-up rezistory
    PORTB |= (1 << BTN_D12);
    PORTB |= (1 << BTN_D8);
    PORTD |= (1 << BTN_D5);
    PORTD |= (1 << BTN_D2);
 
    // LED vypnúť
    PORTB &= ~(1 << LED_YELLOW);
    PORTB &= ~(1 << LED_RED);
 
    while (1)
    {
        button = read_button();


  while (1)
        if (button != 0)
  {
        {
    /*  relax  */
            _delay_ms(80); // debounce
  }


  return(0);
            if (read_button() == button)
            {
                entered[index] = button;
                index++;
 
                wait_release();
 
                if (index == 4)
                {
                    ok = 1;
 
                    for (i = 0; i < 4; i++)
                    {
                        if (entered[i] != correct[i])
                        {
                            ok = 0;
                        }
                    }
 
                    if (ok == 1)
                    {
                        uart_puts("spravny kod\r\n");
 
                        PORTB |= (1 << LED_YELLOW);
                        _delay_ms(4000);
                        PORTB &= ~(1 << LED_YELLOW);
                    }
                    else
                    {
                        uart_puts("nespravny kod\r\n");
 
                        PORTB |= (1 << LED_RED);
                        _delay_ms(700);
                        PORTB &= ~(1 << LED_RED);
                    }
 
                    index = 0;
                }
            }
        }
    }
}
}


</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="uart.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
 
#ifndef UART_H_
#define UART_H_
 
#define F_CPU 16000000UL
#define BAUD 9600
 
void uart_init(void);
void uart_putc(char c);  //vypis spravny/nespravny kod
void uart_puts(const char *s); // chcel som pridať este  ak kliknem D12 tak mi vypise ake tlacidlo som stlacil ale v main kode som to nepouzil
 
#endif
</syntaxhighlight ></tab>
</tabs>
 
<tab name="uart.c"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>
#include "uart.h"


void adc_init(void);                                  // A/D converter initialization
void uart_init(void)
{
    // 9600 baud pre 16 MHz
    UBRR0H = 0;
    UBRR0L = 103;


unsigned int adc_read(char a_pin);
    UCSR0B = (1 << RXEN0) | (1 << TXEN0); // enable RX TX
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // 8-bit data
}
 
void uart_putc(char c)  //sluzy na vypis spravny/nespravny
{
    while (!(UCSR0A & (1 << UDRE0)));
    UDR0 = c;
}
 
void uart_puts(const char *s)  //nepouzivam v main
{
    while (*s)
    {
        uart_putc(*s);
        s++;
    }
}
</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
</tabs>
</tabs>


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':  

Aktuálna revízia z 13:17, 30. apríl 2026

Záverečný projekt predmetu MIPS / LS2026 - Meno Priezvisko


Zámok na kód II.

Mojou úlohou bolo pracovať so vstupmi vo forme tlačidiel a na základe ich postupného stláčania vytvoriť sekvenciu, ktorú systém vyhodnocuje. Program sleduje poradie stlačených tlačidiel a po zadaní celej sekvencie ho porovná s vopred definovaným správnym kódom. V prípade správneho zadania sa rozsvieti žltá LED dióda, pri nesprávnom zadaní sa rozsvieti červená LED dióda.

Mapovanie pinov mikrokontroléra ATmega328P na vývojovej doske Arduino Uno

Literatúra:


Analýza a opis riešenia

Moje riešenie bolo zamerané na spracovanie vstupov z tlačidiel a vyhodnotenie ich postupného stláčania vo forme sekvencie. Použité boli štyri tlačidlá pripojené na digitálne piny D12, D8, D5 a D2. Program zaznamenáva poradie stlačení a po zadaní štyroch hodnôt ho porovnáva s vopred definovanou sekvenciou.

Na signalizáciu výsledku boli použité dve LED diódy. Žltá LED sa rozsvieti pri správnom zadaní, zatiaľ čo červená LED krátko zabliká pri nesprávnom zadaní. Tlačidlá sú nastavené ako vstupy s internými pull-up rezistormi. Program obsahuje aj jednoduchú UART komunikáciu, ktorá po vyhodnotení vypíše "spravny kod" alebo "nespravny kod".


Použité súčiastky:


Tlačidlá

4 Tlačidlá

LED Diódy

LED diódy červená a žltá

Rezistor 220Ω

Rezistor 220Ω


Opis schémy

Základom obvodu je Arduino Uno. V zapojení sa nachádzajú aj dve LED diódy. Každá LED dióda má v sérii zapojený rezistor s odporom 220 Ω. Tieto rezistory slúžia na obmedzenie elektrického prúdu, aby nedošlo k vypáleniu diód alebo poškodeniu pinov Arduina. LED diódy Slúžia nám ako výstupy.

V obvode sú štyri tlačidlá (Tlačidlo 1 až 4), ktoré slúžia ako používateľský vstup. Sú pripojené k digitálnym pinom D12, D8, D5 a D2. Pri každom tlačidle vidíme rezistor s odporom 220 Ω pripojený k napájaniu. Toto zapojenie zabezpečuje definovanú logickú úroveň na pine Arduina (logickú 1), kým nie je tlačidlo stlačené. Po stlačení sa pin prepojí so zemou (GND) a hodnota sa zmení na logickú 0.

Schéma zapojenia.


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

#include <avr/io.h>
#include <util/delay.h>
#include "uart_P.h"

// tlačidlá
#define BTN_D12 PB4
#define BTN_D8  PB0
#define BTN_D5  PD5
#define BTN_D2  PD2

// LED
#define LED_YELLOW PB5   // D13
#define LED_RED    PB3   // D11

int read_button(void)
{
    if (!(PINB & (1 << BTN_D12))) return 12;
    if (!(PIND & (1 << BTN_D5)))  return 5;
    if (!(PIND & (1 << BTN_D2)))  return 2;
    if (!(PINB & (1 << BTN_D8)))  return 8;

    return 0;
}

void wait_release(void)
{
    while (read_button() != 0);
    _delay_ms(150);
}

int main(void)
{
    uart_init();

    int correct[4] = {12, 5, 2, 8};
    int entered[4];
    int index = 0;
    int button;
    int i;
    int ok;

    // LED výstupy
    DDRB |= (1 << LED_YELLOW);
    DDRB |= (1 << LED_RED);

    // tlačidlá vstupy
    DDRB &= ~(1 << BTN_D12);
    DDRB &= ~(1 << BTN_D8);
    DDRD &= ~(1 << BTN_D5);
    DDRD &= ~(1 << BTN_D2);

    // pull-up rezistory
    PORTB |= (1 << BTN_D12);
    PORTB |= (1 << BTN_D8);
    PORTD |= (1 << BTN_D5);
    PORTD |= (1 << BTN_D2);

    // LED vypnúť
    PORTB &= ~(1 << LED_YELLOW);
    PORTB &= ~(1 << LED_RED);

    while (1)
    {
        button = read_button();

        if (button != 0)
        {
            _delay_ms(80); // debounce

            if (read_button() == button)
            {
                entered[index] = button;
                index++;

                wait_release();

                if (index == 4)
                {
                    ok = 1;

                    for (i = 0; i < 4; i++)
                    {
                        if (entered[i] != correct[i])
                        {
                            ok = 0;
                        }
                    }

                    if (ok == 1)
                    {
                        uart_puts("spravny kod\r\n");

                        PORTB |= (1 << LED_YELLOW);
                        _delay_ms(4000);
                        PORTB &= ~(1 << LED_YELLOW);
                    }
                    else
                    {
                        uart_puts("nespravny kod\r\n");

                        PORTB |= (1 << LED_RED);
                        _delay_ms(700);
                        PORTB &= ~(1 << LED_RED);
                    }

                    index = 0;
                }
            }
        }
    }
}
#ifndef UART_H_
#define UART_H_

#define F_CPU 16000000UL
#define BAUD 9600

void uart_init(void);
void uart_putc(char c);  //vypis spravny/nespravny kod
void uart_puts(const char *s); // chcel som pridať este  ak kliknem D12 tak mi vypise ake tlacidlo som stlacil ale v main kode som to nepouzil

#endif
#include <avr/io.h>
#include "uart.h"

void uart_init(void)
{
    // 9600 baud pre 16 MHz
    UBRR0H = 0;
    UBRR0L = 103;

    UCSR0B = (1 << RXEN0) | (1 << TXEN0); // enable RX TX
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // 8-bit data
}

void uart_putc(char c)  //sluzy na vypis spravny/nespravny
{
    while (!(UCSR0A & (1 << UDRE0)));
    UDR0 = c;
}

void uart_puts(const char *s)  //nepouzivam v main
{
    while (*s)
    {
        uart_putc(*s);
        s++;
    }
}

</tabs>


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.

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.