极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 30030|回复: 13

自行车LED点阵尾灯 3*max7219

[复制链接]
发表于 2013-4-16 11:55:42 | 显示全部楼层 |阅读模式
本帖最后由 athlon789789 于 2013-4-16 11:57 编辑

新手做的3个8*8点阵做的点阵尾灯带一点动画功能不过很麻烦要自己一帧一帧去做,有兴趣朋友可以自己试下。做这个东西最麻烦的部分是实现按钮的即时响应,因为动画免不了用到delay什么的。delay一出按钮什么的都完蛋了。代码比较暴力求高手指点优化一下,还有就是转向的时候可以响应按钮开关的,自己没有好办法了。max7219的库https://code.google.com/p/arudino-maxmatrix-library/downloads/list 我做了简单的修改可以实现测试功能和省电待机功能
  1. #include <avr/pgmspace.h>
  2. #include <MaxMatrix.h>  //这个库我做了简单修改加入了关机功能测试功能
  3. #include <Button.h>
  4. #include "SimpleTimer.h"
  5. //////////////////////////////////////左右箭头

  6. PROGMEM prog_uchar LR[]={
  7.   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
  8.   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

  9. ///////////////////////////////////////5-6帧的两个小动画
  10. PROGMEM prog_uchar KH[] = {
  11.   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, //中间四个点
  12.   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,//左第一括弧
  13.   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,//右第一括弧
  14.   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,//左第二括弧
  15.   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 };//右第二括弧
  16.   PROGMEM prog_uchar HEART[] = {
  17.   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,
  18.   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,
  19.   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,
  20.   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,
  21.   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,
  22.   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 };

  23. ////////////////////////////////////////////点阵配置

  24. SimpleTimer timer;
  25. int data = 10;
  26. int load = 11;
  27. int clock = 12;
  28. int maxInUse = 3;    //max7219的级联数量
  29. MaxMatrix m(data, load, clock, maxInUse);
  30. /////////////////////////////////////////////////////////
  31. byte buffer[28];
  32. byte i=0;
  33. int  movetimer;
  34. int standbytimer;
  35. boolean turningOn = false;
  36. boolean breakingOn = false;
  37. boolean ledonoff = false;
  38. boolean stanbystat=false;
  39. boolean ledread=false;
  40. boolean turning=false;
  41. ///////////////////////////////////////////button库设置按钮
  42. Button breakButton = Button(4,HIGH);
  43. Button LButton = Button(5, HIGH);
  44. Button RButton = Button(7,HIGH);
  45. ////////////////////////////////////////////

  46. void setup()
  47. {
  48. //Serial.begin(9600);



  49.   //////////////////////led////////
  50.   m.init();
  51.   m.setIntensity(15);
  52.   m.clear();
  53.   /////////////////////////////////
  54.   breakButton.setHoldDelay(5);
  55.   LButton.setHoldDelay(800);
  56.     RButton.setHoldDelay(800);

  57.   standbytimer=timer.setInterval(180, standby);//行车灯动画帧数间隔时间
  58.   

  59. }

  60. //////////////////////////////////////////////////////////

  61. void loop()
  62. {
  63.   breakButton.listen();
  64.   LButton.listen();
  65.   RButton.listen();
  66.   timer.run();
  67.   ////////////////////////////////////用MAX7219库中的测试功能实现刹车提示
  68.   if (breakButton.isHold())
  69.   {
  70.     breakingOn = true;
  71.     m.test(true);
  72.   }
  73. else{
  74.   breakingOn = false;
  75.   m.test(false);
  76. }
  77. ////////////////////////////////左转向
  78.   if (LButton.onRelease()&&ledonoff==false)
  79.   {
  80.     turningOn = true;
  81.     Llight();
  82.   }
  83.   else{
  84.     turningOn = false;
  85.   }
  86.   ////////////////////////////右转向
  87.     if (RButton.onRelease()&&ledonoff==false)
  88.   {
  89.     turningOn = true;
  90.     Rlight();
  91.   }
  92.   else{
  93.     turningOn = false;
  94.   }
  95. //////////////////////////////按住转向开关开关点阵屏实现省电模式,但是测试模式可以随时响应所以刹车灯功能还在

  96.   if (LButton.isHold() && ledonoff == false){
  97.     delay(10);
  98.     m.shutdown(true);
  99.     ledonoff = true;
  100.   }
  101.     else if(LButton.isHold() && ledonoff == true){
  102.         delay(10);
  103.       m.shutdown(false);
  104.     ledonoff = false;
  105.   }

  106.   
  107.     if (RButton.isHold() && ledonoff == false){
  108.     delay(10);
  109.     m.shutdown(true);
  110.     ledonoff = true;
  111.   }
  112.     else if(RButton.isHold() && ledonoff == true){
  113.         delay(10);
  114.       m.shutdown(false);
  115.     ledonoff = false;
  116.   }

  117.   }
  118.   
  119.   


  120. ////////////////////////////////////////////////////////////行车中动画提醒
  121. void standby(){
  122. m.setIntensity(5);
  123. if (turningOn == false&& breakingOn== false && ledonoff==false){
  124.     stanbystat=true;

  125.   if (i<6){
  126.     i++;
  127.   }
  128.   else if(i=6){
  129.     i=0;
  130.   }
  131.    memcpy_P(buffer, HEART + i*26, 26);  
  132.    
  133.    m.writeSprite(0, 0,buffer);

  134. }
  135. }





  136. //左右转向的动画提示用moveleft功能实现也可以做一个大点的箭头然后闪烁效果也不错但是不够拉风了,
  137. //按下大约持续15秒钟后自动返回待机模式,因为自行车前面没有提示而且再手动去关毕比较麻烦转弯时候提前一点按下15秒后自动就关闭了。
  138. //由于用了delay,所有按键都没有响应了,这里请大家帮忙看看怎么能不用delay实现,这样还可以转向同时提示刹车
  139. void Llight() {
  140.     m.clear();
  141.        timer.disable(standbytimer);

  142. m.setIntensity(15);
  143.   for (int i=0; i<5; i++) {
  144.   memcpy_P(buffer, LR + 0, 26);
  145.   m.writeSprite(24, 0,buffer);
  146.   for (int i=0; i<24; i++) {   
  147.     m.shiftLeft(false, false);
  148.      delay(50);
  149.        turningOn == false;
  150.   timer.enable(standbytimer);
  151.   //  m.clear();
  152.   }
  153. }
  154. }

  155. void Rlight(){
  156.        timer.disable(standbytimer);
  157. m.setIntensity(15);
  158.   for (int i=0; i<5; i++) {
  159.   memcpy_P(buffer, LR + 26, 26);
  160.   m.writeSprite( 0, 0,buffer);
  161.   for (int i=0; i<24; i++) {   
  162.     m.shiftRight(true, false);
  163.      delay(50);
  164.      turningOn == false;
  165. timer.enable(standbytimer);
  166.    // m.clear();
  167.   }
  168. }
  169. }


复制代码


评分

参与人数 2 +31 收起 理由
幻生幻灭 + 1 赞一个!
Ansifa + 30 效果不错的说

查看全部评分

回复

使用道具 举报

发表于 2013-4-16 12:18:55 | 显示全部楼层
无图无真相
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-16 13:59:56 | 显示全部楼层
duocool 发表于 2013-4-16 12:18
无图无真相

有视频的哦
回复 支持 反对

使用道具 举报

发表于 2013-4-16 14:14:59 | 显示全部楼层
有意思有意思,有空也折騰一個{:soso_e144:}
回复 支持 反对

使用道具 举报

发表于 2013-4-16 20:24:46 | 显示全部楼层
参考 Arduino样例 Blink without Delay
回复 支持 反对

使用道具 举报

发表于 2013-4-16 20:39:16 | 显示全部楼层
那个警示灯超炫,有点像兰博的尾灯如果箭号没有尾巴就这的很像啦。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-16 23:34:56 | 显示全部楼层
raphaelhhq 发表于 2013-4-16 20:39
那个警示灯超炫,有点像兰博的尾灯如果箭号没有尾巴就这的很像啦。。。

直接可以修改,我怕别人看不清才加了尾巴
回复 支持 反对

使用道具 举报

发表于 2013-6-5 10:35:42 | 显示全部楼层
想要没有delay的话,建议显示部分单独写一个函数,再加一个cache作为图像显示缓存。通过定时中断的方式对显示的图像进行刷新,即可解决delay的问题。
回复 支持 反对

使用道具 举报

发表于 2013-6-5 14:16:25 | 显示全部楼层
这个想法确实不错,效果也挺玄的,只是在主循环中少用delay为妙,如果是顺序控制的程序,如有需要可以用delay,但是有即时的按钮需要按下就有反应,延时多了按钮反应就慢了.处理的办法是将Dalay"剔除"出主循环,再需要延迟的地方用中断或用计数器来判断,中断是时间到了再处理,时间不到继续循环,这样按键的反应会快许多.同理也可以用计数器来判断,这样效率也大大提高.
回复 支持 反对

使用道具 举报

发表于 2013-12-8 17:54:11 | 显示全部楼层
想问下如果两个8*8点阵max7219, 一个是比如’A‘字向走左和重复,另一个只是显示’B‘。有可能实现吗?一样信号咯。
回复 支持 反对

使用道具 举报

发表于 2014-7-24 18:25:12 | 显示全部楼层
你好我也想做一个这样的尾灯但是我是新手可否分享一下?
回复 支持 反对

使用道具 举报

发表于 2014-7-25 14:14:51 | 显示全部楼层
看起来还不错。程序还可以再斟酌一下。
回复 支持 反对

使用道具 举报

发表于 2015-3-12 21:49:41 | 显示全部楼层

能共享一下库文件吗?
回复 支持 反对

使用道具 举报

发表于 2015-7-31 16:23:32 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-18 11:51 , Processed in 0.060960 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表