[스마트팜]관수시스템을위한 소스코드
Makerist
예제&실습
1
1816
2024.03.15 01:33
#include <LiquidCrystal_I2C.h> // LCD 라이브러리를 불러옵니다. #include <Wire.h> // I2C 통신 라이브러리를 불러옵니다. LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD 객체를 생성합니다. (주소, 열수, 행수) const int relayPin = 2; // 릴레이 모듈이 연결된 디지털 핀 번호 const int potentiometerPin = A0; // 포텐시오미터가 연결된 아날로그 핀 번호 int pumpRuntime = 600000; // 펌프가 작동할 시간 (10분을 밀리초로 변환한 값) int interval = 7200000; // 펌프를 작동시키는 간격 (2시간을 밀리초로 변환한 값) unsigned long previousMillis = 0; // 이전 작동 시간을 저장하는 변수 void setup() { pinMode(relayPin, OUTPUT); // 릴레이 핀을 출력으로 설정합니다. digitalWrite(relayPin, LOW); // 초기에 릴레이를 OFF 상태로 설정합니다. lcd.begin(); // LCD를 초기화합니다. lcd.backlight(); // LCD 백라이트를 켭니다. lcd.setCursor(0, 0); // LCD 커서 위치를 (0, 0)으로 설정합니다. lcd.print("Timer: 02:00:00"); // 초기 LCD 메시지 출력 lcd.setCursor(0, 1); // LCD 커서 위치를 (0, 1)으로 설정합니다. lcd.print("Pump: 00:10:00"); } void loop() { unsigned long currentMillis = millis(); // 현재 시간을 밀리초로 가져옵니다. int potValue = map(analogRead(potentiometerPin), 0, 1023, 0, 7200000); // 포텐시오미터의 값을 0부터 7200000까지의 값으로 변환합니다. interval = potValue; // 변환된 값을 간격 변수에 저장합니다. if (currentMillis - previousMillis >= interval) { // 설정된 간격마다 펌프를 작동합니다. previousMillis = currentMillis; // 이전 작동 시간을 현재 시간으로 업데이트합니다. digitalWrite(relayPin, HIGH); // 릴레이를 ON 상태로 변경하여 펌프를 작동합니다. delay(pumpRuntime); // 설정된 작동 시간만큼 대기합니다. digitalWrite(relayPin, LOW); // 릴레이를 OFF 상태로 변경하여 펌프를 멈춥니다. } // LCD에 타이머 시간과 펌프 작동 시간을 표시합니다. lcd.setCursor(7, 0); // LCD 커서 위치를 (7, 0)으로 설정합니다. lcd.print(convertToTime(interval)); // 타이머 시간을 출력합니다. lcd.setCursor(6, 1); // LCD 커서 위치를 (6, 1)으로 설정합니다. lcd.print(convertToTime(pumpRuntime)); // 펌프 작동 시간을 출력합니다. } // 밀리초를 시간(시:분:초)으로 변환하는 함수 String convertToTime(unsigned long millisTime) { unsigned long hours = millisTime / 3600000; // 시간 계산 unsigned long minutes = (millisTime % 3600000) / 60000; // 분 계산 unsigned long seconds = ((millisTime % 3600000) % 60000) / 1000; // 초 계산 // 시간, 분, 초를 문자열로 변환하여 반환 return String(hours) + ":" + String(minutes) + ":" + String(seconds); }