BASIC4MCU | 질문게시판 | 센서 동작 스케치 4개 합치려면 어떻게 해야될까요?
페이지 정보
작성자 아두이노뉴비 작성일2020-12-07 22:23 조회15,216회 댓글3건본문
include <Servo.h>
#include "DHT.h" // DHT11를 사용하기 위한 라이브러리 호출하기// 온습도 센서를 디지털 3번 핀에 연결합니다.
#define DHTPIN 3
#define DHTTYPE DHT11int piezoPin = 2; // 피에조 부저의 +극을 오렌지보드 2번에 연결
int airCon = 7; // RGB LED의 파란색 핀을 디지털 9번 연결
int notes[] = {4186, 4698, 5274, 5587, 6271}; // 가까울 시 울릴 경보의 멜로디 작성
boolean flag = 0;DHT dht(DHTPIN, DHTTYPE);
int motor = 5; // 서보 모터의 핀 번호
int LED = 6; // LED의 핀 번호
Servo servo;
void setup(){
Serial.begin(9600); // 시리얼 통신, 속도는 9600
servo.attach(motor); // 모터 시작
pinMode(motor,OUTPUT); // 모터 출력
dht.begin();
pinMode(piezoPin, OUTPUT); // 피에조 핀을 출력핀으로 설정
pinMode(airCon, OUTPUT); // 3색 LED중 파란색 핀을 출력핀으로 설정
}
void loop(){
int sensor = analogRead(A0); // 조도센서의 데이터 받아오기
if (sensor > 1000){ // 주위가 어둡다면
digitalWrite(LED, HIGH); // led 켜주기
for(int i = 0; i < 180; i++){ // 서보 모터의 각도를 180도로
servo.write(i);
delay(10);
}
while(sensor >=1000 && sensor <= 1023){ // 조도센서의 빛 밝기에 변함이 없을 때
delay(100);
sensor = analogRead(A0); // 조도센서의 값 재입력
}
}else { // 주위가 밝다면
digitalWrite(LED, LOW); // led꺼주기
for(int k = 180; k> 0; k--){ // 서보모터의 각도를 0도로
servo.write(k);
delay(10);
}
while(sensor >= 0 && sensor < 1000){ // 조도센서의 빛 밝기에 변함이 없을 때
delay(100);
sensor = analogRead(A0); // 조도센서의 값 재입력
}
}float humidity = dht.readHumidity();
float temperature = dht.readTemperature();if (isnan(humidity) || isnan(temperature) ) {
Serial.println("Failed to read from DHT sensor!");
return;
}// 측정된 온도, 습도값으로 불쾌지수 값 계산 후 시리얼 모니터에 출력
float discomfortIndex = (1.8 * temperature) - (0.55 * (1 - humidity / 100.0) * (1.8 * temperature - 26)) + 32;
Serial.println(discomfortIndex);// 불쾌지수값이 70보다 높을 경우
if (discomfortIndex > 70) {
// 에어콘(파란색 LED)를 켜주면서 멜로디를 재생
digitalWrite(airCon, HIGH);
if (flag == 0) {
for (int i = 0; i < 5; i++) {
tone(piezoPin, notes[i], 300);
delay(150);
}
flag = 1;
}
}else {
// 에어콘(파란색 LED)를 끔
digitalWrite(airCon, LOW);
flag = 0;
}
delay(1500);
}
위에코딩에서 핀번호는 그냥 무시해주시고 합친거만 봐주세요
뭐 대충 이런식인데 4가지 센서를 조합을 해볼려고해여
1. 조도센서 입력값을 통한 서보모터 led 제어
2. 온습도센서 입력값을 통한 led 및 피에조 부저 제어
3. 초음파 센서 입력값을 통한 led ON/OFF 제어
4. 적외선 센서 입력값을 통한 led ON/OFF 제어
이렇게 4개를 한구성으로 하고싶은데..
1 / 2 / 3 / 4 각각 따로따로 업로드해서 실행하면 다 원하는데로 잘 동작하는데.
심지어 1/2를 위의 코딩처럼 선언끼리 셋업끼리 루프끼리 묶으면 잘동작해여
근데 3이나 4를 추가하는순간 1번빼고 다 먹통이 되버리네요 ?
코딩자체에 문제가 있는건지..
멀티쓰레드문제라고 봐야되는건지..
loop를 여러개쓰는건 컴파일자체가 안되고..
task를 나눠서 독립적으로 동작하게 코딩이 가능한가요 ?
도움좀 부탁드립니다
댓글 3
조회수 15,216master님의 댓글
master 작성일
while(sensor >=1000 && sensor <= 1023){ // 조도센서의 빛 밝기에 변함이 없을 때
delay(100);
sensor = analogRead(A0); // 조도센서의 값 재입력
}
무한루프에서 빠져나오지 못하면 다른 코드가 실행 될리가 없겠죠?
아두이노뉴비님의 댓글
아두이노뉴비
while 대신 if로 바꿔주면 브레이크를 따로 추가안해도 빠져나와서 동작할까요 ?
master님의 댓글
master
if문은 1회 실행 후 빠져나옵니다.