LED Game Candle Panic details here https://kohacraft.com/candlepanic

Dependencies:   mbed

Committer:
kohacraft
Date:
Sun Aug 30 06:09:39 2020 +0000
Revision:
0:ec192cf5acd1
ver1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kohacraft 0:ec192cf5acd1 1 /*
kohacraft 0:ec192cf5acd1 2 candle panic
kohacraft 0:ec192cf5acd1 3 キャンドル パニック
kohacraft 0:ec192cf5acd1 4
kohacraft 0:ec192cf5acd1 5 詳しくはこちら
kohacraft 0:ec192cf5acd1 6 https://kohacraft.com/candlepanic
kohacraft 0:ec192cf5acd1 7
kohacraft 0:ec192cf5acd1 8 public domain
kohacraft 0:ec192cf5acd1 9 */
kohacraft 0:ec192cf5acd1 10
kohacraft 0:ec192cf5acd1 11 #include "mbed.h"
kohacraft 0:ec192cf5acd1 12
kohacraft 0:ec192cf5acd1 13 //LED&光センサー
kohacraft 0:ec192cf5acd1 14 #define ArrayNum 8
kohacraft 0:ec192cf5acd1 15 DigitalOut ledK[ArrayNum] = { dp1, dp2, dp4, dp6, dp9, dp10, dp13, dp14};
kohacraft 0:ec192cf5acd1 16 DigitalOut ledA(dp11);
kohacraft 0:ec192cf5acd1 17 DigitalIn ledSensor(dp15);
kohacraft 0:ec192cf5acd1 18 DigitalOut flash(dp5);
kohacraft 0:ec192cf5acd1 19 bool sensorArray[ArrayNum] = { 0, 0, 0, 0, 0, 0, 0, 0 };
kohacraft 0:ec192cf5acd1 20 bool ledArray[ArrayNum] = { 0, 0, 0, 0, 0, 0, 0, 0 };
kohacraft 0:ec192cf5acd1 21 #define LedA_Led 0 //LEDをLEDモードにする
kohacraft 0:ec192cf5acd1 22 #define LedA_Sensor 1 //LEDをセンサーモードにする
kohacraft 0:ec192cf5acd1 23
kohacraft 0:ec192cf5acd1 24 //サウンド
kohacraft 0:ec192cf5acd1 25 #define C1 1/261.626
kohacraft 0:ec192cf5acd1 26 #define D1 1/293.665
kohacraft 0:ec192cf5acd1 27 #define E1 1/329.628
kohacraft 0:ec192cf5acd1 28 #define F1 1/349.228
kohacraft 0:ec192cf5acd1 29 #define G1 1/391.995
kohacraft 0:ec192cf5acd1 30 #define A1 1/440.000
kohacraft 0:ec192cf5acd1 31 #define B1 1/493.883
kohacraft 0:ec192cf5acd1 32 #define C2 C1/2
kohacraft 0:ec192cf5acd1 33 #define D2 D1/2
kohacraft 0:ec192cf5acd1 34 #define E2 E1/2
kohacraft 0:ec192cf5acd1 35 #define F2 F1/2
kohacraft 0:ec192cf5acd1 36 #define G2 G1/2
kohacraft 0:ec192cf5acd1 37 #define A2 A1/2
kohacraft 0:ec192cf5acd1 38 #define B2 B1/2
kohacraft 0:ec192cf5acd1 39 const float tone[] = { C1, D1, E1, F1, G1, A1, B1, C2, D2, E2, F2, G2, A2, B2 };
kohacraft 0:ec192cf5acd1 40 PwmOut sp(dp18);
kohacraft 0:ec192cf5acd1 41 bool offBeepOn = 0; //LEDがOFFするときの音を出す
kohacraft 0:ec192cf5acd1 42 bool onBeepOn = 0; //LEDがONするときの音を出す
kohacraft 0:ec192cf5acd1 43 int beepDevide = 30;
kohacraft 0:ec192cf5acd1 44
kohacraft 0:ec192cf5acd1 45 int loopCount = 0;
kohacraft 0:ec192cf5acd1 46 int offCount = 500; //loopCountがこの値になったらLEDを一つ消す
kohacraft 0:ec192cf5acd1 47 int speedUpCount = 30; //loopCountがこの値になったらOffCountを減らす
kohacraft 0:ec192cf5acd1 48 int goleOffCount = 50; //offCountがこの値になったらゲームクリア
kohacraft 0:ec192cf5acd1 49
kohacraft 0:ec192cf5acd1 50 DigitalOut led(dp17);
kohacraft 0:ec192cf5acd1 51
kohacraft 0:ec192cf5acd1 52 void lightDetect();
kohacraft 0:ec192cf5acd1 53 void beep(float);
kohacraft 0:ec192cf5acd1 54 void showLed();
kohacraft 0:ec192cf5acd1 55 void offBeep();
kohacraft 0:ec192cf5acd1 56 void onBeep();
kohacraft 0:ec192cf5acd1 57
kohacraft 0:ec192cf5acd1 58 int main() {
kohacraft 0:ec192cf5acd1 59
kohacraft 0:ec192cf5acd1 60
kohacraft 0:ec192cf5acd1 61 //初期化
kohacraft 0:ec192cf5acd1 62 for( int i=0 ; i< ArrayNum ; i++ )
kohacraft 0:ec192cf5acd1 63 {
kohacraft 0:ec192cf5acd1 64 ledK[i] = 1;
kohacraft 0:ec192cf5acd1 65 ledArray[i] = 0;
kohacraft 0:ec192cf5acd1 66 }
kohacraft 0:ec192cf5acd1 67 flash = 1;
kohacraft 0:ec192cf5acd1 68
kohacraft 0:ec192cf5acd1 69 //LEDを順番に点灯しながら音を鳴らす
kohacraft 0:ec192cf5acd1 70
kohacraft 0:ec192cf5acd1 71 for( int i=0 ; i< ArrayNum ; i++ )
kohacraft 0:ec192cf5acd1 72 {
kohacraft 0:ec192cf5acd1 73 ledArray[i] = 1;
kohacraft 0:ec192cf5acd1 74 showLed();
kohacraft 0:ec192cf5acd1 75 beep( tone[i] );
kohacraft 0:ec192cf5acd1 76 wait( 0.1 );
kohacraft 0:ec192cf5acd1 77 }
kohacraft 0:ec192cf5acd1 78 beep( 0 );
kohacraft 0:ec192cf5acd1 79
kohacraft 0:ec192cf5acd1 80 int offCounter = 0;
kohacraft 0:ec192cf5acd1 81 while(1) {
kohacraft 0:ec192cf5acd1 82
kohacraft 0:ec192cf5acd1 83 //ランダムにどれか1つ消灯する
kohacraft 0:ec192cf5acd1 84 if( offCounter > offCount )
kohacraft 0:ec192cf5acd1 85 {
kohacraft 0:ec192cf5acd1 86 while(1)
kohacraft 0:ec192cf5acd1 87 {
kohacraft 0:ec192cf5acd1 88 float numFloat = (float)rand()/RAND_MAX * ( ArrayNum - 1 );
kohacraft 0:ec192cf5acd1 89 int num = int( numFloat + 0.5 );
kohacraft 0:ec192cf5acd1 90 if( ledArray[ num ] == 1 )
kohacraft 0:ec192cf5acd1 91 {
kohacraft 0:ec192cf5acd1 92 ledArray[ num ] = 0;
kohacraft 0:ec192cf5acd1 93 break;
kohacraft 0:ec192cf5acd1 94 }
kohacraft 0:ec192cf5acd1 95 }
kohacraft 0:ec192cf5acd1 96
kohacraft 0:ec192cf5acd1 97 offBeepOn = 1;
kohacraft 0:ec192cf5acd1 98 offCounter = 0;
kohacraft 0:ec192cf5acd1 99 }
kohacraft 0:ec192cf5acd1 100 offCounter++;
kohacraft 0:ec192cf5acd1 101
kohacraft 0:ec192cf5acd1 102 showLed();
kohacraft 0:ec192cf5acd1 103
kohacraft 0:ec192cf5acd1 104 lightDetect(); //センサ状態を取得
kohacraft 0:ec192cf5acd1 105 for( int i=0 ; i< ArrayNum ; i++ )
kohacraft 0:ec192cf5acd1 106 {
kohacraft 0:ec192cf5acd1 107 if( ledArray[i] == 0 && sensorArray[i] == 1 )
kohacraft 0:ec192cf5acd1 108 {
kohacraft 0:ec192cf5acd1 109 ledArray[i] = 1;
kohacraft 0:ec192cf5acd1 110 onBeepOn = 1;
kohacraft 0:ec192cf5acd1 111 }
kohacraft 0:ec192cf5acd1 112 }
kohacraft 0:ec192cf5acd1 113 showLed();
kohacraft 0:ec192cf5acd1 114
kohacraft 0:ec192cf5acd1 115 //全部消えたら終わり
kohacraft 0:ec192cf5acd1 116 int result = 0;
kohacraft 0:ec192cf5acd1 117 for( int i=0 ; i< ArrayNum ; i++ )
kohacraft 0:ec192cf5acd1 118 {
kohacraft 0:ec192cf5acd1 119 result += ledArray[i];
kohacraft 0:ec192cf5acd1 120 }
kohacraft 0:ec192cf5acd1 121 if( result == 0 )
kohacraft 0:ec192cf5acd1 122 {
kohacraft 0:ec192cf5acd1 123 break;
kohacraft 0:ec192cf5acd1 124 }
kohacraft 0:ec192cf5acd1 125
kohacraft 0:ec192cf5acd1 126 onBeep();
kohacraft 0:ec192cf5acd1 127 offBeep();
kohacraft 0:ec192cf5acd1 128
kohacraft 0:ec192cf5acd1 129 wait(0.002);
kohacraft 0:ec192cf5acd1 130 loopCount++;
kohacraft 0:ec192cf5acd1 131 if( loopCount%speedUpCount == 0 )
kohacraft 0:ec192cf5acd1 132 {
kohacraft 0:ec192cf5acd1 133 offCount--;
kohacraft 0:ec192cf5acd1 134 if( offCount < goleOffCount )
kohacraft 0:ec192cf5acd1 135 break;
kohacraft 0:ec192cf5acd1 136 }
kohacraft 0:ec192cf5acd1 137
kohacraft 0:ec192cf5acd1 138 }
kohacraft 0:ec192cf5acd1 139
kohacraft 0:ec192cf5acd1 140 if( offCount >= goleOffCount )
kohacraft 0:ec192cf5acd1 141 {
kohacraft 0:ec192cf5acd1 142 //失敗
kohacraft 0:ec192cf5acd1 143 beep( C1 );
kohacraft 0:ec192cf5acd1 144 wait( 0.2 );
kohacraft 0:ec192cf5acd1 145 beep( 0 );
kohacraft 0:ec192cf5acd1 146 wait( 0.2 );
kohacraft 0:ec192cf5acd1 147 beep( C1 );
kohacraft 0:ec192cf5acd1 148 wait( 1 );
kohacraft 0:ec192cf5acd1 149 beep( 0 );
kohacraft 0:ec192cf5acd1 150
kohacraft 0:ec192cf5acd1 151 }
kohacraft 0:ec192cf5acd1 152 else
kohacraft 0:ec192cf5acd1 153 {
kohacraft 0:ec192cf5acd1 154 //成功
kohacraft 0:ec192cf5acd1 155 for( int j=0 ; j<3 ; j++ )
kohacraft 0:ec192cf5acd1 156 {
kohacraft 0:ec192cf5acd1 157 for( int i=7 ; i<15 ; i++ )
kohacraft 0:ec192cf5acd1 158 {
kohacraft 0:ec192cf5acd1 159 beep(tone[i]);
kohacraft 0:ec192cf5acd1 160 wait( 0.05 );
kohacraft 0:ec192cf5acd1 161 }
kohacraft 0:ec192cf5acd1 162 }
kohacraft 0:ec192cf5acd1 163 beep(0);
kohacraft 0:ec192cf5acd1 164
kohacraft 0:ec192cf5acd1 165 while(1)
kohacraft 0:ec192cf5acd1 166 {
kohacraft 0:ec192cf5acd1 167 for( int i=0 ; i< ArrayNum ; i++ )
kohacraft 0:ec192cf5acd1 168 ledArray[i] = 1;
kohacraft 0:ec192cf5acd1 169 showLed();
kohacraft 0:ec192cf5acd1 170 wait(0.2);
kohacraft 0:ec192cf5acd1 171
kohacraft 0:ec192cf5acd1 172 for( int i=0 ; i< ArrayNum ; i++ )
kohacraft 0:ec192cf5acd1 173 ledArray[i] = 0;
kohacraft 0:ec192cf5acd1 174 showLed();
kohacraft 0:ec192cf5acd1 175 wait(0.2);
kohacraft 0:ec192cf5acd1 176 }
kohacraft 0:ec192cf5acd1 177 }
kohacraft 0:ec192cf5acd1 178 while(1)
kohacraft 0:ec192cf5acd1 179 {
kohacraft 0:ec192cf5acd1 180 ;
kohacraft 0:ec192cf5acd1 181 }
kohacraft 0:ec192cf5acd1 182 }
kohacraft 0:ec192cf5acd1 183
kohacraft 0:ec192cf5acd1 184 //光センサとして光を検知する
kohacraft 0:ec192cf5acd1 185 void lightDetect()
kohacraft 0:ec192cf5acd1 186 {
kohacraft 0:ec192cf5acd1 187 ledA = LedA_Sensor; //光センサのモードにする
kohacraft 0:ec192cf5acd1 188 for( int i=0 ; i < ArrayNum ; i++ ) //全てのセンサをOFFにする
kohacraft 0:ec192cf5acd1 189 {
kohacraft 0:ec192cf5acd1 190 ledK[i] = 0;
kohacraft 0:ec192cf5acd1 191 sensorArray[i] = 0;
kohacraft 0:ec192cf5acd1 192 }
kohacraft 0:ec192cf5acd1 193
kohacraft 0:ec192cf5acd1 194 for( int i=0 ; i < ArrayNum ; i++ )
kohacraft 0:ec192cf5acd1 195 {
kohacraft 0:ec192cf5acd1 196 flash = 0;
kohacraft 0:ec192cf5acd1 197 wait(0.0001);
kohacraft 0:ec192cf5acd1 198 flash = 1;
kohacraft 0:ec192cf5acd1 199
kohacraft 0:ec192cf5acd1 200 ledK[i] = 1; //特定のセンサのみONにする
kohacraft 0:ec192cf5acd1 201 wait(0.0001);
kohacraft 0:ec192cf5acd1 202 bool res = ledSensor; //センサの状態を読み込む
kohacraft 0:ec192cf5acd1 203 if( res == 0 )
kohacraft 0:ec192cf5acd1 204 sensorArray[i] = 1;
kohacraft 0:ec192cf5acd1 205 else
kohacraft 0:ec192cf5acd1 206 sensorArray[i] = 0;
kohacraft 0:ec192cf5acd1 207 ledK[i] = 0; //特定のセンサをOFFにする
kohacraft 0:ec192cf5acd1 208 }
kohacraft 0:ec192cf5acd1 209 return;
kohacraft 0:ec192cf5acd1 210 }
kohacraft 0:ec192cf5acd1 211
kohacraft 0:ec192cf5acd1 212 //指定した周期でピープを鳴らす 0ならOFF
kohacraft 0:ec192cf5acd1 213 void beep( float scale )
kohacraft 0:ec192cf5acd1 214 {
kohacraft 0:ec192cf5acd1 215 if( scale != 0 )
kohacraft 0:ec192cf5acd1 216 {
kohacraft 0:ec192cf5acd1 217 sp.period(scale);
kohacraft 0:ec192cf5acd1 218 sp.write(0.5f);
kohacraft 0:ec192cf5acd1 219 }
kohacraft 0:ec192cf5acd1 220 else
kohacraft 0:ec192cf5acd1 221 {
kohacraft 0:ec192cf5acd1 222 sp.write(0.0f);
kohacraft 0:ec192cf5acd1 223 }
kohacraft 0:ec192cf5acd1 224 }
kohacraft 0:ec192cf5acd1 225
kohacraft 0:ec192cf5acd1 226 //ledArrayにしたがってLEDを点灯する
kohacraft 0:ec192cf5acd1 227 void showLed()
kohacraft 0:ec192cf5acd1 228 {
kohacraft 0:ec192cf5acd1 229 for( int i=0 ; i<ArrayNum ; i++ )
kohacraft 0:ec192cf5acd1 230 {
kohacraft 0:ec192cf5acd1 231 if( ledArray[i] == 1)
kohacraft 0:ec192cf5acd1 232 {
kohacraft 0:ec192cf5acd1 233 ledK[i] = 0;
kohacraft 0:ec192cf5acd1 234 }
kohacraft 0:ec192cf5acd1 235 else
kohacraft 0:ec192cf5acd1 236 {
kohacraft 0:ec192cf5acd1 237 ledK[i] = 1;
kohacraft 0:ec192cf5acd1 238 }
kohacraft 0:ec192cf5acd1 239 }
kohacraft 0:ec192cf5acd1 240 ledA = LedA_Led; //LEDのモードにする
kohacraft 0:ec192cf5acd1 241 }
kohacraft 0:ec192cf5acd1 242
kohacraft 0:ec192cf5acd1 243 //LEDがOFFするときのサウンド
kohacraft 0:ec192cf5acd1 244 bool offBeepRun = 0;
kohacraft 0:ec192cf5acd1 245 int offBeepCount = 0;
kohacraft 0:ec192cf5acd1 246 int offMelodyCounter = 0;
kohacraft 0:ec192cf5acd1 247 void offBeep()
kohacraft 0:ec192cf5acd1 248 {
kohacraft 0:ec192cf5acd1 249 int melodyLength = 2;
kohacraft 0:ec192cf5acd1 250 float melody[2] = { D1, C1 };
kohacraft 0:ec192cf5acd1 251
kohacraft 0:ec192cf5acd1 252 if( offBeepOn == 1 )
kohacraft 0:ec192cf5acd1 253 {
kohacraft 0:ec192cf5acd1 254 offBeepOn = 0;
kohacraft 0:ec192cf5acd1 255 offBeepRun = 1;
kohacraft 0:ec192cf5acd1 256 offBeepCount = 0;
kohacraft 0:ec192cf5acd1 257 offMelodyCounter = 0;
kohacraft 0:ec192cf5acd1 258 }
kohacraft 0:ec192cf5acd1 259
kohacraft 0:ec192cf5acd1 260 if( offBeepRun == 1 )
kohacraft 0:ec192cf5acd1 261 {
kohacraft 0:ec192cf5acd1 262 if( offBeepCount%beepDevide == 0 )
kohacraft 0:ec192cf5acd1 263 {
kohacraft 0:ec192cf5acd1 264 if( offMelodyCounter < melodyLength )
kohacraft 0:ec192cf5acd1 265 {
kohacraft 0:ec192cf5acd1 266 //メロディの長さ以下だったら音を鳴らす
kohacraft 0:ec192cf5acd1 267 beep( melody[ offMelodyCounter++ ] );
kohacraft 0:ec192cf5acd1 268 }
kohacraft 0:ec192cf5acd1 269 else
kohacraft 0:ec192cf5acd1 270 {
kohacraft 0:ec192cf5acd1 271 //音を止める
kohacraft 0:ec192cf5acd1 272 beep(0);
kohacraft 0:ec192cf5acd1 273 offBeepRun = 0;
kohacraft 0:ec192cf5acd1 274 }
kohacraft 0:ec192cf5acd1 275 }
kohacraft 0:ec192cf5acd1 276
kohacraft 0:ec192cf5acd1 277 offBeepCount++;
kohacraft 0:ec192cf5acd1 278 return;
kohacraft 0:ec192cf5acd1 279 }
kohacraft 0:ec192cf5acd1 280
kohacraft 0:ec192cf5acd1 281 return;
kohacraft 0:ec192cf5acd1 282 }
kohacraft 0:ec192cf5acd1 283
kohacraft 0:ec192cf5acd1 284 //LEDがONするときのサウンド
kohacraft 0:ec192cf5acd1 285 bool onBeepRun = 0;
kohacraft 0:ec192cf5acd1 286 int onBeepCount = 0;
kohacraft 0:ec192cf5acd1 287 int onMelodyCounter = 0;
kohacraft 0:ec192cf5acd1 288 void onBeep()
kohacraft 0:ec192cf5acd1 289 {
kohacraft 0:ec192cf5acd1 290 int melodyLength = 2;
kohacraft 0:ec192cf5acd1 291 float melody[2] = { C2, D2 };
kohacraft 0:ec192cf5acd1 292
kohacraft 0:ec192cf5acd1 293 if( onBeepOn == 1 )
kohacraft 0:ec192cf5acd1 294 {
kohacraft 0:ec192cf5acd1 295 onBeepOn = 0;
kohacraft 0:ec192cf5acd1 296 onBeepRun = 1;
kohacraft 0:ec192cf5acd1 297 onBeepCount = 0;
kohacraft 0:ec192cf5acd1 298 onMelodyCounter = 0;
kohacraft 0:ec192cf5acd1 299 }
kohacraft 0:ec192cf5acd1 300
kohacraft 0:ec192cf5acd1 301 if( onBeepRun == 1 )
kohacraft 0:ec192cf5acd1 302 {
kohacraft 0:ec192cf5acd1 303 if( onBeepCount%beepDevide == 0 )
kohacraft 0:ec192cf5acd1 304 {
kohacraft 0:ec192cf5acd1 305 if( onMelodyCounter < melodyLength )
kohacraft 0:ec192cf5acd1 306 {
kohacraft 0:ec192cf5acd1 307 //メロディの長さ以下だったら音を鳴らす
kohacraft 0:ec192cf5acd1 308 beep( melody[ onMelodyCounter++ ] );
kohacraft 0:ec192cf5acd1 309 }
kohacraft 0:ec192cf5acd1 310 else
kohacraft 0:ec192cf5acd1 311 {
kohacraft 0:ec192cf5acd1 312 //音を止める
kohacraft 0:ec192cf5acd1 313 beep(0);
kohacraft 0:ec192cf5acd1 314 onBeepRun = 0;
kohacraft 0:ec192cf5acd1 315 }
kohacraft 0:ec192cf5acd1 316 }
kohacraft 0:ec192cf5acd1 317
kohacraft 0:ec192cf5acd1 318 onBeepCount++;
kohacraft 0:ec192cf5acd1 319 return;
kohacraft 0:ec192cf5acd1 320 }
kohacraft 0:ec192cf5acd1 321
kohacraft 0:ec192cf5acd1 322 return;
kohacraft 0:ec192cf5acd1 323 }
kohacraft 0:ec192cf5acd1 324