Automatizanos
Published © CC BY

Camara a intervalos timelapse de bajo presupuesto

Camara a intervalos timelapse de bajo presupuesto with DigiSpark

IntermediateProtip3 hours39

Things used in this project

Story

Read more

Custom parts and enclosures

Esquematico, Codigo e Instrucciones

Schematics

Esquematico

Code

Codigo

C/C++
// ********************************************
//			Automatizanos.com
// ********************************************
//  Includes
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
// ********************************************

uint8_t conteo_watchdog = 0;

// ********************************************
// Interrupciones
ISR(WDT_vect){
	++conteo_watchdog;
}
// ********************************************


#define ENCENDIDO_CAMARA		PB0
#define LED_INCORPORADO     		PB1
#define SENSOR_ILUMINACION		PB2
#define DISPARO_CAMARA			PB3
#define LUZ_FLASH_EXTERNO		PB4



#define DELAY_DISPARO		1000
#define DELAY_CAM_LISTA	5000
#define DELAY_CAM_ENCE	2500
#define DELAY_CAM_FOTO	3000

int main(void) {

	// Init LED_INCORPORADO pin como salida
	DDRB |= (1 << LED_INCORPORADO);
	// Init ENCENDIDO_CAMARA pin como salida
	DDRB |= (1 << ENCENDIDO_CAMARA);
	// Init DISPARO_CAMARA pin como salida
	DDRB |= (1 << DISPARO_CAMARA);
	// Init LUZ_FLASH_EXTERNO pin como salida
	DDRB |= (1 << LUZ_FLASH_EXTERNO);

	// sequencia al reiniciar!! ( para determinar visualmente si ocurrio reset)  	 

	PORTB |= (1 << LED_INCORPORADO);
	_delay_ms(100);
	PORTB ^= (1 << LED_INCORPORADO);
	_delay_ms(500);
	PORTB |= (1 << LED_INCORPORADO);
	_delay_ms(100);
	PORTB ^= (1 << LED_INCORPORADO);
	_delay_ms(1000);
	

	for (;;) {
		
		cli(); //Desabilitar interupciones	
		MCUSR &= ~(1<<WDRF); // Limpiar el watchdog reset
		// desabilitar el temporizador watchdog 
		WDTCR |= (1 << WDCE ) ;
		//WDTCR &= ( 0 << WDE );
		WDTCR &= ~( 1 << WDE );

		if(conteo_watchdog > 2){
			conteo_watchdog = 0;

			// ***********************************************************************
			//                             ponga su codigo aqui!!
			// ***********************************************************************
						
			// Encender  LED_INCORPORADO
			PORTB |= (1 << LED_INCORPORADO);
			
			_delay_ms(100);

			// presionando,esperando y soltando el interruptor para encender la camara
			PORTB |= (1 << ENCENDIDO_CAMARA);			
			_delay_ms(DELAY_CAM_ENCE);
			PORTB &= ~ (1 << ENCENDIDO_CAMARA);

			// esperar a que la camara se inicialice
			_delay_ms(DELAY_CAM_LISTA);
			
			// Verificar las condiciones de luz
			inicializa_ADC();

			// iniciar medicion de  ADC 
			ADCSRA |= (1 << ADSC);         		
			// Esperar mientras se completa la medicion
    			while (ADCSRA & (1 << ADSC) ); 	

    			if (ADCH > 25)
    				{
      					// apagar el flash externo
					PORTB &= ~(1 << LUZ_FLASH_EXTERNO );		
    				} else {
      					// encender el flash externo
					PORTB |= (1 << LUZ_FLASH_EXTERNO );		
    				}

			// presionando,esperando y soltando el interruptor de disparo de la camara
			PORTB |= (1 << DISPARO_CAMARA);			
			_delay_ms(DELAY_DISPARO);
			PORTB &= ~ (1 << DISPARO_CAMARA);

			// Esperar a que la foto se grabe en la tarjeta
			_delay_ms(DELAY_CAM_FOTO);

			// Apagando el flash 	
			PORTB &= ~(1 <<  LUZ_FLASH_EXTERNO );		

			_delay_ms(100);

			// presionando,esperando y soltando el interruptor para apagar la camara
			PORTB |= (1 << ENCENDIDO_CAMARA);			
			_delay_ms(DELAY_CAM_ENCE);
			PORTB &= ~(1 << ENCENDIDO_CAMARA);

			_delay_ms(1000);

			// Apagar el led incorporado
			PORTB &= ~ (1 << LED_INCORPORADO);

			_delay_ms(100);

			// ***********************************************************************
		}

		TCCR0B = (1<<CS01); // Poner el pre escalador en  8
						
		MCUCR = (1<<SM1)|(1<<SE); // Inicializar modo de bajo consumo y habilitar dormir

		MCUSR &= ~(1<<WDRF); // Limpiar el  watchdog reset
		// Incializando el temporizador de watchdog 
		WDTCR |= (1 << WDCE ) | ( 1 << WDE );
		WDTCR |= (1 << WDIE ); 
		WDTCR |= (1 << WDP3) | (1 << WDP0); // El temporizador se dispara cada 8 segundos

		sei(); //Habilitar la interrupciones

		asm volatile ("sleep");
				
	}

  return 0;
}

void inicializa_ADC()
{


	ADMUX =
				(1 << ADLAR) |   // Desplazar el resultado a la izquierda ( usar solamente 8 bits )
				(0 << REFS2) |     // Configura ref. de voltaje a 1.1V, bit 2
				(1 << REFS1) |     // Configura ref. de voltaje a 1.1V, bit 1
				(0 << REFS0) |     // Configura ref. de voltaje a 1.1V, bit 0

				(0 << MUX3)  |     // usar ADC1 para entrada (PB2), MUX bit 3
				(0 << MUX2)  |     // usar ADC1 para entrada (PB2), MUX bit 2
				(0 << MUX1)  |     // usar ADC1 para entrada (PB2), MUX bit 1
				(1 << MUX0);       // usar ADC1 para entrada (PB2), MUX bit 0

  	ADCSRA = 
				(1 << ADEN)  |     // Habilitar ADC 
				(1 << ADPS2) |     // configura pre escalador a 128, bit 2 
				(1 << ADPS1) |     // configura pre escalador a 128, bit 1 
				(1 << ADPS0);      // configura pre escalador a 128, bit 0  

}

Credits

Automatizanos

Automatizanos

2 projects • 0 followers
Proyectos, articulos, y opiniones tecnologicas para el hogar y la industria

Comments