Tengo el controlador led de Adafruit conectado a mi atmega32. Ajusté su biblioteca para el Arduino, así que ahora solo necesito un controlador µ y no un Arduino. Esto funciona.
Ahora quiero controlar el brillo de los leds con un BH1750FVI. Yo uso la biblioteca I2C de Peter Fleury, enlace de descarga de la biblioteca . Luego agregué un código para poder sacar valores del sensor y ajustar el brillo de mis leds y aquí las cosas van mal.
Inicializo el I2C, luego lo envío al sensor para despertarme, me da una medida en Alta resolución de 1Lx y vuelvo a dormir. Normalmente, esto debería funcionar pero no pasa nada con mis leds, incluso mis leds parpadeantes (que no dependen de la medida del sensor) no funcionan.
Debido a que el sensor funciona en 3.3V y mi atmega32 funciona en 5V, utilizo un controlador de nivel lógico jy-mcu .
¿Qué estoy haciendo mal o es quizás mi controlador de nivel lógico jy-mcu?
mi código:
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <compat/twi.h>
#include <math.h>
#include "i2cmaster.h"
#define adres 0x23
/** Calculate from the sensor values to the pwm levels for the leds */
int calcLight(unsigned char lightData){
int lData = (int) lightData;
if(lData == 0){
return 0;
}else{
int calcData = round(lData / 655.35);
calcData = round(calcData * 40.95);
return calcData;
}
}
unsigned char getData(){
unsigned char data = 0x0000;
if(i2c_start(adres + I2C_WRITE)){ // set device address and write mode
i2c_stop(); /* failed to issue start condition, possibly no device found */
return 0x0000; // deactivate all 8 LEDs to show error */
}else{
i2c_write(0x01);
i2c_stop();
i2c_start_wait(adres + I2C_WRITE); // set device address and write mode
i2c_write(0x10);
if(i2c_rep_start(adres + I2C_READ)){ // set device address and read mode
i2c_stop();
return 0x0000;
}else{
data = i2c_readAck() << 8; // read MSB
data = data + i2c_readNak(); // read and shift LSB
i2c_stop();
return data;
}
}
}
int main(){
int lightData = 100;
unsigned char data = 0x0000;
tlc5947(2);
begin();
i2c_init();
ledsOff();
write();
_delay_ms(5000);
while(1){
data = getData();
if(data != 0x0000){
lightData = calcLight(data);
}
if(lightData <= 100){
setPWM(4, 100);
}else{
setPWM(4, lightData);
}
setPWM(19, 2000); // control blinking led
setPWM(28, 2000); // control blinking led
write();
_delay_ms(5000);
ledsOff();
write();
_delay_ms(5000);
}
}
Gracias de antemano
PS .: Soy nuevo en I2C.