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

Ambientné osvetlenie kuchyne LED pásom

Pri nočnom zarábaní mlieka mladému (2 roky) som zistil, že by sa nám v kuchyni zišlo pohybom aktivované decentné, ambientné, osvetlenie kuchyne. Zúžitkoval som tu dve veci – TSB bootloader pre ATTINY85 a PWM riadenie MOSFETu. Požiadavky boli jednoduché – pohybom aktivovať, postupne rozsvietiť, pri pohybe nechať stále svietiť, pri opustení priestoru postupne zhasnúť, pri prípadnom prechode počas zhasínania zase plynule rozsvietiť. Skompilovaný kód má cca 1600 bajtov, takže by sa zmestil aj do ATTINY2x 🙂 Na detegovanie pohybu slúži PIR modul typ HC-SR505, PWM signál budí SMD MOSFET IPB10N03L vykuchaný z nejakej starej základnej dosky PC. Jeden trimer slúži na zmenu prahu svetla, druhý na nastavenie času svietenia. Obkukal som aj nelineárne rozsvecovanie a zhasínanie – lineárne fakt nevyzeralo tak dobre. Tu je prototyp – schéma, doska (druhá revízia) a osadená doska.
No a tu je finálny kód:

#include <avr/pgmspace.h>

#define pinRL A1
#define pinCasovac A2
#define pinLuxPrah A3
#define pinPIR 0
#define pinLED 1

#define krok 12

boolean obnova, pohyb, svieti = 0;
uint8_t jas_max, jas_start = 0;
uint16_t doba_svietenia, lux, lux_prah;
uint32_t zapnutie;

const byte table[] PROGMEM = {
  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,
  2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,
  3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,   4,   5,
  5,   5,   5,   5,   5,   5,   5,   6,   6,   6,   6,   6,   6,   6,   7,   7,
  7,   7,   7,   8,   8,   8,   8,   8,   9,   9,   9,   9,   9,  10,  10,  10,
 10,  11,  11,  11,  11,  12,  12,  12,  12,  13,  13,  13,  14,  14,  14,  15,
 15,  15,  16,  16,  16,  17,  17,  18,  18,  18,  19,  19,  20,  20,  21,  21,
 22,  22,  23,  23,  24,  24,  25,  25,  26,  26,  27,  28,  28,  29,  30,  30,
 31,  32,  32,  33,  34,  35,  35,  36,  37,  38,  39,  40,  40,  41,  42,  43,
 44,  45,  46,  47,  48,  49,  51,  52,  53,  54,  55,  56,  58,  59,  60,  62,
 63,  64,  66,  67,  69,  70,  72,  73,  75,  77,  78,  80,  82,  84,  86,  88,
 90,  91,  94,  96,  98, 100, 102, 104, 107, 109, 111, 114, 116, 119, 122, 124,
127, 130, 133, 136, 139, 142, 145, 148, 151, 155, 158, 161, 165, 169, 172, 176,
180, 184, 188, 192, 196, 201, 205, 210, 214, 219, 224, 229, 234, 239, 244, 250
};

void setup(){
  pinMode(pinPIR, INPUT_PULLUP);
  pinMode(pinLED, OUTPUT);
  jas_max = 255;
  doba_svietenia = 1000 * map(analogRead(pinCasovac), 0, 1023, 0, 112);
}

void loop(){
  lux_prah = analogRead(pinLuxPrah);
  pohyb = digitalRead(pinPIR);
  lux = analogRead(pinRL);

  if ((!svieti && pohyb && lux < lux_prah) || obnova){
    for(uint8_t i = jas_start; i < jas_max; i++){
      analogWrite(pinLED, pgm_read_byte(&table[i]));
      delay(krok);
    }
    svieti = 1;
    obnova = 0;
    zapnutie = millis();
  }

  if (svieti && pohyb) zapnutie = millis();

  if (svieti && !pohyb && millis() - zapnutie > doba_svietenia){
    svieti = 0;
    jas_start = 0;
    for(uint8_t i = jas_max; i > 0; i--){
      analogWrite(pinLED, pgm_read_byte(&table[i]));
      if (digitalRead(pinPIR)){
        jas_start = i;
        obnova = 1;
        break;
      }
      delay(krok);
    }
    if (jas_start == 0) analogWrite(pinLED, 0);
  }
}

Prikladám aj Eagle súbory, ak by si to niekto chcel vyrobiť, alebo upraviť. Video ako to funguje:

Pridaj komentár

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