BASIC4MCU | 질문게시판 | 아두이노 DHT11,팬모터,네오픽셀,적외선센서,블루투스(부기능코딩)
페이지 정보
작성자 조숩인 작성일2022-05-07 06:59 조회298회 댓글5건본문
학교에서 활동으로 프로그래밍 하고있는데요… 제발 살려주세요ㅠㅠ 마지막 합치는 단계에서 막혔어요.. 제가 원하는 코딩은
1. 55%습도가 넘어가면 5초동안 팬모터가 켜졌다가 꺼짐
2. 앱에서 y버튼 누르면 5초동안 팬모터 켜짐
3. 슬라이더 제어로 표시된 값이 현재 습도값보다 낮으면 팬모터 켜짐
4. 적외선 센서 거리값이 13미만일 때 네오픽셀 켜짐
5. 앱에서 o누르면 네오픽셀 5초동안 켜졌다가 꺼짐
이거입니다. (앱이랑도 연동) 각각 할 때는 원하는데로 잘 됐는데 합치니깐 모순이 너무 많네요 ㅠㅠㅠㅠㅜ 이상하게 작동돼요.. 1,2번은 잘 되는데 3번이 아예 안돼요 1번 팬모터 구동할 때 millis함수 쓰고 5초동안 켜졌다가 꺼지게 고쳐주시면 감사하겠습니다.. 그리고 4,5번은 잘 켜지긴하는데 값이 자꾸 튀는지 지멋대로 1초 켜지고 꺼지고 갑자기 켜졌다가 꺼지고 반복해요ㅜㅜ 제발 도와주세요.. 정말 고민 많이 하고 올리는 겁니다! 혹시 구동원리? 이해안가시는 거 있으면 댓글 남겨주세요..! 피드백 주시면 바로 센서들로 실험 가능해서 잘 된다면 기프티콘 드릴게유,,, 정말 간절합니다 도와주시면 감사하겠습니다. 아! delay함수 대신 millis함수로 사용해야합니당
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN A11 //DHT 핀번호
#define R A10 //릴레이 핀번호
DHT dht(DHTPIN, DHTTYPE);
#include <Adafruit_NeoPixel.h>
#define sensor A0 //적외선 센서 입력번호
#define Pin1 A8 //네오픽셀 핀번호
#define NUM_LEDS 11 //네오픽셀 갯수
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, Pin1, NEO_GRB + NEO_KHZ800);
#define CTIME 5000
#define LTIME 5000
void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
pinMode(DHTPIN, INPUT);
pinMode(A9, OUTPUT);
pinMode(R, OUTPUT);
digitalWrite(A9, HIGH);
dht.begin();
strip.setBrightness(50);
strip.begin();
strip.show();
}
void loop()
{
int depth;
double humidity, humThHtoD;
unsigned long ledTime = millis() - 10000, ledTime2 = millis() - 10000, coolTime = millis() - 10000, coolTime2 = millis() - 10000;
unsigned long ledtime;
char bt;
String humThH = ""; //빈 문자 생성
while (1)
{
humidity = dht.readHumidity();
Serial.println(humidity);
Serial1.println(humidity); //어플에 습도값 띄움
if (humidity >= 55)
{
coolTime2 = millis();
}
else
{
digitalWrite(R, LOW);
}
bt = Serial1.read(); //어플에서 버튼을 읽었을 때
/*앱에서 수동으로 팬모터 및 LED 제어*/
if (bt == 'y') // fanManual
{
coolTime = millis();
}
else if ( bt == 'o') //ledManual
{
ledTime = millis();
}
/*앱에서 슬라이더로 팬모터 제어*/
if (Serial1.available())
{
humThH = Serial1.readStringUntil('c');
humThHtoD = humThH.toDouble();
digitalWrite(R, humidity > humThHtoD ? HIGH : LOW);
}
// 팬모터 구동
digitalWrite(R, (millis() - coolTime < CTIME) || (millis() - coolTime2 < CTIME) ? HIGH : LOW);
//적외선 센서 거리
depth = AtoD();
//Serial.println(depth);
/*적외선 거리 13 미만일 때 LED ON되게 millis로 제어*/
if (depth < 13)
{
millis() - ledtime < LTIME;
}
else
{
LedOff();
ledtime = millis();
}
//LED 구동
(millis() - ledTime < LTIME) || (depth < 13) ? LedOn() : LedOff();
}
}
void LedOn()
{
for (int i = 0; i < strip.numPixels(); i++)
{
strip.setPixelColor(i, 0, 255, 255);
strip.show(); //OFF
}
}
void LedOff()
{
for (int i = 0; i < strip.numPixels(); i++)
{
strip.setPixelColor(i, 0, 0, 0);
strip.show(); //OFF
}
}
int AtoD()
{
int d;
float volts;
volts = analogRead(sensor) * 0.0048828125;
// A/D 값 변환을 위한 5/1024(분해능)을 곱해준다
d = 13 * pow(volts, -1); // pow(x,y):x의 y승
return d;
}
댓글 5
조회수 298master님의 댓글
master 작성일
//humThH=Serial1.readStringUntil('c');
//humThHtoD=humThH.toDouble();
//digitalWrite(R,humidity>humThHtoD ? HIGH:LOW);
3. 슬라이더 제어로 표시된 값이 현재 습도값보다 낮으면 팬모터 켜짐
아두이노에서 슬라이더 값을 받는 것이 간단하지 않습니다.
앱에서 아두이노가 보내주는 습도값을 받아서 슬라이더 값과 비교하고
팬모터 킬 일이 있으면 'y'를 보내세요
master님의 댓글
master 작성일
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN A11 //DHT 핀번호
#define R A10 //릴레이 핀번호
DHT dht(DHTPIN,DHTTYPE);
//
#include <Adafruit_NeoPixel.h>
#define sensor A0 //적외선 센서 입력번호
#define Pin1 A8 //네오픽셀 핀번호
#define NUM_LEDS 11 //네오픽셀 갯수
Adafruit_NeoPixel strip=Adafruit_NeoPixel(NUM_LEDS,Pin1,NEO_GRB + NEO_KHZ800);
//
#define CTIME 5000
#define LTIME 5000
//
void setup(){
pinMode(DHTPIN,INPUT);
pinMode(A9,OUTPUT); digitalWrite(A9,HIGH);
pinMode(R,OUTPUT);
Serial.begin(9600);
Serial1.begin(9600);
dht.begin();
strip.begin(); strip.setBrightness(50); strip.show();
}
//
void LedOn(){
for(int i=0;i<strip.numPixels();i++)strip.setPixelColor(i,0,255,255);
strip.show();
}
void LedOff(){
for(int i=0;i<strip.numPixels();i++){ strip.setPixelColor(i,0,0,0); }
strip.show();
}
//
int AtoD(){
int d;
float volts;
volts=analogRead(sensor)*0.0048828125;
d=13*pow(volts,-1); // pow(x,y):x의 y승
return d;
}
//
bool humi_flag=0,depth_flag=0;
char bt;
int depth;
unsigned long t,t1,coolTime,coolTime2,ledTime,ledTime2;
double humidity;
//
void loop(){
unsigned long t=millis();
//---------------------------------------
if(t-t1>=1000){ t1=t; // 1초마다
humidity=dht.readHumidity();
Serial.println(humidity); Serial1.println(humidity); // 습도 출력
//---------------------------------------
if(humidity>=55){ // 1. 55%습도가 넘어가면
if(humi_flag==0){ humi_flag=1; coolTime2=t+5000; }
}
else{ humi_flag=0; }
}
//---------------------------------------
if(Serial1.available()){
bt=Serial1.read();
if (bt=='y'){ coolTime=t+5000; } // fanManual // 2. 앱에서 y버튼 누르면 팬모터 5초동안 켜졌다가 꺼짐
else if(bt=='o'){ ledTime =t+5000; } // ledManual // 5. 앱에서 o누르면 네오픽셀 5초동안 켜졌다가 꺼짐
}
//---------------------------------------
// 팬모터 구동
if((coolTime>t)||(coolTime2>t)){ digitalWrite(R,1); } // 5초동안 팬모터가 켜졌다가
else { digitalWrite(R,0); } // 꺼짐
//---------------------------------------
// 4. 적외선 센서 거리값이 13미만일 때 네오픽셀 켜짐
depth=AtoD(); // Serial.println(depth);
if(depth<13){ // 적외선 거리 13 미만일 때 5초동안 LED ON
if(depth_flag==0){ depth_flag=1; ledTime2=t+5000; }
}
else{ depth_flag=0; }
//---------------------------------------
//LED 구동
if((ledTime>t)||(ledTime2>t)){ LedOn(): } // 5초동안 led가 켜졌다가
else { LedOff(); } // 꺼짐
}
조숩인님의 댓글
조숩인
알려주신데로 해봤는데 led가 항상 켜진상태로 있다가 13미만이면 5초동안 켜지고 꺼집니다. 13미만이 아닐 때는 또 항상 켜진상태로 유지됩니다..
조금 수정하여 led는 이런식으로 바꾸었는데 손으로 대고 5초 이후에 켜지고 손을 떼면 바로 꺼지는 상태로 돼요 이 방법이 스쳐지나가는 물건에도 감지를 안해서 좋은 방법인 거 같은데 5초 동안 거리를 인식하고 5초만 켜지게 할 수 있는 if문은 무엇을 쓰는게 좋을까요..??
depth = AtoD();
if (depth < 13)
{
if (depth_flag == 0)
{
ledTime2 = t + 5000;
depth_flag = 1;
}
}
else
{
depth_flag = 0;
}
//LED ON, OFF
if ((ledTime > t) || (ledTime2 < t))
{
LedOn();
}
else
{
LedOff();
}
}
master님의 댓글
master 작성일
led가 항상 켜진상태로 있다가 13미만이면 5초동안 켜지고 꺼집니다. 13미만이 아닐 때는 또 항상 켜진상태로 유지됩니다..
//
//LED 구동
if((ledTime>t)||(ledTime2>t)){ LedOn(): } // 5초동안 led가 켜졌다가
else { LedOff(); } // 꺼짐
ledTime2는 정상적으로 동작하고 있는 것으로 보입니다.
ledTime이 문제가 있겠죠
else if(bt=='o'){ ledTime =t+5000; } // ledManual // 5. 앱에서 o누르면 네오픽셀 5초동안 켜졌다가 꺼짐
앱에서 'o'를 계속 주고 있는 것 아닌지 체크하세요
master님의 댓글
master 작성일
void loop(){
unsigned long t=millis();
중요한 것은 아니지만
void loop(){
t=millis();
이렇게 수정하세요