BASIC4MCU | 질문게시판 | 보드레이트 관련 재질문
페이지 정보
작성자 죠르디 작성일2022-06-16 15:42 조회230회 댓글9건본문
안녕하세요 저번에 질문드린 내용입니다. 저번에 코드 합치는 거 질문 드렸었는데 이제 막 시험이 끝나서 오늘 저번에 답변해주신 코드 실행해봤는데 앱에 블루투스를 연결해도 값이 나오지 않습니다. 합치기 전의 코드로 했을 때는 값이 나오는 것은 확인했습니다.
#include <Wire.h>
#include "DHT.h"
#include <SoftwareSerial.h>
#define DHTPIN 4 // SDA 핀의 설정
#define DHTTYPE DHT22 // DHT22 (AM2302) 센서종류 설정
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial BTserial(8,9); //블루투스 연결
//
const int MPU_ADDR = 0x68; // I2C통신을 위한 MPU6050의 주소
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // 가속도(Acceleration)와 자이로(Gyro)
double angleAcX, angleAcY, angleAcZ;
double angleGyX, angleGyY, angleGyZ;
double angleFiX, angleFiY, angleFiZ;
const double RADIAN_TO_DEGREE = 180/ 3.14159;
const double DEG_PER_SEC = 32767 / 250; // 1초에 회전하는 각도
const double ALPHA = 1 / (1 + 0.04);
// GyX, GyY, GyZ 값의 범위 : -32768 ~ +32767 (16비트 정수범위)
unsigned long now = 0; // 현재 시간 저장용 변수
unsigned long past = 0; // 이전 시간 저장용 변수
double dt = 0; // 한 사이클 동안 걸린 시간 변수
double averAcX, averAcY, averAcZ;
double averGyX, averGyY, averGyZ;
//
long t,t1;
//
void setup() {
dht.begin();
initSensor();
BTserial.begin(9600);
Serial.begin(115200);
caliSensor(); // 초기 센서 캘리브레이션 함수 호출
past = millis(); // past에 현재 시간 저장
pinMode(13,OUTPUT);
}
//
void loop() {
getData();
getDT();
angleAcX = atan(AcY / sqrt(pow(AcX, 2) + pow(AcZ, 2)));
angleAcX *= RADIAN_TO_DEGREE;
angleAcY = atan(-AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2)));
angleAcY *= RADIAN_TO_DEGREE;
// 가속도 센서로는 Z축 회전각 계산 불가함.
// 가속도 현재 값에서 초기평균값을 빼서 센서값에 대한 보정
angleGyX += ((GyX - averGyX) / DEG_PER_SEC) * dt; //각속도로 변환
angleGyY += ((GyY - averGyY) / DEG_PER_SEC) * dt;
angleGyZ += ((GyZ - averGyZ) / DEG_PER_SEC) * dt;
// 상보필터 처리를 위한 임시각도 저장
double angleTmpX = angleFiX + angleGyX * dt;
double angleTmpY = angleFiY + angleGyY * dt;
double angleTmpZ = angleFiZ + angleGyZ * dt;
// (상보필터 값 처리) 임시 각도에 0.96가속도 센서로 얻어진 각도 0.04의 비중을 두어 현재 각도를 구함.
angleFiX = ALPHA * angleTmpX + (1.0 - ALPHA) * angleAcX;
angleFiY = ALPHA * angleTmpY + (1.0 - ALPHA) * angleAcY;
if(abs(angleFiX) >= 50) {
tone(13,261.6,1000);}
angleFiZ = angleGyZ; // Z축은 자이로 센서만을 이용하열 구함(가속도센서 z축 회전 감지 불가)
//Serial.print("AngleAcX:"); Serial.print(angleAcX);
Serial.print("\t FilteredX:"); Serial.print(angleFiX);
//Serial.print("\t AngleAcY:"); Serial.print(angleAcY);
Serial.print("\t FilteredY:"); Serial.println(angleFiY);
//Serial.print("\t AngleGyZ:"); Serial.print(angleGyZ);
//Serial.print("\t FilteredZ:"); Serial.println(angleFiZ);
//Serial.print("Angle Gyro X:"); Serial.print(angleGyX);
//Serial.print("\t\t Angle Gyro y:"); Serial.print(angleGyY);
//Serial.print("\t\t Angle Gyro Z:"); Serial.println(angleGyZ);
//delay(20);
}
//----------------------
t=millis();
if(t-t1>=1000){ t1=t; // 매 1초마다
float t=dht.readTemperature();
float h=dht.readHumidity();
if(isnan(t) || isnan(h)){ Serial.println("Failed to read from DHT"); }
else{
Serial.print("Temperature: "); Serial.print(t); Serial.print(" ºC\t");
Serial.print("Humidity: "); Serial.print(h); Serial.println(" % rH");
}
BTserial.print(t); BTserial.println(" ºC");
BTserial.print(h); BTserial.println(" %");
if(t>=29 || h>=80){ BTserial.println("기저귀를 확인하세요."); }
else { BTserial.println("기저귀가 뽀송합니다."); }
}
}
//
void initSensor() {
Wire.begin();
Wire.beginTransmission(MPU_ADDR); // I2C 통신용 어드레스(주소)
Wire.write(0x6B); // MPU6050과 통신을 시작하기 위해서는 0x6B번지에
Wire.write(0);
Wire.endTransmission(true);
}
//
void getData() {
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B); // AcX 레지스터 위치(주소)를 지칭합니다
Wire.endTransmission(false);
Wire.requestFrom(MPU_ADDR, 14, true); // AcX 주소 이후의 14byte의 데이터를 요청
AcX = Wire.read() << 8 | Wire.read(); //두 개의 나뉘어진 바이트를 하나로 이어 붙여서 각 변수에 저장
AcY = Wire.read() << 8 | Wire.read();
AcZ = Wire.read() << 8 | Wire.read();
Tmp = Wire.read() << 8 | Wire.read();
GyX = Wire.read() << 8 | Wire.read();
GyY = Wire.read() << 8 | Wire.read();
GyZ = Wire.read() << 8 | Wire.read();
}
//
void getDT() {
now = millis();
dt = (now - past) / 1000.0;
past = now;
}
//
void caliSensor() {
double sumAcX = 0 , sumAcY = 0, sumAcZ = 0;
double sumGyX = 0 , sumGyY = 0, sumGyZ = 0;
getData();
for (int i=0;i<10;i++) {
getData();
sumAcX+=AcX; sumAcY+=AcY; sumAcZ+=AcZ;
sumGyX+=GyX; sumGyY+=GyY; sumGyZ+=GyZ;
delay(50);
}
averAcX=sumAcX/10; averAcY=sumAcY/10; averAcZ=sumAcY/10;
averGyX=sumGyX/10; averGyY=sumGyY/10; averGyZ=sumGyZ/10;
}
댓글 9
조회수 230master님의 댓글
master 작성일시리얼 모니터에도 아무런 값이 안나오든가요?
죠르디님의 댓글
죠르디 작성일시리얼모니터 115200으로는 자이로센서 값이 잘 나오는데 9600 선택하면 아예 안나와요!
master님의 댓글
master
시리얼모니터를 왜 9600으로 바꿨죠?
죠르디님의 댓글
죠르디
바꾼 것이 아니고 시리얼모니터에는 보드레이트를 115200으로 선택했을 때 자이로센서 값만 나와서 온도, 습도 값은 9600으로 선택하면 나오는 줄 알았는데 이상한 외계어만 나옵니다ㅜㅜ
master님의 댓글
master
온습도 코드가 엉뚱한 곳에 가 있었네요
다시 컴파일 해보세요
죠르디님의 댓글
죠르디
initSensor();에서 에러가 나옵니다ㅜㅜ
죠르디님의 댓글
죠르디
void setup 구문 안에 있는 initSensor();입니다
죠르디님의 댓글
죠르디
아 이 오류는 void set up위로 함수 위치 바꿔서 해결된 것 같은데 밑에 t = illis();에서 오류가 나네요 't' does not name a type이라고 뜹니다 ㅜㅜ
죠르디님의 댓글
죠르디
아 이것도 방금 해결했는데 하나가 문제입니다ㅜㅜ 새 글 올리겠습니다