/****************************************************/
// FILE TOSIBA TVリモコン (メカ接点方式)
// DATE :Tue, Jan 10, 2025
// DESCRIPTION : IrDa TLN105B
// CPU TYPE : Arduino UNO
// by chiyabo
// This file is generated by Renesas Project Generator.
/****************************************************/
#include < IRremote.hpp > // include the library
#define BAUDRATE 9600
#define SEND_IrDa_PIN 4
#define MaxKey 8 // Maxキーの数
#define sRepeats 0 // Repeet Num
#define KeyShift A2
char ChgKey = false ;
char Trg = false ;
uint8_t OutCommand ;
unsigned int OutAddress = 0xBF40 ;
const int threshold[ ] = { 128, 281, 376, 522, 684, 820, 909, 1011 } ; // AD変換値の閾値
// analogRead( A0 )
const unsigned char KeySelCode_A01[ ] = { 0x12, 0x7A, 0x00, 0x1B, 0x3E, 0x1A, 0x3D, 0x5B } ; //ChgKey = false
const unsigned char KeySelCode_A02[ ] = { 0x12, 0x7C, 0x00, 0x1F, 0x3F, 0x1E, 0x27, 0x5F } ; //ChgKey = true
// analogRead( A1 )
const unsigned char KeySelCode_A11[ ] = { 0x28, 0x3B, 0x73, 0x74, 0x2E, 0x2D, 0x57, 0x00 } ; //ChgKey = false
const unsigned char KeySelCode_A12[ ] = { 0x6E, 0x3C, 0x75, 0x76, 0x2C, 0x50, 0x10, 0x00 } ; //ChgKey = true
void setup( ){
Serial.begin( BAUDRATE ) ;
pinMode( KeyShift, OUTPUT ) ;
digitalWrite( KeyShift, HIGH ) ;
IrSender.begin( SEND_IrDa_PIN ) ;
}
void loop( ){
int LastResult_A0 = -2 ; // 前回のキーデコード結果
int Result_A0 ; // 今回のキーデコード結果
int LastResult_A1 = -2 ; // 前回のキーデコード結果
int Result_A1 ; // 今回のキーデコード結果
// キーを読み取る。 チャタリングの除去などのため、A/D変換の値が落ち着くまで待つ
// 10ms間隔でキーを読み取り、同じキーが押されていたら、落ち着いたと判断する
Result_A0 = KeyDecode( analogRead( A0 ) ) ;
if( Result_A0 != -1 ){
LastResult_A0 = Result_A0 ;
delay( 10 ) ;
Result_A0 = KeyDecode( analogRead( A0 ) ) ;
if( Result_A0 == LastResult_A0 ){
// Key確定
if( ( Result_A0 == 1 ) || ( Result_A0 == 2 ) ){
if( ( Result_A0 == 1 ) && ( Trg == true ) ){
Trg = false ;
OutCommand = KeySelCode_A02[ Result_A0 ] ;
}
else if( ( Result_A0 == 1 ) && ( Trg == false ) ){
Trg = true ;
OutCommand = KeySelCode_A01[ Result_A0 ] ;
}
if( ( Result_A0 == 2 ) && ( ChgKey == true ) ){
ChgKey = false ;
digitalWrite( KeyShift, HIGH ) ;
}
else if( ( Result_A0 == 2 ) && ( ChgKey == false ) ){
ChgKey = true ;
digitalWrite( KeyShift, LOW ) ;
}
delay( 100 ) ;
}
else if( ChgKey == false ){
OutCommand = KeySelCode_A01[ Result_A0 ] ;
}
else{
OutCommand = KeySelCode_A02[ Result_A0 ] ;
}
if( Result_A0 != 2 ){
IrSender.sendNEC( OutAddress, OutCommand, sRepeats ) ;
}
}
}
Result_A1 = KeyDecode( analogRead( A1 ) ) ;
if( Result_A1 != -1 ){
LastResult_A1 = Result_A1 ;
delay( 10 ) ;
Result_A1 = KeyDecode( analogRead( A1 ) ) ;
if( Result_A1 == LastResult_A1 ){
// Key確定
if( ChgKey == false ){
OutCommand = KeySelCode_A11[ Result_A1 ] ;
if( ( Result_A1 == 0 ) || ( Result_A1 >= 4 ) ){
OutAddress = 0xBE40 ;
}
}
else{
OutCommand = KeySelCode_A12[ Result_A1 ] ;
if( Result_A1 == 4 ){
OutAddress = 0xBE40 ;
}
}
IrSender.sendNEC( OutAddress, OutCommand, sRepeats ) ;
OutAddress = 0xBF40 ;
}
}
delay( 200 ) ;
}
// キーデコード関数
// 引数をA/D変換結果(0~1023)にして呼ぶと、押したキーの番号(0~KeyNum-1)を返す。
// 何もキーを押していない時は、-1を返す。
int KeyDecode( int n ){
int i = 0 ;
while( ( i < MaxKey ) && ( n > threshold[ i ] ) ) i++ ;
if( i >= MaxKey ) return -1 ;
return i ;
}