SW立ち上がりの検出 – プログラム例

プログラム例

#include <Arduino.h> // Arduino.h の読み込み0の読み込み
#include "switch.h" // switch.h の読み込み

// ステッピングモータの動作ピン
int smPins[4] = {2, 5, 16, 17};

// スピーカ用ピンの設定
int speaker = 25;
// スピーカ用PWMチャンネルの設定
int speakerPwm = 0;

// SW1の割込み時に実行する関数
void intSw1() {

  // 前回の割込み発生時刻の保存用スタティック変数
  static int t0 = 0;
  // 前回の割込みから10ms未満の時、何もしない
  if(millis()-t0 < 10) return;
  // 割込み発生時刻の更新
  t0 = millis();

  // 入力レベルがHの時(すなわち、立ち上がりの時)
  if(digitalRead(sw1)==HIGH) {
    ledcWrite(speakerPwm, 65536/2);  // スピーカから音を鳴らす
  }
}

// SW2の割込み時に実行する関数
void intSw2() {

  // 前回の割込み発生時刻の保存用スタティック変数
  static int t0 = 0;
  // 前回の割込みから10ms未満の時、何もしない
  if(millis()-t0 < 10) return;
  // 割込み発生時刻の更新
  t0 = millis();

  // 入力レベルがHの時(すなわち、立ち上がりの時)
  if(digitalRead(sw2)==HIGH) {
    ledcWrite(speakerPwm, 0);  // スピーカの音を止める
  }
}

/*
 * setup 関数
 */
void setup() {
  /* ここにプログラムの最初に1回だけ実行したい処理を上から順に記述していきます */

  // シリアル通信を115200bpsで開始
  Serial.begin(115200);

  Serial.println("初期設定の開始");

  // スイッチの初期設定
  initSwitch();

  // ステッピングモータの動作ピンの初期設定
  for(int i=0;i<4;i++) {

    // 出力ピンに設定
    pinMode(smPins[i], OUTPUT);
    // Lレベルに設定
    digitalWrite(smPins[i], LOW);
  }

  // スピーカのPWMの設定
  // PWMピンを出力ピンに設定
  pinMode(speaker, OUTPUT);
  // PWMチャンネルを440Hz、16ビット(0〜65536)に設定
  ledcSetup(speakerPwm, 440, 16);
  // PWMピンとPWMチャンネルを結びつける
  ledcAttachPin(speaker, speakerPwm);
  // PWMのデューティ比を0%に設定(消音)
  ledcWrite(speakerPwm, 0);

  // SW1の割込みの設定
  attachInterrupt(sw1, intSw1, CHANGE);
  // SW2の割込みの設定
  attachInterrupt(sw2, intSw2, CHANGE);

  Serial.println("初期設定の完了");
}

/*
 * loop 関数
 */
void loop() {
  /* ここにプログラム中で繰り返し実行したい処理を上から順に記述していきます */

  // ステッピングモータ回転
  for(int i=0;i<4;i++) {
    // 各動作ピンの出力設定
    for(int j=0;j<4;j++) {
      if(i==j) { // i番目のピンをHレベルに設定
        digitalWrite(smPins[j], HIGH);
      } else { // i番目以外のピンをLレベルに設定
        digitalWrite(smPins[j], LOW);
      }
    }
    // 回転インターバル
    delay(1000);
  }
}
Code language: Arduino (arduino)

音の出力はボタンを離した時に変わるようになりましたか?

割込みタイプの設定を「CHANGE」にするのを忘れないようにしましょう。