/* 水草水槽のCO2発生量コントロール 2018/09/07 ラジオペンチ */ #include // 時間はタイマー割り込みで刻む volatile int secCount = 0; int pumpIntervalDay = 300; // 昼間のインターバル(単位:秒、300=5分) int pumpIntervalNight = 2400; // 夜間のインターバル(単位:秒、2400=40分)。昼間の1/8、圧力低下防止のため int pumpInterval; // ポンプ駆動周期 int lastDayNightFlag; // 前回の昼夜フラグ int dayNightFlag; // 現在の昼夜フラグ int ss = 10; // ビルドアップショット数 int ssInterval = 2000; // ビルドアップショット間隔(単位:ms) const int pumpOnTime = 30; // ポンプON時間 (単位:ms) volatile int timeUpFlag = 0; // タイムアップフラグ void setup() { pinMode(6, OUTPUT); // ポンプ駆動信号 pinMode(7, OUTPUT); // 動作確認表示 pinMode(8, INPUT_PULLUP); // 昼夜信号(昼はLOW,夜はHIGH) pinMode(13, OUTPUT); MsTimer2::set(1000, timeIntrp); // 1秒毎に timeIntrpをコール MsTimer2::start(); shotCo2(); // 開始時に1ショット(つまりリセット毎に1ショット) setDayNight(); // 昼夜インターバルセット lastDayNightFlag = dayNightFlag; // 次回のためにフラグを記録 } void loop() { while (timeUpFlag == 0) { // 1秒間待つ } digitalWrite(7, HIGH); // 動作確認表示ON timeUpFlag = 0; // タイムアップフラグをクリア setDayNight(); // 昼夜情報を読んで必要なパラメーターを設定 if ((lastDayNightFlag == 1) && (dayNightFlag == 0)) { // 前回が夜で今回は昼だったら(つまり朝になった直後なら) buildUp(); // 内圧上昇させるために強制注入(ビルドアップ) } lastDayNightFlag = dayNightFlag; // 次回のためにフラグを記録 secCount++; if (secCount >= pumpInterval) { // 指定時間だったら secCount = 0; // 秒カウンタをリセット shotCo2(); // ポンプ駆動 } delay(20); // LED点灯確認のために待つ digitalWrite(7, LOW); // 動作確認表示OFF } void buildUp() { // ビルドアップショットを実行 for (int n = 0; n < ss; n++) { // 指定回数 shotCo2(); // ポンプ駆動 delay(ssInterval); // 指定時間待つ } } void shotCo2() { digitalWrite(6, HIGH); // ポンプON digitalWrite(13, HIGH); delay(pumpOnTime); // 指定所間ポンプをON digitalWrite(6, LOW); // ポンプOFF digitalWrite(13, LOW); } void setDayNight() { if (digitalRead(8) == LOW) { pumpInterval = pumpIntervalDay; // 昼間 dayNightFlag = 0; // フラグは0 } else { pumpInterval = pumpIntervalNight; // 夜間 dayNightFlag = 1; // フラグは1 } } void timeIntrp() { // MsTimer2 割込み処理 timeUpFlag = 1; // 1秒経過フラグON }