Infračervený vypínač s ATtiny45: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 1: | Riadok 1: | ||
Záverečný projekt predmetu MIPS / LS2025 - ''' | Záverečný projekt predmetu MIPS / LS2025 - '''Meno Priezvisko''' | ||
Riadok 51: | Riadok 51: | ||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
<tab name="filename.h"><syntaxhighlight lang="c++" style="background: LightYellow;"> | <tab name="filename.h"><syntaxhighlight lang="c++" style="background: LightYellow;"> | ||
/* | |||
Simple NEC IR sender with button on ATmega328P (Arduino Uno hardware) in AVR C | |||
Wiring: | |||
- IR LED anode via 100? resistor to PD3, cathode to GND | |||
- Pushbutton: one side to PD2, other to GND (use internal pull-up) | |||
- Indicator LED anode via 330? resistor to PB5 (Arduino pin 13), cathode to GND | |||
- F_CPU = 16 MHz | |||
*/ | |||
#define F_CPU 16000000UL | |||
#include <avr/io.h> | #include <avr/io.h> | ||
#include <util/delay.h> | |||
// --- Definícia pinov --- | |||
#define IR_DDR DDRD | |||
#define IR_PORT PORTD | |||
#define IR_PIN 3 // PD3 pre IR LED | |||
#define BTN_DDR DDRD | |||
#define BTN_PORT PORTD | |||
#define BTN_PINR PIND | |||
#define BTN_PIN 2 // PD2 pre tlačidlo | |||
#define LED_DDR DDRB | |||
#define LED_PORT PORTB | |||
#define LED_PIN 5 // PB5 (Arduino pin 13) pre indikáciu | |||
// Časovania protokolu NEC (v mikrosekundách) | |||
#define NEC_HDR_MARK 9000 | |||
#define NEC_HDR_SPACE 4500 | |||
#define NEC_BIT_MARK 562 | |||
#define NEC_ONE_SPACE 1688 | |||
#define NEC_ZERO_SPACE 562 | |||
#define NEC_RPT_SPACE 2250 | |||
// 32-bitový kód, ktorý sa bude odosielať | |||
#define MY_CODE 0xBF40FF00 | |||
// Funkcia na vyslanie "mark" (38 kHz nosnej) po dobu "us" µs | |||
static void mark(uint16_t us) { | |||
// kmitočet ~38 kHz: perioda ~26 µs, polperióda ~13 µs | |||
uint16_t cycles = us / 26; | |||
while (cycles--) { | |||
IR_PORT |= (1 << IR_PIN); | |||
_delay_us(13); | |||
IR_PORT &= ~(1 << IR_PIN); | |||
_delay_us(13); | |||
} | |||
} | |||
// Funkcia na vyslanie "space" (vypnutá LED) po dobu "us" µs | |||
static void space(uint16_t us) { | |||
IR_PORT &= ~(1 << IR_PIN); | |||
while (us--) { | |||
_delay_us(1); | |||
} | |||
} | |||
void | // Funkcia na odoslanie 32-bitového NEC kódu | ||
static void sendNEC(uint32_t code) { | |||
// úvodný rámec (header) | |||
mark(NEC_HDR_MARK); | |||
space(NEC_HDR_SPACE); | |||
// odosielanie bitov LSB ako prvé | |||
for (uint8_t i = 0; i < 32; i++) { | |||
mark(NEC_BIT_MARK); | |||
if (code & 1) { | |||
space(NEC_ONE_SPACE); | |||
} else { | |||
space(NEC_ZERO_SPACE); | |||
} | |||
code >>= 1; | |||
} | |||
// záverečný "mark" | |||
mark(NEC_BIT_MARK); | |||
IR_PORT &= ~(1 << IR_PIN); | |||
} | |||
int main(void) { | |||
// nastavenie GPIO: IR LED výstup | |||
IR_DDR |= (1 << IR_PIN); | |||
// tlačidlo vstup s interným pull-up | |||
BTN_DDR &= ~(1 << BTN_PIN); | |||
BTN_PORT |= (1 << BTN_PIN); | |||
// indikácia LED výstup | |||
LED_DDR |= (1 << LED_PIN); | |||
LED_PORT &= ~(1 << LED_PIN); | |||
while (1) { | |||
// čakanie na stlačenie tlačidla (aktívne LOW) | |||
if (!(BTN_PINR & (1 << BTN_PIN))) { | |||
_delay_ms(50); // eliminácia odrazu (debounce) | |||
if (!(BTN_PINR & (1 << BTN_PIN))) { | |||
// odoslanie NEC kódu | |||
sendNEC(MY_CODE); | |||
// krátke zobrazenie výsledku na LED | |||
LED_PORT |= (1 << LED_PIN); | |||
_delay_ms(200); | |||
LED_PORT &= ~(1 << LED_PIN); | |||
// počkaj na uvoľnenie tlačidla | |||
while (!(BTN_PINR & (1 << BTN_PIN))); | |||
_delay_ms(50); | |||
} | |||
} | |||
} | |||
return 0; | |||
} | |||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
</tabs> | </tabs> | ||
Riadok 66: | Riadok 169: | ||
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. | 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. | Na konci uvádzame fotku hotového zariadenia. | ||
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]] | [[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]] |
Verzia z 20:46, 11. jún 2025
Záverečný projekt predmetu MIPS / LS2025 - Meno Priezvisko
Zadanie
Cieľom môjho zadania bolo vytvoriť program, ktorý umožní vysielať špecialny kód, ktorý budeme vysielať pomocou IR diody.

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.

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.

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...
#include <avr/io.h>
int main(void)
{
unsigned int measuredValue;
while (1)
{
/* relax */
}
return(0);
}
/*
Simple NEC IR sender with button on ATmega328P (Arduino Uno hardware) in AVR C
Wiring:
- IR LED anode via 100? resistor to PD3, cathode to GND
- Pushbutton: one side to PD2, other to GND (use internal pull-up)
- Indicator LED anode via 330? resistor to PB5 (Arduino pin 13), cathode to GND
- F_CPU = 16 MHz
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
// --- Definícia pinov ---
#define IR_DDR DDRD
#define IR_PORT PORTD
#define IR_PIN 3 // PD3 pre IR LED
#define BTN_DDR DDRD
#define BTN_PORT PORTD
#define BTN_PINR PIND
#define BTN_PIN 2 // PD2 pre tlačidlo
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN 5 // PB5 (Arduino pin 13) pre indikáciu
// Časovania protokolu NEC (v mikrosekundách)
#define NEC_HDR_MARK 9000
#define NEC_HDR_SPACE 4500
#define NEC_BIT_MARK 562
#define NEC_ONE_SPACE 1688
#define NEC_ZERO_SPACE 562
#define NEC_RPT_SPACE 2250
// 32-bitový kód, ktorý sa bude odosielať
#define MY_CODE 0xBF40FF00
// Funkcia na vyslanie "mark" (38 kHz nosnej) po dobu "us" µs
static void mark(uint16_t us) {
// kmitočet ~38 kHz: perioda ~26 µs, polperióda ~13 µs
uint16_t cycles = us / 26;
while (cycles--) {
IR_PORT |= (1 << IR_PIN);
_delay_us(13);
IR_PORT &= ~(1 << IR_PIN);
_delay_us(13);
}
}
// Funkcia na vyslanie "space" (vypnutá LED) po dobu "us" µs
static void space(uint16_t us) {
IR_PORT &= ~(1 << IR_PIN);
while (us--) {
_delay_us(1);
}
}
// Funkcia na odoslanie 32-bitového NEC kódu
static void sendNEC(uint32_t code) {
// úvodný rámec (header)
mark(NEC_HDR_MARK);
space(NEC_HDR_SPACE);
// odosielanie bitov LSB ako prvé
for (uint8_t i = 0; i < 32; i++) {
mark(NEC_BIT_MARK);
if (code & 1) {
space(NEC_ONE_SPACE);
} else {
space(NEC_ZERO_SPACE);
}
code >>= 1;
}
// záverečný "mark"
mark(NEC_BIT_MARK);
IR_PORT &= ~(1 << IR_PIN);
}
int main(void) {
// nastavenie GPIO: IR LED výstup
IR_DDR |= (1 << IR_PIN);
// tlačidlo vstup s interným pull-up
BTN_DDR &= ~(1 << BTN_PIN);
BTN_PORT |= (1 << BTN_PIN);
// indikácia LED výstup
LED_DDR |= (1 << LED_PIN);
LED_PORT &= ~(1 << LED_PIN);
while (1) {
// čakanie na stlačenie tlačidla (aktívne LOW)
if (!(BTN_PINR & (1 << BTN_PIN))) {
_delay_ms(50); // eliminácia odrazu (debounce)
if (!(BTN_PINR & (1 << BTN_PIN))) {
// odoslanie NEC kódu
sendNEC(MY_CODE);
// krátke zobrazenie výsledku na LED
LED_PORT |= (1 << LED_PIN);
_delay_ms(200);
LED_PORT &= ~(1 << LED_PIN);
// počkaj na uvoľnenie tlačidla
while (!(BTN_PINR & (1 << BTN_PIN)));
_delay_ms(50);
}
}
}
return 0;
}
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:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.