Infračervený vypínač s ATtiny45
Zo stránky SensorWiki
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...
<tabs>
<tab name="Hlavný kód"><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 <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.