BH1750FVI con I2C no funcionará

1

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.

    
pregunta Daan Mouha

0 respuestas

Lea otras preguntas en las etiquetas