本帖最后由 athlon789789 于 2013-4-16 11:57 编辑
新手做的3个8*8点阵做的点阵尾灯带一点动画功能不过很麻烦要自己一帧一帧去做,有兴趣朋友可以自己试下。做这个东西最麻烦的部分是实现按钮的即时响应,因为动画免不了用到delay什么的。delay一出按钮什么的都完蛋了。代码比较暴力求高手指点优化一下,还有就是转向的时候可以响应按钮开关的,自己没有好办法了。max7219的库https://code.google.com/p/arudino-maxmatrix-library/downloads/list 我做了简单的修改可以实现测试功能和省电待机功能
- #include <avr/pgmspace.h>
- #include <MaxMatrix.h> //这个库我做了简单修改加入了关机功能测试功能
- #include <Button.h>
- #include "SimpleTimer.h"
- //////////////////////////////////////左右箭头
- PROGMEM prog_uchar LR[]={
- 24, 8, B00011000,B00111100,B01111110,B11011011,B10011001,B00011000,B00011000,B00000000,B00011000,B00111100,B01111110,B11011011,B10011001,B00011000,B00011000,B00000000,B00011000,B00111100,B01111110,B11011011,B10011001,B00011000,B00011000,B00000000, //leftled
- 24, 8, B00011000,B00011000,B10011001,B11011011,B01111110,B00111100,B00011000,B00000000,B00011000,B00011000,B10011001,B11011011,B01111110,B00111100,B00011000,B00000000,B00011000,B00011000,B10011001,B11011011,B01111110,B00111100,B00011000,B00000000 };//rightled
- ///////////////////////////////////////5-6帧的两个小动画
- PROGMEM prog_uchar KH[] = {
- 24,8, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, //中间四个点
- 24,8, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011000,B00100100,B00000000,B00000000,B00100100,B00011000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,//左第一括弧
- 24,8, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011000,B00100100,B01000010,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000010,B00100100,B00011000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,//右第一括弧
- 24,8, B00000000,B00000000,B00000000,B00111100,B01000010,B10000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000001,B01000010,B00111100,B00000000,B00000000,B00000000,//左第二括弧
- 24,8, B01000010,B10000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000001,B01000010 };//右第二括弧
- PROGMEM prog_uchar HEART[] = {
- 24,8, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,B00010010,B00100100,B00100100,B00010010,B00001100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
- 24,8, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,B00011110,B00111100,B00111110,B00001100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
- 24,8, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110,B00011111,B00111111,B01111110,B01111110,B00111111,B00011111,B00001110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
- 24,8, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110,B00010001,B00101110,B01011111,B10111111,B01111110,B01111110,B10111111,B01011111,B00101110,B00010001,B00001110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
- 24,8, B00000000,B00000000,B00000000,B00000000,B00001110,B00010001,B00100000,B01001100,B10011110,B00111111,B01111111,B11111110,B11111110,B01111111,B00111111,B10011110,B01001100,B00100000,B00010001,B00001110,B00000000,B00000000,B00000000,B00000000,
- 24,8, B00000000,B00001110,B00010001,B00100000,B01000000,B10001110,B00011111,B00111111,B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B01111111,B00111111,B00011111,B10001110,B01000000,B00100000,B00010001,B00001110,B00000000 };
- ////////////////////////////////////////////点阵配置
- SimpleTimer timer;
- int data = 10;
- int load = 11;
- int clock = 12;
- int maxInUse = 3; //max7219的级联数量
- MaxMatrix m(data, load, clock, maxInUse);
- /////////////////////////////////////////////////////////
- byte buffer[28];
- byte i=0;
- int movetimer;
- int standbytimer;
- boolean turningOn = false;
- boolean breakingOn = false;
- boolean ledonoff = false;
- boolean stanbystat=false;
- boolean ledread=false;
- boolean turning=false;
- ///////////////////////////////////////////button库设置按钮
- Button breakButton = Button(4,HIGH);
- Button LButton = Button(5, HIGH);
- Button RButton = Button(7,HIGH);
- ////////////////////////////////////////////
- void setup()
- {
- //Serial.begin(9600);
- //////////////////////led////////
- m.init();
- m.setIntensity(15);
- m.clear();
- /////////////////////////////////
- breakButton.setHoldDelay(5);
- LButton.setHoldDelay(800);
- RButton.setHoldDelay(800);
- standbytimer=timer.setInterval(180, standby);//行车灯动画帧数间隔时间
-
- }
- //////////////////////////////////////////////////////////
- void loop()
- {
- breakButton.listen();
- LButton.listen();
- RButton.listen();
- timer.run();
- ////////////////////////////////////用MAX7219库中的测试功能实现刹车提示
- if (breakButton.isHold())
- {
- breakingOn = true;
- m.test(true);
- }
- else{
- breakingOn = false;
- m.test(false);
- }
- ////////////////////////////////左转向
- if (LButton.onRelease()&&ledonoff==false)
- {
- turningOn = true;
- Llight();
- }
- else{
- turningOn = false;
- }
- ////////////////////////////右转向
- if (RButton.onRelease()&&ledonoff==false)
- {
- turningOn = true;
- Rlight();
- }
- else{
- turningOn = false;
- }
- //////////////////////////////按住转向开关开关点阵屏实现省电模式,但是测试模式可以随时响应所以刹车灯功能还在
- if (LButton.isHold() && ledonoff == false){
- delay(10);
- m.shutdown(true);
- ledonoff = true;
- }
- else if(LButton.isHold() && ledonoff == true){
- delay(10);
- m.shutdown(false);
- ledonoff = false;
- }
-
- if (RButton.isHold() && ledonoff == false){
- delay(10);
- m.shutdown(true);
- ledonoff = true;
- }
- else if(RButton.isHold() && ledonoff == true){
- delay(10);
- m.shutdown(false);
- ledonoff = false;
- }
- }
-
-
- ////////////////////////////////////////////////////////////行车中动画提醒
- void standby(){
- m.setIntensity(5);
- if (turningOn == false&& breakingOn== false && ledonoff==false){
- stanbystat=true;
- if (i<6){
- i++;
- }
- else if(i=6){
- i=0;
- }
- memcpy_P(buffer, HEART + i*26, 26);
-
- m.writeSprite(0, 0,buffer);
- }
- }
- //左右转向的动画提示用moveleft功能实现也可以做一个大点的箭头然后闪烁效果也不错但是不够拉风了,
- //按下大约持续15秒钟后自动返回待机模式,因为自行车前面没有提示而且再手动去关毕比较麻烦转弯时候提前一点按下15秒后自动就关闭了。
- //由于用了delay,所有按键都没有响应了,这里请大家帮忙看看怎么能不用delay实现,这样还可以转向同时提示刹车
- void Llight() {
- m.clear();
- timer.disable(standbytimer);
- m.setIntensity(15);
- for (int i=0; i<5; i++) {
- memcpy_P(buffer, LR + 0, 26);
- m.writeSprite(24, 0,buffer);
- for (int i=0; i<24; i++) {
- m.shiftLeft(false, false);
- delay(50);
- turningOn == false;
- timer.enable(standbytimer);
- // m.clear();
- }
- }
- }
- void Rlight(){
- timer.disable(standbytimer);
- m.setIntensity(15);
- for (int i=0; i<5; i++) {
- memcpy_P(buffer, LR + 26, 26);
- m.writeSprite( 0, 0,buffer);
- for (int i=0; i<24; i++) {
- m.shiftRight(true, false);
- delay(50);
- turningOn == false;
- timer.enable(standbytimer);
- // m.clear();
- }
- }
- }
复制代码
|