极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13049|回复: 5

自制电子色子

[复制链接]
发表于 2016-3-7 12:16:27 | 显示全部楼层 |阅读模式
闲来无事做了一个电子色子, 和女儿一起玩飞行棋.

所需材料如下:
1. arduino pro mini  一块
2. 倾斜开关             一个
3. 蜂鸣器                 一个
4. ws2812 LED灯     九颗







代码如下:

  1. #include <FastLED.h>

  2. //LED数量
  3. #define NUM_LEDS 9
  4. //ws2812的数据针脚
  5. #define PIN 6
  6. //蜂鸣器针脚
  7. #define BeepPin 4
  8. //倾斜开关针脚
  9. #define inPin 9

  10. CRGB leds[NUM_LEDS];
  11. CRGB Dice[6][9]={{CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Red,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Black},
  12. {CRGB::Aqua,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Aqua},
  13. {CRGB::LimeGreen,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::LimeGreen,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::LimeGreen},
  14. {CRGB::Black,CRGB::Blue,CRGB::Black,CRGB::Blue,CRGB::Black,CRGB::Blue,CRGB::Black,CRGB::Blue,CRGB::Black},
  15. {CRGB::Black,CRGB::Green,CRGB::Black,CRGB::Green,CRGB::Green,CRGB::Green,CRGB::Black,CRGB::Green,CRGB::Black},
  16. {CRGB::Orange,CRGB::Orange,CRGB::Orange,CRGB::Black,CRGB::Black,CRGB::Black,CRGB::Orange,CRGB::Orange,CRGB::Orange}};
  17. boolean bb=false;
  18. boolean AA=false;
  19. int count=0;
  20. int AC=0;
  21. static unsigned long  printTime=0;
  22. char r=0;
  23. int runLen=0;

  24. void setup(){
  25.   pinMode(inPin, INPUT);
  26.   pinMode(BeepPin, OUTPUT);
  27.   FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS);
  28.   FastLED.setBrightness(20);
  29.   randomSeed(analogRead(A0)+millis());
  30.   printTime=getTick(0,true);
  31. }
  32. void setAll(int rc,int gc,int bc){
  33.   for(int i = 0 ; i < NUM_LEDS; i++ ){
  34.     if(rc>=0) leds[i].r=rc;
  35.     if(gc>=0) leds[i].g=gc;
  36.     if(bc>=0) leds[i].b=bc;
  37.   }
  38.   FastLED.show();
  39. }
  40. void setI(int i,int rc,int gc,int bc){
  41.   if(i<0||i>=NUM_LEDS) return;
  42.   if(rc>=0) leds[i].r=rc;
  43.   if(gc>=0) leds[i].g=gc;
  44.   if(bc>=0) leds[i].b=bc;
  45. }
  46. void setICRGB(int i,CRGB cr){
  47.   if(i<0||i>=NUM_LEDS) return;
  48.   leds[i]=cr;
  49. }
  50. void setAllCRGB(CRGB cr){
  51.   for(int i = 0 ; i < NUM_LEDS; i++ ){
  52.     leds[i]=cr;
  53.   }
  54.   FastLED.show();
  55. }
  56. void setAllList(CRGB *cr){
  57.   for(int i = 0 ; i < NUM_LEDS; i++ ){
  58.     leds[i]=cr[i];
  59.   }
  60.   FastLED.show();
  61. }
  62. void loop() {
  63.   if(count>1){
  64.     AA=true;
  65.     printTime=getTick(0,true);
  66.     count=0;
  67.   }else{
  68.     if(digitalRead(inPin)==HIGH&&!bb&&!AA){
  69.       count++;
  70.       bb=true;
  71.     }else if(digitalRead(inPin)==LOW)
  72.       bb=false;
  73.   }
  74.   if(AA&&getTick(printTime,false)>120){
  75.     runLen=0;
  76.   do{
  77.     runLen+=random(50)+random(runLen);
  78.     r=random(6);
  79.     setAllList(Dice[r]);
  80.     if(runLen<500) delay(runLen);
  81.   }while(runLen<500);
  82.   beep(r);
  83.     AA=false;
  84.     count=0;
  85.     bb=false;
  86.   }
  87. }
  88. void beep(char c){
  89.   switch(c){
  90.     case 0:
  91.       beep_short(1,50,50);
  92.     break;
  93.     case 1:
  94.       beep_short(2,200,20);
  95.       break;
  96.     case 2:
  97.       beep_short(3,200,20);
  98.       break;
  99.     case 3:
  100.       beep_short(4,100,20);
  101.       break;
  102.     case 4:
  103.       beep_short(5,100,20);
  104.       break;
  105.     case 5:
  106.       beep_short(1,100,200);
  107.       break;
  108.   }
  109. }
  110. void beep_short(int n,int len,int l){
  111.   for(int j=0;j<n;j++){
  112.     for(int i=0;i<2;i++){
  113.       digitalWrite(BeepPin, HIGH);
  114.       delay(l);
  115.       digitalWrite(BeepPin, LOW);
  116.       delay(l);
  117.     }
  118.     delay(len);
  119.   }
  120. }
  121. unsigned long getTick(unsigned long pMMillis,boolean getNow) {
  122.   if(getNow) return millis();
  123.   unsigned long currentMillis = millis();
  124.   if(currentMillis < pMMillis) {
  125.     return (currentMillis+(4294967295 - pMMillis + 1));
  126.   }else
  127.     return (currentMillis-pMMillis);
  128. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2016-3-7 14:20:10 | 显示全部楼层
建议加上一个遥控的功能
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-7 14:31:31 | 显示全部楼层
zoologist 发表于 2016-3-7 14:20
建议加上一个遥控的功能

我们放在台面,一拍台就运行,所以没做遥控了
回复 支持 反对

使用道具 举报

发表于 2016-3-7 15:03:32 | 显示全部楼层
你可以用遥控功能设定你想要的值,然后该拍还是拍
回复 支持 反对

使用道具 举报

发表于 2016-3-8 08:21:38 | 显示全部楼层
程序有注释就更好了。
回复 支持 反对

使用道具 举报

发表于 2016-3-8 09:47:23 | 显示全部楼层
噢!原來是 電子骰子。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 22:30 , Processed in 0.039447 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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