カレンダー
| S |
M |
T |
W |
T |
F |
S |
|
|
|
|
1
|
2
|
3
|
4
|
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
|
26
|
27
|
28
|
29
|
30
|
|
2025年 11月 18日
ドリップ式タワー頂部の養液ドリップ部に雨滴センサーを取り付ける。ポンプの故障や養液がなくなったりした場合、赤LEDが点滅する仕組みに変えた。ArduinoのコードはChatGPTに下記プロンプトで丸投げ。 水耕栽培ポットの間欠潅水システムのスケッチを出して。Arduino Pro Mini使用int LEDRED = 4;int LEDGREEN = 5;int PUMP = 2; //潅水ポンプint VPIN = 11; //雨滴センサーLM393の電源、測定時のみONanalogRead(A0):フォトトランジスタNJL7302L値analogRead(A1):雨滴センサーLM393の値 ポンプは昼夜で別動作analogRead(A0)の値が150以上は昼間、未満は夜間昼間:ポンプ3分ON 57分OFFの繰り返し夜間:ポンプ3分ON 177分OFFの繰り返しポンプONの時:LEDRED点灯 analogRead(A1)の値400以上で潅水なし、未満で潅水あり400未満:潅水ありの場合 LEDGREEN点灯400以上:潅水なしの場合 LEDGREEN消灯 ポンプONと潅水ありの状態に数秒のタイムラグがあるがポンプON後30秒経過しても潅水なしの状態の場合、LEDRED点滅(1秒周期)リセットするまで点滅は続く 上記内容でフルスケッチをお願い。と書いてエンターキーを押した瞬間にフルスケッチが出力された。後はArduinoIDEでコピペで完成。上記内容なら手打ちで半日で出来そうだが、チャッピーは一瞬で回答してくれた。 // ==== ピン設定 ====int LEDRED = 4;int LEDGREEN = 5;int PUMP = 2; // 潅水ポンプint VPIN = 11; // LM393雨滴センサー電源(測定時のみON)// ==== 時間設定(ミリ秒) ====const unsigned long PUMP_ON_TIME = 3UL * 60UL * 1000UL; // 3分const unsigned long DAY_OFF_TIME = 57UL * 60UL * 1000UL; // 昼間:57分const unsigned long NIGHT_OFF_TIME = 177UL * 60UL * 1000UL; // 夜間:177分const unsigned long WATER_DELAY_LIMIT = 30UL * 1000UL; // ポンプON後30秒以内に潅水開始// ==== 閾値 ====const int DAY_THRESHOLD = 150; // A0:150以上=昼const int WATER_THRESHOLD = 400; // A1:400未満=潅水あり// ==== 状態管理 ====bool pumpRunning = false;unsigned long pumpStartTime = 0;unsigned long lastPumpAction = 0;bool errorState = false; // エラー(点滅)はリセットまで保持 void setup() { pinMode(LEDRED, OUTPUT); pinMode(LEDGREEN, OUTPUT); pinMode(PUMP, OUTPUT); pinMode(VPIN, OUTPUT); digitalWrite(LEDRED, LOW); digitalWrite(LEDGREEN, LOW); digitalWrite(PUMP, LOW); digitalWrite(VPIN, LOW); Serial.begin(115200); // ==== リセット後は必ずポンプONからスタート ==== lastPumpAction = millis() - 99999999UL; // OFF時間超過扱いにして即ON startPump();} void loop() { // ---- 昼夜判定(A0) ---- int lightValue = analogRead(A0); bool isDay = (lightValue >= DAY_THRESHOLD); // ---- 雨滴センサー(A1)読み取り ---- digitalWrite(VPIN, HIGH); delay(5); // センサー安定化 int rainValue = analogRead(A1); digitalWrite(VPIN, LOW); bool waterDetected = (rainValue < WATER_THRESHOLD); // ---- 潅水あり / なし LED ---- if (waterDetected) { digitalWrite(LEDGREEN, HIGH); } else { digitalWrite(LEDGREEN, LOW); } unsigned long now = millis(); // ================================ // ★ ポンプ OFF → ON 判定 // ================================ if (!pumpRunning) { unsigned long offTime = isDay ? DAY_OFF_TIME : NIGHT_OFF_TIME; if (now - lastPumpAction >= offTime) { startPump(); } } // ================================ // ★ ポンプ動作中の処理 // ================================ if (pumpRunning) { // ---- 30秒以内に潅水ありにならなければエラー ---- if (!errorState && (now - pumpStartTime >= WATER_DELAY_LIMIT) && !waterDetected) { errorState = true; // エラーモード突入 } // ---- ポンプON時間が経過したらOFF ---- if (now - pumpStartTime >= PUMP_ON_TIME) { stopPump(); } } // ================================ // ★ エラーLED点滅処理 // ================================ if (errorState) { if ((now / 1000) % 2 == 0) { digitalWrite(LEDRED, HIGH); } else { digitalWrite(LEDRED, LOW); } } Serial.print("明暗 "); Serial.print(lightValue); Serial.print(" 潅水 "); Serial.println(rainValue); delay(50);//前は50}// =============================// 関数:ポンプON// =============================void startPump() { pumpRunning = true; pumpStartTime = millis(); lastPumpAction = millis(); if (!errorState) digitalWrite(LEDRED, HIGH); digitalWrite(PUMP, HIGH); Serial.println("PUMP ON");}// =============================// 関数:ポンプOFF// =============================void stopPump() { pumpRunning = false; digitalWrite(PUMP, LOW); if (!errorState) digitalWrite(LEDRED, LOW); Serial.println("PUMP OFF");}
by ainame60
| 2025-11-18 19:34
| 家庭菜園
|
Comments(0)
|