Sensor de Luz BH1750 + ATmega8

O sensor de Luz BH1750, super-económico, vai dar origem a alguns temas que iremos abordar doravante.
Este sensor funciona com I2C, ja foi abordado este tipo de comunicação neste artigo.
È muito simples o seu funcionamento, apenas temos de ter cuidado quando usamos AVR, com a tensão que este sensor é tolerante (5V), por isso teremos de usar uma fonte de alimentação 3,3V, neste caso usou-se a AMS1117.

O esquema de ligações também é simples, usou-se a comunicação porta serie.

Licacaoes

A demonstração do funcionamento, colocar-se-à em breve, disponibiliza-se o código:

BH1750 + Atmega8
/*
 * AVR_BH1750.c
 *
 * Created: 10-04-2018
 * Author : Norlinux
 * http://www.microelectronic.pt
 * http://maquina.96.lt
 * https://www.facebook.com/MundoDosMicrocontroladores/
 * Released under GPLv3.
 * Please refer to LICENSE file for licensing information.
 * which can be found at http://www.gnu.org/licenses/gpl.txt
 */
#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "bh1750/bh1750.h"

/* define CPU frequency in Mhz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 8000000UL
#endif

//This function is used to initialize the USART
//at a given UBRR value
void USARTInit(uint16_t ubrr_value)
{
   //Set Baud rate
   UBRRL = ubrr_value;
   UBRRH = (ubrr_value>>8);

   /*Set Frame Format
   >> Asynchronous mode
   >> No Parity
   >> 1 StopBit
   >> char size 8
   */

   UCSRC=(1<<URSEL)|(3<<UCSZ0);
   //Enable The receiver and transmitter
   UCSRB=(1<<RXEN)|(1<<TXEN);
	sei();
}


//This function is used to read the available data
//from USART. This function will wait until data is
//available.
char USARTReadChar()
{
	//Wait until a data is available
	while(!(UCSRA & (1<<RXC)))
	{
		//Do nothing
	}
	//Now USART has got data from host
	//and is available is buffer
	return UDR;
}

//This fuction writes the given "data" to
//the USART which then transmit it via TX line
void USARTWriteChar(char data)
{
	//Wait untill the transmitter is ready
	while(!(UCSRA & (1<<UDRE)))
	{
		//Do nothing
	}
	//Now write the data to USART buffer
	UDR=data;
}
void send_message(char *buffer)
{
	unsigned char i=0;
	while(buffer[i]!='\0')
	{
		while ((UCSRA & 1<<UDRE)==0);
		UDR=buffer[i];
		i++;
	}
}



int main(void) {
	//init uart
	USARTInit(51); // 9600
	//init bh1750
	bh1750_init();
	char Msg[32]={};
	 while (1)
	  {
		//get lux
		int lux = bh1750_getlux();

		//print value
		sprintf(Msg,"Lux:%d\r\n",lux);
		send_message(Msg);
		_delay_ms(1000);
	}
	
	return 0;
}

 

Deixe uma resposta

Your email address will not be published.

www.000webhost.com