求助:求WS2812彩灯灯光效果算法或者软件
因项目用到WS2812彩灯,编灯光效果的时候发现很麻烦,而且用的数组(如下),很占空间(虽然空间足够),但如果增加减少效果很费劲。所以求助万能的坛子,有没有好用的一些算法或者软件编辑效果的。另外,项目上的界面是这样的自定义效果,基于什么算法,一直搞不明白,比如那个混合颜色是什么鬼?
/*********************************** 外圈花样定义 *************************************/
const uint8_t rgbO_Mono[] = //r
{{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//r
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
//g
,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
//g
,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
//b
,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
//b
,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff}
,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff}
,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff}
,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff}
};
const uint8_t rgbO_Move[] = //r6
{{0xff,0x00,0x00},{0xf0,0x00,0x00},{0xe1,0x00,0x00},{0xd2,0x00,0x00}
,{0xc3,0x00,0x00},{0xb4,0x00,0x00},{0xa5,0x00,0x00},{0x96,0x00,0x00}
,{0x87,0x00,0x00},{0x78,0x00,0x00},{0x69,0x00,0x00},{0x5a,0x00,0x00}
,{0x4b,0x00,0x00},{0x3c,0x00,0x00},{0x2d,0x00,0x00},{0x1e,0x00,0x00}
,{0x00,0xff,0x00},{0x00,0xf0,0x00},{0x00,0xe1,0x00},{0x00,0xd2,0x00}
,{0x00,0xc3,0x00},{0x00,0xb4,0x00},{0x00,0xa5,0x00},{0x00,0x96,0x00}
,{0x00,0x87,0x00},{0x00,0x78,0x00},{0x00,0x69,0x00},{0x00,0x5a,0x00}
,{0x00,0x4b,0x00},{0x00,0x3c,0x00},{0x00,0x2d,0x00},{0x00,0x1e,0x00}
,{0x00,0x00,0xff},{0x00,0x00,0xf0},{0x00,0x00,0xe1},{0x00,0x00,0xd2}
,{0x00,0x00,0xc3},{0x00,0x00,0xb4},{0x00,0x00,0xa5},{0x00,0x00,0x96}
,{0x00,0x00,0x87},{0x00,0x00,0x78},{0x00,0x00,0x69},{0x00,0x00,0x5a}
,{0x00,0x00,0x4b},{0x00,0x00,0x3c},{0x00,0x00,0x2d},{0x00,0x00,0x1e}
};
/*********************************** 中间花样定义 *************************************/
//数字0~9
const uint8_t rgbM_Num[] = //0
{{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//1
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//2
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//3
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//4
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//5
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//6
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//7
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//8
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
//9
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
};
const uint8_t rgbM_Pattern1[] = //花样1 内向外扩散
{{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x55,0x55,0x55},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
//
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x55,0x55,0x55},{0x00,0x00,0x00},{0x55,0x55,0x55},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
//
,{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55}
,{0x55,0x55,0x55},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x55,0x55,0x55}
,{0x55,0x55,0x55},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x55,0x55,0x55}
,{0x55,0x55,0x55},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x55,0x55,0x55}
,{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55},{0x55,0x55,0x55}
//r
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
//r
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
//r
,{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00}
,{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
,{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
,{0xff,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0xff,0x00,0x00}
,{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00},{0xff,0x00,0x00}
//g
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
//g
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
//g
,{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00}
,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
,{0x00,0xff,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0xff,0x00}
,{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00},{0x00,0xff,0x00}
//b
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
//b
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0x00}
,{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00}
//b
,{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff}
,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0xff}
,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0xff}
,{0x00,0x00,0xff},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0x00},{0x00,0x00,0xff}
,{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff},{0x00,0x00,0xff}
};
/************************** 底层初始化 ******************************************/ 见过最牛逼的用stm8f003带1024个灯珠,可以做很多花样和速度的 bbandpp 发表于 2018-9-15 22:09
见过最牛逼的用stm8f003带1024个灯珠,可以做很多花样和速度的
我现在用的是STM32F103RET6,定时器PWM+DMA驱动,
空间什么的够用,差在效果的算法。。。搞了好久了。。 jssd 发表于 2018-9-15 22:11
我现在用的是STM32F103RET6,定时器PWM+DMA驱动,
空间什么的够用,差在效果的算法。。。搞了好久了。。 ...
搞个Python脚本生成吧,或者搞个图形工具来生成。因为效果太多了,估计没有现成的简单工具帮你
BWT,你们要什么效果? jssd 发表于 2018-9-15 22:11
我现在用的是STM32F103RET6,定时器PWM+DMA驱动,
空间什么的够用,差在效果的算法。。。搞了好久了。。 ...
这个核心就是在内置的效果上 nanfang2000 发表于 2018-9-15 22:18
搞个Python脚本生成吧,或者搞个图形工具来生成。因为效果太多了,估计没有现成的简单工具帮你
BWT,你 ...
就是一般机台比较炫的效果,比如渐变,闪,转,七彩。。。之类的。。。。
这些我的想法是用固定的数组编好,然后读。。。
但好像匹配不上楼主位的那个界面,主要是混合色不知道怎样处理。。。难道定义另一个数组叠加上去? 混色是背景色的含义吧,估计只能加数组了 bbandpp 发表于 2018-9-15 22:19
这个核心就是在内置的效果上
确实,看别人几百几千种效果,也不知是怎样弄出来的?难不成一个一个数组慢慢弄?想想觉得有点可怕。。。 jssd 发表于 2018-9-15 22:24
确实,看别人几百几千种效果,也不知是怎样弄出来的?难不成一个一个数组慢慢弄?想想觉得有点可怕。。。 ...
这种内推的,应该不会有这么多模式的,一般也就5,6种模式就够了 arduino的这个库不错
https://github.com/kitesurfer1404/WS2812FX jssd 发表于 2018-9-15 22:24
确实,看别人几百几千种效果,也不知是怎样弄出来的?难不成一个一个数组慢慢弄?想想觉得有点可怕。。。 ...
换个思路,把灯条看成屏幕,放电影
做成动画编辑那种专业软件,一帧一帧的,想怎么搞都行。就是比较耗存储。
有人给过我一个灯光效果的播放文件,几百MB,打开看其实就是一帧一帧的数据。。。 aammoo 发表于 2018-9-15 22:41
arduino的这个库不错
https://github.com/kitesurfer1404/WS2812FX
看起来不错,可是看不懂。。。惭愧了。。{:3_60:} nanfang2000 发表于 2018-9-15 22:59
换个思路,把灯条看成屏幕,放电影
做成动画编辑那种专业软件,一帧一帧的,想怎么搞都行。就是比较耗存 ...
我也是倾向这种,准备写一个小软件,从上到下读一张张彩色图片像素RGB值,存成数组,刷屏时就按这个一帧帧刷,模式搞几种,比如静态,移动,闪烁(也可以看成速度很慢的移动),渐变。。。
只是这样搞,楼主位的混合色不知道怎样搞。。。 jssd 发表于 2018-9-15 23:34
我也是倾向这种,准备写一个小软件,从上到下读一张张彩色图片像素RGB值,存成数组,刷屏时就按这个一帧 ...
不太明白楼主位这个图什么意思,混合色什么意思。。难道意思不是纯色? nanfang2000 发表于 2018-9-15 23:38
不太明白楼主位这个图什么意思,混合色什么意思。。难道意思不是纯色? ...
我也不知道,现在我把基本色当底色,然后叠加上混合色。也就是两组数组了。。。 渐变色用HSL做算法再转回RGB显示啊! 有个来源的库忘了叫什么了可以实现很多效果 用的是spi+dma驱动 jssd 发表于 2018-9-15 22:11
我现在用的是STM32F103RET6,定时器PWM+DMA驱动,
空间什么的够用,差在效果的算法。。。搞了好久了。。 ...
SPI+DMA可以很高效的驱动,spi速度设置为合适的频率,1bit变成3bit就可以。 kakarotto 发表于 2018-9-16 20:26
SPI+DMA可以很高效的驱动,spi速度设置为合适的频率,1bit变成3bit就可以。
sip也弄过,确实是可以,只是有一个我不是很满意,多了几个没用的IO脚,pwm只要一个io就行 Pupil 发表于 2018-9-16 16:31
有个来源的库忘了叫什么了可以实现很多效果
是楼上那个吗? jssd 发表于 2018-9-16 20:35
是楼上那个吗?
你查下fastled,github上的,好像还见过几个,一时找不到 这个问题好,也想知道需要怎么做。 WS2812FX 有54种样式,支持分段,速度调节,色彩设置,建议用arduino看看效果先。移植到F030上面,空间爆了。 为啥的我置低刷新要300US才行? gmyu 发表于 2018-9-28 10:14
WS2812FX 有54种样式,支持分段,速度调节,色彩设置,建议用arduino看看效果先。移植到F030上面,空间爆了 ...
WS2812FX ?这是个什么东东?有开源的吗? 我见过最NB的是用STM8实现,分段,变色,流星这些效果 用SD卡读,然后直接发,行不行? 效果就用软件做 楼主,最后效果做出来了吗 本帖最后由 jssd 于 2018-11-12 16:47 编辑
bbandpp 发表于 2018-11-12 11:22
楼主,最后效果做出来了吗
没有按图的做了。写了个小软件,把所有的数据都做成数组,然后直接用了。这样的后果是code变成了300+K。。。
看下面
生成图片和数组的小软件,使用opencv2413
/***********************************************************************
* OpenCV 2.3.1 example
* By Quarryman 2012
***********************************************************************/
#include <stdio.h>
#include "stdlib.h"
#include <tchar.h>
#include <Windows.h>
#include <fstream>
#include <iostream>
#include <string>
#include<iomanip>
#include <opencv2\opencv.hpp>
#include<shlwapi.h>
using namespace cv;
using namespace std;
//
//
//ofstream outfile("ws2812Dat.c", ios::trunc);
//
//const int LEDNUM = 100;
//
//void get_setImagePixel(string imagePath)
//{
// /********** 截取名称字符串 *******************/
// int dex = imagePath.find_last_of('\\');
// cout << dex << endl;
// string name = imagePath.substr(dex+1);
// cout << name << endl;
// dex = name.find('.');
// name = name.substr(0,dex);
// cout << name << endl;
//
////Mat image = imread(imagePath , 0);
// Mat image = imread(imagePath, 1);
// //得宽高
// int w = image.cols;
// int h = image.rows;
// int stepw = w/LEDNUM;
// int i,j;
// int channels = image.channels();
// //灰度图,像素为单通道
// if (channels == 1)
// {
//// int pixel = image.at<uchar>(x, y);
//// cout << "灰度图像,处的灰度值为" << pixel << endl;
// }
// else
// {
// //通过实验,彩色图像的默认存储是bgr, 且存储的格式如下
// outfile << "const unsigned char " << name <<"[]" << " = {"<<endl;
//
// for(j=0;j<h;j+=stepw)
// {
// outfile << " ";
// for(i=0;i<w;i+=stepw)
// {
// int b = image.at<Vec3b>(j, i); // b = image.at<uchar>(x,y*3);
// int g = image.at<Vec3b>(j, i); //g = image.at<uchar>(x, y * 3 + 1);
// int r = image.at<Vec3b>(j, i); //r = image.at<uchar>(x, y * 3 + 1);
// image.at<Vec3b>(j, i) = 255;
// image.at<Vec3b>(j, i) = 255;
// image.at<Vec3b>(j, i) = 255;
// outfile << "{0x" << setw(2)<< setfill('0') << hex << r << ",0x" << setw(2)<<setfill('0') << hex<< g << ",0x" << setw(2)<< setfill('0') << hex<< b << "},";
// }
// outfile << endl;
// }
// outfile << " };"<<endl;
// }
//
// imshow("cc", image);
// outfile.close();
//}
//
//string TCHAR2STRING(TCHAR* str)
//{
// std::string strstr;
// try
// {
// int iLen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
//
// char* chRtn = new char;
//
// WideCharToMultiByte(CP_ACP, 0, str, -1, chRtn, iLen, NULL, NULL);
//
// strstr = chRtn;
// }
// catch (std::exception e)
// {
// }
//
// return strstr;
//}
//
//int main()
//{
////// int x=::MessageBox(NULL, TEXT("将在20秒后关机,确定执行吗?"), TEXT("操作提示"), 1);
//// TCHAR szBuffer = {0};
//// OPENFILENAME file = {0};
//// file.hwndOwner = NULL;
//// file.lStructSize = sizeof(file);
//// file.lpstrFilter = _T("jpg文件(*.jpg)\0*.jpg\0所有文件(*.*)\0*.*\0");//要选择的文件后缀
////// file.lpstrInitialDir = _T("C:\\");//默认的文件路径
//// file.lpstrFile = szBuffer;//存放文件的缓冲区
//// file.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);
//// file.nFilterIndex = 0;
//// file.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER ;//标志如果是多选要加上OFN_ALLOWMULTISELECT
//// BOOL bSel = GetOpenFileName(&file);
////// cout << file.lpstrFile << endl;
////// cout << szBuffer << endl;
//// string imagename = TCHAR2STRING(szBuffer);
//// cout << imagename << endl;
////
////// string imagename = "eeee.jpg"; //此处需要填写绝对地址,我测试时使用相对地址出错。
//// get_setImagePixel(imagename);
//
// //读入图像
// //Mat img = imread(imagename);
// //
// ////如果读入图像失败
// //if(img.empty())
// //{
// // return -1;
// //}
// //
// ////创建窗口
// //namedWindow("image",1);
// //
// ////显示图像
// //imshow("image", img);
//
// //等待按键,按键盘任意键返回
// waitKey();
//
// return 0;
//
// //错误指出: feihongmeilian
// //经本人验证,string imagename = "lena.jpg";处是可以使用相对地址,本人使用环境为OpenCV 2.4.3
// //图片为meinv.jpg置于代码文件所在文件夹的上一级文件夹中,string imagename = "..\\meinv.jpg"图片可正常显示。
// //需提醒注意的是 双引号“” 中出现的第一个 斜杠 \ 被视作转义字符
//}
//#include <opencv2/opencv.hpp>
//#include<opencv2/imgproc/imgproc.hpp>
//#include<iostream>
//using namespace std;
//using namespace cv;
//
//int main()
//{
// Mat img;
// img = imread("pic180x509.bmp");
// for (int i = 0; i < 3; i++)
// {
// Mat bgr(img.rows, img.cols, CV_8UC3, Scalar(0, 0, 0));
// Mat temp(img.rows, img.cols, CV_8UC1);
// Mat out[] = { bgr };
// int from_to[] = { i,i };
// mixChannels(&img, 1, out, 1, from_to,1);
// //获得其中一个通道的数据进行分析
// imshow("1 channel", bgr);
// waitKey();
// }
//}
//
//int main()
//{
// //载入图像
// IplImage* img=cvLoadImage("pic180x509.bmp",1);
// //cvCreateImage(size,depth,channels)函数,depth 图像元素的位深度,IPL_DEPTH_8U 表示无符号8位整型
// IplImage* Bimg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);//1为有1个通道
// IplImage* Gimg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
// IplImage* Rimg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
//
// IplImage* pImg1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);//3为有3个通道
// IplImage* pImg2=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
// IplImage* pImg3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
// //将RGB图像分离
// //cvSplit( const CvArr* src,CvArr* dst0,CvArr* dst1,CvArr* dst2,CvArr* dst3 )函数
// //复制src的各个通道到图像dst0,dst1,dst2和dst3中
// cvSplit(img,Bimg,Gimg,Rimg,0);
// //目标图像必须与源图像在大小和数据类型上匹配
// //输入多通道,输出为B,G,R单通道
//
// //在合成之前需要清零
// cvSetZero(pImg1);
// cvSetZero(pImg2);
// cvSetZero(pImg3);
// //将三个通道合成
// //输入参数为B,G,R单通道,最后一个为输出
// //cvMerge( const CvArr* src0, const CvArr* src1,const CvArr* src2, const CvArr* src3,CvArr* dst );
// cvMerge(Bimg,0,0,0,pImg3);
// cvMerge(0,Gimg,0,0,pImg2);
// cvMerge(0,0,Rimg,0,pImg1);
//
// cvNamedWindow("RGB",1);
// cvShowImage("RGB",img);
//
// cvNamedWindow("R",1);
// cvShowImage("R",pImg1);
//
// cvNamedWindow("G",1);
// cvShowImage("G",pImg2);
//
// cvNamedWindow("B",1);
// cvShowImage("B",pImg3);
//
// //HSV图像处理
// IplImage* hsv=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
//
// //将RGB图像转为HSV图像的函数
// cvCvtColor(img,hsv,CV_BGR2HSV);
//
// IplImage* Himg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1);
// IplImage* Simg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1);
// IplImage* Vimg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1);
//
// IplImage* HSV1=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,3);//3个通道
// IplImage* HSV2=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,3);
// IplImage* HSV3=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,3);
// //用法同上
// cvSplit(hsv,Vimg,Simg,Himg,0);
//
// cvNamedWindow("V",1);
// cvShowImage("V",Vimg);
//
// cvNamedWindow("S",1);
// cvShowImage("S",Simg);
//
// cvNamedWindow("H",1);
// cvShowImage("H",Himg);
//
// cvNamedWindow("HSV",1);
// cvShowImage("HSV",hsv);
//
// cvWaitKey(0);
// //RGB RELEASE
// cvReleaseImage(&img);
// cvReleaseImage(&Rimg);
// cvReleaseImage(&Gimg);
// cvReleaseImage(&Bimg);
//
// cvReleaseImage(&pImg1);
// cvReleaseImage(&pImg2);
// cvReleaseImage(&pImg3);
// //HSV RELEASE
// cvReleaseImage(&hsv);
// cvReleaseImage(&Himg);
// cvReleaseImage(&Simg);
// cvReleaseImage(&Vimg);
//
// cvReleaseImage(&HSV1);
// cvReleaseImage(&HSV2);
// cvReleaseImage(&HSV3);
//
// return 0;
//}
struct BGR
{
uchar b;
uchar g;
uchar r;
};
struct HSV
{
int h;
double s;
double v;
};
bool IsEquals(double val1 , double val2)
{
return fabs(val1 - val2) < 0.001;
}
// BGR(BGR: 0~255)转HSV(H: , V: )
void BGR2HSV(BGR &bgr, HSV &hsv)
{
double b, g, r;
double h, s, v;
double min, max;
double delta;
b = bgr.b / 255.0;
g = bgr.g / 255.0;
r = bgr.r / 255.0;
if (r > g)
{
max = MAX(r, b);
min = MIN(g, b);
}
else
{
max = MAX(g, b);
min = MIN(r, b);
}
v = max;
delta = max - min;
if (IsEquals(max, 0))
{
s = 0.0;
}
else
{
s = delta / max;
}
if (max == min)
{
h = 0.0;
}
else
{
if (IsEquals(r, max) && g >= b)
{
h = 60 * (g - b) / delta + 0;
}
else if (IsEquals(r, max) && g < b)
{
h = 60 * (g - b) / delta + 360;
}
else if (IsEquals(g, max))
{
h = 60 * (b - r) / delta + 120;
}
else if (IsEquals(b, max))
{
h = 60 * (r - g) / delta + 240;
}
}
hsv.h = (int)(h + 0.5);
hsv.h = (hsv.h > 359) ? (hsv.h - 360) : hsv.h;
hsv.h = (hsv.h < 0) ? (hsv. h + 360) : hsv.h;
hsv.s = s;
hsv.v = v;
}
// HSV转BGR
void HSV2BGR(HSV &hsv, BGR &bgr)
{
int h = hsv.h;
double s = hsv. s;
double v = hsv. v;
double b = 0.0;
double g = 0.0;
double r = 0.0;
int flag = (int)abs(h / 60.0);
double f = h/60.0 - flag;
double p = v * (1 - s);
double q = v * (1 - f*s);
double t = v * (1 - (1- f)*s);
switch (flag)
{
case 0:
b = p;
g = t;
r = v;
break;
case 1:
b = p;
g = v;
r = q;
break;
case 2:
b = t;
g = v;
r = p;
break;
case 3:
b = v;
g = q;
r = p;
break;
case 4:
b = v;
g = p;
r = t;
break;
case 5:
b = q;
g = p;
r = v;
break;
default:
break;
}
int blue = int(b * 255);
bgr.b = (blue > 255) ? 255 : blue;
bgr.b = (blue < 0) ? 0 : bgr.b;
int green = int(g * 255);
bgr.g = (green > 255) ? 255 : green;
bgr.g = (green < 0) ? 0 : bgr.g;
int red = int(r * 255);
bgr.r = (red > 255) ? 255 : red;
bgr.r = (red < 0) ? 0 : bgr.r;
}
ofstream outfile("data.c", ios::trunc);
int main()
{
string imgName = "pic360x201.bmp";
Mat img = cv::imread(imgName);
Mat tmp = img.clone();
if (img.data == NULL)
{
cout<< "Could not open or find the image"<<endl;
return -1;
}
outfile << "const unsigned char " << "monoBW" <<"[]" << " = {" << " /*256*1*/" <<endl;
for(int i=0;i<256;i++)
{
outfile << "{0x" << setw(2)<< setfill('0') << hex << i << ",0x" << setw(2)<<setfill('0') << hex<< i << ",0x" << setw(2)<< setfill('0') << hex<< i << "},";
}
outfile << " };"<<endl;
outfile <<endl;
// 色彩空间转换>>自己实现
int row = img.rows;
int col = img.cols * img.channels();
uchar * pImg = NULL;
BGR bgr;
HSV hsv;
outfile << "const unsigned char " << "hsv" <<"[]" << " = {" << " /*360*201*/" <<endl;
outfile << " ";
for (int j = 0; j < col/3; j++)
{
outfile << "/* " << setw(3)<< setfill('0') << j << " */" ;
}
outfile << endl;
for (int i = 0; i < row/2+1; i++)
{
outfile << "/* " << setw(3)<< setfill('0')<< dec << i << "*/ " ;
pImg = img.ptr<uchar>(i);// 遍历时用img.at()效率会降很多, 很耗时
for (int j = 0; j < col; j+=3)
{
//bgr.b = pImg;
//bgr.g = pImg;
//bgr.r = pImg;
//bgr.b = 0;
//bgr.g = 0;
//bgr.r = 0;
//BGR2HSV(bgr, hsv);
hsv.h = j/3;//调整色相 +60.取值范围为[0, 360)
hsv.h = (hsv.h > 359) ? (hsv.h - 360) : hsv.h;
hsv.h = (hsv.h < 0) ? (hsv.h + 360) : hsv.h;
hsv.s = 1;
hsv.v = i/100.0;//调整色相 +60.取值范围为[0, 360)
hsv.v = (hsv.v > 1) ? 1 : hsv.v;
hsv.v = (hsv.v < 0) ? 0 : hsv.v;
HSV2BGR( hsv, bgr);
pImg = bgr.b;
pImg = bgr.g;
pImg = bgr.r;
int b = bgr.b;
int g = bgr.g;
int r = bgr.r;
outfile << "{0x" << setw(2)<< setfill('0') << hex << r << ",0x" << setw(2)<<setfill('0') << hex<< g << ",0x" << setw(2)<< setfill('0') << hex<< b << "},";
}
outfile << endl;
}
for (int i = row/2+1; i < row; i++)
{
outfile << "/* " << setw(3)<< setfill('0')<< dec << i << "*/ " ;
pImg = img.ptr<uchar>(i);// 遍历时用img.at()效率会降很多, 很耗时
for (int j = 0; j < col; j+=3)
{
//bgr.b = pImg;
//bgr.g = pImg;
//bgr.r = pImg;
//bgr.b = 255;
//bgr.g = 255;
//bgr.r = 255;
//BGR2HSV(bgr, hsv);
hsv.h = j/3;//调整色相 +60.取值范围为[0, 360)
hsv.h = (hsv.h > 359) ? (hsv.h - 360) : hsv.h;
hsv.h = (hsv.h < 0) ? (hsv.h + 360) : hsv.h;
hsv.s = 1-(i-100)/100.0;//调整色相 +60.取值范围为[0, 360)
hsv.s = (hsv.s > 1) ? 1 : hsv.s;
hsv.s = (hsv.s < 0) ? 0 : hsv.s;
hsv.v = 1;
HSV2BGR( hsv, bgr);
pImg = bgr.b;
pImg = bgr.g;
pImg = bgr.r;
int b = bgr.b;
int g = bgr.g;
int r = bgr.r;
outfile << "{0x" << setw(2)<< setfill('0') << hex << r << ",0x" << setw(2)<<setfill('0') << hex<< g << ",0x" << setw(2)<< setfill('0') << hex<< b << "},";
}
outfile << endl;
}
outfile << " };"<<endl;
// for (int i = 0; i < row; i++)
// {
// pImg = img.ptr<uchar>(i);// 遍历时用img.at()效率会降很多, 很耗时
// for (int j = 0; j < col; j+=3)
// {
// bgr.b = pImg;
// bgr.g = pImg;
// bgr.r = pImg;
// BGR2HSV(bgr, hsv);
// //hsv.h = hsv.h + 60;//调整色相 +60.取值范围为[0, 360)
// //hsv.h = (hsv.h > 359) ? (hsv.h - 360) : hsv.h;
// //hsv.h = (hsv.h < 0) ? (hsv.h + 360) : hsv.h;
//hsv.s =hsv.s + 0.1;//调整色相 +60.取值范围为[0, 360)
// hsv.s = (hsv.s > 1) ? 1 : hsv.s;
// hsv.s = (hsv.s < 0) ? 0 : hsv.s;
// HSV2BGR( hsv, bgr);
// pImg = bgr.b;
// pImg = bgr.g;
// pImg = bgr.r;
// }
// }
imshow("my", img);
cv::imwrite("output.bmp",img);
// 色彩空间转换>>调用OpenCV
// cvtColor(tmp, tmp, CV_BGR2HSV);
// vector<Mat> channels;
// split(tmp, channels);
//// channels += 60;// 调整色相 +30.这里没有做范围判断,opencv的h取值范围为[0, 180)
// channels += 200;// 调整色相 +30.这里没有做范围判断,opencv的h取值范围为[0, 180)
// merge(channels, tmp);
// cvtColor(tmp, tmp, CV_HSV2BGR);
// imshow("opencv", tmp);
cv::waitKey();
return 0;
}
生成的数组
生成的图片
bbandpp 发表于 2018-10-12 13:54
我见过最NB的是用STM8实现,分段,变色,流星这些效果
(引用自28楼)
有出处吗或者效果
页:
[1]