 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
| Poglej prejšnjo temo :: Poglej naslednjo temo |
| Avtor |
Sporočilo |
Milek Član


Pridružen-a: Ned 02 Avg 2015 13:50 Prispevkov: 117 Aktiv.: 0.90 Kraj: Maribor
|
Objavljeno: Pet Dec 05, 2025 7:02 pm Naslov sporočila: Božična zvezda z ATtiny45 |
|
|
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.
| Opis: |
|
| Velikost datoteke: |
153.73 KB |
| Pogledana: |
4 krat |

|
| Opis: |
|
| Velikost datoteke: |
105.21 KB |
| Pogledana: |
0 krat |

|
| Opis: |
|
| Velikost datoteke: |
146.61 KB |
| Pogledana: |
0 krat |

|
| Opis: |
|
| Velikost datoteke: |
85.94 KB |
| Pogledana: |
1 krat |

|
|
|
| Nazaj na vrh |
|
 |
v.j. Član

Pridružen-a: Pet 13 Feb 2015 9:47 Prispevkov: 1876 Aktiv.: 13.79 Kraj: Veldes
|
Objavljeno: Sob Dec 06, 2025 12:39 am Naslov sporočila: |
|
|
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 |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4882 Aktiv.: 19.76 Kraj: Kobarid
|
Objavljeno: Ned Dec 07, 2025 1:07 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|