극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기13

in kr-dev 커뮤니티2 years ago

안녕하세요 Jimae입니다.

자 드디어 각각의 센서와 필요한 라이브러리에 설명이 다된것같아 이번에는 프로그램 전체를 공개하고자 합니다.

물론 이 프로젝트는 따라서 만들기 어려울것 같습니다.

왜냐하면 안드로이드 어플이 커스텀이거든요.

그리고 시나리오 각센서들을 블루트스를 통해 안드로이드 어플로 데이터를 보내는 용도이기 때문에

검증이 힘들것같습니다.

그냥 프로그램을 보고 하나하나씩 분석해서 이때 어떻게 만들었지 라고 넘어가야 할것같아요.

// 0.05A

#include <SFE_TSL2561.h>
#include <AM2320.h>
#include <Wire.h>
#include <OneWire.h> 
#include <DallasTemperature.h>
#include <SoftwareSerial.h>

#define SOILPIN A0
#define ONE_WIRE_BUS 2 
#define BLUELED 5

enum{SIGNALWAITING = 0, DATASEND, DATACONFIRM};

SFE_TSL2561 light;
AM2320 THumidity;

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature Temperature(&oneWire);
SoftwareSerial BTSerial(3, 4);   //bluetooth module Tx:Digital 3 Rx:Digital 4

boolean gain;     // Gain setting, 0 = X1, 1 = X16;
unsigned int ms;  // Integration ("shutter") time in milliseconds

double lux = 0;
double temperature = 0;
double humidity = 0;

double soilHumidity = 0;
double soilTemperature = 0;


unsigned char programStep = SIGNALWAITING;

String BlueString = "";

long ledTimer = 0;
long previousLedTimer = ledTimer;
unsigned char ledFlag = 0;


long blueTimer = 0;
long previousblueTimer = blueTimer;


void setup() {
  // put your setup code here, to run once:
  LightSensorInit();    // 조도센서 초기화
  THumidityInit();      // 온습도센서 초기화
  TemperatureInit();    // 온도센서 초기화
  Serial.begin(9600);
  BTSerial.begin(9600); // 블루투스 초기화
  BluetoothLEDInit();   // 블루투스 led 초기화
}

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

void SmartFarmProgram(void)
{
  switch(programStep)
  {
    case SIGNALWAITING:
                       while(BTSerial.available())  //BTSerial 값이 있으면
                       {
                         char blueChar = (char)BTSerial.read();  //BTSerial int형식의 값을 char형식으로 변환
                         BlueString+=blueChar;   //수신되는 문자열을 BlueString 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
                         delay(5);           //수신 문자열 끊김 방지
                       }
  
                       if(!BlueString.equals(""))  //myString 값이 있다면
                       {
                           if(BlueString == "start")  
                           {
                             programStep = DATASEND;
                             BlueString="";  //BlueString 변수값 초기화
                             
                             blueTimer = millis();
                             previousblueTimer = blueTimer;
                             break;
                           }
                         BlueString="";  //BlueString 변수값 초기화
                       }
                       
                       BluetoothLEDBlink(); // LED 깜빡거리는 함수
                       break;
    case DATASEND:
                  BluetoothLEDOn(); // LED 계속 켜짐

                  SensorDataRead(); // 센서값들 읽기

                  SensorDataSend(); // 센서 값들 전송
        
                  programStep = DATACONFIRM;
                  
                  break;
                  
    case DATACONFIRM:
                     while(BTSerial.available())  //BTSerial 값이 있으면
                     {
                        char blueChar = (char)BTSerial.read();  //BTSerial int형식의 값을 char형식으로 변환
//                        Serial.println(blueChar);   // 디버깅 코드
                        BlueString+=blueChar;   //수신되는 문자열을 BlueString 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
                        delay(5);           //수신 문자열 끊김 방지
                     }
  
                     if(!BlueString.equals(""))  //myString 값이 있다면
                     {
                         if(BlueString == "ok")  
                         {
                           programStep = DATASEND;
                           BlueString="";  //BlueString 변수값 초기화
                           
                           blueTimer = millis(); 
                           previousblueTimer = blueTimer;
                           break;
                         }
                       BlueString="";  //BlueString 변수값 초기화
                     }

                     blueTimer = millis();

                     if(blueTimer - previousblueTimer > 3000)   // 3초이상 데이터 안들어올경우 대기상태로 돌아감
                     {
                        programStep = SIGNALWAITING;
                        blueTimer = millis();
                        previousblueTimer = blueTimer;
                     }
                       
                     break;
    default:
            break;
  }
}

void LightSensorInit(void)
{
  light.begin();

  unsigned char ID;
  
  if (light.getID(ID))
  {
    
  }
  else
  {
    byte error = light.getError();
  //  printError(error);
  }

  gain = 0;
  unsigned char time = 2;
//  Serial.println("Set timing...");
  light.setTiming(gain,time,ms);
//  Serial.println("Powerup...");
  light.setPowerUp();
}

double LightSensorRead(void)
{
  double lux = 0;    // Resulting lux value
  
  delay(ms);

  unsigned int data0, data1;

  if (light.getData(data0,data1))
  {
    // getData() returned true, communication was successful
 
    boolean good;  // True if neither sensor is saturated
    
    // Perform lux calculation:

    good = light.getLux(gain,ms,data0,data1,lux);
    
    // Print out the results:
  
  }
  else
  {
    // getData() returned false because of an I2C error, inform the user.

    byte error = light.getError();
//    printError(error);
  }

  return lux;
}

void printError(byte error)
  // If there's an I2C error, this function will
  // print out an explanation.
{
  Serial.print("I2C error: ");
  Serial.print(error,DEC);
  Serial.print(", ");
  
  switch(error)
  {
    case 0:
      Serial.println("success");
      break;
    case 1:
      Serial.println("data too long for transmit buffer");
      break;
    case 2:
      Serial.println("received NACK on address (disconnected?)");
      break;
    case 3:
      Serial.println("received NACK on data");
      break;
    case 4:
      Serial.println("other error");
      break;
    default:
      Serial.println("unknown error");
  }
}

void THumidityInit(void)
{
  THumidity.begin();
}

void THumidityRead(void)
{
  if (THumidity.measure()) {
    temperature = THumidity.getTemperature();
    humidity = THumidity.getHumidity();
  }
  else {  // error has occured
    int errorCode = THumidity.getErrorCode();
    switch (errorCode) {
      case 1: Serial.println("ERR: Sensor is offline"); break;
      case 2: Serial.println("ERR: CRC validation failed."); break;
    }    
  }
}

double SoilHumidityRead(void)
{
  int sensorValue = 0;
  double calculation = 0;

  sensorValue = analogRead(SOILPIN);

  calculation = (1023 - sensorValue) * 0.098;
  
  return calculation;
}

void TemperatureInit(void)
{
  Temperature.begin(); 
}

double TemperatureRead(void)
{
  double temperature = 0;
  
  Temperature.requestTemperatures(); 
  
  temperature = Temperature.getTempCByIndex(0);
  
  return temperature;
}

void BluetoothLEDInit(void)
{
  pinMode(BLUELED, OUTPUT);
  digitalWrite(BLUELED, LOW);
}

void BluetoothLEDBlink(void)
{
  ledTimer = millis();

  if(ledTimer - previousLedTimer > 200)
  {
      if(ledFlag == 0)
      {
        digitalWrite(BLUELED, HIGH);
        ledFlag = 1;
      }
      else 
      {
        digitalWrite(BLUELED, LOW);
        ledFlag = 0;
      }
      ledTimer = millis();
      previousLedTimer = ledTimer;
  }
}

void BluetoothLEDOn(void)
{
  digitalWrite(BLUELED, HIGH);
}

void SensorDataRead(void)
{
  lux = LightSensorRead();

  THumidityRead();  //온습도 센서 값일기
         
  soilHumidity = SoilHumidityRead();
 
  soilTemperature = TemperatureRead();                         
}

void SensorDataSend(void)
{
//  Serial.println("data start");       // 디버깅 코드
  BTSerial.print((int)temperature);
  BTSerial.print(",");
  BTSerial.print((int)humidity);
  BTSerial.print(",");
  BTSerial.print((int)lux);
  BTSerial.print(",");
  BTSerial.print((int)soilTemperature);
  BTSerial.print(",");
  BTSerial.print((int)soilHumidity);
  BTSerial.println("~");
}

엄청길죠...?

원래는 각기능마다 해더파일과 소스파일로 각각나눠야 하지만 아두이노 프로그램 자체가 통짜프로그램 방식이기에 귀찮아서 한파일로 만들었습니다.

ㅠㅠ 이때당시의 저는 귀찮음이 상당했네요.

아무튼 소스는 공개했구... 글이 길어질것같아서 내일부터 차근차근 분석을 해보도록 하겠습니다.

이만 다들 좋은하루 되세요.

극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기1
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기2
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기3
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기4
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기5
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기6
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기7
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기8
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기9
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기10
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기11
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기12

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57839.82
ETH 3132.70
USDT 1.00
SBD 2.43