Zámok na kód II.: Rozdiel medzi revíziami
Zo stránky SensorWiki
| (10 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
| Riadok 16: | Riadok 16: | ||
== Analýza a opis riešenia == | == 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". | |||
[[Súbor: | Použité súčiastky: | ||
Tlačidlá | |||
[[Súbor:Tlacidla.jpg|400px|thumb|center|4 Tlačidlá]] | |||
LED Diódy | |||
[[Súbor:Ledkys.jpg|400px|thumb|center|LED diódy červená a žltá]] | |||
Rezistor 220Ω | |||
[[Súbor:Odpor.jpg|400px|thumb|center|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. | |||
[[Súbor:Schematics.jpg|400px|thumb|center|Schéma zapojenia.]] | |||
| Riadok 34: | 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) | ||
{ | { | ||
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; | |||
} | |||
} | |||
} | |||
} | |||
} | } | ||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
<tab name=" | <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 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 | 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'': | ||
| Riadok 71: | Riadok 229: | ||
'''Video:''' | '''Video:''' | ||
<center><youtube>D0UnqGm_miA</youtube></center> | <center><youtube>D0UnqGm_miA</youtube></center> | ||
== Čo by som urobil inak == | == Čo by som urobil inak == | ||
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.

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á

LED Diódy

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.

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.

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.