タイマの回路を使用する場合、
マイスキャンごとでどれくらいの時間が経過したかを
検出する必要があります。
この時間経過を積算することでタイマの経過時間を
測定し、動作させます。

// 入力デバイスに関する設定部
#define X0021 (0x01 << 0)
#define X0022 (0x01 << 1)
#define X0034 (0x01 << 2)
#define X0035 (0x01 << 3)
#define GET_X(DEVICE,NO) (in_data & DEVICE)
byte in_no[] = { 21 , 22 , 34 , 35};
unsigned long in_data ; // 入力Xの保持変数(32点数分)
// 出力デバイスに関する設定部
#define Y0018 (0x01 << 0)
#define Y0019 (0x01 << 1)
#define Y0025 (0x01 << 2)
#define Y0026 (0x01 << 3)
#define GET_Y(DEVICE,NO) (out_data & DEVICE)
#define SET_Y_ON(DEVICE,NO) out_data = out_data | DEVICE
#define SET_Y_OFF(DEVICE,NO) out_data = out_data & ~DEVICE
byte out_no[] = { 18 , 19 , 25 , 26};
unsigned long out_data ; // 出力Yの保持変数(32点数分)
// 内部リレーに関する設定部
#define M0000 (0x01 << (0 % 16) )
#define M0001 (0x01 << (1 % 16) )
#define GET_M(DEVICE,NO) (m_relay[ NO / 16 ] & DEVICE)
#define SET_M_ON(DEVICE,NO) m_relay[ NO / 16 ] = m_relay[ NO / 16 ] | DEVICE
#define SET_M_OFF(DEVICE,NO) m_relay[ NO / 16 ] = m_relay[ NO / 16 ] & ~DEVICE
unsigned short m_relay[1]; // 内部リレーMの保持変数
#define T0000 (0x01 << (0 % 16) )
#define T0001 (0x01 << (1 % 16) )
#define GET_T(DEVICE,NO) (t_relay[ NO / 16 ] & DEVICE)
#define SET_T_ON(DEVICE,NO) t_relay[ NO / 16 ] = t_relay[ NO / 16 ] | DEVICE
#define SET_T_OFF(DEVICE,NO) t_relay[ NO / 16 ] = t_relay[ NO / 16 ] & ~DEVICE
unsigned short t_relay[1]; //
unsigned long t_count[2]; //
// 立ち上がり処理に関する設定部
#define UTRG0000 (0x01 << (0 % 16) )
#define UTRG0001 (0x01 << (1 % 16) )
#define UTRG0002 (0x01 << (2 % 16) )
#define GET_UTRG(DEVICE,NO) (u_plsg[NO/16] & DEVICE)
#define SET_UTRG_ON(DEVICE,NO) u_plsg[NO/16] = u_plsg[NO/16] | DEVICE
#define SET_UTRG_OFF(DEVICE,NO) u_plsg[NO/16] = u_plsg[NO/16] & ~DEVICE
unsigned short u_plsg[1]; // 立ち上り処理用のリレー
unsigned long starttime;
unsigned long lasttime;
unsigned long spantime;
unsigned long lasttime_ms;
unsigned long spantime_ms;
// Arduino 起動時呼び出しプログラム
void setup(){
for (byte i=0; i<sizeof(in_no); i++) {
pinMode(in_no[i],INPUT);
}
for (byte i=0; i<sizeof(out_no); i++) {
pinMode(out_no[i],OUTPUT);
}
}
// Arduino 繰り返しプログラム
void loop(){
time_update();
output_update();
input_update();
/////////////////////////////////////////////////////////////
// スキャンプログラム //
// この下に毎スキャン実行するプログラムを書いてくださいな。//
/////////////////////////////////////////////////////////////
if (GET_X(X0021,21)){
SET_Y_ON(Y0019,19);
}
if (GET_X(X0022,22)){
SET_Y_OFF(Y0019,19);
}
if (GET_Y(Y0019,19)) {
if (!GET_UTRG(UTRG0000,0)) {
SET_UTRG_ON(UTRG0000,0);
} else {
if ((t_count[0] + (spantime) ) >= 20 * 100000){
t_count[0] = 20 * 100000;
SET_T_ON(T0000,0);
} else {
t_count[0] += spantime;
}
}
} else {
t_count[0] = 0;
SET_T_OFF(T0000,0);
SET_UTRG_OFF(UTRG0000,0);
}
if (GET_T(T0000,0)){
SET_Y_ON(Y0025,25);
} else {
SET_Y_OFF(Y0025,25);
}
/////////////////////////////////////////////////////////////
// ここまでスキャンプログラム //
// //
/////////////////////////////////////////////////////////////
output_refresh();
}
// standard function
// 入力情報の更新関数
void input_update() {
in_data = 0;
for (byte i=0; i<sizeof(in_no); i++) {
if (digitalRead(in_no[i])==LOW) {
in_data = in_data & ~(0x01 << i);
} else {
in_data = in_data | (0x01 << i);
}
}
}
// 出力情報の更新関数
void output_update() {
for (byte i=0; i<sizeof( out_no ); i++) {
if ( out_data & (0x01 << i) ) {
digitalWrite( out_no[i], HIGH );
} else {
digitalWrite( out_no[i] , LOW );
}
}
}
// タイマーの時間経過関数宣言部
void time_update() {
unsigned long nowtime;
nowtime = micros();
spantime = nowtime - lasttime;
lasttime = nowtime;
nowtime = millis(); // 電源ON後の経過時間をmsで取得する
spantime_ms = nowtime - lasttime_ms;
lasttime_ms = nowtime;
}
タイマーの経過時間の測定は、ループで
行いますが、各ループごとの時間(スキャンタイム)は
ループごとで計測する必要があります。
また、ラダー部(loop)の命令を書き出します。
if (GET_X(X0021,21)){
SET_Y_ON(Y0019,19);
}
if (GET_X(X0022,22)){
SET_Y_OFF(Y0019,19);
}
if (GET_Y(Y0019,19)) {
if (!GET_UTRG(UTRG0000,0)) {
SET_UTRG_ON(UTRG0000,0);
} else {
if ((t_count[0] + (spantime) ) >= 20 * 100000){
t_count[0] = 20 * 100000;
SET_T_ON(T0000,0);
} else {
t_count[0] += spantime;
}
}
} else {
t_count[0] = 0;
SET_T_OFF(T0000,0);
SET_UTRG_OFF(UTRG0000,0);
}
if (GET_T(T0000,0)){
SET_Y_ON(Y0025,25);
} else {
SET_Y_OFF(Y0025,25);
}