Hola
Me estoy haciendo un poco de domotica casera con Arduino y la RPI.
Me he tenido que inventar una forma de controlar una tira RGB envíando un solo byte. El primer bit lo uso para indicar que enviamos un color, así tengo libres los 32000 valores restantes para enviar otras cosas, como control de persianas, ventilaciones, melodias, etc.
Utilizo simplemodbus para el arduino y para la RPI uso OpenHab.
De der a izq, los primeros 5 bits dan 31 niveles de azul, los siguiente 5 bits, otros 31 niveles de verde y los siguientes 5 los del rojo. El ultimo bit lo uso para indicar que hay color. De querer usarlo, si se le añade al verde se estaría haciendo el estandard RGB565.
Esta es la parte de decodifica los bits que recibe por el registro 0.
/* CONTROL COMANDOS DE LUCES RGB */
if( (holdingRegs[0] >= 32768) && (holdingRegs[0] != valorViejoLed) ) { // Si recibimos un color nuevo
valorViejoLed = holdingRegs[0]; // capturamos el valor para entrar solo ante un nuevo color.
// 255 es apagado - Se reciben valores de 0a31. Hay que convertir 31=0 y 0=255. Pasos de 8,22. 31*8 -256
// (( (31-X) *255) /31) Hace la conversion de 31=0 y 0=255.
// ((holdingRegs[0]&0x7C00)>>10) Decodifica los bits. Primero deja solo los que queremos y luego los desplaza al principio del byte
Leds( (((31-((holdingRegs[0]&0x7C00)>>10))*255)/31) , (((31-((holdingRegs[0]&0x3E0)>>5))*255)/31), (((31-(holdingRegs[0]&0x1F))*255)/31) ); // Descodificamos los bits del "RGB555"
}
La función leds solo actua sobre las salidas "analogicas" pwm:
/*****************************************************************************************
****************** Leds() pone la luz de colores que se le envía *********************
/****************************************************************************************/
void Leds(byte Rojo, byte Verde, byte Azul){
analogWrite(PIN_LED_ROJO, Rojo);
analogWrite(PIN_LED_VERDE, Verde);
analogWrite(PIN_LED_AZUL, Azul);
} // Fin Leds()
La parte del OpenHab:
// Codificamos el valor RGB en 1 bit de comando color, 5 bits de Red, 5 bits de Green y 5 bits de Blue. Y lo enviamos. Seudo RGB565
rule "Sacar valores RGB del HSB Para Despachin"
when
Item RGBDe changed
then
var int kk
hsbValue = RGBDe.state as HSBType
kk = kk + (((hsbValue.red.intValue)*31)/100) // Cogemos el valor RGB del rojo y lo pasamos de 0-255 a 0-31, que es de 0 a 5 bits.
kk = kk<<5 // Desplazamos esos 5 bits para dejarle sitio a los del siguiente color.
kk = kk + (((hsbValue.green.intValue)*31)/100) // Lo mismo con el verde
kk = kk<<5
kk = kk + (((hsbValue.blue.intValue)*31)/100)
kk = kk + 32768 // Activamos el primer bit para que el receptor sepa que estamos enviando color
postUpdate( ComandoID11, kk ) // Lo enviamos a Despachin.
end
Espero que le sea util a alguien. A mi me habría ahorrado varias horas haberlo encontrado en algún sitio.