BASIC4MCU | 질문게시판 | 답변 : 앱인벤터 블루투스 온습도제어 모터 오류
페이지 정보
작성자 master 작성일2020-09-08 16:14 조회6,583회 댓글2건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=13334
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2020-09-08 오후 4:20:48// by Ok-Hyun Park//#include <SoftwareSerial.h>#define BT_RXD 7#define BT_TXD 8SoftwareSerial bluetooth(BT_TXD,BT_RXD);//블루투스#include <DHT.h>#define DHTPIN 2#define DHTTYPE DHT11DHT dht(DHTPIN,DHTTYPE);//DHT#include <Wire.h>#include "RTClib.h"RTC_DS3231 rtc;char in_data;unsigned long samplingTime,interval=1000,previousMillis=0;//통신,RTC#include <Servo.h>Servo servo;int servoPin=10;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 collectionint pHArray[ArrayLenth];int pHArrayIndex=0;float pHValue,voltage;//PHvoid setup(){Serial.begin(9600);bluetooth.begin(9600);dht.begin();if(!rtc.begin()){ Serial.println("RTC를 찾을 수 없습니다."); while(1); }if(rtc.lostPower()){Serial.println("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.println(now.day(),DEC); //년월일Serial.print(now.hour(),DEC); Serial.print(':'); Serial.print(now.minute(),DEC); Serial.print(':'); Serial.println(now.second(),DEC); //시분초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){ samplingTime=millis();pHArray[pHArrayIndex++]=analogRead(SensorPin);if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;voltage=avergearray(pHArray,ArrayLenth)*5.0/1024;pHValue=3.5*voltage+Offset;Serial.print("pH value: "); Serial.println(pHValue,2); Serial.println();bluetooth.print("pH value: "); bluetooth.println(pHValue,2); bluetooth.println();}}//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; min=arr[i]; } //arr<minelse{if(arr[i]>max){ amount+=max; max=arr[i]; } //arr>maxelse { amount+=arr[i]; } //min<=arr<=max}}avg=(double)amount/(number-2);}return avg;}int servoPin=10;
서보모터 핀을 10번이나 11번으로 변경해서 다시 해보세요
millis()함수 및 소프트웨어 시리얼 등에서 타이머를 사용하기 때문에 일부 타이머의 기능에 제한이 생길 수 있습니다.
서보모터도 타이머를 사용합니다.
댓글 2
조회수 6,583박효신조아요님의 댓글
박효신조아요 작성일말씀하신 핀을 변경해서 다시해봤는데 오류가 그대로입니다.
master님의 댓글
master 작성일
무슨 오류인지 모르겠지만
모터전원의 전류가 부족하면 모터가 제대로 동작하지 않습니다.