请选择 进入手机版 | 继续访问电脑版

gForce控制RGB灯环(arduino)

[复制链接]

5

主题

9

帖子

47

积分

新手上路

Rank: 1

积分
47
yuyu_morning 发表于 2017-7-19 18:24:23
244 2
本帖最后由 yuyu_morning 于 2017-7-19 18:26 编辑

一、器材
  WS2812灯环(24)arduino uno主板、杜邦线、gForce手环以及gForcejoint硬件展示
二、相关环境介绍
1.WS2812:硬件连接简单,不需搭建外部电路,每位灯珠需要三个字节的数据控制。单片机从灯环in引脚传递信息,信息采取串行方式发送,每经过一位灯珠信息减少24bit,内部电路自动向下发送剩余数据。(WS2812规格书)

2.gForce手环硬件连接与arduino开发环境搭建http://139.224.25.190:8890/forum.php?mod=viewthread&tid=26&page=1#pid28

三、代码相关
  1. #include <gForceAdapter.h>
  2. #include<SoftwareSerial.h>
  3. #include "./lib/MakeblockOrion.h"

  4. GForceAdapter gforce = GForceAdapter(&Serial);

  5. MeRGBLed led(PORT_3);

  6. #define RGB_Count 24
  7. #define RGB_Color 8

  8. enum ColorSet {
  9.   RED = 1,
  10.   ORANGE,
  11.   YELLOW,
  12.   GREEN,
  13.   CYAN,
  14.   BLUE,
  15.   PURPLE,
  16.   BLACK
  17. };

  18. enum RGBNum {
  19.   RGB_1 = 1,
  20.   RGB_2, RGB_3, RGB_4, RGB_5, RGB_6,
  21.   RGB_7, RGB_8, RGB_9, RGB_10, RGB_11,
  22.   RGB_12, RGB_13, RGB_14, RGB_15, RGB_16,
  23.   RGB_17, RGB_18, RGB_19, RGB_20, RGB_21,
  24.   RGB_22, RGB_23, RGB_24
  25. };

  26. enum ModeSet {
  27.   CLOSE = 0,
  28.   OPEN = 1
  29. };


  30. void setup()
  31. {
  32.   gforce.Init();
  33.   led.setNumber(RGB_Count);
  34.   RGB_init();
  35. }

  36. void loop()
  37. {
  38.   while (1)
  39.   {
  40.     get_gforce_data();
  41.   }
  42. }

  43. void RGB_init(void)
  44. {
  45.   RGB_LoopLight(RGB_1, RGB_8, RED , OPEN, 50);
  46.   RGB_LoopLight(RGB_9, RGB_16, YELLOW , OPEN, 50);
  47.   RGB_LoopLight(RGB_17, RGB_24, BLUE , OPEN, 50);
  48.   RGB_LoopLight(RGB_24, RGB_1, BLACK , OPEN, 50);
  49.   RGB_LoopLight(RGB_1, RGB_24, CYAN , CLOSE, 0);
  50.   delay(100);
  51.   RGB_LoopLight(RGB_1, RGB_24, BLACK , CLOSE, 0);
  52.   delay(250);
  53.   RGB_LoopLight(RGB_1, RGB_24, PURPLE , CLOSE, 0);
  54.   delay(100);
  55.   RGB_LoopLight(RGB_1, RGB_24, BLACK , CLOSE, 0);
  56.   delay(250);
  57.   RGB_LoopColor(RGB_1, RGB_24, RED, 100);
  58.   RGB_LoopLight(RGB_1, RGB_24, BLACK , OPEN, 50);
  59.   RGB_LoopColor(RGB_8, RGB_1, PURPLE, 100);
  60.   RGB_LoopColor(RGB_9, RGB_19, ORANGE, 100);
  61.   RGB_LoopWater(2, RED, 50);
  62.   RGB_LoopWater(3, BLUE, 150);
  63.   RGB_LoopLight(RGB_1, RGB_24, BLACK , CLOSE, 0);
  64.   delay(100);
  65.   RGB_LoopWater(4, GREEN, 200);
  66.   RGB_LoopWater(5, PURPLE, 200);
  67.   RGB_LoopLight(RGB_1, RGB_24, BLACK , CLOSE, 0);
  68.   delay(100);
  69. }

  70. void get_gforce_data()
  71. {
  72.   GF_Data gForceData;
  73.   if (OK == gforce.GetGForceData(&gForceData)) {
  74.     GF_Gesture gesture;
  75.     switch (gForceData.type) {
  76.       case GF_Data::QUATERNION:
  77.         break;
  78.       case GF_Data::GESTURE:
  79.         gesture = gForceData.value.gesture;
  80.         if (gesture == GF_FIST) {
  81.           Serial.println("Receive fist signel!");
  82.           RGB_LoopLight(RGB_1, RGB_24, RED, OPEN, 50);
  83.         }
  84.         else if (gesture == GF_SPREAD) {
  85.           Serial.println("Receive spread signel!");
  86.           RGB_LoopWater(2, PURPLE, 50);
  87.         }
  88.         else if (gesture == GF_WAVEIN) {
  89.           Serial.println("Receive wavein signel!");
  90.           RGB_LoopColor(RGB_24, RGB_1, RED, 50);
  91.         }
  92.         else if (gesture == GF_WAVEOUT) {
  93.           Serial.println("Receive waveout signel!");
  94.           RGB_LoopColor(RGB_1, RGB_24, RED, 50);
  95.         }
  96.         else if (gesture == GF_PINCH) {
  97.           Serial.println("Receive pinch signel!");
  98.           RGB_LoopLight(RGB_1, RGB_24, BLUE, OPEN, 50);
  99.         }
  100.         else if (gesture == GF_SHOOT) {
  101.           Serial.println("Receive shoot signel!");
  102.           RGB_LoopWater(3, CYAN, 50);
  103.         }
  104.         else if (gesture == GF_RELEASE) {
  105.           Serial.println("Receive release signel!");
  106.           RGB_LoopLight(RGB_1, RGB_24, BLACK , OPEN, 1);
  107.         }
  108.         else if (gesture == GF_UNKNOWN) {
  109.           Serial.println("Receive unknown signel!");
  110.           RGB_LoopLight(RGB_1, RGB_24, BLACK , OPEN, 1);
  111.         }
  112.         break;
  113.       default:
  114.         break;
  115.     }
  116.   }
  117. }

  118. void RGB_SingleLight(RGBNum Num, ColorSet Color)
  119. {
  120.   uint8_t num = (uint8_t)Num - 1;
  121.   switch (Color)
  122.   {
  123.     case RED: led.setColorAt(num, 255, 0, 0); //red
  124.       break;
  125.     case ORANGE: led.setColorAt(num, 255, 165, 0); //orange
  126.       break;
  127.     case YELLOW: led.setColorAt(num, 255, 255, 0); //yellow
  128.       break;
  129.     case GREEN: led.setColorAt(num, 0, 255, 0); //green
  130.       break;
  131.     case CYAN: led.setColorAt(num, 0, 255, 255); //cyan
  132.       break;
  133.     case BLUE: led.setColorAt(num, 0, 0, 255); //blue
  134.       break;
  135.     case PURPLE: led.setColorAt(num, 160, 32, 240); //purple
  136.       break;
  137.     case BLACK: led.setColorAt(num, 0, 0, 0); //black
  138.       break;
  139.     default : led.setColorAt(num, 0, 0, 0);
  140.       break;
  141.   }
  142.   led.show();
  143. }

  144. void RGB_LoopWater(uint8_t num, ColorSet Color, long delayms)
  145. {
  146.   uint8_t num_Cot = RGB_Count / num, num_Rer = RGB_Count % num, i, j, Lightnum;
  147.   if (num <= RGB_Count)
  148.   {
  149.     j = 1;
  150.     do {
  151.       for (i = 0; i < num; i ++)
  152.       {
  153.         Lightnum = num_Cot * i + j ;
  154.         RGB_SingleLight((RGBNum)Lightnum, Color);
  155.         delay(2);
  156.       }
  157.       j ++;
  158.       delay(delayms);
  159.     } while (j <= num_Cot);
  160.     if (num_Rer != 0)
  161.       RGB_LoopColor((RGBNum)RGB_Count, (RGBNum)(RGB_Count - num_Cot + 1), RED, 50);

  162.   }
  163.   else
  164.     RGB_LoopColor(RGB_1, RGB_24, RED, 100);
  165. }

  166. void RGB_LoopColor(RGBNum BeginNum, RGBNum EndNum, ColorSet Color, long delayms)
  167. {
  168.   uint8_t num1 = (uint8_t)BeginNum, num2 = (uint8_t)EndNum, color = (uint8_t)Color;
  169.   if (num1 < num2) {
  170.     do {
  171.       delay(delayms);
  172.       RGB_SingleLight((RGBNum)num1, (ColorSet)color);
  173.       num1 ++;
  174.       color ++;
  175.       if (color == RGB_Color)
  176.         color = 1;
  177.     } while (num1 <= num2);
  178.   }
  179.   else {
  180.     do {
  181.       delay(delayms);
  182.       RGB_SingleLight((RGBNum)num1, (ColorSet)color);
  183.       num1 --;
  184.       color ++;
  185.       if (color == RGB_Color)
  186.         color = 1;
  187.     } while (num1 >= num2);
  188.   }
  189. }

  190. void RGB_LoopLight(RGBNum BeginNum, RGBNum EndNum, ColorSet Color, ModeSet Mode, long delayms)
  191. {
  192.   uint8_t num1 = (uint8_t)BeginNum, num2 = (uint8_t)EndNum, mode = (uint8_t)Mode;
  193.   if (mode)
  194.   {
  195.     if (num1 < num2) {
  196.       do {
  197.         delay(delayms);
  198.         RGB_SingleLight((RGBNum)num1, Color);
  199.         num1 ++;
  200.       } while (num1 <= num2);
  201.     }
  202.     else {
  203.       do {
  204.         delay(delayms);
  205.         RGB_SingleLight((RGBNum)num1, Color);
  206.         num1 --;
  207.       } while (num1 >= num2);
  208.     }
  209.   }
  210.   else {
  211.     delayms = 0;
  212.     do {
  213.       RGB_SingleLight((RGBNum)num1, Color);
  214.       num1 ++;
  215.     } while (num1 <= RGB_Count);
  216.   }

  217. }



复制代码
注:底层库调用采用makeblock相关库文件

四、视频演示




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

 楼主| yuyu_morning 发表于 2017-7-19 18:26:56
期待更多更好的玩法!!!
回复 支持 反对

使用道具 举报

suxiang198 发表于 2017-7-26 17:07:14
灯环很炫噢
回复 支持 反对

使用道具 举报

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

本版积分规则

热帖滚动