BASIC4MCU | 질문게시판 | 이유를 모르겠습니다.
페이지 정보
작성자 나난나 작성일2022-06-15 18:56 조회918회 댓글7건본문
처음에는 distance2의 값을 20번 측정해서 평균을 돌려주는 것을 추가했더니
distance1의 값을 측정하는 초음파 센서가 늦게 반응합니다. 원래 바로 열려야 되는데 약 5초 정도 지연됩니다. distance2만 20번 측정한건데 왜 distnace1이 늦어지는 모르겠습니다.
그리고 lcd의 밝기가 서보모터가 90도로 열렸을때는 밝게 빛나는데 0도가 되었을때(뚜껑이 닫혀있을때)는 약간 어두워집니다. 이것 또한 이유를 모르겠습니다.
(뒤에 십자가 돌려서 밝기 최대한 입니다.)
#include <Servo.h>
#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
Servo servo, servo2;
hd44780_I2Cexp mylcd;
// 각 핀 번호 설정
int value=0;
int echo1 = 8;
int trig1 = 9;
int echo2 = 10;
int trig2 = 11;
int speaker = 12;
int red=4;
int green=3;
int cmdSize = 0;
long previousMillis = 0;
char a;
char b;
// 각 핀의 입출력 설정
void setup() {
Serial.begin(9600);
pinMode(trig1, OUTPUT);
pinMode(echo1, INPUT);
pinMode(trig2, OUTPUT);
pinMode(echo2, INPUT);
pinMode(speaker,OUTPUT);
pinMode(red,OUTPUT);
pinMode(green,OUTPUT);
servo.attach(7);
servo2.attach(6);
mylcd.begin(16, 2); //16열 2행짜리 LCD를 사용하겠다.
mylcd.init();
mylcd.setCursor(0,0);
mylcd.print("[");
mylcd.setCursor(10,0);
mylcd.print("] --% ");
}
void customclear()
{
// ensures all custom character slots are clear before new custom
// characters can be defined.
byte blank[8] =
{
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
}
void customset1()
{
customclear();
byte nemo[8] = { 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111,};
byte jo[8]= { 0b11111, 0b00100, 0b01010, 0b10101, 0b00100, 0b00100, 0b11111, 0b00000,};
mylcd.createChar(0, nemo);
mylcd.createChar(1, jo);
}
void loop() {
digitalWrite(trig1, LOW);
digitalWrite(echo1, LOW);
delayMicroseconds(2);
digitalWrite(trig1, HIGH);
delayMicroseconds(10);
digitalWrite(trig1, LOW);
unsigned long duration1 = pulseIn(echo1, HIGH);
float distance1 = ((float)(340 * duration1) / 10000) / 2;
float fDist = distance2();
int fDistp = (1-fDist/37)*100;
customset1();
a = fDistp;
b = fDistp;
long currentMillis = millis();
if (currentMillis - previousMillis >= 7000) {
previousMillis = currentMillis;
}
if(distance1<13) //쓰레기통 뚜껑
{
servo.write(0);
servo2.write(90);
delay(10);
delay(3000);
}else
{
servo.write(90);
servo2.write(0);
delay(10);
}
if(fDist <= 6){ //9단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0);mylcd.write(0);mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.print("] "); if(fDist > 0){mylcd.print("100");} mylcd.print("% ");
digitalWrite(green,HIGH);
digitalWrite(red,LOW);
tone(speaker, 262);
mylcd.setCursor(0,1);
mylcd.print("!FULL! !FULL!");
}else if(fDist <= 9){ //8단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.print(" ] "); if(fDist > 0){mylcd.print( fDistp);} mylcd.print("% ");
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}else if(fDist <= 12){ //7단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.print(" ] "); if(fDist > 0){mylcd.print( fDistp);} mylcd.print("% ");
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}else if(fDist <= 14){ //6단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.print(" ] "); if(fDist > 0){mylcd.print( fDistp);} mylcd.print("% ");
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}else if(fDist <= 16){ //5단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.print(" ] "); if(fDist > 0){mylcd.print( fDistp);} mylcd.print("% ");
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}else if(fDist <= 18){ //4단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.print(" ] "); if(fDist > 0){mylcd.print( fDistp);} mylcd.print("% ");
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}else if(fDist <= 20){ //3단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.write(0); mylcd.write(0); mylcd.print(" ] "); if(fDist > 0){mylcd.print( fDistp);} mylcd.print("% ");
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}else if(fDist <= 22){ //2단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.write(0); mylcd.print(" ] "); if(fDist > 0){mylcd.print( fDistp);} mylcd.print("% ");
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}else if(fDist <= 24){ //1단
mylcd.clear();
mylcd.print("["); mylcd.write(0); mylcd.print(" ] "); if(fDist > 0){mylcd.print( fDistp);} mylcd.print("% ");
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}else{
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
noTone(speaker);
mylcd.clear();
mylcd.print("[ ");
mylcd.print("] --% ");
mylcd.setCursor(0,1);
mylcd.print("Capston's MZZO"); mylcd.write(1);
}
}
float distance2()
{
float fDuration, fdistance=0;
for(int i=0; i<20; i++)
{
digitalWrite(trig2, HIGH);
delay(10);
digitalWrite(trig2, LOW);
fduration = pulseIn(echo2, HIGH);
fdistance += 17 * fduration / 1000.0;
delay(120);
}
return (fdistance/20.0);
}
댓글 7
조회수 918master님의 댓글
master 작성일
for(int i=0; i<20; i++){
digitalWrite(trig2, HIGH); delay(10); digitalWrite(trig2, LOW);
fduration = pulseIn(echo2, HIGH);
fdistance += 17 * fduration / 1000.0;
delay(120);
}
delay(120);*20=2400ms=2.4초
나난나님의 댓글
나난나
이거는 그냥 이만큼 걸리다는 것을 알려주신건가요?
master님의 댓글
master
단순히 딜레이만 2.4초이고
만약 거리측정에 평균 20ms가 걸린다고 하면
20회 측정에 0.4초가 걸리게 됩니다.
distance2() 측정에 거의 3초가 걸리게 되는 것이죠
나난나님의 댓글
나난나
네 distance2는 이만큼 걸려야 되는게 맞는데 왜 distnace1까지 이러는 걸까요? 조건은 distance2만 주었는데...
master님의 댓글
master
밥 한 번 먹고 반찬 한 번 먹다가
밥을 20번 먹고 반찬 한 번 먹는데
왜 밥을 20번 먹는다고 반찬 먹는 시간이 길어졌는 지를 묻는 거 잖아요?
왜 이해를 못하는지를 이해하지 못하겠습니다.
나난나님의 댓글
나난나
해결되었습니다. 감사합니다.
master님의 댓글
master 작성일
서보모터 전류 변화는 두 가지 가능성이 있는데요
1. 90도와 0도의 부하가 다르기 때문에 서보모터 소모전류 차이가 난다.
0도에서 어두워진다면 0도 일 때 뚜껑을 붙들고 있느라고 소모전류가 커지는 것 같습니다.
2. 0도나 180도에서 일부 서보모터는 조정미숙으로 내부 구조물에 닿아서 덜덜 거리면서 소모전류가 커지기도 합니다. 이 때는 각도를 조금 줄여서 사용해야 합니다...만 이 경우는 아닌 것으로 보여집니다.
1번 경우의 해결방법은 전류용량이 큰 전원장치를 사용하면 되겠죠