色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ATtiny單片機(jī)電子蠟燭,ATtiny candle

454398 ? 2018-09-20 19:47 ? 次閱讀

ATtiny單片機(jī)電子蠟燭,ATtiny candle

關(guān)鍵字:ATTINY85,電子蠟燭電路

想想當(dāng)你好不容易跟女朋友共度燭光晚餐,卻因?yàn)橄灎T點(diǎn)沒(méi)了或打翻著火了,那是一件多么坑爹的事啊!今天為你分享一款自己diy的超自然的燭光蠟燭。
ATtiny 電子蠟燭,皮特?米爾斯開(kāi)發(fā)這個(gè)偉大的蠟燭,正如我們圖片所見(jiàn)到的一樣,但怎樣讓這蠟燭的光芒像傳統(tǒng)的蠟燭一樣閃爍呢。
皮特使用一個(gè)高亮的LED和一些模擬的輔助軟件,這樣就使得ATtiny 電子蠟燭的燭光和傳統(tǒng)蠟燭擁有一樣的閃爍的燭光,并且優(yōu)于傳統(tǒng)蠟燭,因?yàn)樗话橛忻骰鸬奈kU(xiǎn)。
ATtiny 電子蠟燭最難的部分就閃爍神態(tài)逼真,所以皮特做了一個(gè)蠟燭光檢測(cè)電阻( LDR )和固定電阻作為一個(gè)分壓器。這是作為ATTINY85 ADC之中的一個(gè)輸入端,并離散時(shí)間間隔的進(jìn)行采樣。采樣速率為100毫秒。然后將采集的8bit的電頻值存儲(chǔ)到EEPROM中,以便記錄蠟燭的閃爍圖譜,驅(qū)動(dòng)將其連接的LED、PWM形成通路。在用三節(jié)干電池供電。最后您只需編程程序,然后通過(guò)開(kāi)關(guān)進(jìn)行控制。
下面是ATtiny 電子蠟燭的電路圖
下面是程序的代碼以及寫(xiě)入EEPROM的數(shù)據(jù)
view plainprint?
/* 
Program Description: This program reads a light detecting resistor thru an internal ADC and stores the value,  
after scaling it, to eeprom.  This ADC value is sent to a PWM channel with attached led.  This is essentially a data logger 
for light and replay by LED.  If, if you aim the LDR at a flickering candle during its recording phase, you have a flickering  
led candle.   
 
A circuit description and other details can be found at http://petemills.blogspot.com 
 
Filename: ATTiny_Candle_v1.0.c 
Author: Pete Mills 
 
Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms 
 
*/  
  
  
  
//********** Includes **********  
  
#include        
#include      
#include   
  
  
  
  
//********** Definitions **********  
  
// LED for flame simulation  
  
#define LED   PB0    
#define LED_PORT PORTB  
#define LED_DDR  DDRB  
  
  
  
// Light Detecting Resistor for recording a live flame  
  
#define LDR   PINB3   
#define LDR_PORT PINB  
#define LDR_DDR  DDRB  
  
  
  
// Tactile Switch Input  
  
#define SW1   PINB4  
#define SW1_PORT PINB  
#define SW1_DDR  DDRB  
  
  
#define ARRAY_SIZE 500  // size of the flicker array  
#define SAMPLE_RATE 100  // ms delay for collecting and reproducing the flicker  
  
  
  
//********** Function Prototypes **********  
  
void setup(void);  
void toggle_led(void);  
void program_flicker(void);  
void led_alert(void);  
void eeprom_save_array(void);  
void eeprom_read_array(void);  
void scale_array(void);  
uint8_t get_adc(void);  
uint8_t scale( uint8_t input, uint8_t inp_low, uint8_t inp_hi, uint8_t outp_low, uint8_t outp_hi);  
uint8_t is_input_low(char port, char channel, uint8_t debounce_time, int input_block);  
  
  
  
  
//********** Global Variables **********  
  
uint8_t flicker_array[ ARRAY_SIZE ] = { 0 };  
uint8_t EEMEM ee_flicker_array[ ARRAY_SIZE ] = { 0 };  
  
  
int main(void)  
{  
  
uint16_t replay = 0;  
  
setup();  
  
eeprom_read_array();  
  
  
  
 while(1)  
 {   
   
    
    
    
  if( is_input_low( SW1_PORT, SW1, 25, 250 ) )  
  {  
     
   // program the flicker  
   // after entering and upon completion, a predetermined flash pattern will occur as described in led_alert()    
   // aim the ldr at a flickering candle or any other light source ( like a laser ) you want to record during this time  
   // and upon completion the values are stored to eeprom.  They are played back immediately as well   
   // as being recalled from eeprom upon first start up  
     
   led_alert();  
   program_flicker();  
   scale_array();  
   eeprom_save_array();  
   led_alert();  
  }  
    
    
    
  // replay the recorded flicker pattern   
    
  OCR0A = flicker_array[ replay ];  
  ++replay;  
    
  if( replay >= ( ARRAY_SIZE - 13 ) ) // if the end of the stored array has been reached  
  {   
   replay = 0;          // start again from the beginning  
   //led_alert();  
  }  
    
  _delay_ms( SAMPLE_RATE );  
  _delay_ms( 3 );    // ADC Conversion time  
     
 }  
}  
  
  
  
  
//********** Functions **********  
  
void setup(void)  
{  
  
  
  
 //********* Port Config *********  
  
 LED_DDR |= ( 1 << LED);   // set PB0 to "1" for output   
 LED_PORT &= ~( 1 << LED );   // turn the led off  
  
 LDR_DDR &= ~( 1 << LDR );   // set LDR pin to 0 for input  
 LDR_PORT |= ( 1 << LDR );   // write 1 to enable internal pullup  
  
 SW1_DDR &= ~( 1 << SW1 );   // set sw1 pin to 0 for input  
 SW1_PORT |= ( 1 << SW1 );   // write a 1 to sw1 to enable the internal pullup  
  
  
  
 //********** PWM Config *********  
   
 TCCR0A |= ( ( 1 << COM0A1 ) | ( 1 << WGM01 ) | ( 1 << WGM00 ) ); // non inverting fast pwm  
 TCCR0B |= ( 1 << CS00 ); // start the timer  
   
   
   
 //********** ADC Config **********  
   
 ADMUX |= ( ( 1 << ADLAR ) | ( 1 << MUX1 ) | ( 1 << MUX0 ) );  // left adjust and select ADC3  
 ADCSRA |= ( ( 1 << ADEN ) | ( 1 << ADPS2 ) | ( 1 << ADPS1 ) ); // ADC enable and clock divide 8MHz by 64 for 125khz sample rate  
 DIDR0 |= ( 1 << ADC3D ); // disable digital input on analog input channel to conserve power  
  
}  
  
  
  
  
void toggle_led()  
{  
    LED_PORT ^= ( 1 << LED );  
}  
  
  
  
  
uint8_t is_input_low( char port, char channel, uint8_t debounce_time, int input_block )  
{  
  
/*  
This function is for debouncing a switch input  
Debounce time is a blocking interval to wait until the input is tested again.  
If the input tests low again, a delay equal to input_block is executed and the function returns ( 1 )  
*/  
          
 if ( bit_is_clear( port, channel ) )  
 {  
  _delay_ms( debounce_time );  
     
   if ( bit_is_clear( port, channel ) )   
   {  
    _delay_ms( input_block );  
    return 1;  
   }  
   
 }  
  
 return 0;  
}  
  
  
  
  
uint8_t get_adc()  
{  
 ADCSRA |= ( 1 << ADSC );   // start the ADC Conversion  
   
 while( ADCSRA & ( 1 << ADSC ));  // wait for the conversion to be complete  
   
 return ~ADCH; // return the inverted 8-bit left adjusted adc val  
  
}  
  
  
  
  
void program_flicker()  
{   
 // build the flicker array  
   
 for( int i = 0; i < ARRAY_SIZE; i++ )  
 {  
  flicker_array[ i ] = get_adc();    
  _delay_ms( SAMPLE_RATE );  
 }  
  
}  
  
  
  
  
void led_alert()  
{  
 // this is a function to create a visual alert that an event has occured within the program  
 // it toggles the led 10 times.  
   
 for( int i = 0; i < 10; i++ )  
 {  
  OCR0A = 0;  
  _delay_ms( 40 );  
  OCR0A = 255;  
  _delay_ms( 40 );  
 }  
  
}  
  
  
  
  
void eeprom_save_array()  
{   
 for( int i = 0; i < ARRAY_SIZE; i++ )  
 {  
  eeprom_write_byte( &ee_flicker_array[ i ], flicker_array[ i ] );  
    
 }  
}  
  
  
  
  
void eeprom_read_array()  
{  
 for( int i = 0; i < ARRAY_SIZE; i++ )  
 {  
  flicker_array[ i ] = eeprom_read_byte( &ee_flicker_array[ i ] );  
    
 }  
}  
  
  
  
  
uint8_t scale( uint8_t input, uint8_t inp_low, uint8_t inp_hi, uint8_t outp_low, uint8_t outp_hi)  
{  
return ( ( ( input - inp_low ) * ( outp_hi - outp_low ) ) / ( ( inp_hi - inp_low ) + outp_low ) );  
}  
  
  
  
  
void scale_array()  
{  
 uint8_t arr_min = 255;  
 uint8_t arr_max = 0;  
 uint8_t out_low = 20;  
 uint8_t out_high = 255;  
   
   
   
 // find the min and max values  
   
 for( int i = 0; i < ARRAY_SIZE; i++ )  
 {  
  if( flicker_array[ i ] < arr_min )  
   arr_min = flicker_array[ i ];  
     
  if( flicker_array[ i ] > arr_max )  
   arr_max = flicker_array[ i ];  
 }  
   
   
   
 // now that we know the range, scale it  
   
 for( int i = 0; i < ARRAY_SIZE; i++ )  
 {  
  flicker_array[ i ] = scale( flicker_array[ i ], arr_min, arr_max, out_low, out_high );  
 }  
   
}   igh );  
 }  
   
}   igh );  
 }  
   
}    
 }  
   
}    
 }  
   
}    
 }  
   
}    }  
   
}    }  
   
}    }  
   
}       
EEPROM的數(shù)據(jù)
rom.rar
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    單片機(jī)電子技術(shù)中的應(yīng)用及發(fā)展

    單片機(jī)作為一種高度集成的微控制器,在電子技術(shù)領(lǐng)域有著廣泛的應(yīng)用。本文首先介紹了單片機(jī)在多個(gè)領(lǐng)域的具體應(yīng)用,包括自動(dòng)化儀器儀表、家用電器、醫(yī)用設(shè)備、通信設(shè)備、汽車(chē)電子控制與檢測(cè)以及模塊化
    的頭像 發(fā)表于 01-15 10:30 ?71次閱讀

    如何優(yōu)化單片機(jī)項(xiàng)目的功耗

    在現(xiàn)代電子設(shè)計(jì)中,功耗優(yōu)化已成為一個(gè)不可忽視的重要議題。對(duì)于單片機(jī)(MCU)項(xiàng)目而言,功耗不僅關(guān)系到產(chǎn)品的能效比,還直接影響到電池壽命和熱管理。 硬件層面的功耗優(yōu)化 1. 選擇合適的單片機(jī) 選擇一個(gè)
    的頭像 發(fā)表于 11-01 14:16 ?482次閱讀

    單片機(jī)電路圖用什么軟件畫(huà)

    單片機(jī)電路圖的設(shè)計(jì)和繪制是一個(gè)復(fù)雜的過(guò)程,涉及到電路設(shè)計(jì)、電子元件的選擇、電路板布局、信號(hào)完整性分析等多個(gè)方面。 1. 選擇合適的軟件 繪制單片機(jī)電路圖,你可以選擇多種軟件,每種軟件都有其特點(diǎn)和優(yōu)勢(shì)
    的頭像 發(fā)表于 10-17 09:43 ?1204次閱讀

    電子產(chǎn)品方案開(kāi)發(fā)公司常用的15個(gè)單片機(jī)經(jīng)典電路分享!

    : 13、復(fù)位電路: 14、AD/DA/光敏/熱敏: 15、CPU最小系統(tǒng)工作電路: 單片機(jī)作為電子產(chǎn)品開(kāi)發(fā)中的核心控制單元,其經(jīng)典電路在各個(gè)領(lǐng)域發(fā)揮著重要作用。隨著科技的不斷發(fā)展,單片機(jī)電
    發(fā)表于 09-25 14:43

    單片機(jī)方案開(kāi)發(fā):如何給電子產(chǎn)品單片機(jī)選型?

    在給電子項(xiàng)目做IC方案開(kāi)發(fā)時(shí),總是需要考慮到許多關(guān)鍵因素。在本文中,對(duì)于給即將開(kāi)發(fā)的電子產(chǎn)品做好單片機(jī)選型。英銳恩單片機(jī)開(kāi)發(fā)工程師將從以下幾點(diǎn)進(jìn)行介紹。 一、選擇制造商: 許多生產(chǎn)
    發(fā)表于 09-25 10:56

    51單片機(jī)驅(qū)動(dòng)

    電子發(fā)燒友網(wǎng)站提供《51單片機(jī)驅(qū)動(dòng).exe》資料免費(fèi)下載
    發(fā)表于 09-20 11:46 ?5次下載

    基于51單片機(jī)電子稱電路圖及程序

    本資源內(nèi)容概要:? ? ? ?這是基于51單片機(jī)電子稱電路圖及程序設(shè)計(jì)包含了電路圖源文件(Altiumdesigner軟件打開(kāi))、C語(yǔ)言程序源代碼(keil軟件打開(kāi))。本資源適合人群
    發(fā)表于 06-21 14:33 ?0次下載

    單片機(jī):微小卻強(qiáng)大的電子奇跡,揭秘其無(wú)限可能!

    單片機(jī):微小卻強(qiáng)大的電子奇跡,揭秘其無(wú)限可能!
    的頭像 發(fā)表于 04-24 14:20 ?527次閱讀
    <b class='flag-5'>單片機(jī)</b>:微小卻強(qiáng)大的<b class='flag-5'>電子</b>奇跡,揭秘其無(wú)限可能!

    基于51單片機(jī)電子鐘【調(diào)時(shí),DS1302,數(shù)碼管,獨(dú)立按鍵】(仿真)

    基于51單片機(jī)電子鐘【調(diào)時(shí),DS1302,數(shù)碼管,獨(dú)立按鍵】(仿真)
    的頭像 發(fā)表于 04-10 00:41 ?2573次閱讀
    基于51<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>電子</b>鐘【調(diào)時(shí),DS1302,數(shù)碼管,獨(dú)立按鍵】(仿真)

    基于51單片機(jī)電子鐘【整點(diǎn)報(bào)時(shí),6數(shù)碼管,獨(dú)立按鍵】(仿真)

    基于51單片機(jī)電子鐘【整點(diǎn)報(bào)時(shí),6數(shù)碼管,獨(dú)立按鍵】(仿真)
    的頭像 發(fā)表于 04-10 00:37 ?1020次閱讀
    基于51<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>電子</b>鐘【整點(diǎn)報(bào)時(shí),6數(shù)碼管,獨(dú)立按鍵】(仿真)

    單片機(jī)電子時(shí)鐘走時(shí)更精確的方法

    更精確些呢?? 誤差原因分析 1.單片機(jī)電子時(shí)鐘的計(jì)時(shí)脈沖基準(zhǔn),是由外部晶振的頻率經(jīng)過(guò)12分頻后提供的,采用內(nèi)部的定時(shí),計(jì)數(shù)器來(lái)實(shí)現(xiàn)計(jì)時(shí)功能。所以,外接晶振頻率的精確度直接影響電子鐘計(jì)時(shí)的準(zhǔn)確性
    發(fā)表于 04-08 07:19

    如何系統(tǒng)、科學(xué)地自學(xué)單片機(jī)

    的自學(xué)單片機(jī)呢?自學(xué)單片機(jī)需要一定的計(jì)劃和方法,以下是具體的步驟和建議。如何系統(tǒng)、科學(xué)地自學(xué)單片機(jī)?學(xué)習(xí)電子基礎(chǔ)知識(shí):理解電路原理、數(shù)字電子
    的頭像 發(fā)表于 03-28 08:03 ?1161次閱讀
    如何系統(tǒng)、科學(xué)地自學(xué)<b class='flag-5'>單片機(jī)</b>?

    fpga是單片機(jī)

    FPGA不是單片機(jī)。兩者雖然都是電子產(chǎn)品,但它們?cè)诙鄠€(gè)方面有著本質(zhì)的不同。
    的頭像 發(fā)表于 03-14 17:17 ?1653次閱讀

    基于單片機(jī)的燃?xì)鈭?bào)警設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于單片機(jī)的燃?xì)鈭?bào)警設(shè)計(jì).doc》資料免費(fèi)下載
    發(fā)表于 03-04 09:46 ?1次下載

    單片機(jī)的最小系統(tǒng)由什么組成 單片機(jī)的最小系統(tǒng)包括哪些

    單片機(jī)(Microcontroller Unit,MCU)的最小系統(tǒng)包括以下幾個(gè)主要組成部分: 單片機(jī)芯片:單片機(jī)是整個(gè)最小系統(tǒng)的核心部分,它集成了中央處理器(Central Processing
    的頭像 發(fā)表于 02-02 11:27 ?1.1w次閱讀
    主站蜘蛛池模板: 曰产无码久久久久久精品 | 国产又黄又粗又爽又色的视频软件 | 男女作爱在线播放免费网页版观看 | 99RE6这里只有精品国产AV | 成人无码精品1区2区3区免费看 | 中文字幕在线免费观看视频 | 啪啪羞羞GIF男女0OXX动态图 | 日本红怡院亚洲红怡院最新 | 亚洲一日韩欧美中文字幕在线 | 538prom精品视频我们不只是 | 内射少妇三洞齐开 | 亚洲另类国产综合在线 | 色哦色哦哦色天天综合 | 国产精品女上位好爽在线短片 | 久久精品亚洲热综合一本 | 蜜桃视频一区二区 | 寂寞夜晚看免费视频 | 青青久在线视频免费观看 | 久青草国产在线观看视频 | av56788成 人影院 | 91看片淫黄大片.在线天堂 | 欧美一区二区高清 | 国产成人拍精品免费视频爱情岛 | 日韩爽爽影院在线播放 | 国产在线精彩亚洲久久 | 无码天堂亚洲国产AV久久 | 失禁 调教 刺激 哭喊男男 | 97人妻久久久精品系列A片 | 欧美一级成人影院免费的 | 亚洲熟女乱色一区二区三区 | 11 13加污女qq看他下面 | 古月娜下面好紧好爽 | 欧美午夜免费观看福利片 | 免费黄色网址在线观看 | china chinese中国人玩 | 青青视频国产依人在线 | 日本午夜精品理论片A级APP发布 | 2023极品少妇XXXO露脸 | 一本色道久久88加勒比—综合 | 国产人妻人伦精品无码.麻豆 | 秋霞网韩国理伦片免费看 |