BASIC4MCU | 질문게시판 | 앱인벤터 블루투스 온습도제어 모터 오류
페이지 정보
작성자 박효신조아요 작성일2020-09-08 15:40 조회2,651회 댓글0건첨부파일
본문
아두이노를 이용하여 rtc모듈을 사용하고 있습니다. Rtc모듈로 원하는 시간울 정해두고 그 시간에 모터가 움직이도록 설계하였습니다.
그리고 시간은 딜레이함수를 쓰지않고, millis를 사용하였습니다.
그 시간에 따라 온습도센서로 온습도도 1초마다 받도록하였습니다.
이때 블루투스를 이용하여 앱인벤터로 rtc모듈의 시간값과 온습도값을 출력시키고싶은데,
시리얼모니터에서는 잘 값이 출력되는데
모터가 오류가 납니다.
무엇이 문제일까요? 동영상 파일 첨부합니다.
아래는 코드입니다.
#include <SoftwareSerial.h>
#define BT_RXD 7
#define BT_TXD 8
SoftwareSerial bluetooth(BT_TXD, BT_RXD);
//블루투스
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
//DHT
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
char in_data;
long interval = 1000;
long previousMillis = 0;
//통신, RTC
#include <Servo.h>
Servo servo;
int servoPin = 9;
int angle = 0;
//Servo
#define SensorPin A0 //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.00 //deviation compensate
#define samplingInterval 1000
#define ArrayLenth 40 //times of collection
int pHArray[ArrayLenth]; //Store the average value of the sensor feedback
int pHArrayIndex=0;
static unsigned long samplingTime = millis();
static float pHValue,voltage;
//PH
void setup ()
{
Serial.begin(9600);// 시리얼 프린트 시작
bluetooth.begin(9600);
dht.begin();
if (! rtc.begin()) //(!는 논리 부정연산자로 거짓을 참으로 참을 거짓으로 바꾸어 줍니다. 즉 RTC가 시작을 하지 않는다면 이라는 조건입니다.)
{
Serial.println("RTC를 찾을 수 없습니다.");
while (1); //1번 반복
}
if (rtc.lostPower())
{
Serial.println("RTC가 전원이 없습니다. 시간을 설정합니다."); //RTC에 전원이 없다면
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0)); 이렇게 설정하셔야합니다.
}
servo.attach(servoPin);
}
void loop ()
{
unsigned long currentMillis = millis();
if( currentMillis - previousMillis > interval )
{
previousMillis = currentMillis;
DateTime now = rtc.now(); //현재시간을 세팅
Serial.print(now.year(), DEC); //년
Serial.print('/');
Serial.print(now.month(), DEC); //월
Serial.print('/');
Serial.print(now.day(), DEC); //날
Serial.println();
Serial.print(now.hour(), DEC); //시간
Serial.print(':');
Serial.print(now.minute(), DEC); //분
Serial.print(':');
Serial.print(now.second(), DEC); //초
Serial.println();
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("습도 : ");
Serial.print(h);
Serial.println(" %");
Serial.print("온도 : ");
Serial.print(t);
Serial.println(" 'C");
Serial.println();
bluetooth.print("습도 : ");
bluetooth.print(h);
bluetooth.println(" %");
bluetooth.print("온도 : ");
bluetooth.print(t);
bluetooth.println(" 'C");
in_data = Serial.read();
if (( now.hour() == 16 && now.minute() == 49 && now.second() == 10) )
{
servo.write(180); //각도 180도로 움직임
}
else if ( now.hour() == 16 && now.minute() == 49 && now.second() == 12 )
{
servo.write(0); //각도 0도로 움직임
}
else
{
servo.write(0);
}
}
if(millis()-samplingTime > samplingInterval)
{
pHArray[pHArrayIndex++]=analogRead(SensorPin);
if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
pHValue = 3.5*voltage+Offset;
samplingTime=millis();
Serial.print("pH value: ");
Serial.print(pHValue,2);
Serial.println("\n");
bluetooth.print("pH value: ");
bluetooth.print(pHValue,2);
bluetooth.println("\n");
}
}
double avergearray(int* arr, int number)
{
int i;
int max,min;
double avg;
long amount=0;
if(number<=0)
{
Serial.println("Error number for the array to avraging!/n");
return 0;
}
if(number<5)
{
for(i=0;i<number;i++)
{
amount+=arr[i];
}
avg = amount/number;
return avg;
}
else
{
if(arr[0]<arr[1])
{
min = arr[0];max=arr[1];
}
else
{
min=arr[1];max=arr[0];
}
for(i=2;i<number;i++)
{
if(arr[i]<min)
{
amount+=min; //arr<min
min=arr[i];
}
else
{
if(arr[i]>max)
{
amount+=max; //arr>max
max=arr[i];
}
else
{
amount+=arr[i]; //min<=arr<=max
}
}
}
avg = (double)amount/(number-2);
}
return avg;
}
댓글 0
조회수 2,651등록된 댓글이 없습니다.