유니티 - 아두이노 스마트팜 데모 프로젝트

NOAH·2021년 9월 20일
0

Unity

목록 보기
25/33

개발 영역 :

Arduino
Unity 3d Client Version 2019.4.12f1
Vuforia sdk

제품명 - AR 스마트팜

습도 센서를 이용해서 자동으로 급수하여주는 스마트팜 키트를 이용하여 제작

개발목적

개인 식물의 상태 정보를 모바일로 증강하여
상태를 모니터링 + 컨트롤시켜주는 IOT 스마트팜 프로젝트

유사제품과 차별점

기존 유사 제품

기존 습도로 자동급수 해주는 스마트 아두이노 키트

차별점 1. 블루투스 통신을 연결

아두이노 HM-10 블루투스 4.0 BLE 모듈 HM10 CC2541 Arduino Bluetooth 4.0 BLE Module

#include <SoftwareSerial.h>
SoftwareSerial BT(2, 3);

void setup() {
  Serial.begin(9600);
  BT.begin(9600);
}

void loop() {
  if (BT.available()) {
    Serial.write(BT.read());
  }
  if (Serial.available()) {
    BT.write(Serial.read());
  }
}

NOAH로 블루투스 이름 설정

차별점 2. 증강현실 기능

아두이노의 블루투스를 Unity 프로젝트에 연결하고
뷰포리아 sdk의 이미지 인식 기능을 이용하여
온도 습도, 팬 관련 인자들을 모바일에서 증강해서
모니터링 + 컨트롤 하는 기능을 추가 했습니다.

코드 일부

제품 활용 가치
동영상 (유튜브에 게시하시고, URL 첨부)
시뮬레이션 동영상 (학번이름.mp4)

진행 상황

20211102

  • 실사용 가능한 지 리서치 진행 - 뷰포리아, 아두이노 블루투스 연결 등 IOT 지식 쌓기 좋아서 선택
  • 스마트 스토어 장바구니 담기
  • 5강 뷰포리아 세팅부터 세팅하면서 들으면 됨

20211117

  • 스마트팜 키드 수령, 아두이노 IDE 설치

20211118

  • 유니티 뷰포리아 sdk 이미지 객체 인식 테스트

20211111

  • 키트조립

20211112

  • 아두이노 연결 및 세팅

rgb Serial 직렬 통신

void setup() {
  Serial.begin(9600);
  pinMode(9,OUTPUT); //r
  pinMode(10,OUTPUT); // g
  pinMode(11,OUTPUT); //b
}

void loop() {
  if(Serial.available()){
    char cmd = Serial.read();
    if (cmd == 'r') {
      analogWrite(9,255);
      analogWrite(10,0);
      analogWrite(11,0);
    }
        if (cmd == 'g') {
      analogWrite(9,0);
      analogWrite(10,255);
      analogWrite(11,0);
    }
        if (cmd == 'b') {
      analogWrite(9,0);
      analogWrite(10,0);
      analogWrite(11,255);
    }
  }

}

데모

//블루투스 관련
#include <SoftwareSerial.h>
SoftwareSerial BT(2, 3);
String cmd;

//온습도계 관련
#include <SimpleDHT.h>
SimpleDHT11 dht11(4);
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
int last_temp;
int last_humi;

//팬 관련
bool isFanOn = false;

//토양수분센서 관련
int soilHumidity = 0;
#define A_SOIL_HUMI A0
int last_soil;

//LCD 관련 
#include <LiquidCrystal_I2C.h>/*LiquidCrystal_I2C*/
#define LCD_I2C_ADDR 0x27 
LiquidCrystal_I2C lcd(LCD_I2C_ADDR, 16, 2);

//워터펌프 관련
#define O_PUMP_A 8
#define O_PUMP_B 5

//RGB 관련 변수 선언
#define O_RGB_R 10
#define O_RGB_G 9
#define O_RGB_B 11


//////////////////////////////// 사용자 정의 함수 ///////////////////////////////////

//LCD 화면 출력 함수
void printLcd() {
  lcd.setCursor(0, 0);
  lcd.print(" Hellosoft Farm");
  lcd.setCursor(0, 1);
  lcd.print("T: ");
  lcd.print((int)temperature);
  lcd.print("*C / ");
  lcd.print("H: ");
  lcd.print(soilHumidity);
  lcd.print("%");

}

//토양습도 계산 함수
void calcSoilHumidity() {
  soilHumidity = map(analogRead(A_SOIL_HUMI), 1000, 400, 0, 100);
  if(soilHumidity > 100) soilHumidity = 100;
  else if(soilHumidity < 0) soilHumidity = 0;
}

//온도 습도 계산 함수
void calcTemp(){
    int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    return;
  }
}

//워터펌프 작동 함수
void WaterPump(){
    delay(2000);
    lcd.clear();
    lcd.noBacklight();
    for (int i = 0; i < 230; i++) 
    {
      analogWrite(O_PUMP_A, i);
      delay(5);
    }
    delay(500);
    analogWrite(O_PUMP_A, 0);
    analogWrite(O_PUMP_B, 0);
    delay(100);

  lcd.init();
  lcd.backlight();

    
}

void FanOn(){
    digitalWrite(12,HIGH);
    digitalWrite(13,LOW);
  }

void FanOff(){
    digitalWrite(12,HIGH);
    digitalWrite(13,HIGH);
  }



void SendSensor(){
   
  //블루투스 출력 
  //온도 3자리 / 습도 3자리 / 토양수분 3자리 형태로 출력함. 예시) Sensor026056080

  String message = "Sensor";
  
  //온도 3자리 출력
  if((int)temperature<100) message+="0";
  if((int)temperature<10) message+="0";
  message+=((int)temperature);
  
  //습도 3자리 출력
  if((int)humidity<100) message+="0";
  if((int)humidity<10) message+="0";
  message+=((int)humidity);

  //토양수분 3자리 출력
  if((int)soilHumidity<100) message+="0";
  if((int)soilHumidity<10) message+="0";
  message+=((int)soilHumidity);

  BT.println(message);

  last_temp = (int)temperature;
  last_humi = (int)humidity;
  last_soil = (int)soilHumidity; 
}


void RGBChange(){
  int red = cmd.substring(3,6).toInt();
  int green = cmd.substring(6,9).toInt();
  int blue = cmd.substring(9,12).toInt();
  Serial.print(red);
  Serial.print("/");
    Serial.print(green);
  Serial.print("/");
    Serial.print(blue);
  Serial.println("/");
  
  analogWrite(O_RGB_R,red);
  analogWrite(O_RGB_G,green);
  analogWrite(O_RGB_B,blue);
}




/////////////////////////////// SETUP //////////////////////////////////

void setup() {
  Serial.begin(9600);
  BT.begin(9600);
  
  pinMode(O_PUMP_A, OUTPUT);
  pinMode(O_PUMP_B, OUTPUT);
  pinMode(O_RGB_R, OUTPUT);
  pinMode(O_RGB_G, OUTPUT);
  pinMode(O_RGB_B, OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  
  analogWrite(O_RGB_R, 125);
  analogWrite(O_RGB_G, 125);
  analogWrite(O_RGB_B, 125);
  
  analogWrite(O_PUMP_A, 0);
  analogWrite(O_PUMP_B, 0);

  digitalWrite(13,HIGH);
  digitalWrite(12,HIGH);
  
  lcd.init();
  lcd.backlight();
  
  delay(2000);
}


//////////////////////////////// LOOP ////////////////////////////////////


void loop() {

  //온도,습도,토양수분 계산하고 LCD에 출력하기
  calcTemp();
  calcSoilHumidity();
  printLcd();
  
  /*
  //토양 수분 센서 습도가 1~19 값이면 자동으로 워터펌프가 작동합니다.
  if (soilHumidity < 20 && soilHumidity >1) {
    BT.println("WaterPump");
    WaterPump();
  } 
  */

  //만약 센서값이 달라지면 블루투스로 전송
  if ((int)temperature!=last_temp || (int)humidity!=last_humi || soilHumidity!=last_soil){
    SendSensor();
  }
 

  //만약 블루투스로 신호가 들어오면 작동합니다.
  if(BT.available()){
    cmd = BT.readStringUntil('\n');
    delay(100);
    Serial.println(cmd);

    if(cmd.indexOf("WaterPump")>-1) {
      BT.println("WaterPump");
      WaterPump();
    }

    else if (cmd.indexOf("FanOn")>-1){
      BT.println("FanOn");
      FanOn();
    }
    
    else if (cmd.indexOf("FanOff")>-1){
      BT.println("FanOff");
      FanOff();
    }    
    
    else if (cmd.indexOf("RGB")>-1){
      BT.println("RGB");
      RGBChange();
    }    
    

    else{
      Serial.println(cmd);
    }
  }


  delay(100);
  
}

Reference

강의 영상
강의 자료

0개의 댓글