سلام دوستان عزیز
من دارم یه سنسور لوکس متر رو راه میندازم TSL2561 هست
اینا کدهاش هست . ولی ارور داره . میتونید راهنماییم کنید ؟ ممنون
این کد برنامه اصلی :
و اینم کد کتابخونش :
من دارم یه سنسور لوکس متر رو راه میندازم TSL2561 هست
اینا کدهاش هست . ولی ارور داره . میتونید راهنماییم کنید ؟ ممنون
این کد برنامه اصلی :
/*****************************************************
Chip type : ATmega16A
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16a.h>
#include <i2c.h>
#include <alcd.h>
#include <math.h>
#include <stdlib.h>
#include <tsl2561.h>
#include <delay.h>
#include <stdio.h>
double Lux = 0;
char str[50];
float LUX;
void main(void)
{
tsl2561_init();
TSL2561_config();
// I2C Bus initialization
// I2C Port: PORTC
// I2C SDA bit: 1
// I2C SCL bit: 0
// Bit Rate: 100 kHz
// Note: I2C settings are specified in the
// Project|Configure|C Compiler|Libraries|I2C menu.
i2c_init();
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 20
lcd_init(20);
while (1)
{
LUX=ReadLuxes();
lcd_clear();
sprintf(str,"LUX=%0.1f ",LUX);
lcd_puts(str);
delay_ms(1000);
}
}
و اینم کد کتابخونش :
#define ControlRegister 0x80
#define TurnOnBits 0x03
#define TimingRegister 0x02 // 0x00 = 13.7ms / 0x01 = 101ms / 0x02 = 402ms (default)
#define IntegrationTimeGain 0x10 // 0x00 = 1x Gain (default) / 0x10 = 16x Gain
#define Data0LowByteMode 0x8C //Address the Ch0 lower data register
#define Data0HighByteMode 0x8D //Address the Ch0 upper data register
#define Data1LowByteMode 0x8E //Address the Ch1 lower data register
#define Data1HighByteMode 0x8F //Address the Ch1 upper data register
#define addr 0x52
void tsl2561_init(void)
{
int TSL2561AddressWrite_Float = 0x39<<1;
i2c_start();
i2c_write(addr);
i2c_write(ControlRegister);
i2c_write(TurnOnBits);
i2c_stop();
}
//-------------------------------------
// Configuration TSL2561
//-------------------------------------
void TSL2561_config(void)
{
i2c_start();
i2c_write(addr);
i2c_write(0x81);
i2c_write(TimingRegister);
//i2c_stop();
//i2c_start();
//i2c_write(0x39);
//i2c_write(0x81);
i2c_write(IntegrationTimeGain);
i2c_stop();
}
//-------------------------------------
// Read one byte from TSL2561
//-------------------------------------
unsigned char ReadByteTSL2561(unsigned char RegisterAddress)
{
unsigned char Data;
i2c_start();
i2c_write(addr);
i2c_write(RegisterAddress);
i2c_start(); // restart I2c
i2c_write(addr+1);// address + 1 is the read mode
Data = i2c_read(0); // read one byte from EEPROM
i2c_stop();
return Data;
}
void Power_On()
{
i2c_start();
i2c_write(addr);
i2c_write(0x80);
i2c_write(0x03);
i2c_stop();
}
//-------------------------------------
// Read lux value from TSL2561
//-------------------------------------
double Calculate(unsigned char,unsigned char,unsigned char,unsigned char);
void ReadLuxes()
{
char tmp[20];
unsigned char Data0Low_uchar=0;
unsigned char Data0High_uchar=0;
unsigned char Data1Low_uchar=0;
unsigned char Data1High_uchar=0;
Data0Low_uchar = ReadByteTSL2561(Data0LowByteMode);
Data0High_uchar = ReadByteTSL2561(Data0HighByteMode);
Data1Low_uchar = ReadByteTSL2561(Data1LowByteMode);
Data1High_uchar = ReadByteTSL2561(Data1HighByteMode);
Lux = Calculate(Data0Low_uchar,Data0High_uchar,Data1Low_uchar,Data1High_uchar); //Lux as a double value
}
//-------------------------------------
// Calculate luxes from TSL2561
//-------------------------------------
double Calculate(unsigned char Data0Low_uchar,unsigned char Data0High_uchar,unsigned char Data1Low_uchar,unsigned char Data1High_uchar)
{
unsigned int Channel0_uint;
unsigned int Channel1_uint;
unsigned int Data0Low_uint;
unsigned int Data0High_uint;
unsigned int Data1Low_uint;
unsigned int Data1High_uint;
float Channel0_float;
float Channel1_float;
float ChannelsRatio_float;
double Channel0_double;
double Channel1_double;
double ChannelsRatio_double;
double Lux = 0;
Data0Low_uint = (unsigned int)Data0Low_uchar;
Data0High_uint = (unsigned int)Data0High_uchar;
Data1Low_uint = (unsigned int)Data1Low_uchar;
Data1High_uint = (unsigned int)Data1High_uchar;
Channel0_uint = (unsigned int)256 * Data0High_uint + Data0Low_uint; //Shift Data0High to upper byte
Channel1_uint = (unsigned int)256 * Data1High_uint + Data1Low_uint; //Shift Data1High to upper byte
Channel0_float = (float)Channel0_uint;
Channel1_float = (float)Channel1_uint;
ChannelsRatio_float = Channel1_float / Channel0_float;
ChannelsRatio_double = (double)ChannelsRatio_float;
Channel0_double = (double)Channel0_float;
Channel1_double = (double)Channel1_float;
if ((ChannelsRatio_double <= (double)0.50) && (ChannelsRatio_double > (double)0))
{
Lux = (double)0.0304 * Channel0_double - (double)0.062 * Channel0_double * (pow(ChannelsRatio_double, 1.4));
}
else if((ChannelsRatio_double <= (double)0.61) && (ChannelsRatio_double > (double)0.50))
{
Lux = (double)0.0224 * Channel0_double - (double)0.031 * Channel1_double;
}
else if((ChannelsRatio_double <= (double)0.80) && (ChannelsRatio_double > (double)0.61))
{
Lux = (double)0.0128 * Channel0_double -(double) 0.0153 * Channel1_double;
}
else if((ChannelsRatio_double <= (double)1.30) && (ChannelsRatio_double > (double)0.80))
{
Lux = (double)0.00146 * Channel0_double - (double)0.00112 * Channel1_double;
}
else if(ChannelsRatio_double > (double)1.30)
{
Lux = 0;
}
return Lux;
}
//-------------------------------------
// End of TSL2561 support
//------------------------------------
دیدگاه