Novinky: Pridal som novú sekciu na webe - Turistika
Sitepoint logo

Detské nočné svetielko s časovačom a fade-out efektom

Po dvoch rokoch veľký projekt 🙂 Mladému sa pokazilo plyšové slniečko do postele, na večerné zaspávanie. Vnútri bol nejaký čínsky custom obvod (epoxidom zakvapnutý obvod), ktorý z dlhej chvíle zlyhal. Prvá verzia opravy bol logic-level MOSFET a RC člen, lenže spomínané MOSFETy sa robia zásadne len v SMD prevedení. Druhá a finálna verzia používa mikrokontrolér ATtiny13A (1 kB flash, 64 bajtov RAM) a jeden bipolárny tranzistor pre LEDky. Nasleduje schéma, plošný spoj a kód.

Popis programu:

Program využíva sleep režim MCU, v aktuálnom prípade (AD prevodník vypnutý, SLEEP_MODE_PWR_DOWN režim) je kľudový odber asi 100 nA… Hneď po zapnutí sa nastaví vstupný pin pre tlačítko a výstupný pre tranzistor a LEDky. Ďalej sa priamo cez registre vypne AD prevodník (ADCSRA) a nastavia sa HW prerušenia (GIMSK, PCMSK) – pre viac info treba pozrieť datasheet. MCU sa hneď uspí a jediné čo ho zobudí, je nízky stav na pine č. 6 (PB1/INT0/PCINT1). Vtedy program skočí do rutiny prerušenia (ISR) a na 300 sekúnd zapne LEDky a potom postupne počas 254 sekúnd zhasína. Výsledný čas je teda cca 10 minút. Pri ďalšom stlačení počas svietenia sa časovač vynuluje. Posledný zaujímavý príkaz je zase priamy zápis do registra GIFR, ktorý označí ISR ako dokončené. Program má po skompilovaní 306 bajtov a zaberá 5 bajtov RAM 🙂

#include <avr/interrupt.h>
#include <avr/sleep.h>
#define pinLED 0
#define pinBTN 1

byte c;

ISR(PCINT0_vect) {
  digitalWrite(pinLED, HIGH);
  delay(300000);
  for (c = 254; c--; c > 0){
    analogWrite(pinLED, c);
    delay(1000);
  }
  GIFR = 0b0110000; // vynuluj interrupt flag
}

void setup() {
  pinMode(pinLED, OUTPUT);
  pinMode(pinBTN, INPUT_PULLUP);
  ADCSRA = 0;          // ADC disabled
  GIMSK = 0b00100000;  //  General Interrupt Mask Register, Bit 5 – PCIE: Pin Change Interrupt Enable
  PCMSK = 0b00000111;  //  Pin Change Mask Register, Bits 5:0 – PCINT[5:0]: Pin Change Enable Mask 5:0
}

void loop() {
  sleep_enable();
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  
  sleep_cpu();
}

Plošák vyzerá ako od cigošov, lebo mi dochádza toner v tlačiarni… Napájanie cez 500 mAh Li-Ion akumulátor.


Categories:


Comments

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *