最終更新時間:2018年08月16日 06時00分45秒
EEPROM 版
/*
* Uno : input -> A0, HWIR -> D2, SCL -> A5, SDA -> A4
* 32ubb : F7, E6, D0, D1
*/
#define KEYBOARD_MODE 1
#include <Wire.h>
const byte EEPROM_ID = 0x50; // I2C address for 24LC256 ( A0 = A1 = A2 = GND )
const int analogInPin0 = 0; // Analog In 0 @ Uno, F7 @ 32ubb
const int irRecievePin = 7; // Hardware Interrupt : D2 = 2 @ Uno, E6 = 7 @ 32ubb
const int irNo = 4; // : 0 @ Uno, 4 @ 32ubb
int sensorValue = 0;
volatile int repeat;
unsigned int rep0, rep1, rep2, rep3;
String seq0, seq1, seq2, seq3;
/*** Setup ***/
void setup()
{
Serial.begin( 9600 );
//while ( !Serial ) ; // wait for serial port to connect. Needed for Leonardo only
Wire.begin();
String buf0, buf1, buf2, buf3;
byte c;
int split_cnt = 0;
//Serial.println( "start reading config from EEPROM" );
for ( int i = 0; i < 1024; i++ ) {
c = i2cEEPROM_Read( i );
if ( char( c ) == '|' ) {
split_cnt++;
continue;
}
if ( split_cnt < 1 ) buf0 += char( c );
else if ( split_cnt < 2 ) seq0 += char( c );
else if ( split_cnt < 3 ) buf1 += char( c );
else if ( split_cnt < 4 ) seq1 += char( c );
else if ( split_cnt < 5 ) buf2 += char( c );
else if ( split_cnt < 6 ) seq2 += char( c );
else if ( split_cnt < 7 ) buf3 += char( c );
else if ( split_cnt < 8 ) seq3 += char( c );
}
rep0 = buf0.toInt();
rep1 = buf1.toInt();
rep2 = buf2.toInt();
rep3 = buf3.toInt();
/*
Serial.println( rep0 ); Serial.println( seq0 );
Serial.println( rep1 ); Serial.println( seq1 );
Serial.println( rep3 ); Serial.println( seq3 );
Serial.println( rep2 ); Serial.println( seq2 );
Serial.println( "read config from EEPROM." );
*/
pinMode( irRecievePin, INPUT );
attachInterrupt( irNo, stop_cmd, CHANGE );
}
/*** Main Loop ***/
void loop()
{
String sequence;
repeat = 0;
sensorValue = analogRead( analogInPin0 );
//Serial.println( sensorValue ); delay( 50 );
// no button pushed, sensorValue : 1023
if ( sensorValue < 50 ) { // button 3 pushed : 862
sequence = seq3;
repeat = rep3;
}
else if ( sensorValue < 660 ) { // button 2 pushed : 434
sequence = seq2;
repeat = rep2;
}
else if ( sensorValue < 780 ) { // button 1 pushed : 215
sequence = seq1;
repeat = rep1;
}
else if ( sensorValue < 880 ) { // button 0 pushed : 212
sequence = seq0;
repeat = rep0;
}
//
String buf = sequence;
while ( repeat > 0 ) {
String cmdline;
boolean more = true;
int n;
sequence = buf;
while ( more ) {
n = sequence.indexOf( '\n' );
cmdline = sequence.substring( 0, n );
sequence = sequence.substring( n + 1 );
more = send_key( cmdline );
}
delay( 100 );
repeat--;
}
delay( 50 );
}
/*** Subroutines ***/
/* read from external memory */
byte i2cEEPROM_Read( unsigned int address )
{
byte data;
Wire.beginTransmission( EEPROM_ID );
Wire.write( (int)highByte(address) );
Wire.write( (int)lowByte(address) );
Wire.endTransmission();
Wire.requestFrom( EEPROM_ID, (byte)1 );
while ( Wire.available() == 0 )
;
data = Wire.read();
return data;
}
/* send keycode or move cursor */
boolean send_key( String cmd )
{
String key;
char c;
if ( cmd.equals( "__END__" ) )
return false;
if ( cmd.startsWith( "wait " ) ) {
String t = cmd.substring( 5 );
Serial.println( "wait " + t + " ..." );
for ( int i = 0; i < 100; i++ )
delay( t.toInt() );
}
// Mouse event
else if ( cmd.startsWith( "move " ) ) {
int n = cmd.indexOf( ',' );
String x = cmd.substring( 5, n );
String y = cmd.substring( n + 1 );
if ( KEYBOARD_MODE )
Mouse.move( x.toInt(), y.toInt() );
else
Serial.println( "move " + x + ", " + y );
}
else if ( cmd.equals( "click" ) ) {
if ( KEYBOARD_MODE )
Mouse.click();
else
Serial.println( "click" );
}
// Keyboard event
else if ( cmd.equals( "releaseAll" ) ) {
if ( KEYBOARD_MODE )
Keyboard.releaseAll();
else
Serial.println( "releaseAll" );
}
else if ( cmd.startsWith( "press " ) ) {
key = cmd.substring( 6 );
if ( KEYBOARD_MODE ) {
c = str2char( key );
Keyboard.press( c );
}
else
Serial.println( key );
}
else if ( cmd.startsWith( "write " ) ) {
key = cmd.substring( 6 );
if ( KEYBOARD_MODE ) {
c = str2char( key );
Keyboard.write( c );
}
else
Serial.println( key );
}
else if ( cmd.startsWith( "print " ) ) {
key = cmd.substring( 6 );
if ( KEYBOARD_MODE )
Keyboard.print( key );
else
Serial.println( key );
}
else if ( cmd.startsWith( "println " ) ) {
key = cmd.substring( 8 );
if ( KEYBOARD_MODE )
Keyboard.println( key );
else
Serial.println( key );
}
return true;
}
char str2char( String s )
{
if ( s.equals( "KEY_SPACE" ) ) return 0x20;
if ( s.equals( "KEY_LEFT_CTRL" ) ) return KEY_LEFT_CTRL;
if ( s.equals( "KEY_LEFT_SHIFT" ) ) return KEY_LEFT_SHIFT;
if ( s.equals( "KEY_LEFT_ALT" ) ) return KEY_LEFT_ALT;
if ( s.equals( "KEY_TAB" ) ) return KEY_TAB;
if ( s.equals( "KEY_RETURN" ) ) return KEY_RETURN;
if ( s.equals( "KEY_F1" ) ) return KEY_F1;
if ( s.equals( "KEY_F2" ) ) return KEY_F2;
if ( s.equals( "KEY_F3" ) ) return KEY_F3;
if ( s.equals( "KEY_F4" ) ) return KEY_F4;
if ( s.equals( "KEY_F5" ) ) return KEY_F5;
if ( s.equals( "KEY_F6" ) ) return KEY_F6;
if ( s.equals( "KEY_F7" ) ) return KEY_F7;
if ( s.equals( "KEY_F8" ) ) return KEY_F8;
if ( s.equals( "KEY_F9" ) ) return KEY_F9;
if ( s.equals( "KEY_F10" ) ) return KEY_F10;
if ( s.equals( "KEY_F11" ) ) return KEY_F11;
if ( s.equals( "KEY_F12" ) ) return KEY_F12;
return KEY_ESC;
}
/* hardware interrupt */
void stop_cmd()
{
repeat = -1;
}
シーケンス組み込み
/*
* Uno : input -> A0, HWIR -> D2, SCL -> A5, SDA -> A4
* 32ubb : F7, E6, D0, D1
*/
#define KEYBOARD_MODE 1
const int analogInPin0 = 0; // Analog In 0 @ Uno, F7 @ 32ubb
const int irRecievePin = 7; // Hardware Interrupt : D2 = 2 @ Uno, E6 = 7 @ 32ubb
const int irNo = 4; // : 0 @ Uno, 4 @ 32ubb
int sensorValue = 0;
volatile int repeat;
unsigned int rep0, rep1, rep2, rep3;
String seq0, seq1, seq2, seq3;
/*** Setup ***/
void setup()
{
String s;
s += "2";
s += "|";
s += "press KEY_LEFT_SHIFT\n";
s += "press KEY_F12\n";
s += "releaseAll\n";
s += "wait 450\n";
s += "print 21200005\n";
s += "print 0005\n";
s += "write KEY_TAB\n";
s += "write KEY_RETURN\n";
s += "__END__\n";
s += "|";
s += "1";
s += "|";
s += "press KEY_LEFT_SHIFT\n";
s += "press KEY_F12\n";
s += "releaseAll\n";
s += "wait 450\n";
s += "print 21500005\n";
s += "print 0005\n";
s += "write KEY_TAB\n";
s += "write KEY_RETURN\n";
s += "__END__\n";
s += "|";
s += "1";
s += "|";
s += "press KEY_LEFT_SHIFT\n";
s += "press KEY_F12\n";
s += "releaseAll\n";
s += "wait 450\n";
s += "print 43400005\n";
s += "print 0005\n";
s += "write KEY_TAB\n";
s += "write KEY_RETURN\n";
s += "__END__\n";
s += "|";
s += "10";
s += "|";
s += "press KEY_LEFT_SHIFT\n";
s += "press KEY_F12\n";
s += "releaseAll\n";
s += "wait 450\n";
s += "print 86200005\n";
s += "print 0005\n";
s += "write KEY_TAB\n";
s += "write KEY_RETURN\n";
s += "__END__\n";
s += "|";
String buf0, buf1, buf2, buf3;
int split_cnt = 0;
for ( int i = 0; i < s.length(); i++ ) {
if ( s[i] == '|' ) {
split_cnt++;
continue;
}
if ( split_cnt < 1 ) buf0 += s[i];
else if ( split_cnt < 2 ) seq0 += s[i];
else if ( split_cnt < 3 ) buf1 += s[i];
else if ( split_cnt < 4 ) seq1 += s[i];
else if ( split_cnt < 5 ) buf2 += s[i];
else if ( split_cnt < 6 ) seq2 += s[i];
else if ( split_cnt < 7 ) buf3 += s[i];
else if ( split_cnt < 8 ) seq3 += s[i];
}
rep0 = buf0.toInt();
rep1 = buf1.toInt();
rep2 = buf2.toInt();
rep3 = buf3.toInt();
Serial.begin( 9600 );
while ( !Serial ) ; // wait for serial port to connect. Needed for Leonardo only
Serial.println( rep0 ); Serial.println( seq0 );
Serial.println( rep1 ); Serial.println( seq1 );
Serial.println( rep2 ); Serial.println( seq2 );
Serial.println( rep3 ); Serial.println( seq3 );
pinMode( irRecievePin, INPUT );
attachInterrupt( irNo, stop_cmd, CHANGE );
}
/*** Main Loop ***/
void loop()
{
String sequence;
repeat = 0;
sensorValue = analogRead( analogInPin0 );
Serial.println( sensorValue ); delay( 50 );
// no button pushed, sensorValue : 1023
if ( sensorValue < 50 ) { // button 3 pushed : 862
sequence = seq3;
repeat = rep3;
}
else if ( sensorValue < 660 ) { // button 2 pushed : 434
sequence = seq2;
repeat = rep2;
}
else if ( sensorValue < 780 ) { // button 1 pushed : 215
sequence = seq1;
repeat = rep1;
}
else if ( sensorValue < 880 ) { // button 0 pushed : 212
sequence = seq0;
repeat = rep0;
}
//
String buf = sequence;
while ( repeat > 0 ) {
String cmdline;
boolean more = true;
int n;
sequence = buf;
while ( more ) {
n = sequence.indexOf( '\n' );
cmdline = sequence.substring( 0, n );
sequence = sequence.substring( n + 1 );
more = send_key( cmdline );
}
delay( 100 );
repeat--;
}
delay( 50 );
}
/*** Subroutines ***/
/* send keycode or move cursor */
boolean send_key( String cmd )
{
String key;
char c;
if ( cmd.equals( "__END__" ) )
return false;
if ( cmd.startsWith( "wait " ) ) {
String t = cmd.substring( 5 );
Serial.println( "wait " + t + " ..." );
delay( t.toInt() );
}
// Mouse event
else if ( cmd.startsWith( "move " ) ) {
int n = cmd.indexOf( ',' );
String x = cmd.substring( 5, n );
String y = cmd.substring( n + 1 );
if ( KEYBOARD_MODE )
Mouse.move( x.toInt(), y.toInt() );
else
Serial.println( "move " + x + ", " + y );
}
else if ( cmd.equals( "click" ) ) {
if ( KEYBOARD_MODE )
Mouse.click();
else
Serial.println( "click" );
}
// Keyboard event
else if ( cmd.equals( "releaseAll" ) ) {
if ( KEYBOARD_MODE )
Keyboard.releaseAll();
else
Serial.println( "releaseAll" );
}
else if ( cmd.startsWith( "press " ) ) {
key = cmd.substring( 6 );
if ( KEYBOARD_MODE ) {
c = str2char( key );
Keyboard.press( c );
}
else
Serial.println( key );
}
else if ( cmd.startsWith( "write " ) ) {
key = cmd.substring( 6 );
if ( KEYBOARD_MODE ) {
c = str2char( key );
Keyboard.write( c );
}
else
Serial.println( key );
}
else if ( cmd.startsWith( "print " ) ) {
key = cmd.substring( 6 );
if ( KEYBOARD_MODE )
Keyboard.print( key );
else
Serial.println( key );
}
else if ( cmd.startsWith( "println " ) ) {
key = cmd.substring( 8 );
if ( KEYBOARD_MODE )
Keyboard.println( key );
else
Serial.println( key );
}
return true;
}
char str2char( String s )
{
if ( s.equals( "KEY_LEFT_CTRL" ) ) return KEY_LEFT_CTRL;
if ( s.equals( "KEY_LEFT_SHIFT" ) ) return KEY_LEFT_SHIFT;
if ( s.equals( "KEY_LEFT_ALT" ) ) return KEY_LEFT_ALT;
if ( s.equals( "KEY_TAB" ) ) return KEY_TAB;
if ( s.equals( "KEY_RETURN" ) ) return KEY_RETURN;
if ( s.equals( "KEY_F1" ) ) return KEY_F1;
if ( s.equals( "KEY_F2" ) ) return KEY_F2;
if ( s.equals( "KEY_F3" ) ) return KEY_F3;
if ( s.equals( "KEY_F4" ) ) return KEY_F4;
if ( s.equals( "KEY_F5" ) ) return KEY_F5;
if ( s.equals( "KEY_F6" ) ) return KEY_F6;
if ( s.equals( "KEY_F7" ) ) return KEY_F7;
if ( s.equals( "KEY_F8" ) ) return KEY_F8;
if ( s.equals( "KEY_F9" ) ) return KEY_F9;
if ( s.equals( "KEY_F10" ) ) return KEY_F10;
if ( s.equals( "KEY_F11" ) ) return KEY_F11;
if ( s.equals( "KEY_F12" ) ) return KEY_F12;
return KEY_ESC;
}
/* hardware interrupt */
void stop_cmd()
{
repeat = -1;
}
オリジナル
// DIP-SW setup
const int PinDip1 = 0; // d2
const int PinDip2 = 1; // d3
const int PinDip3 = 2; // d1
const int PinDip4 = 5; // c6 : no use
// Push-Button setup
const int PinDaisen = 7; // e6
const int PinSembok = 6; // d7
const int PinMisato = 4; // d4
const int PinKouiki = 3; // d0
const int PinShift = 8; // b4
void setup() {
pinMode( PinDip1, INPUT );
pinMode( PinDip2, INPUT );
pinMode( PinDip3, INPUT );
pinMode( PinDip4, INPUT );
pinMode( PinDaisen, INPUT );
pinMode( PinSembok, INPUT );
pinMode( PinMisato, INPUT );
pinMode( PinKouiki, INPUT );
pinMode( PinShift, INPUT );
}
void loop() {
// get Push-Button status
int city = 0, shft = 0;
if ( digitalRead( PinShift ) == LOW ) {
shft = 1;
delay( 80 );
}
if ( digitalRead( PinDaisen ) == LOW ) city = 2120;
else if ( digitalRead( PinSembok ) == LOW ) city = 2150;
else if ( digitalRead( PinMisato ) == LOW ) city = 4340;
else if ( digitalRead( PinKouiki ) == LOW ) city = 8620;
else if ( shft == 1 ) { // login windows
delay( 50 );
if ( digitalRead( PinShift ) == LOW ) {
Keyboard.print( "KAIGO" );
Keyboard.write ( KEY_RETURN );
}
}
// get DIP-SW status
int pc = 0;
if ( digitalRead( PinDip1 ) == LOW ) pc += 1;
if ( digitalRead( PinDip2 ) == LOW ) pc += 2;
if ( digitalRead( PinDip3 ) == LOW ) pc += 4;
//if ( digitalRead( PinDip4 ) == LOW ) pc += 8;
// output !
if ( city != 0 ) {
if ( shft == 0 ) { // logout L/P
Keyboard.press( KEY_LEFT_SHIFT );
Keyboard.write( KEY_F12 );
//Keyboard.print( "test" );
Keyboard.releaseAll();
delay( 200 );
}
String id = "";
id += city; id += "000"; id += pc;
Keyboard.print( id );
String pw = "000";
pw += pc;
Keyboard.print( pw );
Keyboard.write( KEY_TAB );
Keyboard.write( KEY_RETURN );
}
delay( 50 );
}