娘Nanoに求婚者4人。親父がデートを仕切る。母はオロオロ？

　マルチタスクとかマルチスレッドとか検索してたら、次の記事を見つけました。

https://qiita.com/bunnyhopper_isolated/items/d4cf96895d665f5401af

https://zenn.dev/maedan/articles/2bf91ab20cef5e

早速真似してやってみました。上記にも記載がありますが、

https://playground.arduino.cc/Code/TimedAction/

からダウンロードした「TimedAction.h」内の「#include "WProgram.h"」を「#include "Arduino.h"」に変更する必要があります。

　ただなぞるのもつまらないので次のようなストーリーを考えました。
![親父.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/2f868699-53b6-d868-dcda-80fbe441334f.jpeg)
　親父は「MsTimer2」で2秒間隔で動き、その都度乱数でお話相手を選びます。母親は親父に話す機会を与えられオロオロしますが、これまた乱数で話す時間を勝手に決め終了します。話す機会を与えられて、特性の異なる求婚者4人はそれぞれ自己アピールします。母親と彼らに「TimedAction」の「プロトスレッド」なるものを使ってみました。母親と求婚者4人を懸命に捌く親父をイメージしてください。（でも一番大変なのは娘のNanoですよね）
　以下、一応 arduino Nano 用のソースです。時間のずれを少なくするつもりで「65536=2^16」を超えない所で"delayMicroseconds"を使ってます。
```
#include <TimedAction.h>
#include <MsTimer2.h>

void ororo();
void t2();
void t4();
void t5();
void t6();

TimedAction HAHA  = TimedAction(250, ororo); // 0.250秒毎にチェックに行く？
TimedAction Task2 = TimedAction(250, t2);
TimedAction Task4 = TimedAction(250, t4);
TimedAction Task5 = TimedAction(250, t5);
TimedAction Task6 = TimedAction(250, t6);

void setup() {
  Serial.begin(115200);
  if(!Serial.available()){;}

  // Omit Pin3
  pinMode(13, OUTPUT);
  pinMode(7, OUTPUT); // digitalWrite
  pinMode(2, OUTPUT); // digitalWrite
  pinMode(4, OUTPUT); // digitalWrite
  pinMode(5, OUTPUT); // analogWrite
  pinMode(6, OUTPUT); // analogWrite

  MsTimer2::set(2000, OYAJI);  // Pin3 to disabled. Used by MsTimer2.?
  MsTimer2::start();
}
int rN,rn;
void loop() {
  HAHA.check();
  Task2.check();
  Task4.check();
  Task5.check();
  Task6.check();
}

void OYAJI() {
  rN = random(5);
  Serial.print(rN);
  digitalWrite(13, HIGH);
  delayMicroseconds(1000);
  digitalWrite(13, LOW);
}

void ororo() {
  if (rN == 0) {
    digitalWrite(7, HIGH);
    Serial.print(">");Serial.println(rN);
    rn=random(400);
    delay(100+rn);
    digitalWrite(7, LOW);
  }
}

void t2() {　　　　// はっきりした性格
  if (rN == 1) {
    digitalWrite(2, HIGH);
    Serial.print(">");Serial.println(rN);
    delay(1999);
    digitalWrite(2, LOW);
  }
}

void t4() {       // ちょっと声は小さいけど話はできる
  if (rN == 2) {
    digitalWrite(4, HIGH);
    Serial.print(">");Serial.println(rN);
    for (int i = 0; i < 250; i += 1) {
      digitalWrite(4, HIGH);
      delayMicroseconds(200);
      digitalWrite(4, LOW);
      delayMicroseconds(3800);
    }
  }
}

    void t5() {       // テンションが上がり、後下がる
  if (rN == 3) {
    analogWrite(5, 200);
    Serial.print(">");Serial.println(rN);
    for (int i = 0; i < 250; i++) {
      analogWrite(5, i);
      delayMicroseconds(5000);
    }
    for (int i = 248; i >= 0; i--) {
      analogWrite(5, i);
      delayMicroseconds(5000);
    }
  }
}

void t6() {         // テンションが徐々に上がっていく
  if (rN == 4) {
    analogWrite(6, 200);
    Serial.print(">");Serial.println(rN);
    for (int i = 0; i < 200; i++) {
      analogWrite(6, i);
      delayMicroseconds(9998);
      analogWrite(6, 0);
    }
  }
}
```
　やはり無理が有るので、タイミングが微妙にずれます。親父は2秒ごとに誰かを指名し、それを他の５人が0.25秒ごとに調べにいくので最大0.25秒の遅れが出ます。さらに、指名された者が時間制限を守らないと時間がずれますかね。自己アピールが過ぎ他人や周りに迷惑をかける、現実社会でアルアルですね。この設定だと、時々話を早めに切り上げる母親の出る幕が多いのも面白いです。
　人間一人一人がシングルタスクです。そのタスクがたくさん勝手に動いている、不思議❓
　こんなのも良いかと思ってます。

https://yamaccu.github.io/tils/20220502-Arduino-Timer

以上。