#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개를 사용하는 방법이 없나요..?? 아두이노에 대해 너무 문외한이라 잘 모르겠습니다.ㅠㅠ
|