问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

找一些好玩的 有意义的电路图 可以复杂点

发布网友 发布时间:2022-05-19 12:49

我来回答

2个回答

热心网友 时间:2023-10-12 04:04

蜡烛灯一个,控制控制一个led

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 ring 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 <avr/io.h>       

#include <util/delay.h>     

#include <avr/eeprom.h>  

  

  

  

  

//********** 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 reprocing 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 ring 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 );  

 }  

   

}    

 }  

   

}    

 }  

   

}    

 }  

   

}    }  

   

}    }  

   

}    }  

   

}                                                         

热心网友 时间:2023-10-12 04:05

装一台数字钟吧

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你见过最古老的东西是什么,有多少年历史 WORD中怎么输出稿纸模式word中怎么输出稿纸模式 女性尿检阴性是什么意思 阴性尿检是什么意思 尿检阴性是什么 win10如何查看电脑配置参数 win10怎样查看电脑配置参数 多地对公职人员提接种要求 亚马逊订单可以退回任何Kohl's商店,7月份生效 亚马逊提供免费退货,珠宝退货卖家要承担运费吗 新的亚马逊退货政策惹争议!官方解答来了 关于油烟机配件的一些英文翻译(行家进) surface mount tactile switch 是什么 元器件switch tactile 是什么意思 asp.net构造函数绑定checkboxlist数据源问题 自动挡新车如何磨合? 我的功放机是,步步高5.1声道的,插上大二芯插头话筒不响,怎么回事? 什么是.net构造函数 宜信理财怎么样 深圳宜信卓越财富怎么样?人员怎么那么少,那个面试经理胡X什么来头,怎么那么傲。 谁有知道厦门宜信财富中心的地址和咨询电话? 武汉宜信怎么样?刚大学毕业,宜信让我过去面试,谁在里面待过啊 平安银行理财经理和宜信财富理财经理,我该如何选择 宜信BM 职位 什么级别 薪资大概多少 宜信理财师的提成如何算 宜信财富公司的理财顾问怎么样?业绩好做么?怎么才能干长久? 宜信财富怎样的,待遇如何,好做嘛,我在广州的,他们叫我去面试?? 南京宜信财富投资公司怎么样啊?我想去做理财顾问,有哪些要注意的啊? 松下波轮洗衣机电脑版大概多少钱 小天鹅5168波轮洗衣机电脑版闪烁怎么回事 磁铁会影响波轮洗衣机的电脑板吗? 帮忙翻译一下!急!!! PT-005- K2 求翻译 万分紧急 在线等 谢谢了 绞尽脑汁不会 唉 技术不过关 画角平分线步骤? 画角的平分线(写出步骤) 民生银行房贷29万十五年一共利息多少 如何在手机客户端寻找自己的文章和UC订阅号 在uc云观上能看到自己发表的文章吗 uc订阅号平台文章被推荐到哪里 如何在订阅号里查找文章 订阅号怎么看哪篇文章发送过哪篇文章没发送过? uc头条得订阅号在哪 UC订阅号如何获得原创功能? uc头条收藏内容在哪找 红米手机左上角总显示安全中心的符号怎么去掉 有怎样地小妙招可以去黑头?(简单些,我只是个学生。弄不到太复杂的) 我是一名16岁的中学生怎样去黑头呢? 学生去黑头的最好方法 护士节的来历是怎样的 你心目中的好护士是什么样的?