//----------------------------------------------------------------------- // 23.11.04 naka // 押しボタン式信号機のおもちゃ // //----------------------------------------------------------------------- /*************************************************** DFPlayer - A Mini MP3 Player For Arduino *************************************************** This example shows the basic function of library for DFPlayer. Created 2016-12-07 By [Angelo qiao](Angelo.qiao@dfrobot.com) GNU Lesser General Public License. See for details. All above must be included in any redistribution ****************************************************/ #include "Arduino.h" #include #include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" SoftwareSerial mySoftwareSerial(10, 11); // RX, TX DFRobotDFPlayerMini myDFPlayer; #define w_button 2 #define c_Green 3 #define c_Yellow 4 #define c_Red 5 #define w_Green 6 #define w_Red 7 #define b_light 8 #define DFP_power 9 #define ON HIGH #define OFF LOW #define wait_time 6*1000 #define yellow_wait 3*1000 #define w_until_blink 5*1000 #define w_blink_no 13 #define VOLUME 20 void setup() { // Serial.begin(115200); // Serial.println("Start"); // 端子の初期化 pinMode(c_Green, OUTPUT); pinMode(c_Yellow,OUTPUT); pinMode(c_Red, OUTPUT); pinMode(w_Green, OUTPUT); pinMode(w_Red, OUTPUT); pinMode(b_light, OUTPUT); pinMode(DFP_power, OUTPUT); pinMode(w_button, INPUT_PULLUP); mySoftwareSerial.begin(9600); Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); //反応が返るまでループさせる digitalWrite(DFP_power, ON); while(!myDFPlayer.begin(mySoftwareSerial)){ Serial.print("."); delay(200); } delay(1000); Serial.println(F("DFRobot DFPlayer initialized")); myDFPlayer.volume(VOLUME); //Set volume value. From 0 to 30 delay(1000); } void WakeUp(){ } void loop() { static unsigned long timer; set_traffic_signal('G'); // 1回、通行ノイズ発生 myDFPlayer.playMp3Folder(random(1,10)); // ノイズは1〜9の9種類 delay(wait_time); // ボタンが押されるまでスリープする set_traffic_signal('X'); // すべてのLED消灯 digitalWrite(DFP_power, OFF); // スリープモード移行 Sleep(); // スリープ解除 digitalWrite(b_light, ON); // 「しばらくおまちください」点灯 set_traffic_signal('G'); digitalWrite(DFP_power, ON); // DFPlayer on delay(800); myDFPlayer.volume(VOLUME); //Set volume value. From 0 to 30 delay(1000); myDFPlayer.playMp3Folder(random(1,10)); // ノイズは1〜10の9種類 delay(wait_time); set_traffic_signal('Y'); delay(yellow_wait); set_traffic_signal('R'); myDFPlayer.playMp3Folder(random(10,12)); // ピヨピヨ音かカッコー digitalWrite(b_light, OFF); // 「しばらくおまちください」消灯 delay(w_until_blink); digitalWrite(w_Green, OFF); // 歩行者信号「緑」消灯 set_walker_signal_blink(w_blink_no); digitalWrite(w_Red, ON); // 歩行者信号「赤」点灯 delay(1000); // 歩行者用信号が「赤」になったあと、1秒後に車道側「緑」 } void set_traffic_signal(char color) { // 車線信号の色を指定 switch (color) { case 'X': digitalWrite(c_Red, OFF); digitalWrite(c_Yellow, OFF); digitalWrite(c_Green, OFF); digitalWrite(w_Red, OFF); digitalWrite(w_Green, OFF); digitalWrite(b_light, OFF); // 「しばらくおまちください」消灯 break; case 'G': digitalWrite(c_Red, OFF); digitalWrite(c_Yellow, OFF); digitalWrite(c_Green, ON); digitalWrite(w_Red, ON); digitalWrite(w_Green, OFF); break; case 'Y': digitalWrite(c_Red, OFF); digitalWrite(c_Yellow, ON); digitalWrite(c_Green, OFF); digitalWrite(w_Red, ON); digitalWrite(w_Green, OFF); break; case 'R': digitalWrite(c_Red, ON); digitalWrite(c_Yellow, OFF); digitalWrite(c_Green, OFF); digitalWrite(w_Red, OFF); digitalWrite(w_Green, ON); break; } } void set_walker_signal_blink(int cnt) { // 歩行者信号の緑点滅 while(cnt>0) { int blink_wait = cnt*20+200; delay(blink_wait); digitalWrite(w_Green, ON); delay(blink_wait); digitalWrite(w_Green, OFF); cnt--; } } //https://www.hiramine.com/physicalcomputing/atmega328/sleepbuttonwakeup.html // 外部割り込みの結果呼び出される関数 void wakeUpNow() { ; // 何もなし } void Sleep() { // @ アナログ・デジタル・コンバータ機能を無効にする(少しでも電力消費を抑えるため) byte adcsra_old = ADCSRA; // ADC Control と Register Aの設定値の以前の値を保持。 ADCSRA = 0; // アナログ・デジタル・コンバータ機能の無効にする。 // A スリープモードを設定する(ADGでセット) set_sleep_mode(SLEEP_MODE_PWR_DOWN); // B 割り込み機能を無効にする(CDの処理を確実に実行するため) noInterrupts(); // cli()でも同じ // C 電圧降下検出機能を無効にする(少しでも電力消費を抑えるため) sleep_bod_disable(); // D スリープ機能を有効にする(ADGでセット) sleep_enable(); // E 割り込み機能を有効にする(CDの処理を実行したので元に戻す) interrupts(); // sei()でも同じ // F 外部割り込み条件を設定する(Wakeするための外部割り込み条件の割込設定) attachInterrupt(0,wakeUpNow, FALLING); // INT0端子(2番ピン)の立ち下がりで割り込み発生。wakeUpNow関数が呼ばれる。 // G スリープ実行(ADGでセット) // sleep_cpu(); sleep_mode(); // (Gによってスリープに移行する。Fで設定した外部割り込みでWakeし、Hの処理が実施される) // H スリープ機能を無効にする(Fで設定した外部割り込みでWakeしたので、スリープを無効にする) sleep_disable(); // I 外部割り込み条件の設定を解除する(Wakeしたので) detachInterrupt(0); // J アナログ・デジタル・コンバータ機能を有効にする(Wakeしたので) ADCSRA = adcsra_old; }