Arduinoでエアコンの1時間タイマーを自作する

【Arduino】複数のシフトレジスタ74HC595を使う

※この記事は別ブログ(2021/05/11投稿)から移行したものです。

シフトレジスタ(74HC595)を直列に繋いでいけば、Arduinoのピンを3つ使用するだけでいくらでも出力ピンを増やすことができますが、そうすると8ビット以上のデータを送る必要があります。

自分の使い方が間違っている可能性が大きいですが、例えば2つのシフトレジスタを使用することとします。
この場合16ビットのデータをシフトレジスタに送る必要があります。
通常ShiftOut関数という便利そうなものが標準で備わっていますが、この関数は8ビットの送信にしか対応していません。
なので16ビットのデータを2つに分け、ShiftOut関数を2回実行すればいいのかな?と思い試してみましたが不可能でした。

調べてみた結果ShiftOut関数の仕様上これは仕方がないことだそうです。

標準のShiftOut関数では無理と分かったので自分でオリジナルの関数を作ってみることにしました。



プログラム

使用しているArduinoは自作したUnoです。
SendBit()が今回作った自作のShiftOut関数です。

#define RCK 2 //ラッチピン
#define SI  3 //データピン
#define SCK 4 //クロックピン

String level[17] = { //光らせるLEDのパターン
  "0000000000000000",
  "0000000000000001",
  "0000000000000011",
  "0000000000000111",
  "0000000000001111",
  "0000000000011111",
  "0000000000111111",
  "0000000001111111",
  "0000000011111111",
  "0000000111111111",
  "0000001111111111",
  "0000011111111111",
  "0000111111111111",
  "0001111111111111",
  "0011111111111111",
  "0111111111111111",
  "1111111111111111"
};

void setup() {
  pinMode(RCK, OUTPUT);
  pinMode(SI, OUTPUT);
  pinMode(SCK, OUTPUT);
  //Serial.begin(115200);
}

void loop() {
  for (int i = 0; i < 17; i++) {
    SendBit(level[i]); //自作のShiftOut関数へ
    delay(200);
  }
}

void SendBit(String level) { //自作のShiftOut関数
  digitalWrite(RCK, LOW); //ラッチピンをLOWにしてシフトレジスタの出力を無効にする
  int BitLength = level.length(); //データのビット数を取得

  for (int a = 0; a < BitLength; a++) { //ビット数分繰り返す
    if (level.substring(a, (a + 1)) == "1") { //"substring"で1文字抜き出し、1であればデータピンをHIGHに、0ならLOWにする
      digitalWrite(SI, HIGH);
    }
    else {
      digitalWrite(SI, LOW);
    }
    digitalWrite(SCK, HIGH); //クロックピン
    digitalWrite(SCK, LOW);
  }

  digitalWrite(RCK, HIGH); //ラッチピンをHIGHにしてシフトレジスタを有効にする
}

1文字ずつ抜き出して0か1かを判定し送信、それを繰り返すだけです。

動作はこんな感じ↓