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:

/*
* 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
#include
#include
#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 um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s