BASIC4MCU | 질문게시판 | 서보모터, 온습도센서 코드 질문
페이지 정보
작성자 kshdlfaldfh 작성일2022-06-22 13:20 조회13,344회 댓글2건첨부파일
본문
안녕하세요. 여쭤볼 게 있어서 글 남깁니다. 소리가 130이 넘으면 서보모터와 스피커가 작동하고 온습도가 일정값이 넘으면 O,X 데이터를 앱에 전송하는 코드를 작성하였는데 어디서 잘못된 것인지 실행을 시키면 소리가 130이 넘지 않은 상태에서 서보모터가 조금씩 작동을 합니다. (첨부된 영상) 이 코드에 오류가 있는건가요..? 코드를 서보모터와 온습도를 따로따로 작동시켰을 때에는 오류가 없는 걸로 보아 합치면서 오류가 생긴 듯합니다.
#include <MsTimer2.h>
#include <Servo.h>
#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); //블루투스 연결
Servo myservo1;// create servo object to control a servo
Servo myservo2;// twelve servo objects can be created on most boards
int Sensor = A1;
int speakerPin = 12;
char notes[] = "ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc ";
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 300;
volatile int pos=0,length=15,len=0,run=0;
void playTone(int tone, int duration) { //자장가 출력1
for (long len = 0; len < duration * 1000L; len += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}
void playNote(char note, int duration) { //자장가 출력2
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 2015, 1800, 1619, 1532, 1375, 1236, 1114, 1056 };
for (int len = 0; len < 8; len++) {
if (names[len] == note) {
playTone(tones[len], duration);
}
}
}
void flash() { //서보모터 작동
if(run){
if (len< 5){ if(pos<100)pos++; }
else if(len< 9){ if(pos> 0)pos--; }
else if(len<14){ if(pos<100)pos++; }
else { if(pos> 0)pos--; }
myservo1.write(pos);
myservo2.write(pos);
}
else{
pos=0; myservo1.write(0); myservo2.write(0);
}
}
void setup() {
myservo1.attach(6);
myservo2.attach(5);// attaches the servo on pin 5,6 to the servo object
Serial.begin(9600);
dht.begin();
pinMode(Sensor,INPUT);
pinMode(speakerPin, OUTPUT);
BTserial.begin(9600);
MsTimer2::set(20,flash);// flash함수를 20ms마다 호출한다
MsTimer2::start();
}
void loop() {
int Sound = analogRead(Sensor);
Serial.println(Sound);
if (Sound > 130) { //소리가 130이상이면
run=1;
for (len=0;len<length;len++){
if (notes[len]==' ') { delay(beats[len] * tempo); }
else { playNote(notes[len], beats[len] * tempo); }
delay(tempo / 2);
}
run=0;
}
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 and h >= 80) {
BTserial.println("O"); //출력
} else{
BTserial.println("X");
}
delay(1000);
}
댓글 2
조회수 13,344master님의 댓글
master 작성일
if(t>=29 and h>=80){
문법에 맞지 않는 문장입니다.
if(t>=29 && h>=80){
kshdlfaldfh님의 댓글
kshdlfaldfh 작성일and로 했을 때도 실행되었고, &&로 바꿔도 영상에 나온 거랑 똑같이 작동됩니다..