본문 바로가기
컴퓨터 활용/노년에 즐기는 코딩

콩나물자동재배기 최종 코드 완성

by easyfly 2026. 3. 22.
반응형

콩나물자동재배기 최종 코드 완성

많은 시행착오를 거친 끝에 콩나물자동재배기 최종 코드를 완성했습니다. 펌프 IN, OUT 구조를 확인하는데도 여러 번의 시도를 거쳤고, 물량을 맞추는 시도도 많았습니다. 결국 1회에 30초, 하루 6회로 결정했습니다.

const int pumpPin1 = 10;
const int pumpPin2 = 6;
const int switchPin = 2;   // 스위치 연결 핀

const unsigned long PUMP_ON_TIME = 30000UL;             // 30초
const unsigned long INTERVAL = 14370000UL;              // 4시간 - 30초

unsigned long previousMillis = 0;
bool pumpRunning = false;
unsigned long pumpStartMillis = 0;

void setup() {
  pinMode(pumpPin1, OUTPUT);
  pinMode(pumpPin2, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);  // 내부 풀업 사용

  digitalWrite(pumpPin1, LOW);
  digitalWrite(pumpPin2, LOW);
}

void loop() {
  unsigned long currentMillis = millis();

  // 1. 자동 급수 시작 조건: 4시간 경과
  if (!pumpRunning && (currentMillis - previousMillis >= INTERVAL)) {
    startPump(currentMillis);
  }

  // 2. 수동 급수 시작 조건: 스위치를 누르면
  // INPUT_PULLUP 방식이므로 평소 HIGH, 누르면 LOW
  if (!pumpRunning && digitalRead(switchPin) == LOW) {
    startPump(currentMillis);
  }

  // 3. 펌프가 켜져 있는 상태에서 20초가 지나면 정지
  if (pumpRunning && (currentMillis - pumpStartMillis >= PUMP_ON_TIME)) {
    stopPump(currentMillis);
  }
}

void startPump(unsigned long now) {
  digitalWrite(pumpPin1, HIGH);
  digitalWrite(pumpPin2, LOW);
  pumpRunning = true;
  pumpStartMillis = now;
}

void stopPump(unsigned long now) {
  digitalWrite(pumpPin1, LOW);
  digitalWrite(pumpPin2, LOW);
  pumpRunning = false;
  previousMillis = now;  // 여기서부터 다시 4시간 계산
}

나주시립도서관에서 테스트

 

또한 버튼을 하나 둬서 버튼 신호가 가면 바로 30초간 물이 주어지도록 추가했습니다. 과정에서 인공지능의 도움을 많이 받았습니다. 

반응형

댓글