65.9K
CodeProject 正在变化。 阅读更多。
Home

LED 蜡烛灯带定时器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2019 年 2 月 25 日

CPOL

1分钟阅读

viewsIcon

13130

带定时器的 LED 蜡烛灯

LEDTimedCandle

我研究了大量的电池供电LED蜡烛灯电路和代码,但未能找到具有时间控制功能的LED蜡烛灯。

由于我有一些ATTiny13芯片,我决定使用这个小芯片。 我希望LED能够模拟蜡烛光亮大约4小时,然后熄灭20小时,因此我需要一个定时器和一个计数器。 另一个定时器/PWM用于模拟蜡烛闪烁。 但ATTiny13只有一个定时器。 在ATTiny13上,你只能使用定时器或PWM。

// watchdog interrupt
ISR (WDT_vect)
{
  sec8_counter++;

#ifdef USE_HEART_BEAT_LED  
  //flash heart beat LED
  digitalWrite(LED2, HIGH);
  delay(1);
  digitalWrite(LED2, LOW);
#endif
  
  if(sec8_counter>=HOUR_INTERVAL){
    sec8_counter=0;
    if(bLedIsOn==1){
      on_hours++;
      if(on_hours>=MAX_ON_HOURS){
        bLedIsOn=0; //switch to OFF mode
        off_hours=0;
      }
    }else{
      off_hours++;
      if(off_hours>=MAX_OFF_HOURS){
        bLedIsOn=1; //switch to ON mode
        on_hours=0;
      }
    }
  }
  wdt_reset();
}  // end of WDT_vect

幸运的是,ATTiny还有一个看门狗定时器,可以用来调用中断函数。 看门狗定时器使用独立的128kHz时钟运行,与CPU时钟无关。 最长的超时时间为8秒。 因此,我需要计数450次才能获得一小时。

void loop ()
{
  //sleep 20 hours and work 4 hours
  noInterrupts();
  if(bLedIsOn==1){
    doCandle();
  }else{
    digitalWrite (LED, LOW); //ensure LED is OFF
   goToSleep ();
  }
  interrupts();
}  // end of loop

代码使ATTiny13休眠8秒或点亮LED。 点亮阶段为4小时,休眠阶段将延长至20小时。 序列从点亮阶段开始,当供电时。 在点亮阶段,我测量到大约3mA的电流,而在关断阶段,电路需要300µA的电流。

电路在Arduino代码文件中记录。 将ATTiny13的时钟频率降低到9.6MHz以下不会改变功耗。 但我切换到1.2MHz内部时钟并禁用了BOD(低功耗自动关机)以使用两节或三节AA电池获得更长的运行时间。

https://github.com/hjgode/LEDTimedCandle/tree/master

感谢所有分享知识的人,特别是

© . All rights reserved.