/*****************************************************/
// FILE ランダム関数 スロットマシーンモドキ
// 7SegLED 3桁
// DATE :Tue, Jan 10, 2025
// DESCRIPTION : TLR313
// CPU TYPE : Arduino UNO
// by Chiyabo
// This file is generated by Renesas Project Generator.
/*****************************************************/
#include "SoftwareSerial.h"
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"
// 7SegLED Disp
#define SI 8
#define SCK 9
#define RCK 10
#define SEL1 11
#define SEL2 12
#define SEL3 13
// Start/Stop SW
#define Swin 5
#define Start 6
#define Stop 7
#define Timer_Adjust1 313 // 1000ms / 3.2ms = 312.5
#define Timer_Adjust2 625 // 2sec
#define Timer_Adjust3 938 // 3sec
#define Timer_Adjust4 1250 // 4sec
#define Timer_Adjust5 1563 // 5sec
#define Timer_Adjust6 1875 // 6sec
int RandomNumber ;//「RandomNumber」をlongで変数宣言
//char RandamCont = 0 ;
unsigned int Time_Up = 0 ;
unsigned char Led_Sel ;
unsigned char Code1 ;
unsigned char Code2 ;
unsigned char Code3 ;
unsigned int Timer ;
char StopNo0 = false ;
char StopNo1 = false ;
char StopNo2 = false ;
char SpOutEnStat ;
char SpOutEn = true ;
char SpOutLevel = 0 ;
char SpOut = 3 ;
char CountStart ;
char SundStart = false ;
//const unsigned char Led_Code[ ] = {0x5f,0x50,0x6d,0x79,0x72,0x3b,0x3f,// "0"~"6"
// 0x51,0x7f,0x73,0x77,0x3e,0x0f,0x7c, // "7"~"d"
// 0x2f,0x27 // "e"~"f"
// } ;
int Jr[ ] = { 784, 660, 588, 524, 588, 660 } ;
//int busy_PIN = 9 ;//busyピンはD9に接続
char Mp3No = 2 ;
SoftwareSerial mySoftwareSerial( 4, 3 ) ; // RX, TX
DFRobotDFPlayerMini myDFP ; //インスタンスmyDFPを生成
void setup( ){
//Serial.begin(9600); //シリアル通信を9600bpsで初期化
// 7SegLED Disp
pinMode( SI, OUTPUT ) ;
pinMode( SCK, OUTPUT ) ;
pinMode( RCK, OUTPUT ) ;
pinMode( SEL1, OUTPUT ) ;
pinMode( SEL2, OUTPUT ) ;
pinMode( SEL3, OUTPUT ) ;
digitalWrite( SEL1, HIGH ) ;
digitalWrite( SEL2, HIGH ) ;
digitalWrite( SEL3, HIGH ) ;
// Start/Stop SW
pinMode( SpOut, OUTPUT ) ;
pinMode( Swin, INPUT_PULLUP ) ;
pinMode( Stop, OUTPUT ) ;
pinMode( Start, OUTPUT ) ;
digitalWrite( Stop, LOW ) ;
digitalWrite( Start, LOW ) ;
// タイマー割り込み設定
TCCR1A = 0; // タイマー1動作モードを初期化
TCCR1B = ( 1 << WGM12 ) | ( 1 << CS11 ) ; // CTCモード 分周比1/8 WGM12 = CS11 = 1
OCR1A = 1600 - 1 ; // 800μsとなるように設定
TIMSK1 = ( 1 << OCIE1A ) ; // タイマー1のAマッチ割り込みを許可 OCIE1A = 1
Timer = 0 ;
Led_Sel = 0 ;
randomSeed(100); //乱数の種となる数値を100に指定
mySoftwareSerial.begin( 9600 ) ; //DFPlayer通信用のソフトウェアシリアルを初期化
if ( !myDFP.begin (mySoftwareSerial ) ){
//DFPlayerを初期化。2秒以内に初期化できなければエラーメッセージを表示
//Serial.println( F( "Unable to begin:" ) ) ;
while( true ) ;
}
myDFP.volume( 20 ) ;//ボリュームを25に設定(指定できる値は0~30)
}
void loop() {
//long RandomNumber;//「RandomNumber」をlongで変数宣言
if( Timer == 0 ){ // 312Hx 3.2ms毎
//if( ++RandamCont >= 30 ){
RandomNumber = random( 100, 999 ) ;//乱数の最小値を100、最大値を999に指定
//Serial.println( RandomNumber ) ;//乱数を送信、改行
//RandamCont = 0 ;
//}
LED( ) ;
Timer = 4 ; // 800us*4=3.2ms 312Hz
}
}
// 割込みサービスルーチン
ISR( TIMER1_COMPA_vect ){
if(Timer > 0 ){
Timer-- ;
}
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
FunctionName : Led Write Task
Prototype: void LED( void )
Function : LED DATA SET & WRITE
Input : NONE
Output : NONE
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*
void LED( void ){
unsigned char Code ;
unsigned char Change_Code ; /
char i ;
// Disp Off
digitalWrite( SEL1, HIGH ) ;
digitalWrite( SEL2, HIGH ) ;
digitalWrite( SEL3, HIGH ) ;
if( ++Led_Sel >= 3 ){
Led_Sel = 0 ;
}
if( digitalRead( Swin ) == 1 ){ // StartSW ON
StopNo0 = false ;
StopNo1 = false ;
StopNo2 = false ;
Time_Up = 0 ;
SpOutEnStat = false ;
SpOutEn = true ;
CountStart = true ;
SundStart = true ;
digitalWrite( Start, LOW ) ;
digitalWrite( Stop, HIGH ) ;
}
if( digitalRead( Swin ) == 0 ){ // StopSW ON
if( SpOutEnStat == false ){
if( SundStart == true ){
myDFP.play( Mp3No ) ;//SDカード内のmp3ファイルを再生
delay( 100 ) ;
myDFP.play( Mp3No ) ;//SDカード内のmp3ファイルを再生 ? 不思議な現象
if( ++Mp3No >= 14 ){
Mp3No = 2 ;
}
SundStart = false ;
}
if( StopNo2 == true ){
SpOutEn = false ;
}
if( ++Time_Up == Timer_Adjust1 ){ // 1sec
StopNo0 = true ;
}
if( Time_Up == Timer_Adjust3 ){ // 3sec
StopNo1 = true ;
}
if( Time_Up >= Timer_Adjust5 ){ // 5sec
StopNo2 = true ;
SpOutEnStat = true ;
}
}
digitalWrite( Start, HIGH ) ;
digitalWrite( Stop, LOW ) ;
}
RandomNumber = HexChgDec16( RandomNumber ) ; HEXをDEC値に変換する
switch( Led_Sel ){
case 0 :
if( StopNo0 == false ){
Change_Code = ( char )( ( RandomNumber & 0x0f00 ) >> 8 ) ;
Code1 = ~Led_Code[ Change_Code ] ; // Test
}
ShiftCode( Code1 ) ;
digitalWrite( SEL1, LOW ) ;
digitalWrite( SEL2, HIGH ) ;
digitalWrite( SEL3, HIGH ) ;
break ;
case 1:
if( StopNo1 == false ){
Change_Code =( char )( ( RandomNumber & 0x00f0 ) >> 4 ) ;
Code2 = ~Led_Code[ Change_Code ] ; // Test
}
ShiftCode( Code2 ) ;
digitalWrite( SEL1, HIGH ) ;
digitalWrite( SEL2, LOW ) ;
digitalWrite( SEL3, HIGH ) ;
break ;
case 2:
if( StopNo2 == false ){
Change_Code =( char )( RandomNumber & 0x000f ) ;
Code3 = ~Led_Code[ Change_Code ] ; // Test
}
if( ( SpOutEnStat == true ) && ( CountStart == true ) ){
if( ( Code1 == Code2) && ( Code2 == Code3 ) ){
for( i = 0 ; i < 3 ; ++i ){
myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生
delay( 100 ) ;
myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生 ? 不思議な現象
delay( 500 ) ;
}
}
else if( ( Code1 == Code2) || ( Code1 == Code3 ) || ( Code2 == Code3 ) ){
for( i = 0 ; i < 2 ; ++i ){
myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生
delay( 100 ) ;
myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生 ? 不思議な現象
delay( 500 ) ;
}
}
else{
myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生
delay( 100 ) ;
myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生 ? 不思議な現象
}
SpOutEnStat = false ;
CountStart = false ;
}
ShiftCode( Code3 ) ;
digitalWrite( SEL1, HIGH ) ;
digitalWrite( SEL2, HIGH ) ;
digitalWrite( SEL3, LOW ) ;
break ;
default:
// Disp Off
digitalWrite( SEL1, HIGH ) ;
digitalWrite( SEL2, HIGH ) ;
digitalWrite( SEL3, HIGH ) ;
break ;
}
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */
FunctionName : ShiftCode Task
Prototype: void ShiftCode( unsigned char )
Function : LED DATA SET & WRITE
Input : NONE
Output : NONE
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
void ShiftCode( unsigned char Code ){
char Count ;
unsigned char Scode ;
Scode = Code ;
for( Count = 0 ; Count <= 7 ; ++Count ){
if( ( Scode & 0x80 ) == 0x80 ){
digitalWrite( SI, HIGH ) ;
}
else{
digitalWrite( SI, LOW ) ;
}
Scode = ( Scode << 1 ) ;
//delayMicroseconds( 5 ) ;
digitalWrite( SCK, HIGH ) ;
//delayMicroseconds( 5 ) ;
digitalWrite( SCK, LOW ) ;
//delayMicroseconds( 5 ) ;
}
digitalWrite( RCK, HIGH ) ;
//delayMicroseconds( 5 ) ;
digitalWrite( RCK, LOW ) ;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
// FunctionName : HexChgDec
// Prototype: int HexChgDec(unsigned char HexByte)
// Function : HEXをDEC値に変換する
// Input : 00h-->ffh
// Output : 変換結果
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
int HexChgDec( unsigned char HexByte ){
unsigned char i ;
int Value , Work ;
i = 0 ;
Value = Work = 0 ;
for( Work = 0 ; HexByte >= 0x0a ; Work++ ){
HexByte = ( HexByte - 0x0a ) ;
}
if( Work >= 0x0a ){
for( i = 0 ; Work >= 0x0a ; i++ ){
Work = ( Work - 0x0a ) ;
}
}
Value = ( ( i * 0x100 ) + ( Work * 0x10 ) + ( int )HexByte ) ;
return Value;
}