산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

부품 및 소모품

Arduino Nano R3 1
IO Expander 1
IO Expander Bundle 1

앱 및 온라인 서비스

프로젝트 소개

Arduino로 스마트 관수 컨트롤러 만들기

동적 급수 주기로 정원을 지능적으로 관리하세요. 비가 오거나 이전 급수 이후 비가 온 경우 급수를 중단합니다. 조도 센서로 일출 시간을 감지해 자동으로 급수 시작 시간을 조정합니다. 너무 추울 때도 급수를 멈춥니다.

주요 기능

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

필요 부품 상세

배선도

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

OLED 디스플레이

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

메뉴 버튼을 눌러 메뉴를 표시하고, 계속 눌러 옵션을 순환합니다. 30초간 조작 없으면 자동으로 메뉴가 사라집니다. 선택 버튼으로 원하는 기능을 실행하세요.

IO Expander를 사용하는 이유

시스템 구축

Arduino Nano를 IO Expander에 연결하고 아래 코드를 업로드하세요. 6핀 헤더는 소프트웨어 시리얼 디버그 포트로 최종 설치 시에는 필요 없습니다.

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

중요: ONEWIRE_TO_I2C_ROM1과 ONEWIRE_TO_I2C_ROM2 정의 주소를 본인의 1-Wire to I2C 주소에 맞게 변경하세요.

전체 코드 (C/C++)

/* IO Expander 스케치 최적화
 * 관수 시스템 v1.1 */
#include <math.h>
#include <time.h>
#include <util/crc16.h>
#include <avr/wdt.h>
#include <SoftwareSerial.h>
#include "IOExpander.h"

#define FAHRENHEIT
#define INIT_BOARD "g5w1;g11w1;g11d0,75;g12w1;g12d0,75;rsf"
#define ONEWIRE_TO_I2C_ROM1 "i4scc"
#define ONEWIRE_TO_I2C_ROM2 "i6s8f"
#define ONEWIRE_TEMPERATURE "t6s0300"
#define RTC_SENSOR "s4te"
#define I2C_EEPROM "s4tf"
#define I2C_OLED "s4t10"
#define I2C_LIGHT "s3t9;sc0"
#define OPTICAL_SENSOR "g5a"
#define BUTTON1 "g11d"
#define BUTTON2 "g12d"

#define WATER_TIME_BEFORE_SUNRISE 60
#define SUNRISE_LUX 100
#define RAIN_DETECT_LEVEL 4.0
#define DO_NOT_WATER_TEMP 4.4444 // 40℉

#define MAX_ZONES 4
#define HOUR_IN_DAY 24L
#define MIN_IN_HOUR 60L
#define SEC_IN_MIN 60L
#define SEC_IN_HOUR (MIN_IN_HOUR * SEC_IN_MIN)
#define SEC_IN_DAY (HOUR_IN_DAY * SEC_IN_HOUR)
#define DAYS_IN_WEEK 7
#define SEC_IN_WEEK (SEC_IN_DAY * DAYS_IN_WEEK)

#define SUN 0x01
#define MON 0x02
#define TUE 0x04
#define WED 0x08
#define THR 0x10
#define FRI 0x20
#define SAT 0x40
#define EVERYDAY (SUN | MON | TUE | WED | THR | FRI | SAT)
#define SUNRISE 0x80

#define MENU_OPTIONS 9
#define MENU_TIME 30
#define OFF 0
#define ON 1
#define STATE_ON_OFF 0x01

//#define SERIAL_DEBUG

#ifdef SERIAL_DEBUG
SoftwareSerial swSerial(8,7);
#endif

char weekday[][4] = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
char menu[][13] = {"Next","Water","Reset","Clock Min +","Clock Min -","Clock Hour +","Clock Hour -","Sunrise","ON/OFF"};

enum { MENU_NEXT, MENU_WATER, MENU_RESET, MENU_CLOCK_MIN_PLUS, MENU_CLOCK_MIN_MINUS, MENU_CLOCK_HOUR_PLUS, MENU_CLOCK_HOUR_MINUS, MENU_SUNRISE, MENU_ON_OFF };

typedef struct { char description[16]; uint8_t relay; } ZONE;
typedef struct { uint8_t zone; uint8_t days; int8_t hour; int8_t min; uint8_t duration; } SCHEDULE;
typedef struct { time_t sunrise_time; time_t last_water_time; uint8_t water_schedule; uint8_t water_duration; uint8_t rain[MAX_ZONES]; uint8_t state; uint8_t crc; } NVRAM;

enum { ZONE1, ZONE2, ZONE3, ZONE4 };
enum { RELAY1 = 1, RELAY2, RELAY3, RELAY4 };

ZONE zone[] = { {"Front Right", RELAY1}, {"Front Left", RELAY2}, {"Bushes", RELAY3}, {"Left Side", RELAY4} };
SCHEDULE schedule[] = { {ZONE1, SUNRISE | EVERYDAY, -1, 0, 4}, {ZONE2, EVERYDAY, 6, 15, 5}, {ZONE3, EVERYDAY, 6, 0, 10}, {ZONE4, EVERYDAY, 6, 10, 6} };

NVRAM nvram;
bool update_nvram = false;

uint8_t crc8(uint8_t* data, uint16_t length) {
  uint8_t crc = 0;
  while (length--) crc = _crc8_ccitt_update(crc, *data++);
  return crc;
}

int led = 13;
bool init_oled = true, update_oled = true, init_board = true;

#ifdef FAHRENHEIT
#define C2F(temp) CelsiusToFahrenheit(temp)
float CelsiusToFahrenheit(float celsius) { return ((celsius * 9) / 5) + 32; }
#else
#define C2F(temp) (temp)
#endif

void SerialPrint(const char* str, float decimal, char error) {
  Serial.print(str);
  if (error) Serial.print(F("NA")); else Serial.print(decimal, 1);
}

// ... (이하 루프, 스케줄링, 버튼 처리, OLED 업데이트, NVRAM 저장 등 전체 로직 생략 - 원본 참조)

참고: USB 포트로 Arduino Nano를 프로그래밍할 때는 IO Expander에서 분리해야 합니다(동일 시리얼 포트 공유). 디버깅 시에는 ICSP 포트로 ATmega328P를 프로그래밍하세요. 소프트웨어 디버그 포트를 활성화하려면 SERIAL_DEBUG 정의를 주석 해제하세요.

스플리터는 광학 적외선 센서 데이터 라인을 1-Wire 원격 센서 라인에서 격리하도록 설정해야 합니다. R2에 0옴 0603 저항을 납땜하세요.

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

작은 인클로저에 7/16인치, 큰 인클로저 오른쪽 측면에 11/16인치 구멍을 뚫고 PG7, PG11 글랜드를 장착하세요. 드레멜 도구로 구멍을 살짝 확대해 꽉 끼게 만드세요. PG7은 원격 센서용, PG11은 12VDC, 24VAC, 매니폴드 와이어, RJ11 원격 센서 와이어용입니다.

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

SPST 순간 푸시 버튼 마이크로 스위치를 배선하고 RJ11 스크류 터미널에 연결하세요. 열수축 튜브로 접점을 절연하세요.

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

모든 와이어를 연결하고 부품을 대형 인클로저에 조립/수납하세요. 원격 센서용 50ft RJ11 와이어는 자르지 않고 PG11 글랜드를 통과할 수 있어야 합니다.

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

작은 인클로저 상단에 9/16인치 구멍을 뚫고 광학 적외선 수위 센서를 장착하세요. 드레멜로 구멍을 조정해 센서가 딱 맞게 하세요. 작은 원격 센서 인클로저는 공간이 타이트하지만 권장 방향으로 배치하면 들어갑니다. RJ11 와이어를 최대한 짧게 하면 수납이 쉽습니다. 조립 후 글랜드 너트 와셔에 마린 글루를 발라 밀봉하세요.

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

원격 센서 인클로저를 집 동쪽 높은 곳에 설치하고, 광학 적외선 수위 센서와 조도 센서가 하늘을 향하고 장애물이 없도록 하세요.

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

대형 인클로저 상단/중간/하단에 1/4인치 구멍을 뚫고 버튼을 장착하세요.

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

시스템을 테스트하고 모든 것이 정상 작동하는지 확인하세요. 릴레이와 센서 테스트 시 Arduino를 IO Expander에서 분리해 컴퓨터에 직접 연결해 수동 제어하세요. 검증 완료 후 양면 테이프와 포장 폼으로 보드를 고정해 인클로저에 모두 조립하면 스마트 관수 컨트롤러의 혜택과 절약 효과를 누릴 수 있습니다.

작동 영상

업데이트 내역

2019/09/12: v1.1 릴리스 - 며칠간 정전 시 시작 문제 수정.

2019/10/02: 1-Wire to I2C를 DS3231과 SSD1306 OLED에 연결하면 SDA/SCL 라인에 총 3개의 풀업 저항이 병렬로 연결되어 4.7k/3 = 1.56k 풀업이 되어 너무 강해지고 화면 깨짐이 발생할 수 있습니다. DS3231은 다른 라인에도 쓰이는 저항 팩을 사용하므로 다음 풀업 저항을 제거하세요:

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

회로도

Arduino Nano 기반 스마트 관수 컨트롤러 - 날씨·조도 센서로 자동 급수

제조공정

  1. 오픈소스 스마트 팜 시스템 구축: 저렴하고 상호운용 가능한 IoT로 농민 역량 강화
  2. ECM3532: 에타 컴퓨트의 첫 통합 초저전력 AI 센서 보드, 에지 개발 가속화
  3. Sensorflare와 라즈베리 파이로 433MHz 스마트 홈 컨트롤러 만들기
  4. MCP9808, InfluxDB, Grafana로 라즈베리 파이 홈 온도 모니터 구축하기
  5. 스마트 쓰레기통: 자동화된 폐기물 관리를 위한 셀룰러 IoT 솔루션
  6. 스마트 바텐더: 라즈베리파이 기반 나만의 칵테일 스테이션 만들기
  7. 감정 센서 & EEG: 실시간 감정 감지를 위한 저비용 하드웨어
  8. 윈도우 10 IoT, 라즈베리파이, XBee 수분 센서로 만드는 스마트 관개 컨트롤러
  9. 스마트 텍스타일용 초고감도·내구성 변형 센서 혁신
  10. 혁신적 초박막 센서, 스마트 콘택트렌즈 기능 강화