www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Božična zvezda z ATtiny45

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika za začetnike
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Milek
Član
Član



Pridružen-a: Ned 02 Avg 2015 13:50
Prispevkov: 117
Aktiv.: 0.90
Kraj: Maribor

PrispevekObjavljeno: Pet Dec 05, 2025 7:02 pm    Naslov sporočila:  Božična zvezda z ATtiny45 Odgovori s citatom

Okrasimo svoj vrt, okno ali prostor z božično zvezdo. Z materialom, ki ga imamo doma lahko sestavimo belo LED božično zvezdo.
Z utripanjem simulira efekt dihanja (prižiganje in ugašanje prave zvezde), svetilnost se počasi povečuje in zmanjšuje, cikel je 5 sekund. 6 ur sveti, 18 ur pa je v deep slep, varčevanje z baterijo. Vklopimo jo ponoči, po 6-ih urah delovanja se sama izklopi in je 18 ur v mirovanju. Nato se ponovno vklopi za 6 ur in tako se cikel ponavlja. Napajanje je 3V, dve AAA bateriji, trajata cca 1 mesec, glede na LED porabo. Sam sem omejil tok na 10mA z uporom 10ohm. To je tudi preventiva, ker ATtiny45 premore samo 20mA toka na izhodu.
Malo bolj vešči programiranja si lahko izdelate zvezdo z RGB LED in jo popestrite z barvami. Za vgradnjo bele LED sem uporabil rdeče ohišje. Dekorativnih izdelkov je kar dosti v trgovinah v teh dneh. Sam sem izbral ohišje dekorativne zvezde ene izmed trgovin z poceni izdelki. Lahko pa ohišje izdelate tudi sami.
Koda:

// ATtiny45/85: 6h ON (5s fade-out then 5s fade-in loop), 18h OFF (power-down WDT wake every 8s)
// F_CPU must match board setting (1 MHz)
#ifndef F_CPU
#define F_CPU 1000000UL
#endif

#include <Arduino.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>

#define LED_PIN      0    // PB0 (Arduino pin 0 on many ATtiny cores)
//#define ON_INTERVALS 2700 // 6h / 8s = 2700 WDT intervals
//#define OFF_INTERVALS 8100 // 18h / 8s = 8100 WDT intervals
//#define ON_INTERVALS 45    // 6 min test, pri meni 6min 7sek
//#define OFF_INTERVALS 135  // 18 min test, pri meni 18min 27sek
#define ON_INTERVALS 2647   // 6 h ON, korekcija
#define OFF_INTERVALS 7902  // 18 h OFF, korekcija

volatile bool wdt_flag = false;
volatile uint32_t wdt_counter = 0;

enum State { LED_ON, LED_OFF };
State state = LED_ON; // ob priklopu takoj ON

// Fade (5 s fade-out, 5 s fade-in)
const unsigned long fadePeriod = 5000UL; // 5 sekund za en smerni prehod
const uint8_t pwmMax = 255;
unsigned long fadeStepInterval; // izračunano v setup()
uint8_t pwmValue = pwmMax; // start na polni svetlosti
int8_t pwmStep = -1;       // najprej ugaša (fade out)
unsigned long lastFadeMillis = 0;

ISR(WDT_vect) {
  wdt_flag = true;
}

void wdt_setup_interrupt_8s() {
  // Clear WDRF
  MCUSR &= ~(1 << WDRF);

  // Watchdog change enable
  // Sequence to allow changes of WDTCR on ATtiny45/85
  cli();
  WDTCR = (1 << WDCE) | (1 << WDE); // enable change
  // Set prescaler to ~8s and enable interrupt (WDIE). Do NOT set WDE if you want interrupt-only behaviour.
  WDTCR = (1 << WDP3) | (1 << WDP0) | (1 << WDIE); // ~8s, interrupt mode
  sei();
}

void enterDeepSleep() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_bod_disable(); // požene BOD off (manj toka)
  sei();
  sleep_cpu();
  sleep_disable();
}

void setup() {
  // pin setup
  pinMode(LED_PIN, OUTPUT);
  analogWrite(LED_PIN, pwmValue); // full on at start

  // compute fade step interval (ms per PWM step)
  // fadePeriod is time for full 0->255 or 255->0
  fadeStepInterval = fadePeriod / (unsigned long)pwmMax; // ~19-20 ms

  wdt_setup_interrupt_8s();

  // init timer variables
  lastFadeMillis = millis();
  wdt_counter = 0;
  wdt_flag = false;
}

void loop() {
  unsigned long now = millis();

  switch (state) {
    case LED_ON:
      // update PWM fade at computed interval
      if ((now - lastFadeMillis) >= fadeStepInterval) {
        lastFadeMillis = now;
        // update pwm
        int tmp = (int)pwmValue + (int)pwmStep;
        if (tmp < 0) {
          tmp = 0;
        } else if (tmp > pwmMax) {
          tmp = pwmMax;
        }
        pwmValue = (uint8_t)tmp;
        analogWrite(LED_PIN, pwmValue);

        // reverse direction at endpoints
        if (pwmValue == 0) pwmStep = +1;      // reached 0 -> start fade-in
        else if (pwmValue == pwmMax) pwmStep = -1; // reached max -> start fade-out
      }

      // count WDT intervals to measure 6 hours (wdt_flag set in ISR every ~8s)
      if (wdt_flag) {
        wdt_flag = false;
        wdt_counter++;
        if (wdt_counter >= ON_INTERVALS) {
          // switch to OFF
          wdt_counter = 0;
          state = LED_OFF;
          // ensure LED off
          pwmValue = 0;
          analogWrite(LED_PIN, 0);
          // reset fade values so when we come back we start at full brightness
          pwmValue = pwmMax;
          pwmStep = -1; // next time start by fading out
        }
      }
      break;

    case LED_OFF:
      // LED is off; MCU can sleep to save energy
      if (wdt_flag) {
        wdt_flag = false;
        wdt_counter++;
        if (wdt_counter >= OFF_INTERVALS) {
          wdt_counter = 0;
          state = LED_ON;
          // start LED ON at full brightness immediately
          pwmValue = pwmMax;
          pwmStep = -1; // first action is fade out
          analogWrite(LED_PIN, pwmValue);
          lastFadeMillis = millis();
        }
      }
      // deep sleep between WDT interrupts to save uA
      enterDeepSleep();
      break;
  }
}

Ker ATtiny uporablja RC člen za notranji oscilator, se odstopanja kar velika. Vešči uporabniki bodo uporabili metodo za kalibracijo in tako dobili podatek, za koliko naj popravijo oscilator.

Mi pa to naredimo enostavno tako, da 6 ur skrajšamo na 6 minut in 18 ur skrajšamo na 18 minut:

najprej spogramiramo te vrednosti vrstic v kodi:

#define ON_INTERVALS 45 // 6 min test, pri meni 6min 7sek
#define OFF_INTERVALS 135 // 18 min test, pri meni 18min 27sek

in izmerimo intervala, torej moj testni cikel (6 min ON / 18 min OFF) v resnici traja:

ON: 6 min 7 s = 367 s

OFF: 18 min 27 s = 1107 s

Izračun korekcijskega faktorja

Nominalno bi imel:

ON_INTERVALS = 45 → 45 × 8 s = 360 s

OFF_INTERVALS = 135 → 135 × 8 s = 1080 s

Zato imam:

ON razlika: 367 / 360 ≈ 1.0194

OFF razlika: 1107 / 1080 ≈ 1.025

Preračun za 24-urni cikel

6 h ON / 18 h OFF:
6 h = 21,600 s

18 h = 64,800 s

ON_INTERVAL 6ur:
ON_INTERVAL = round(21600 / t_tick_real_ON)
t_tick_real_ON = 367 / 45 ≈ 8.16 s
ON_INTERVAL = 21600 / 8.16 ≈ 2647

OFF_INTERVAL 18ur:
t_tick_real_OFF = 1107 / 135 ≈ 8.2 s
OFF_INTERVALS = 64800 / 8.2 ≈ 7902

vstavimo:

#define ON_INTERVALS 2647 // 6 h ON, korekcija
#define OFF_INTERVALS 7902 // 18 h OFF, korekcija

Glede na svoje meritve vpišemo izmerjeno število sekund.

Za programiranje sem uporabil USBasp avr programmer. Nastavitve so ATtiny45, 1MhZ (internal), Programator: USBasp(ATtinyCore)

Še nekaj o porabi baterije:

LED ima 10 mA, vendar ne sveti stalno, ampak v 5-sekundnem fade ciklu. Ker fade (0 → 100% → 0) daje povprečno 50 % svetlosti, je povprečni tok LED:
10 mA * 0.5 = 5 mA
To je povprečna poraba med 6-urnim delovanjem.

Izračun porabe:
6 ur delovanja (LED ~5 mA povprečno)
5 mA × 6 h = 30 mAh
18 ur spanja (ATtiny v sleep ~2 µA)
0.002 mA × 18 h = 0.036 mAh → zanemarljivo
Skupna poraba na dan:

≈ 30 mAh / dan

Življenjska doba 2× AA (≈ 2000 mAh)
2000 mAh / 30 mAh = 66 dni
Približno 2 meseca delovanja

(± nekaj dni, odvisno od kakovosti baterij)

Življenjska doba 2× AAA (≈ 1000 mAh)
1000 mAh / 30 mAh ≈ 33 dni (~4,7 tedna)
Približno 1 mesec delovanja.



20251205_105155.jpg
 Opis:
 Velikost datoteke:  153.73 KB
 Pogledana:  4 krat

20251205_105155.jpg



20251204_205024.jpg
 Opis:
 Velikost datoteke:  105.21 KB
 Pogledana:  0 krat

20251204_205024.jpg



20251204_205335.jpg
 Opis:
 Velikost datoteke:  146.61 KB
 Pogledana:  0 krat

20251204_205335.jpg



20251205_112722.jpg
 Opis:
 Velikost datoteke:  85.94 KB
 Pogledana:  1 krat

20251205_112722.jpg


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
v.j.
Član
Član



Pridružen-a: Pet 13 Feb 2015 9:47
Prispevkov: 1876
Aktiv.: 13.79
Kraj: Veldes

PrispevekObjavljeno: Sob Dec 06, 2025 12:39 am    Naslov sporočila:   Odgovori s citatom

Smiselno je, da se ta zvezda prižge, ko nastane mrak, deluje nekaj ur in se ugasne, ni potrebe, da deluje celo noč, večinoma je dovolj v večernem času. Ko se ugasne, gre lahko v sleep za recimo 12 ur, potem se periodično prebuja in preverja svetlobo, lahko vedno bolj pogosto. Vklop ne bo vedno ob istem času, ker je svetloba odvisna od vremenskih razmer. Na ta način se bo zvezda prižgala takrat ko je treba, ura in kalibracija ne bo potrebna.


.

_________________
Kontakt na e-mail, za več informacij klikni gumb 'www', na ZS ne odgovarjam!
Ne mi pisat zasebnih sporočil na forumu! NIKOLI ne boste dobili odgovora na ZS !
Če vam moji odgovori niso všeč, nihče vas ne sili, da jih berete! uporabite gumb 'ignore'
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4882
Aktiv.: 19.76
Kraj: Kobarid

PrispevekObjavljeno: Ned Dec 07, 2025 1:07 pm    Naslov sporočila:   Odgovori s citatom

Simpatičen projekt
Tudi izvedba je lepo rešena. Salamonovo ampak važno da dela
Glede fotoupora. Ja zagotovo bi bilo bolje ampak glede da zdržijo baterije 1.mesec nima smisla

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika za začetnike Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 232 dni


Powered by phpBB © 2001, 2005 phpBB Group