Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Proyecto: Iluminación Led para escritorio
#21
Triggerr escribió:Con que programa has echo el diseño 3D de la placa? Te ha quedado muy muy curioso

Enviado desde mi Nexus 4 usando Tapatalk 2

Con Eagle + EagleUp + Google SketchUp

http://giltesa.com/2012/10/07/instalacio...ers-en-3d/

Se pueden conseguir cosas muy curiosas: http://www.youtube.com/watch?v=GB1F685NU28

Mola
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
Citar
#22
Código:
/**
* Web:       giltesa.com
* Licencia:  CC BY-NC-SA 3.0
*
* ATTiny85 pinout:
*                         _____
*                        |1   8| VCC
*     Tira de leds => D3 |2   7|
*    Potenciometro => A2 |3   6|
*                    GND |4___5| D0 <= Sensor PIR
*/


// PINES
#define LED 3     // Digital PWM  - Tira de leds
#define PIR 0     // Digital      - Sensor movimiento
#define POT A2    // Analogico    - Regulador brillo

// BRILLO:
#define bMinimo   3   // Valor minimo para que el led este encendido.
#define bMargen   4   // Diferencia que ha de haber para que se considere que se ha cambiado el brillo.
byte bAnterior  = 0;
byte bActual    = 0;
byte bAtenuado  = 0;

// MODO AHORRO:
#define tiempoApagado      600000   // Tiempo para entrar en modo ahorro (apagado).
#define tiempoAtenuado     18       // Velocidad que se tarda en aumentar o disminuir cada nivel de brillo.
unsigned long ultimoUso  = 0;       // El momento en el que se utilizo por ultima vez el potenciometro o se detecto al usuario.
boolean enAhorro         = false;   // Indica si los Leds se apagaron por inactividad del usuario.
boolean cambiandoBrillo  = false;   // Indica que se esta cambiando el brillo (aumentandolo o decrementandolo gradualmente)



/**
* Funcion inicial de configuracion.
*/
void setup()
{
    pinMode(LED, OUTPUT);

    // Poniendo el programa en ahorro y las variables de brillo con el mismo valor nos aseguramos
    // de que al reiniciarse el microcontrolador, por un corte de luz, las luces permanezcan apagadas.
    enAhorro    = true;
    bAnterior   = getBrillo();
    bActual     = bAnterior;
}



/**
* Funcion principal.
*/
void loop()
{
    bActual = getBrillo();


    // Se comprueba si el potenciometro ha sido movido. Segun el estado del programa:
    if( getDiferenciaBrillo() > bMargen )
    {
        bAnterior = bActual;
        ultimoUso = millis();

        // Comienza la desactivacion del modo ahorro, los leds se endenderan gradualmente:
        if( enAhorro )
        {
            setBrillo(true);
        }
        // Los leds cambiaran el brillo por el nuevo valor, siempre que el nuevo valor supere el minimo para que estos se enciendan:
        else if( bActual > bMinimo )
        {
            analogWrite( LED, bActual );
        }
        // Si no se supera el minimo los leds se apagan:
        else
        {
            analogWrite( LED, 0 );
        }
    }
    // Prosigue la desactivacion del modo ahorro:
    else if( enAhorro && cambiandoBrillo )
    {
        setBrillo(true);
    }


    // Registra la ultima vez que se detecto la presencia del usuario:
    if( digitalRead(PIR) )
    {
        ultimoUso = millis();

        // Si se estaba activando el modo ahorro, se desactiva gradualmente:
        if( !enAhorro && cambiandoBrillo )
            setBrillo(true);
    }


    // Activa el modo ahorro si el usuario no ha interactuado con los sensores en el tiempoApagado especificado:
    if( !enAhorro  &&  millis()-ultimoUso > tiempoApagado )
    {
        setBrillo(false);
    }

}



/**
* Enciende o apaga el LED con efecto gradual.
*/
void setBrillo( boolean estado )
{

    if( !cambiandoBrillo )
    {
        bAtenuado = estado ? 0 : bActual;
        cambiandoBrillo = true;
    }


    // Sube el brillo:
    if( estado )
    {
        if( bAtenuado < bActual)
        {
            analogWrite( LED, ++bAtenuado );
            delay(tiempoAtenuado);
        }
        else
        {
            enAhorro = false;
            cambiandoBrillo = false;
            bAnterior = bActual;
        }
    }
    // Baja el brillo:
    else
    {
        if( bAtenuado > 0 )
        {
            analogWrite( LED, --bAtenuado );
            delay(tiempoAtenuado);
        }
        else
        {
            enAhorro = true;
            cambiandoBrillo = false;
            bAnterior = bActual;
        }
    }


}



/**
* Lee el valor del potenciometro y devuelve
* el brillo correspondiente para el led.
*/
byte getBrillo()
{
    return map(analogRead(POT), 0, 1023, 0, 255);
}



/**
* Devuelve la diferencia de brillo entre la medicion
* anterior y la actual.
*/
byte getDiferenciaBrillo()
{
    return bAnterior > bActual ? bAnterior-bActual : bActual-bAnterior;
}






Me queda probarlo en el attiny y pedirle a grafisoft que me haga la placa con su cnc :zpalomitas:
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
Citar
#23
Muy buen proyecto giltesa!! Está muy bien pensado y queda de maravilla para tener una iluminación buena en cualquier sitio. Tengo una duda con respecto a este trozo del código, y es que no sé muy bien como va:

Código:
return bAnterior > bActual ? bAnterior-bActual : bActual-bAnterior;

¿Funciona como un if?¿Si bAnterior es mayor que bActual devuelve la diferencia bAnterior-bActual, y si bActual es mayor que bAnterior devuelve la diferencia bActual-bAnterior?
Citar
#24
Regata escribió:Muy buen proyecto giltesa!! Está muy bien pensado y queda de maravilla para tener una iluminación buena en cualquier sitio. Tengo una duda con respecto a este trozo del código, y es que no sé muy bien como va:

Código:
return bAnterior > bActual ? bAnterior-bActual : bActual-bAnterior;

¿Funciona como un if?¿Si bAnterior es mayor que bActual devuelve la diferencia bAnterior-bActual, y si bActual es mayor que bAnterior devuelve la diferencia bActual-bAnterior?

Tambien tengo la duda como funciona esta linea
Citar
#25
Si, así es, se trata de un if corto. Si se cumple la condicion se hace la primera operacion y si no la segunda.

Esto:

Código:
byte getDiferenciaBrillo()
{
    return bAnterior > bActual ? bAnterior-bActual : bActual-bAnterior;
}

Es igual a la versión larga:

Código:
byte getDiferenciaBrillo()
{
    if( bAnterior > bActual )
    {
        return bAnterior-bActual;
    }
    else
    {
        return bActual-bAnterior;
    }
}

Para cosas sencillas queda muy bien Sonrisa


PD: http://es.wikipedia.org/wiki/Operador_ternario
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
Citar
#26
Hostia que bueno, nunca te acostarás sin saber una cosa más, la verdad es que está muy bien. Voy a seguir mirando lo del operador ternario!! Gracias
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Proyecto: Base de carga para relojes automáticos miguelgomez18 22 2,020 10-04-2016, 03:49 PM
Último mensaje: miguelgomez18
  Proyecto Slider para DSLR TomasCarrasco84 8 1,437 05-12-2015, 10:54 PM
Último mensaje: vcode
  Novato - Dudas proyecto First Person View para coche o Heli pedrotronic 3 585 29-10-2014, 11:28 AM
Último mensaje: pedrotronic
  [PROYECTO] Ordenador A bordo para Coche cansi22 35 8,286 23-05-2014, 11:54 AM
Último mensaje: cansi22