반응형

오늘 소개드릴 내용은 간단한 내용인데요.

아두이노 아날로그 핀을 이용하여 스텝모터 28BYJ-48 을 돌려보도록 하겠습니다.

보통은 디지털 핀을 이용하여 스텝모터를 돌리는 예제로 나와 있기 때문에 아날로그 핀을 이용하여 돌리는 방법이 궁금하신 분들이 계실 것 같아 포스팅을 하게 되었습니다.

 

준비물

  • 아두이노 나노 (또는 우노)
  • 28BYJ-48 stepper motor (5V)
  • ULN2003 stepper moter driver
  • 점퍼선 6개 (male --> female)

 

스텝모터는 아두이노 나노의 핀으로 직접 구동하기는 어렵습니다. 대부분의 모터가 사용하는 전력량이 아두이노의 핀의 출력 전류를 초과하기 때문에 직접 연결하시면 아두이노 보드가 망가질 수 있습니다. 그래서 드라이버를 사용하는데요. 보통 모터 드라이버에는 모터에 직접 전류를 인가할 전원을 연결하게 되어있고 2선, 또는 4선으로 신호를 보내 모터의 구동 방향이나 속도, 회전수 또는 각도 등을 입력하게 되죠. 오늘 사용할 ULN2003 의 경우 28BYJ-48 모터와 함께 판매하는 경우가 많으므로 모터와 함께 구입하시는 것이 좋겠습니다.

 

배선연결

연결은 아래와 같이 하시면 됩니다. 좌측은 아두이노, 우측은 ULN2003 드라이버라고 생각하시면 됩니다.

  • A2 - IN1
  • A3 - IN2
  • A4 - IN3
  • A5 - IN4
  • 5V - 5V
  • GND - GND

직접 제작한 무선 아두이노와 연결된 모습

네 테스트 삼아 아두이노의 5V 전원을 바로 드라이버에 인가하였는데 문제 없이 잘 동작하는 것을 확인하였습니다. 나중에 문제가 되는지 테스트를 더 해본 뒤 문제가 된다면 변경하도록 해야할것 같아요.

 

코딩해보자.

해당 모터와 드라이버를 구동하기 위하여 별도의 라이브러리는 필요하지 않습니다. 아두이노에 기본 내장된 stepper 라이브러리를 사용하면 됩니다. 

28BYJ-48 모터는 2048 스텝이 한바퀴로 이루어져 있습니다. 스텝모터를 사용하는 가장 중요한 이유가 정밀한 회전 제어이기 때문에 한바퀴가 몇 스텝으로 이루어져 있는지를 아는 것이 중요합니다.

아두이노 아날로그 핀을 이용하여 간단하게 1초마다 한바퀴씩 돌리는 코드를 작성하면 아래와 같습니다.

#include <Stepper.h>

const int stepsPerRevolution = 64; 
Stepper myStepper(stepsPerRevolution, A5,A3,A4,A2); // 순서가 중요함

void setup() {
  //아날로그 핀을 이용하여 스텝 모터를 돌려본다.
  pinMode(A3, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(A4, OUTPUT);
  pinMode(A5, OUTPUT);  
  myStepper.setSpeed(400);
}

void loop() {

  myStepper.step(2048); 

  delay(1000); 
}

간단하죠? 디지털핀을 이용하여 동작하는것과 다르지 않습니다. 아날로그 핀을 OUTPUT 으로 설정하여 디지털핀처럼 사용하겠다는 선언을 setup 에서 한번 해주면 됩니다.

참고로 A6, A7 은 아날로그 전용 핀이므로 위와 같이 설정해도 디지털핀으로 동작하지 않습니다.

1초마다 한바퀴씩 돌리기로 하였으므로 delay 를 넣어주었고, 한바퀴가 2048 스텝이라고 말씀 드렸으므로 위와 같이 2048 스텝을 돌려주시면 한바퀴씩 돌아갑니다. 만약 반대 방향으로 돌리고 싶으시면 -2048 과 같이 음수값을 넣어 주시면 되고요.

 

만약 3D 프린터 등에 사용하기 위하여 Lead screw 등을 연결할 경우 한바퀴가 2mm 를 이동하는 Lead screw 를 구입하셨다면 아래와 같이 거리만큼 스텝수를 나누어 이동시킬 수 있습니다.

한바퀴가 2mm 이므로 1mm 는 1024 스텝이 되겠죠.

//lead screw 의 스펙이 한바퀴당 2mm 를 이동하는 경우

int stepMM = 2048 / 2; // 2mm 가 한바퀴 이므로 기준 거리인 1mm 에 대한 스텝수 정의
float moveDistance_mm = 0;

// 1mm 를 이동한느 경우
myStepper.step(stepMM);

// 3mm 를 이동하는 경우
moveDistance_mm = 3;
myStepper.step(stepMM * moveDistance_mm);

// 0.1mm 를 이동하는 경우
moveDistance_mm = 0.1;
myStepper.step(stepMM * moveDistance_mm);

// 반대방향으로 10mm 이동해야 하는 경우
moveDistance_mm = -10;
myStepper.step(stepMM * moveDistance_mm);

역시 간단합니다. 이렇게 하면 1mm 를 이동하든, 0.3mm 를 이동하든 원하는 거리만큼 이동할 수 있게 됩니다.

만약 한바퀴에 8mm 를 이동하는 lead screw 를 구입하셨다면 맨 위의 stepMM 을 8로 나누어 주면 끝 입니다.

이해되시나요? 

 

네. 오늘은 이만 마치도록 하겠습니다. 궁금하신 내용은 뎃글로 문의 주시면 감사하겠습니다.

 

2019.06.01 - [DIY/Arduino] - 아두이노를 이용한 RC 카 만들기 1

 

아두이노를 이용한 RC 카 만들기 1

아도이노는 DIY 인 들에게 없어서는 안될 단물 같은 장치이다. 물론 요즘은 프로그래밍 교육용으로도 사용되고 미디어 아티스트들에게도 자주 사용되는 놀라운 장치이다. 간단한 코딩 만으로 하

diy-dev-design.tistory.com

2020.10.14 - [DIY] - DIY 상식 - 전기/전자에 대하여 알아보자 01

 

DIY 상식 - 전기/전자에 대하여 알아보자 01

나는 전기, 전자는 문외한이라서 DIY 는 힘들겠지. DC 는 뭐고 AC 는 도대체 뭐람? 전기는 무서워. 전압, 전류, 저항! 이런 생각들로 인해 DIY 를 하더라도 목공이나 수예와 같이 분야를 한정하는 경

diy-dev-design.tistory.com

2020.10.28 - [DIY/Arduino] - 아두이노로 아이방 스탠드 개조하기 - 자동 꺼짐 기능

 

아두이노로 아이방 스탠드 개조하기 - 자동 꺼짐 기능

아이가 유치원에서 너무나 예쁜 스탠드를 만들어 왔습니다.. AAA 건전지가 들어가는 예쁜 스탠드. 스텐드 옆면에 예쁘게 그림을 그려서 본인이 자는 방에 가져다 두고는 "오늘부터 얘가 나를 지

diy-dev-design.tistory.com

 

반응형
반응형

가끔 아두이노로 무엇인가를 만들어 보려고 하다보면 디스플레이가 있으면 하는 생각이 들때가 있습니다. 아두이노는 작은 컴퓨터이기는 하지만 모름지기 컴퓨터라 한다면 입력장치 - 중앙처리장치 - 출력장치가 모두 있어야 비로소 컴퓨터라 할수 있겠지요. 센서나 버튼 등은 간단한 입력장치라 볼수 있겠으나 아두이노 기판에 붙어있는 LED 는 출력장치라고 하기에는 조금 부족한 면이 있습니다.

 

그래서 오늘은 아두이노 나노 에 OLED 디스플레이를 붙여 볼 생각입니다.

오늘도 역시 알리익스프레스에서 구입한 부품으로 시작합니다.

 

 

오늘 필요한 부품은

  • 아두이노 나노  Arduino Nano (우노가 있으신 분은 그냥 우노로 하시면 됩니다)
  • 0.96 inch OLED display (128x64)

이게 전부 입니다.

간단하죠?

 

참고로 제가 구입한 OLED 보드는 아래의 제품입니다.

Arduino OLED 테스트를 위하여 구입한 제품

I2C 통신이 가능한 모델로 코딩을 간단하게 할수 있고 연결해야 하는 선이 적어 손쉽게 구현이 가능하다는 장점이 있습니다. (4pin)

 

 

먼저 OLED 에 무엇인가를 손쉽게 표시하기 위하여는 라이브러리를 받아야 합니다. 

아래의 첨부파일을 받아주세요.

Adafruit_SSD1306-master.zip
0.03MB
Adafruit-GFX-Library-master.zip
0.32MB

받은신 라이브러리는 압축을 해제하여 내문서> Arduino> Library 폴더안에 아래와 같이 복사해서 넣어주세요.

 

그럼 기본적인 준비는 끝났습니다. 

아두이노 나노와 OLED 를 아래와 같이 연결해 주세요.

  • A4 --> SDA
  • A5 --> SCK
  • 5V --> VDD
  • GND --> GND

요렇게 연결하면 연결도 끝 입니다.

매우 간단하죠?

 

 

자 코딩을 해볼까요? 간단하게 텍스트를 출력하는 예제를 짜 보았습니다.

#include <Wire.h> 
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>

#define OLED_ADDR   0x3C

// reset pin not used on 4-pin OLED module
Adafruit_SSD1306 display(-1);


void setup() {
  // put your setup code here, to run once:

  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);

  display.setFont();
  display.clearDisplay();
  display.display();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(2, 25);
  display.print("DIY DEV DESIGN");
  display.display();
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

setup 에서 한번만 호출해주는 코드 입니다. 나중에 loop 에서 다른 화면을 보여주는 걸로 한다면 인트로 정도가 될 수 있겠습니다.

출력되는 화면을 한번 볼까요?

DIY DEV DESIGN 을 출력해 보았다.

캬~ 아주 깔끔하고 예쁩니다. 디스플레이 크기가 작은 만큼 글자 크기도 좀 작게 설정을 하였는데요. 선명하고 예쁩니다. 

우리는 이 디스플레이에 무엇인가를 그리거나 표시하기 위하여 위와 같은 방식으로 계속 직접 코딩을 하는 것은 비 효율 적이기 때문에 뭔가 좀저 효율적으로 그릴 수 있도록 코딩을 해볼 계획입니다.

 

 

만들어 볼 기능은 아래와 같습니다. (사실 RC 카 조종기에 넣을 기능임)

  • 텍스트 표시하기
  • 프로그래스 바 표시하기
  • 좌우 밸런스 바 표시하기

 

 

텍스트 표시하기

// 위쪽은 동일하므로 생략합니다.

void loop() {
  display.clearDisplay();
  draw_text(1, 2, "[ DIY DEV DESIGN ]", false);
  draw_text(2, 2, "This is selected menu", true);
  draw_text(3, 2, "This is 2nd menu", false);
  draw_text(4, 6, "Sub menu 1 line", false);
  draw_text(5, 6, "Sub menu 2 line", false);
  draw_text(6, 2, "This is 3rd menu", false);
  display.display();
  delay(1000);
}

void draw_text (int line, int xPos, String txt, bool isSelected)
{
  
   int cHeight = (line-1) * 8 + ((line-1) * 2);
   if(isSelected)
   {
      display.fillRect(xPos - 2, cHeight, 127, 8, WHITE);
      display.setTextColor(BLACK);
   }else{
      display.fillRect(xPos - 2, cHeight, 127, 8, BLACK);
      display.setTextColor(WHITE);
   }
   display.setCursor(xPos, cHeight);
   display.print(txt);
}

아래쪽에 draw_text 라는 함수를 하나 만들어 주었습니다. 원하는 줄에 원하는 텍스트를 쉽게 표시할 수 있도록 했는데요, 특징으로는 메뉴 등의 기능으로 사용할 수 있도록 해당 라인이 선택 상태인지를 입력할 수 있도록 했습니다.

구현된 화면을 보면 아래와 같죠. 로터리 스위치나 푸쉬스위치의 입력을 받아 선택상태를 바꾸어 주는 방식으로 메뉴를 개발할 수 있을 것 같습니다.

아두이노 OLED 텍스트 메뉴 표시 테스트

 

 

 

 

프로그래스 바 만들어 보기

void loop() {
  
  for(int i = 2; i < 127; i++)
  {
    display.clearDisplay();
    draw_text(1, 2, "[ DIY DEV DESIGN ]", false);
    draw_text(2, 2, "progress 1", false);
    draw_progressBox(3, i, false);
    draw_text(4, 2, "progress 2", false);
    draw_progressBox(5, 126-i, true);
    display.display();
    delay(20);
  }
  
}

void draw_progressBox(int line, int val, bool isSelected)
{
  
  int cHeight = (line-1) * 8 + ((line-1) * 2);
  if(isSelected)
    {
      display.fillRect(0, cHeight, 127, 8, WHITE);
      display.drawRect(1,cHeight+1, 126, 6, BLACK );
      display.fillRect(1,cHeight+1, val, 6, BLACK );
    }else{
      display.drawRect(1,cHeight+1, 126, 6, WHITE );
      display.fillRect(1,cHeight+1, val, 6, WHITE );
    }
}

void draw_text (int line, int xPos, String txt, bool isSelected)
{
  
   //생략
}

이번에는 draw_progressBox 라는 함수로 프로그래스 바를 표현해 봤습니다. 역시 라인의 위치를 간단히 설정할 수 있도록 하였으며 val 값을 입력 받도록 하였습니다.

그리고 텍스트와 마찬가지로 선택상태를 주게 되면 색상이 반전되어 보이도록 기능을 주었습니다. 총 2~126 까지의 값이 표현 가능합니다. 깔끔하게 100개만 입력 받도록 넓이를 조정해보는 것도 좋을 것 같네요.

구현하면 아래와 같이 표시 됩니다.

아두이노, OLED 프로그래스바 코드 테스트

 

 

 

 

 

아날로그 발란서 만들어보기

다음은 아날로그 발란서 입니다. 센터를 정해 놓고 좌우로 얼마나 기울었는지 등을 설정하거나 보여주는 기능에 적합한 메뉴 입니다.

void loop() {
  
  for(int i = 2; i < 127; i++)
  {
    display.clearDisplay();
    draw_text(1, 2, "[ DIY DEV DESIGN ]", false);
    draw_text(2, 2, "progress 1", false);
    draw_analogBalancer (3, i, false);
    display.display();
    delay(20);
  }
  
}
void draw_analogBalancer(int line, int val, bool isSelected)
{
  int cHeight = (line-1) * 8 + ((line - 1) * 2);  

  if (isSelected)
  {
    display.fillRect(0, cHeight, 127, 8, WHITE);
    display.drawLine(0, cHeight+3, 127, cHeight+3, BLACK);
    display.drawLine(val, cHeight+1, val, cHeight+5, BLACK);
    display.fillTriangle(64, cHeight+5, 62, cHeight+7, 66, cHeight+7, BLACK);
    display.drawPixel(val-1, cHeight+3, WHITE);
    display.drawPixel(val+1, cHeight+3, WHITE);
  }else{
    display.drawLine(0, cHeight+3, 127, cHeight+3, WHITE);
    display.drawLine(val, cHeight+1, val, cHeight+5, WHITE);
    display.fillTriangle(64, cHeight+5, 62, cHeight+7, 66, cHeight+7, WHITE);
    display.drawPixel(val-1, cHeight+3, BLACK);
    display.drawPixel(val+1, cHeight+3, BLACK);
  }
}

코드가 좀 길죠? 아무래도 표현해야 할 요소가 많기 때문인데요, 역시 선택상태를 표시하기 위하여 두벌로 코딩이 되었습니다. 선택 상태를 만드실 필요가 없다면 else 아래쪽만 코딩을 해주셔도 표현이 가능합니다.

 

구현된 화면을 한번 보실까요?

아두이노 OLED 밸런스 바 코드 테스트

가운데 세모가 중심의 위치를 나타내고 세로로 얇은 막대가 현재 입력 받는 val 에 해당되는 위치가 됩니다. 물론 반대로 표시하는 것도 조금만 코드를 수정하면 가능하겠죠?

 

 

이렇게 하여 간단하게 아두이노를 이용하여 초소형 OLED 를 구동하는 것을 보여드렸습니다. 전혀 어렵지 않으니 바로 도전해 보시기 바랍니다. 

OLED 가 각종 정보를 표시하는데 생각보다 속도가 많이 느리므로 아두이노 자체 기능이 지연될 수 있습니다. realtime clock 과 같은 실제 시계 등을 만들기 위하여는 위에 표시한 방식과는 다르게 구현을 해야 될 것 같습니다.

 

궁금하신 것은 뎃글로 문의 해 주시기 바랍니다.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면  클릭!!  부탁드려요~


 

 

2020/03/23 - [DIY/Arduino] - Arduino(아두이노) 무작정 시작하기

2019/12/23 - [DIY/RC] - 아두이노를 이용한 RC 카 만들기 2

2019/11/10 - [DIY/Arduino] - [DIY] 아두이노로 만능 (통합) 리모콘 만들기 1/3

2019/06/27 - [DIY/Arduino] - 아두이노를 이용한 간단한 화분 자동 물주기 시스템

2019/10/29 - [DIY/Arduino] - [DIY] 아두이노를 이용한 수경재배 시스템

반응형
반응형

아두이노는 정말 놀라운 하드웨어가 아닐수 없죠. 우리가 생각하는 이런건 자동으로 해주는거 없나? 이런게 자동으로 되면 좋을텐데... 이런걸 왜 자동으로 안하는거야?? 같은 대부분의 자동화 장치, 기계장치를 원하면 직접 만드는것을 가능하게 끔 만드는 것을 아두이노는 가능하게 합니다.

사실 아주 많은 부분에서 자동화 또는 그런 류의 장치들은 간단한 로직만을 필요로 합니다. 실제 상용화된 제품에서는 보다 많은 기능과 안정성, 수익성, 또 제품화 되기 위한 여러가지 복합적인 문제들을 안고 있기 때문에 제품화 되지 않는 것일 뿐이죠.

오늘 포스트에서 올릴 내용은 바로 "아두이노를 이용한 수경재배" 에 대한 내용입니다.

회사에서 DIY 동호회를 운영중인데 이번 프로젝트가 바로 수경재배가 되시겠습니다.

수경재배를 하기 위하여 알아야 할 것들이 많이 있는데 사실 원천적으로는 복잡하지 않습니다. 식물이 생장에 필요로 하는 물과 양분을 공급해주는것. 바로 이게 핵심인데 그 과정에서 발생되는 인간의 개입 정도를 좀 줄여보는게 이번 프로젝트의 핵심이라 할 수 있겠습니다.

양액은 인터넷에서 저렴하게 구입이 가능하므로 일정 농도로 희석된 양액을 통에 담아두고 수경 재배용 통에 항상 부족하지 않게 공급하는 장치를 만들어 볼 계획입니다.

실제 수경재배를 위하여는 양액의 Ph 농도와 전해질의 양의 측정이 매우 중요하지만 이번 프로젝트를 위하여 엄청난 수확량을 기대한다거나 하는 것이 아니기 때문에 우리는 자동으로 부족한 물 (양액)을 보충해 주어 인간의 개입을 최소화 하는데에 의의를 두기로 하였습니다.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

먼저 필요한 구조를 고민해 보았습니다.

- 식물이 자라기 위한 pot 이 필요할 것이고 pot을 잠기에하여 양액을 공급할 수 있는 양액통이 필요할 것입니다. 그리고 보조 양액통을 만들어 주 양액통에 양액이 부족해지면 보조 양액통으로 부터 양액을 보충해주는 역할을 하도록 만들어 볼 계획입니다. 그리고 양액통 내 용존 산소량을 확보하기 위하여 일정 수준의 공기 주입을 지속적으로 해주는 장치 정도를 만들어 볼 계획입니다.

필요한 재료는 아래와 같은데 이전에 소개했던 자동으로 식물에 물을 공급하는 장치와 거의 유사합니다.

  • 아두이노 나노
  • DRV8883 듀얼 모터 드라이버
  • 미니 DC 펌프 x 2 (양액 공급용, 공기 펌프용)
  • 수위 측정용 스위치 (물주기에 사용했던 센서는 사용불가... 나중에 설명하겠습니다)
    • 일반적인 리미트 스위치
  • 어항용 공돌 (다이소 500원 짜리)
  • 어항용 호스, 링거 호스
  • 양액통 2개,
  • 싱크대 수채구멍용 거름망

 

전체적으로 보면 아래와 같은 구조입니다. 배선은 제외한 그림이기는 한데요.

두개의 DC 모터를 컨트롤 하기 위한 모터 드라이버와 아두이노 나노, 중간에 수량 체크를 위한 스위치 (탁구공의 부력을 이용합니다) 그리고 각각의 식물의 재배를 위한 pot (하수구 거름망), 두개의 양액 통이죠.

 

 

스위치에 의하여 상단 박스의 수량이 부족하면 계속해서 우측 펌프가 물을 끌어 올릴 겁니다. 물이 차오르고 필요한 높이가 되면 탁구공을 매단 수량 체크용 스위치가 신호를 보낼것이고 해당 신호를 받아 필요한 양이 보충되게 되면  양액 공급펌프는 멈출것입니다.

좌측의 에어 공급 펌프는 계속해서 상단 양액내 공기를 뿜어 넣음으로써 산소량을 높이는 역할을 하게 됩니다.

반응형

이론적으로는 간단하죠?

 

네 실제로 간단 합니다. 아래와 같은 형태로 제작이 되었다고 보시면 됩니다. 

중간에 CDS 로 보이는 부품은 네..  CDS 가 맞습니다. CDS가 필요한 이유는 뒤에 설명을 드리도록 하겠습니다.

수경재배 양액 / 산소 공급장치 구조도

 

 

프로토 타입으로 제작한 이미지를 보시죠

탁구공을 접착하여 제작한 부력스위치

탁구공의 부력이 스위치를 작동시키이에 약간 부족함이 있어 날개 길이를 조금 연장하였습니다. 

 

탁구공을 이용하여 제작한 부력스위치를 장착한모습
부력스위치와 워터펌프 테스트 중인 모습

 

 

양액내 산소공급을 위한 공돌, 다이소에서 500원에 구입하였다.

 

 

씨앗으로 부터 시작된 모종. 동그라미 친 두개의 모종이 재배용으로 결정 되었다.

 

통에 양액을 채우고 모종도 pot 에 옮겨 담아 준뒤 시스템을 가동하였습니다.

물과 공기가 예상데로 잘 공급이 되는 것을 확인하였으나 모터 구동시 소음이 좀 있는 편이고 에어의 경우 하루종일 동작하게 되어 있어 모터에 열이 좀 나는 것이 문제가 될 것 같았습니다. 워터 쪽 모터도 물을 끌어올려야하는 상황이다보니 부하가 걸려 모터에서 열이 많이 발생되었습니다. 

기본적인 수경재배 시스템이 완성된 모습

나중에 브래드보드 대신 만능기판에 보드를 옮길 계획인데 해당 작업이 완료되면 별도의 포스팅을 진행할 예정입니다.

 

그리고 위에 잠깐 소음에 대하여 언급을 했었는데요. 아무래도 사무실에서 키우는 것이다 보니 소음으로 인한 민원이 바로 올라오더군요. 시끄럽다고 꺼달라고 하더라구요. - -;;

 

그래서 긴급 조치로 CDS 를 하나 달아서 사무실 조명이 모두 꺼지면 동작하도록 간단한 기능을 추가하였습니다. 이제 아무도 없는 밤에 열심히 산소를 공급해주게 될겁니다.

빨간 동그라미 부분이 CDS 되시겠다.

 

앞으로 진행할 내용은 아래와 같습니다.

  • 만능기판에 기자재 납땜으로 부착
  • 현재 상태는 보기에 좋지 않으므로 케이스를 제작
  • 식물이 자라는것을 타임랩스로 보여주기 위한 카메라 장착 (안쓰는 블랙박스 활용)

준비가 되면 포스팅을 하도록 하겠습니다.

 

아두이노 소스코드는 아래를 참고해 주세요.


const int waterLevelCheckerSW = 2;
const int airPumpSpeedControlPin = A3;
const int motor_waterpump = 9; // pin 9 (D9) is waterpump action
const int motor_airpump = 10; // pin 10 (D10) is waterpump action
const int lightSensor_pin = A4;

int airPumpSpeed = 0;
int buttonState = 0;
int count = 0;
int lightTotal = 0;

void setup() {

  pinMode(13, OUTPUT); // status LED
  pinMode(motor_waterpump, OUTPUT);  // water pump pin
  pinMode(motor_airpump, OUTPUT); // air pump pin
  pinMode(waterLevelCheckerSW, INPUT_PULLUP); // water level checker switch pin
  
  Serial.begin(9600);
}


void loop() {

  count++;
  
  //air pump speed control
  airPumpSpeed = analogRead(airPumpSpeedControlPin); // 
  int pumpSpeed = map(airPumpSpeed, 0, 1023, 0, 128);
  
  
  int lightValue = analogRead(lightSensor_pin);
  
  lightTotal += lightValue;
  
  if (count == 10)
  {
    // the air pump run when dark
    if (lightTotal/10 < 1 )
    {
      analogWrite(motor_airpump, pumpSpeed);
    }else{      
      analogWrite(motor_airpump, 0);
    }
    lightTotal = 0;
    count = 0;
  }
  
  
  Serial.print(airPumpSpeed);
  Serial.print("/");
  Serial.print(pumpSpeed);
  Serial.print("///");
  Serial.println(lightValue);
    
  // water pump control
  buttonState = digitalRead(waterLevelCheckerSW);
  if (buttonState == HIGH ) 
  { 
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW       
    // stop water pumping
    digitalWrite(motor_waterpump, LOW);

  } 
  else 
  {    
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)    
    // start water pumping when dark
    if (lightValue < 2 )
    {
      analogWrite(motor_waterpump, 128);           
    }
  }
  
  delay(10);              // wait for a second

}

 

 

 

끝으로 수위 측정 센서관련하여 

참고로 물주기에 사용하였던 수분 측정 센서(알리익스프레스에서 구입)의 경우 양극단에서 흐르는 전류에 의해 물의 전기분해가 이루어 진 탓인지 센서 표면에 수많은 기포가 발생되었습니다.

센서 측정부에 발생된 기포. 전기분해가 이루어 졌다면 산소와 수소일 것으로 판단 된다.

결국 센서 표면중 한쪽면이 심하게 부식이 되며 양액을 변질 시키는 것을 보고 사용할 수 없겠다 판단 하였습니다.

하루정도 시간이 흐르자 양액의 색깔이 심하게 변하고 센서 표면도 변질 되었다.

결국 수위 측정은 위 사진에서 보여드린 탁구공을 이용하는 방법을 사용해야 했습니다.

토양의 수분 측정시에도 유사한 현상이 있어 결국 센서를 빼버렸었는데요. 해당 센서를 사용한다면 측정 주기를 매우 길게 하고 측정 시간을 짧게 여러번 하여 결과값을 사용하는 방식을 이용하는 것이 좋을 것으로 판단됩니다. 해당 센서를 이용하여 토양의 수분을 측정하려는 목적이시라면 연속해서 측정을 진행하지 마시고 일정 주기를 두고 실제 측정 시간은 짧게 측정을 하는 것이 센서의 수명에 도움이 될것으로 생각됩니다. 참고하세요~

 

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

참고로 이전에 사용하였던 해당 센서를 이용한 토양 수분 측정을 통한 자동으로 물주는 시스템 관련 포스트

https://diy-dev-design.tistory.com/16

 

아두이노를 이용한 간단한 화분 자동 물주기 시스템

얼마뒤면 베트남으로 가족 여행을 떠날 예정입니다. 7박이나 하고 올 예정이므로 집을 비우기 전 준비해야 할 것들이 많습니다. 이것저것 여행준비를 하던 찰나 베란다에 내어 둔 화분이 걱정이 되었습니다. 출발..

diy-dev-design.tistory.com

2020/06/29 - [DIY/Arduino] - C# 에서 아두이노로 시리얼 통신 하기

 

C# 에서 아두이노로 시리얼 통신 하기

카테고리를 c# 으로 해야 할지 Arduino 로 해야할지 조금 고민이 되는 포스트 입니다. 음.... arduino 로 하는게 좋겠네요. 따지고 보면 C# 으로 만든 어플이 중요한게 아니라 아두에노에서 시리얼 통신

diy-dev-design.tistory.com

 

반응형

+ Recent posts