磁动力电子网-雕刻机DIY论坛,单片机论坛,CNCDIY,DIYCNC

 找回密码
 加入磁动力

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 377|回复: 5

[应用实例] 野路子Arduino第三弹:车队灯

  [复制链接]
发表于 2018-12-13 11:33:52 | 显示全部楼层 |阅读模式
这只能算是个试验品。。。。。。野路子底子薄,玩这玩意严重超出俺目前的能力范围。各种不成熟各种不科学各种。。。心累。。。
感谢明浩老大,感谢刘兴宇老师,感谢磁力微信群的诸位大神,对俺的帮助~
实在是干累了,没有足够的时间和精力继续完善它了,先发出来,日后再填坑~用是能凑合用,只是离俺的理想状态还差的远。
开始正题:
1.设计理想:
车友会车队灯应用场景。单车时自己闪自己的灯光样式。当有同车友会的车辆进入通讯范围后自组网,闪烁车队灯样式的灯光效果,并同步闪烁节奏频率。离开通讯距离时,切换回单车灯光效果。【可惜灯光同步没做到。。。】
2.组网方式:
采用自组网方式。没有调谐器,没有主机!防止主机离队或离线造成车队队员的灯光集体离线!【淘宝只找到了1款可以满足这要求的自组网模块,详见配料表】
3.配料表:
3.1. Arduino-Nano:1块 【原想用Tiny85-DigiSpark微型板的,无奈这货闪存太小存不下程序,并且串口也没调试明白...】
Nano板.jpg
3.2.自组网模块:1块【无需调谐器无主机】{}
自组网模块.jpg
淘宝.png
3.3.DC5v电源模块:1块
3.4.DC3.3v电源模块:1块
实验板01正面.jpg
实验板01反面.jpg
实验板00.jpg

3.5.WS2812彩灯带:1条【3线控制整条灯带颜色亮度,详情百度】
实验板02.jpg

评分

参与人数 1金钱 +2 收起 理由
大头文 + 2 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2018-12-13 11:41:48 | 显示全部楼层
4.程序:【写的极其恶心不易读...凑合读吧...哈哈~】
使用库:
1.MsTimer2 明浩老大教授的定时器
2.Adafruit_NeoPixel 用于驱动WS2812灯带
3.自组网模块我使用的是DL-LN33型 有关文档http://pan.baidu.com/s/1qY5rhso? ... scussion#path=%252F以及淘宝链接

  1. #include <MsTimer2.h>

  2. //LED灯条参数定义
  3. #include <Adafruit_NeoPixel.h>

  4. #define PIN 3
  5. #define NUMPIXELS      10 //灯珠数量
  6. // Parameter 1 = number of pixels in strip
  7. // Parameter 2 = Arduino pin number (most are valid)
  8. // Parameter 3 = pixel type flags, add together as needed:
  9. //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
  10. //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
  11. //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products) 【采购灯条是GRB模式】
  12. //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
  13. //   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
  14. Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  15. uint8_t brightness = 0; //LED的亮度
  16. uint8_t fadeAmount = 2; //亮度变化增量
  17. // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
  18. // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
  19. // and minimize distance between Arduino and first pixel.  Avoid connecting
  20. // on a live circuit...if you must, connect GND first.

  21. //#include <SoftSerial.h>
  22. //#include <TinyPinChange.h>
  23. //SoftSerial mySerial(3, 4); // RX, TX


  24. //IO针脚定义
  25. int DebugLED=13;  //调试指示灯13

  26. //串口通讯变量
  27. int incomingByte = 0;          // 接收到的 data byte
  28. String inputString = "";         // 用来储存接收到的内容
  29. boolean newLineReceived = false; // 前一次数据结束标志

  30. //系统变量定义
  31. //volatile unsigned char Master[2] = {0x00,0x88}; //主控地址 永远指定0088号为管理员!!!
  32. volatile byte Team = {0xFB};   //【队长地址】 当队长掉线,此地址分配给【号码最靠前的机器当队长】!
  33. volatile byte Teamccc = {0xcc};
  34. volatile byte Local[2] = {0x00,0x00};  //本机地址
  35. volatile byte RunMode = 0x02;     // 0=队长模式 1=队员模式 2=单机模式
  36. volatile int FlashSW = 0;//车队灯开关!!!0=单机灯样式 1=车队同步灯样式【以后可添加灯光模式如:0=单机 1=车队同步 2=队长特别灯光】
  37. volatile int FlashNo = 0;//灯光效果循环次数。当做定时器用!用于定时检测主机是否在线,以及循环扫描寻找主机。
  38. volatile int TimerNo = 0;//【定时器】循环次数。
  39. volatile byte LedTime = 0; //对表时间,取自Led循环计数!
  40. volatile byte FindID = {0x00};  //从0x00到0xFF累加循环,询问查找在线主机时,存放当前正在询问的IP地址。
  41. volatile byte Guest = {0x00};  //收到对表请求时,存放对表人的IP地址。

  42. volatile int PingNo = 0; //专用于【队员模式】发送查询指令的时间计数。为了打乱查询时间,防止同一时刻一起查询。
  43. volatile int AdminPing = 0;//专用于【队员方统计队长断网计数】。如果3次都显示不在线 则变为RunMode=0x02单机模式。
  44. volatile int Online = 0;//收到队员的对表申请就加1,车队灯每循环一定次数后就看看此数是否为0 0=没收到则转单机模式 大于0说明收到了则清零后继续保持队长模式

  45. //发送指令定义:
  46. unsigned char Code21[8]  = {0xFE,0x05,0x98,0x21,0x00,0x00,0x01,0xFF}; //Port98 //0x21端口查询本机地址

  47. unsigned char Ping90[8]  = {0xFE,0x05,0x90,0x90,FindID,0x88,Team,0xFF};        //【90端口-主动-通用查询是否有主机在线的指令】Port90 //循环FindID,同时把目前队长的地址发出去!
  48. unsigned char Ping900[8]  ={0xFE,0x05,0x90,0x90,Guest,0x88,Team,0xFF};         //【90端口-被动-通知归队的指令】Port90 //收到其他主机查询指令时,如果它的队长级别低,就把目前队长的地址发过去!
  49. unsigned char RTC91[9]   = {0xFE,0x06,0x91,0x91,Guest,0x88,LedTime,Team,0xFF}; //【队长专用-校时指令】Port91 //发送给要求对表的终端。时间和队长地址。数据为LedTime[0]取自灯光循环时间数据!
  50. unsigned char RTCom92[8] = {0xFE,0x05,0x92,0x92,Team,0x88,0x92,0xFF};                //【队员专用-请求校时指令】Port92 //请求队长发送校时指令。端口号92号。队长收到92号端口信息后,直接回复RTC91,9   

  51. //volatile byte Pin4Mode = 0x00;    //44端口Pin4的电平状态 0=低电平关灯 1=高电平开灯 用于判断是否开启了【车队灯】
  52. //unsigned char Code44[8]  = {0xFE,0x05,0x84,0x44,0x00,0x88,0x12,0xFF};   //Port84 //0x44端口控制Pin4 0x10=低电平 0x11=高电平 0x12=电平查询

  53. unsigned char testled[8]  = {0xFE,0x05,0x80,0x20,0x00,0x00,0x15,0xFF}; //点亮自身Led一秒半 FE 05 80 20 00 00 15 FF
  54. unsigned char testaa[8]  = {0xFE,0x05,0x80,0x80,0x02,0x88,0xaa,0xFF};

  55. unsigned char test88[17]  = {0xFE,0x0e,0x80,0x80,0x02,0x88,0x00,0xbb,0xcc,0xaa,0xaa,0xaa,0x00,0x11,0x22,0x00,0xFF};
  56. unsigned char test678[10]  = {0x00,0xbb,0xcc,0xaa,0xaa,0xaa,0x00,0x11,0x22,0x00};



  57. //========初始化代码部分========================
  58. void setup()  
  59. {
  60.   Serial.begin(115200); //软串口初始化速率
  61.   strip.begin();
  62.   strip.show(); // Initialize all pixels to 'off'

  63.   pinMode(DebugLED, OUTPUT);//输入针脚类型

  64. // 设置并启动定时器中断
  65.   MsTimer2::set(50, TM_IntFun);
  66.   MsTimer2::start();
  67. }

  68. // 函数名 TM_IntFun 【开始】!!!*****************************************☆★○●◎◇◆□■△▲

  69. void TM_IntFun()
  70. {
  71. TimerNo++;
  72. serial_read();    //串口数据读取!!!
  73. Serial_Switch();      //串口数据解析!!!
  74. RunMode_switch(); //运行模式解析!!!

  75. }// 函数名 TM_IntFun 【结束】!!!*****************************************☆★○●◎◇◆□■△▲


  76. //◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎●LOOP开始●◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
  77. void loop() {



  78. //☆★☆★☆★☆★☆★☆★☆★☆★灯光模式处理☆★☆★☆★☆★☆★☆★☆★☆★
  79. if (FlashSW == 1) //如果FlashSW=1 开启车队同步灯模式!
  80.   {
  81.     LED_Team();
  82.   }
  83.   else            //如果FlashSW=0 开启单车行车灯模式。
  84.   {
  85.     rainbowCycle(20);
  86.   }



  87. }//◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎●LOOP结束●◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎


  88. //△△△△△△△△△△△△△△△△串口数据收发【serialEvent()】△△△△△△△△△△△△△△△△
  89. void serial_read(){
  90.   while (Serial.available())
  91. {   
  92.     incomingByte = Serial.read();              //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
  93.     inputString += (char) incomingByte;     // 全双工串口可以不用在下面加延时,半双工则要加的//
  94.     delay(5);

  95.      // 下面就是所谓的通讯协议了,如果接收到了换行符号,本例是定义了这次串口通讯数据接收结束//
  96.      // 其他的你还可以加一些规则,比如数据包起始位,规定一个数据包就是以FF为开头的,如果不是就不接收//
  97.      // 也可以加上数据校验位,同样在这里做一个校验判断,如果不符合,则将数据包丢掉,再通过一个标志位写个值,//
  98.      //在主程序里面让发送方重发(主程序里面都写一条IF就行了)//
  99.      //if (incomingByte == '\n') //结束位为换行符\n也就是0A,则本次接收数据完成,到下面去校验数据。//

  100. if (incomingByte == 0xff)
  101.     {
  102.      newLineReceived = true;
  103.     }
  104.   }
  105. }//△△△△△△△△△△△△△△△△串口数据收发【serialEvent()】△△△△△△△△△△△△△△△△


  106. void Serial_Switch()
  107. {
  108. //------------------------------------------------------------------串口接收数据判断--改变运行模式------------------------
  109. if (newLineReceived) //处理接收到的数据包!!!
  110.     {
  111. byte ccc=inputString[3];

  112. test88[15]=ccc;//调试信息,最后一位显示最后接收到的【端口号】

  113. switch(ccc)//------------------------------------------------------------------根据端口号判断-----------------------------
  114. {
  115. case 0x98://----------------------------------------------------------------OK--【98#】查询【本机地址】赋值给Local--------
  116. //Port98 //0x21端口查询本机地址只接受地址0000本机查询【0x01=模块地址 0x02=网络ID 0x03=通讯频道】
  117. Local[0]=inputString[7];
  118. Local[1]=inputString[8];
  119. Team=inputString[7];
  120. //返回数据【FE 07 21 98 00 00 21 01 88 FF】21后面的0188是本机地址
  121. digitalWrite(DebugLED,HIGH);  //调试信息:开机得到本机地址后,调试灯常亮!
  122. break;
  123.   
  124. case 0x90://=======90端口-Ping90,8-接收来自循环FindID的询问,会收到[发起人]目前[队长]的地址!此时回应:判断它的Team[0]是否比我的Team[0]更优先=========
  125. //发送格式unsigned char Ping90[8]  = {0xFE,0x05,0x90,0x90,FindID[0],0x88,Team[0],0xFF};
  126. //接收内容:0xFE,1x05,2x90,3x90,4x发起ID,5x88,6xTeam[0],7xFF
  127. Teamccc=inputString[6];
  128. if (Teamccc<Team)     //【如果它的队长比我的队长更优先,则跟随它的队长!】
  129. {
  130. Team = inputString[6];
  131. RunMode = 0x01;   //变为队员模式
  132. FindID=0xfb;  //变为队员模式时,将循环搜索ID改为0xFB,并倒数方向循环查找新队友。
  133. //Serial.flush();   //串口清空
  134. //unsigned char RTCom92[8] = {0xFE,0x05,0x92,0x92,Team,0x88,0x92,0xFF};
  135. //【队员专用-请求校时指令】Port92 //请求队长发送校时指令。端口号92号。队长收到92号端口信息后,直接回复【RTC91,9】。
  136. RTCom92[4] = Team;
  137. Serial.write(RTCom92,8);  //与新队长校时
  138. AdminPing++;
  139. }
  140. else                              //【如果没我的队长优先,则通知它归队!】
  141. {
  142. Guest= inputString[4]; //取出id准备【发送校时数据】时使用!
  143. //unsigned char Ping900[8]  ={0xFE,0x05,0x90,0x90,Guest,0x88,Team,0xFF};         //【90端口-被动-通知归队的指令】
  144. Ping900[4]=Guest;//Guest取数后,此Ping900中的Guest并未刷新,所以才加了这2句。待查资料学习!现在给Guest加了volatile,不知给Ping900加volatile是否有用?
  145. Ping900[6]=Team;
  146. Serial.write(Ping900,8);  //通知它归队
  147. }
  148. break;

  149. //=====只有队员会收到!!!==91端口-RTC91,9-接收【校时指令】=========
  150. //会收到[队长]发来的闪灯时间数据!此时回应:将发来的闪灯时间赋予本地闪灯时间,实现同步。
  151. //unsigned char RTC91[9]   = {0xFE,0x06,0x91,0x91,Guest[0],0x88,LedTime[0],Team[0],0xFF};
  152. //【队长专用-校时指令】Port91 //发送给要求对表的终端。时间和队长地址。数据为LedTime[0]取自灯光循环时间数据!
  153. //接收格式:0xFE,1x06,2x91,3x91,4x发起ID,5x88,6xLedTime[0],7xTeam[0],8xFF
  154. case 0x91:
  155. RunMode = 0x01;
  156. Team=inputString[7];
  157. LedTime=inputString[6];
  158. AdminPing=0;
  159. break;

  160. //====只有队长会收到此指令!!!===92端口-Ping92,8-接收【队员请求校时指令】=========
  161. //会收到[队员]发来的校时请求!无需判定直接回应:将当前的闪灯时间直接发出去。
  162. //收到格式: RTCom92[8]   = {0xFE,1x05,2x92,3x92,4x队员ID,5x88,6x92,7xFF};队长收到92号端口信息后,直接回复RTC91,9
  163. case 0x92:
  164. if (Team<Local[0])  //我不是队长了!
  165. {
  166. Guest= inputString[4]; //取出id准备【发送校时数据】时使用!
  167. //unsigned char Ping900[8]  ={0xFE,0x05,0x90,0x90,Guest,0x88,Team,0xFF};         //【90端口-被动-通知归队的指令】
  168. Ping900[4]=Guest;
  169. Ping900[6]=Team;
  170. Serial.write(Ping900,8);  //通知它归队
  171. }
  172. else  //否则我就是队长!从单机变队长或自身就是队长。
  173. {
  174. RunMode = 0x00;
  175.     Online=0; //标记我收到过队员校时请求,并清零标记。
  176.     //单位时间内一直有队员请求校时,那我就是队长,如果单位时间内没有校时Online会一直++,累计到界限,我就离职变单机。
  177.    
  178. Team=Local[0];
  179. Guest= inputString[4]; //取出id准备【发送校时数据】时使用!
  180. //---91port--需要校时取变量,取自全彩灯条的循环计时数据!!!
  181. //unsigned char RTC91[9]   = {0xFE,0x06,0x91,0x91,Guest,0x88,LedTime,Team,0xFF}; //【队长专用-校时指令】Port91
  182. RTC91[4]=Guest;
  183. RTC91[6]=LedTime;
  184. RTC91[7]=Team;
  185. Serial.write(RTC91,9);    //与它校时同步!
  186. //Online=0; 放在此处貌似不好使???挪到上面去了。原因待查...

  187. //Serial.write(testled,8);//@@@@@@@@@@@@@@@@@调试信息@@@@@@@@@@@@@@@@@

  188. //+++++++++++++远程调试 02 88 +++++++++++++++
  189.     test88[6]=Online;
  190.     test88[7]= RunMode;
  191.     test88[8]=Team;
  192.     test88[9]=LedTime;
  193.     test88[10]=Teamccc;
  194.     test88[11]=FindID;
  195.     test88[12]= Local[0];
  196.     test88[13]= Local[1];
  197.     test88[14]=Guest;
  198.     Serial.write(test88,17);
  199. //+++++++++++++++++++++++++++++++++++++++++++


  200. }

  201. break;

  202. default: // 以上条件都不符合时,预设执行的动作
  203. digitalWrite(DebugLED,HIGH);//调试信息:收到的数据不符合规则,就闪灯 3 次!!!
  204. delay(100);
  205. digitalWrite(DebugLED,LOW);
  206. delay(100);
  207. digitalWrite(DebugLED,HIGH);
  208. delay(100);
  209. digitalWrite(DebugLED,LOW);
  210. delay(100);
  211. digitalWrite(DebugLED,HIGH);
  212. delay(100);
  213. digitalWrite(DebugLED,LOW);
  214. }     
  215.      inputString = "";   // clear the string
  216.      newLineReceived = false;
  217.     }   //刚接收到的数据包处理完毕!!!!
  218. }


  219. void RunMode_switch()
  220. {
  221.   if (Local[0] == 0x00&&Local[1] == 0x00) //如果Local[0][1]都是零,说明是刚开机,需要获取一下自己的网络地址!
  222.   {
  223. //    Serial.flush();  //串口清空
  224.     Serial.write(Code21,8);//查询本机地址【21P98】
  225.     return;
  226.   }
  227.   
  228. switch (RunMode) //==============【【【依据当前[运行模式]RunMode进行处理】】】========================
  229. {
  230. case 0x02://单机模式 《全网段从前往后搜,遇到比自己小的就转队员模式并同步时间,遇到比自己大的就转队长模式。》
  231. FlashSW = 0;  //重置车灯模式为 0-单机灯
  232.   if(TimerNo  >=  10)  //【定时器循环10次=半秒,就循环查询一下是否有其他人在线。】
  233.   {
  234.     //unsigned char Ping90[8]  = {0xFE,0x05,0x90,0x90,FindID,0x88,Team,0xFF};        
  235.     //【90端口-主动-通用查询是否有主机在线的指令】
  236.    Ping90[4]=FindID;
  237.    Ping90[6]=Team;
  238.    Serial.write(Ping90,8);
  239.    TimerNo = 0;
  240.    FindID++;

  241.     if(FindID  ==  Local[0])
  242.     {
  243.     FindID++;
  244.     }
  245.    
  246.     if(FindID  >=  0x0f) //全网段都扫一遍。避开与数据包冲突的 FC FD FE FF 这4个地址。
  247.     {
  248.     FindID = 0x00;
  249.     }
  250.   }
  251. break;

  252. case 0x00://队长模式  《只搜比自己小的地址,意图找到更高级的队长。》
  253. FlashSW = 1;//重置车灯模式为 1-车队灯
  254.   if(TimerNo>=100)  //【定时器100个50ms=5秒,循环查询是否有更高级的主机在线。】
  255.   {
  256.     Ping90[4]=FindID;
  257.     Ping90[6]=Local[0];
  258.     Serial.write(Ping90,8);
  259.     TimerNo = 0;
  260.     FindID++;
  261.     Online++;
  262.       
  263.     if(FindID  >=  Local[0])
  264.     {
  265.     FindID = 0x00;
  266.     }

  267.   }
  268.   
  269.   if(Online>=6)
  270.   //【校时请求计数】,放在[串口数据校验]里(RTCom92,8)位置上进行计数。
  271.   //累计6个周期30秒内无人要求校时,说明队员都已离队。变为【单机模式】并重置变量。
  272.   {
  273.    RunMode    = 0x02;
  274.    Team    = Local[0];
  275.    FindID  = 0x00;
  276.    FlashNo    = 0;
  277.    TimerNo=0;
  278.    PingNo     = 0;
  279.    AdminPing  = 0;
  280.    Online     = 0;
  281.   }
  282. break;

  283. case 0x01://队员模式 《只搜比自己大的地址,目的通知后来者及时联系队长。》
  284. FlashSW = 1;
  285.   if (PingNo>=20)//0.5秒PingNo++一次,10秒时跟【队长】对对表,保持灯光闪烁同步!!!
  286.   {
  287.   //unsigned char RTCom92[8] = {0xFE,0x05,0x92,0x92,Team,0x88,0x92,0xFF};                //【队员专用-请求校时指令】
  288.   RTCom92[4]=Team;
  289.   Serial.write(RTCom92,8);  
  290.   //使用92号端口请求队长校时。同时给断网计数器+1,队长收到校时请求后会从91端口回应校时,接到91端口的回应信息就给断网计数器清零。
  291.   AdminPing++;
  292.   PingNo=0;

  293. Serial.write(testaa,8);//%%%%%%%%%%%%%%%%%%%%%%%%调试信息%%%%%%%%%%%%%%%%%%%%%%%%
  294.   
  295.   }

  296.   if(TimerNo>=10)  //【定时器每循环50ms*10次=半秒,循环查询是否有更低级的队员在线。循环查询到本机了,就重置FindID,从队伍末尾FB号倒数顺序重新循环】
  297.   {
  298.     //unsigned char Ping90[8]  = {0xFE,0x05,0x90,0x90,FindID,0x88,Team,0xFF};        //【90端口-主动-通用查询是否有主机在线的指令】
  299.    Ping90[4]=FindID;  //从0xFB开始倒数循环搜索
  300.    Ping90[6]=Team;   
  301.     Serial.write(Ping90,8);
  302.     FindID--;
  303.     PingNo++;     //0.5秒加一次ping队长 20次【10秒】后跟队长对表
  304.     TimerNo = 0;  //0.5秒清零定时器计数
  305.       
  306.     if(FindID<=Local[0])//倒数到自己地址时,重置为0xFB,重新倒数循环。
  307.     {
  308.     FindID = 0xFB;
  309. //    PingNo++;
  310.     }
  311.   }
  312.   
  313.   if(AdminPing>=5) //队长断网计数累计5次50秒了,变为【单机模式】并重置变量。
  314.   {
  315.    RunMode    = 0x02;
  316.    Team    = Local[0];
  317.    FindID  = 0x00;
  318.    FlashNo    = 0;
  319.    TimerNo=0;
  320.    PingNo     = 0;
  321.    AdminPing  = 0;
  322.    Online     = 0;
  323.   }
  324. break;

  325. default: // 以上条件都不符合时,预设执行的动作
  326. //理论上不会进入这里。所以放置参数模式复位
  327. Local[0]  = 0x00;
  328. Local[1]  = 0x00;
  329. RunMode=0x02;
  330. }

  331. }


  332. //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%【灯光效果部分】%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  333. // 车队同步灯模式:【黄白闪烁】明暗交替
  334. void LED_Team()
  335. {
  336. strip.setPixelColor(0,strip.Color(brightness,brightness,0));
  337. strip.setPixelColor(1,strip.Color(brightness,brightness,0));
  338. strip.setPixelColor(2,strip.Color(brightness,brightness,0));
  339. strip.setPixelColor(3,strip.Color(brightness,brightness,brightness));
  340. strip.setPixelColor(4,strip.Color(brightness,brightness,brightness));
  341. strip.setPixelColor(5,strip.Color(brightness,brightness,brightness));
  342. strip.setPixelColor(6,strip.Color(brightness,brightness,brightness));
  343. strip.setPixelColor(7,strip.Color(brightness,brightness,brightness));
  344. strip.setPixelColor(8,strip.Color(brightness,brightness,brightness));
  345. strip.setPixelColor(9,strip.Color(brightness,brightness,brightness));
  346. strip.show();
  347. brightness = brightness + fadeAmount;
  348. if (brightness <= 0 || brightness >= 100)
  349. fadeAmount = -fadeAmount ; //亮度翻转
  350. delay(20);
  351. }

  352. //单机彩灯模式:【rainbowCycle】流水循环色
  353. void rainbowCycle(uint8_t wait) {
  354.   uint16_t i, j;

  355.   for(j=0; j<256*2; j++) { // 5 cycles of all colors on wheel 5个周期的所有颜色循环

  356.       if (FlashSW == 1) //彩灯模式发生变化立刻停止
  357.       break;
  358.       
  359.     for(i=0; i< strip.numPixels(); i++) {
  360.       strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
  361.     }
  362.     strip.show();
  363.     delay(wait);
  364.   }
  365. }

  366. // Input a value 0 to 255 to get a color value.输入一个值0到255颜色值。
  367. // The colours are a transition r - g - b - back to r.颜色过渡 R=>G=>B=>R......
  368. uint32_t Wheel(byte WheelPos) {
  369.   WheelPos = 255 - WheelPos;
  370.   if(WheelPos < 85) {
  371.     return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  372.   }
  373.   if(WheelPos < 170) {
  374.     WheelPos -= 85;
  375.     return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  376.   }
  377.   WheelPos -= 170;
  378.   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  379. }

  380. //*********************************************************************************************************************
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-13 12:33:26 | 显示全部楼层
本帖最后由 sexyhgf 于 2018-12-13 12:35 编辑


回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-13 12:35:54 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2018-12-13 12:54:48 | 显示全部楼层
不错不错,厉害厉害
回复 支持 反对

使用道具 举报

发表于 2018-12-14 11:02:25 | 显示全部楼层
sexyhgf 发表于 2018-12-13 12:35
http://v.youku.com/v_show/id_XMzk2MjE2Mjg2OA==.html?x&sharefrom=android&sharekey=8de16a353e0f07ea3 ...

候大师教教我
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入磁动力

本版积分规则

QQ|小黑屋|手机版|Archiver|www.cdle.net 磁动力电子网 2001-2017 ( 粤ICP备10098153号

粤公网安备 44040402000001号

GMT+8, 2019-3-19 12:02

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.