정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

방수온도센서 2개 코딩 봐주세요 ㅠㅠ
HEJ | 2019-12-05

#include <Servo.h>
#include <OneWire.h>
#include <Wire.h>  
 
int DSX = 3;
int DSY = 6;      
//DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 2번에 연결합니다.   
OneWire dsX(DSX);//2번 핀과 연결되 OneWire 객체 생성
OneWire dsY(DSY);    


Servo myservoX;
Servo myservoY;

int angleX=0;
int angleY=0;
int soil=A0;
int piezo = 5; 

//실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
//변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
  
  myservoX.attach(9);
  myservoY.attach(10);
  pinMode(soil,INPUT);
  pinMode(piezo,OUTPUT);                                                                                                         
  Serial.begin(9600);
}

//SETUP()함수가 호출된 이후, loop()함수가 호출되며,
//블록 안의 코드를 무한히 반복 실행합니다.

void loop() 

 int value=1023-analogRead(soil);
  if(Serial.available())//원하는 설정온도 입력 
  {
     
    float x = getTempX(); //x에 측정온도값 저장
    float y = getTempY() ;//y에 측정온도값 저장
    float T = Serial.parseFloat(); //입력한값이 T에 저장
  
    
    
  if( x-T > 5 or T-y > 5) //x-T와 T-y가 5보다 클때 소숫점으로 나눠줌
{   
    Serial.print(x);
    Serial.print("C,");
    Serial.print(y);
    Serial.println("C");
    float tem =(x-T)/(x-y)*5;
    float tem2=(T-y)/(x-y)*5;
    Serial.print("a:b="); 
    Serial.print(tem2, 0); 
    Serial.print(":");
    Serial.println(tem, 0);
    Serial.print(x);
    Serial.println("C");

  


   

    while(value < 600)
    {

    if(0<= tem and tem < 0.5){
     
      angleX=0;
    }
    
    if(0.5<= tem and tem <1.5) {
      angleX=0;
      angleX=angleX+22; //비율이 1일 때 첫번째 구멍만큼 각도가 움직입니다.(22,31,69,113,162)
    }
    if(1.5<= tem and tem <2.5) {
      angleX=0;
      angleX=angleX+31; //비율이 2일 때 두번째 각도만큼 각도가 움직입니다.
    }
    if(2.5<= tem and tem <3.5) {
      angleX=0;
      angleX=angleX+69; //비율이 3일 때 두번째 각도만큼 각도가 움직입니다.
    }
    if(3.5<= tem and tem <4.5) {
      angleX=0;
      angleX=angleX+113; //비율이 4일 때 두번째 각도만큼 각도가 움직입니다.
    }
    if(4.5<= tem and tem <5.5) {
      angleX=0;
      angleX=angleX+162; //비율이 5일 때 두번째 각도만큼 각도가 움직입니다.
    }

    if(0<= tem2 and tem2 < 0.5){
     
      angleY=0;
    }
    
    if(0.5<= tem2 and tem2 <1.5) {
      angleY=0;
      angleY=angleY+22; //비율이 1일 때 첫번째 구멍만큼 각도가 움직입니다.(22,31,69,113,162)
    }
    if(1.5<= tem2 and tem2 <2.5) {
      angleY=0;
      angleY=angleY+31; //비율이 2일 때 두번째 각도만큼 각도가 움직입니다.
    }
    if(2.5<= tem2 and tem2 <3.5) {
      angleY=0;
      angleY=angleY+69; //비율이 3일 때 두번째 각도만큼 각도가 움직입니다.
    }
    if(3.5<= tem2 and tem2 <4.5) {
      angleY=0;
      angleY=angleY+113; //비율이 4일 때 두번째 각도만큼 각도가 움직입니다.
    }
    if(4.5<= tem2 and tem2 <5.5) {
      angleY=0;
      angleY=angleY+162; //비율이 5일 때 두번째 각도만큼 각도가 움직입니다.
    }

 


    
    //각도를 모니터에 출력하도록 설정
    Serial.print("angleX:");
    Serial.println(angleX);
    Serial.print("angleY:");
    Serial.println(angleY);
    Serial.println(value);
    //서보모터로 지정된 각도로 회전하도록 설정
    myservoX.write(angleX);
    myservoY.write(angleY);
    //0.5초 동안 대기합니다.
    delay(500);

    value = 1023-analogRead(soil);
  }
  analogWrite(piezo,5); 
  angleX=0;  //while함수를 탈출 후 angle을 0도로 설정
  angleY=0;
   
  myservoX.write(angleX); //서보모터를 구동시킨다.
  myservoY.write(angleY);
  delay(1000);

}
}
}

 

 

float getTempX()
{                                   //온도 측정 후 반환하는 함수
 byte dataX[12];
 byte addrX[8];
 if ( !dsX.search(addrX)) {
   dsX.reset_search();
   return -1000;
 }
 if ( OneWire::crc8( addrX, 7) != addrX[7]) {
   return -1000;
 }
 if ( addrX[0] != 0x10 && addrX[0] != 0x28) {
   return -1000;
 }


 dsX.reset();
 dsX.select(addrX);
 dsX.write(0x44,1);                                   
 byte presentX = dsX.reset();
 dsX.select(addrX);  
 dsX.write(0xBE); 
 
 for (int i = 0; i < 9; i++) { 
  dataX[i] = dsX.read();                                                          
 }
 
 dsX.reset_search(); 
 byte MSBX = dataX[1];
 byte LSBX = dataX[0];
 float tempReadX = ((MSBX << 8) | LSBX); 
 float TemperatureSumX = tempReadX / 16; 
 return TemperatureSumX;                                                                    
}

 

 

 

 


float getTempY()
{
  byte dataY[12];
  byte addrY[8];
  if ( !dsY.search(addrY))
  {
      dsY.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addrY, 7) != addrY[7])
  {
      
      return -1000;
  }
  if ( addrY[0] != 0x10 && addrY[0] != 0x28)
  {
      
      return -1000;
  }

  dsY.reset();
  dsY.select(addrY);
  dsY.write(0x44,1); 

  byte presentY = dsY.reset();
  dsY.select(addrY);    
  dsY.write(0xBE);
  
  for (int j = 0; j < 9; j++)
  { 
    dataY[j] = dsY.read();
  }
  
  dsY.reset_search();
  
  byte MSBY = dataY[1];
  byte LSBY = dataY[0];

  float tempReadY = ((MSBY << 8) | LSBY); 
  float TemperatureSumY = tempReadY / 16;
  
  return TemperatureSumY;
  
}

 

 

코딩을 이렇게 작성했는데 방수온도센서 2개를 한번에 사용이 안되네요..그리고 피에조 부저도 왜 안울리는지 잘모르겠어요 ..혹시 방수온도 센서 2개를 한번에 사용하는방법 없나요? Dallastemparature.h를 사용하지 않고는 2개를 사용하는 방법이 없나요..?? 아두이노에 대해 너무 문외한이라 잘 모르겠습니다.ㅠㅠ

이전글   |    초음파센서를 방수시키는법 2019-12-04
다음글   |    오늘주제는 바로이것!! 샤샤샤~~ 2019-12-05