找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2671|回复: 1
收起左侧

arduino_WS2812光带源程序,多线程分段流水效果

[复制链接]
ID:603678 发表于 2021-1-28 17:30 | 显示全部楼层 |阅读模式
可以实现预定功能,但不明白为什么可以删除的不能删,不符合常理,是不是有啥缺陷,刚开始学多线
  1. /*
  2.   设置3线程,可以运行流水光带灯、点亮光带、判断逻辑、读取流水速率,但程序本身存在缺陷,可以删除的不能删,可以添加的也不能添加,暂时没有解决,基本运行状态良好
  3. */
  4. #include <FastLED.h>
  5. #include <SCoop.h>

  6. #define Led      9  // PIN 信号灯引脚
  7. #define NUM_LEDS  32  // 灯壳内发光点数量
  8. CRGB leds[NUM_LEDS]; // 彩灯控制的封装函数

  9. void GDRon( unsigned int a ,unsigned int b );
  10. void GDGon( unsigned int a ,unsigned int b );
  11. void GDBon( unsigned int a ,unsigned int b );
  12. void GDoff( unsigned int a ,unsigned int b );

  13. void GDLiuR( unsigned int a ,unsigned int b );
  14. void GDLiuG( unsigned int a ,unsigned int b );
  15. unsigned int Between ;
  16. //定义灯 编号

  17. //9#引脚输出光带信号

  18. //定义灯 初始状态
  19.   int LED2 = 2; //报警2#引脚
  20.   int LED3;int LED4;int LED5;int LED6 ;int LED7;int LED8;
  21.   int LED10;int LED11 ;int LED12 ;
  22.   
  23.   int LEDA0;int LEDA1;int LEDA2 ;int LEDA3 ;int LEDA4;int LEDA5 ;

  24.   defineTask(Task1)
  25.   void Task1::setup()
  26.    {
  27.        pinMode( 3,INPUT_PULLUP);pinMode( 4,INPUT_PULLUP);
  28.        pinMode( 5,INPUT_PULLUP);pinMode( 6,INPUT_PULLUP);pinMode( 7,INPUT_PULLUP);pinMode( 8,INPUT_PULLUP);pinMode(10,INPUT_PULLUP);pinMode(11,INPUT_PULLUP);pinMode( 12,INPUT_PULLUP);
  29.    
  30.        pinMode(A0,INPUT_PULLUP);pinMode(A1,INPUT_PULLUP);pinMode(A2,INPUT_PULLUP);pinMode(A3,INPUT_PULLUP);pinMode(A4,INPUT_PULLUP);pinMode(A5,INPUT_PULLUP);
  31.    
  32.        pinMode(9,OUTPUT);
  33.        pinMode(LED2,OUTPUT); digitalWrite(LED2,HIGH);   
  34.   
  35.        FastLED.addLeds<WS2812, Led, GRB>(leds, NUM_LEDS);                      // 选择引脚作为发送信号口,仅用一个PIN

  36.        unsigned int leds[] = {  CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  37.                                 CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  38.                                 CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  39.                                 CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  40.                               };
  41.    }
  42.    
  43.   void Task1::loop()
  44.    {  
  45.       LED2   = digitalRead(2);  LED3   = digitalRead(3);  LED4   = digitalRead(4);  LED5  = digitalRead(5); LED6  = digitalRead(6); LED7  = digitalRead(7);
  46.       LED8   = digitalRead(8);  LED10  = digitalRead(10); LED11  = digitalRead(11); LED12  = digitalRead(12);
  47.       LEDA0  = analogRead(A0);  LEDA1  = analogRead(A1);  LEDA2  = analogRead(A2);  LEDA3  = analogRead(A3);  LEDA4  = analogRead(A4);  LEDA5 = analogRead(A5);  
  48.    
  49.       Between = map(LEDA0, 0, 1023, 50, 250);
  50.       if( LED6 == 0 ) {  GDLiuR( 11 , 29 ) ; }    GDoff( 11 , 29 ) ;   
  51.       
  52.     }

  53.   defineTask(Task2)
  54.   void Task2::setup(){
  55.    pinMode( 3,INPUT_PULLUP);pinMode( 4,INPUT_PULLUP);
  56.    pinMode( 5,INPUT_PULLUP);pinMode( 6,INPUT_PULLUP);pinMode( 7,INPUT_PULLUP);pinMode( 8,INPUT_PULLUP);pinMode(10,INPUT_PULLUP);pinMode(11,INPUT_PULLUP);pinMode( 12,INPUT_PULLUP);
  57.    
  58.    pinMode(A0,INPUT_PULLUP);pinMode(A1,INPUT_PULLUP);pinMode(A2,INPUT_PULLUP);pinMode(A3,INPUT_PULLUP);pinMode(A4,INPUT_PULLUP);pinMode(A5,INPUT_PULLUP);
  59.    
  60.    pinMode(9,OUTPUT);
  61.    pinMode(LED2,OUTPUT); digitalWrite(LED2,HIGH);   
  62.   
  63.   FastLED.addLeds<WS2812, Led, GRB>(leds, NUM_LEDS);                      // 选择引脚作为发送信号口,仅用一个PIN

  64.   unsigned int leds[] = {  CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  65.                            CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  66.                            CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  67.                            CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  68.                         };
  69. }

  70. void Task2::loop()
  71. {
  72.   LED2   = digitalRead(2);  LED3   = digitalRead(3);  LED4   = digitalRead(4);  LED5  = digitalRead(5); LED6  = digitalRead(6); LED7  = digitalRead(7);
  73.   LED8   = digitalRead(8);  LED10  = digitalRead(10); LED11  = digitalRead(11); LED12  = digitalRead(12);
  74.   LEDA0  = analogRead(A0);  LEDA1  = analogRead(A1);  LEDA2  = analogRead(A2);  LEDA3  = analogRead(A3);  LEDA4  = analogRead(A4);  LEDA5 = analogRead(A5);  



  75.   //光控逻辑  
  76.   
  77.   if( LED3 == 0 ){ GDRon( 0 , 4 ) ; }else GDoff( 0 , 4 ) ;
  78.   
  79.   if( LED5 == 0 ){ GDBon( 10 , 10 ) ; }else GDoff( 10 , 10 ) ;

  80.    
  81.   
  82.   // 报警逻辑
  83.   if( LED3  ==0 && LED4  ==0 || LED4 ==0 && LED5  ==0 )   { digitalWrite(LED2,LOW);  sleep(2);  }  
  84.   else { digitalWrite(LED2,HIGH); sleep(2);  }     //报警设定      
  85. }

  86.   defineTask(Task3)
  87.   void Task3::setup()
  88.    {
  89.        pinMode( 4,INPUT_PULLUP);
  90.        pinMode( 5,INPUT_PULLUP);pinMode( 6,INPUT_PULLUP);pinMode( 7,INPUT_PULLUP);pinMode( 8,INPUT_PULLUP);pinMode(10,INPUT_PULLUP);pinMode(11,INPUT_PULLUP);pinMode( 12,INPUT_PULLUP);
  91.    
  92.        pinMode(A0,INPUT_PULLUP);pinMode(A1,INPUT_PULLUP);pinMode(A2,INPUT_PULLUP);pinMode(A3,INPUT_PULLUP);pinMode(A4,INPUT_PULLUP);pinMode(A5,INPUT_PULLUP);
  93.    
  94.        pinMode(9,OUTPUT);
  95.        pinMode(LED2,OUTPUT); digitalWrite(LED2,HIGH);   
  96.   
  97.        FastLED.addLeds<WS2812, Led, GRB>(leds, NUM_LEDS);                      // 选择引脚作为发送信号口,仅用一个PIN

  98.        unsigned int leds[] = {  CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  99.                                 CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  100.                                 CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  101.                                 CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ), CRGB ( 0,0,0 ),
  102.                               };
  103.    }
  104.    
  105.   void Task3::loop()
  106.    {  
  107.       LED4   = digitalRead(4);
  108.       LEDA0  = analogRead(A0);
  109.    
  110.       int Between = map(LEDA0, 0, 1023, 50, 250);
  111.       if( LED4 == 0 ) {  GDLiuG( 5 , 9 ) ; }    GDoff( 5 , 9 ) ;   
  112.       
  113.     }



  114. void setup(){ Serial.begin(9600); mySCoop.start();  }
  115. void  loop(){ yield();  }

  116. void GDRon( unsigned int a ,unsigned int b )
  117.     {
  118.       int x = b - a ;
  119.        for( int y = 0; y <= x ;y++ )
  120.            {
  121.             int i = y + a ;
  122.             leds[i] = CRGB ( 150,0,0 );            
  123.             }
  124.             FastLED.show(); sleep(1);
  125.     }
  126. void GDGon( unsigned int a ,unsigned int b )
  127.     {
  128.       int x = b - a ;
  129.        for( int y = 0; y <= x ;y++ )
  130.            {
  131.             int i = y + a ;
  132.             leds[i] = CRGB ( 0,150,0 );            
  133.             }
  134.             FastLED.show(); sleep(1);
  135.     }     

  136. void GDBon( unsigned int a ,unsigned int b )
  137.     {
  138.       int x = b - a ;
  139.        for( int y = 0; y <= x ;y++ )
  140.            {
  141.             int i = y + a ;
  142.             leds[i] = CRGB ( 0,0,150 );            
  143.             }
  144.             FastLED.show(); sleep(1);
  145.     }     

  146. void GDoff( unsigned int a ,unsigned int b )
  147.     {
  148.        int x = b - a ;
  149.        for( int y = 0; y <= x ;y++ )
  150.            {
  151.             int i = y + a ;
  152.             leds[i] = CRGB ( 0,0,0 );            
  153.             }  
  154.             FastLED.show(); sleep(1);
  155.     }

  156. void GDLiuR( unsigned int a ,unsigned int b )
  157.     {   

  158.             int x = b - a;
  159.         Serial.println( LEDA0 );   
  160.         Serial.println( Between );
  161.         for( int y=2; y <= x ;y=y+3 )
  162.            { int i = y + a ; leds[i] = CRGB ( 0,0,0 ); }
  163.         for( int y=0; y <= x ;y=y+3 )
  164.            { int i = y + a ; leds[i] = CRGB ( 150,0,0 ); }   FastLED.show();   delay( Between ) ;
  165.          
  166.          
  167.         for( int y=0; y <= x ;y=y+3 )
  168.            { int i = y + a ; leds[i] = CRGB ( 0,0,0 );  }  
  169.         for( int y=1; y <= x ;y=y+3 )
  170.            { int i = y + a ; leds[i] = CRGB ( 150,0,0 );   }  FastLED.show(); delay( Between ) ;
  171.            
  172.         for( int y=1; y <= x ;y=y+3 )
  173.            { int i = y + a ; leds[i] = CRGB ( 0,0,0 );  }  
  174.         for( int y=2; y <= x ;y=y+3 )
  175.            { int i = y + a ; leds[i] = CRGB ( 150,0,0 );   }  FastLED.show(); delay( Between ) ;
  176.     }  
  177. void GDLiuG( unsigned int a ,unsigned int b )
  178.     {   
  179.          int x = b - a ;
  180.         for( int y=2; y <= x ;y=y+3 )
  181.            { int i = y + a ; leds[i] = CRGB ( 0,0,0 ); }
  182.         for( int y=0; y <= x ;y=y+3 )
  183.            { int i = y + a ; leds[i] = CRGB ( 0,150,0 ); }   FastLED.show();   delay( Between ) ;
  184.          
  185.          
  186.         for( int y=0; y <= x ;y=y+3 )
  187.            { int i = y + a ; leds[i] = CRGB ( 0,0,0 );  }  
  188.         for( int y=1; y <= x ;y=y+3 )
  189.            { int i = y + a ; leds[i] = CRGB ( 0,150,0 );   }  FastLED.show(); delay( Between ) ;
  190.            
  191.         for( int y=1; y <= x ;y=y+3 )
  192.            { int i = y + a ; leds[i] = CRGB ( 0,0,0 );  }  
  193.         for( int y=2; y <= x ;y=y+3 )
  194.            { int i = y + a ; leds[i] = CRGB ( 0,150,0 );   }  FastLED.show(); delay( Between ) ;
  195.     }  

  196.   // if( millis() - lastTime > 2 * Between  )
  197.         
  198.         

  199. //  leds[i] = CRGB ( 0,150,0 );    // 翠绿
  200. //  leds[i] = CRGB ( 150,0,0 ); FastLED.show(); sleepMicroseconds(10);   // 大红
  201. //  leds[i] = CRGB ( 100,100,0 ); FastLED.show(); sleepMicroseconds(10); // 中黄
  202. //  leds[i] = CRGB ( 0,0,150 ); FastLED.show(); sleepMicroseconds(10);   // 深蓝
  203. //  leds[i] = CRGB ( 100,0,100 ); FastLED.show(); sleepMicroseconds(10); // 绛紫
  204. //  leds[i] = CRGB ( 0,100,100 ); FastLED.show(); sleepMicroseconds(10); // 天蓝
复制代码

以上代码下载: arduino光带多线程带报警逻辑模版.zip (2.07 KB, 下载次数: 34)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:143767 发表于 2021-1-29 11:37 | 显示全部楼层
我试验了,不亮
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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