BASIC4MCU | 질문게시판 | 답변 : 서보모터, 온습도센서 코드 질문
페이지 정보
작성자 master 작성일2022-06-22 14:15 조회105,785회 댓글15건본문
#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,1); delayMicroseconds(tone);
digitalWrite(speakerPin,0); 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(){
pinMode(Sensor,INPUT);
pinMode(speakerPin,OUTPUT);
myservo1.attach(6);
myservo2.attach(5);
dht.begin();
Serial.begin(9600);
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 && h>=80)BTserial.println("O"); else BTserial.println("X");
delay(1000);
}
동영상이 안보이니 증상을 정확히는 모르겠고..(무슨 유료 코덱을 설치 하라고 해서 패스)
코드에서 특별히 눈에 띄는 부분은 없습니다.
댓글 15
조회수 105,785kshdlfaldfh님의 댓글
kshdlfaldfh 작성일이거 카카오 팟플레이어 깔고 거기서 열면 볼 수 있습니다!
master님의 댓글
master 작성일
myservo1.write(pos);
myservo2.write(pos);
둘 중의 하나만 움직이는 것이 맞나요? myservo1? myservo2? 어느쪽 모터죠?
움직이는 각도는 0도~100도인가요? 그보다 적나요?
kshdlfaldfh님의 댓글
kshdlfaldfh 작성일둘 다 움직이고 100도까지는 아니고 엄청 조금만 왔다갔다 합니다! 마지막에 있는 delay가 문제가 될 가능성은 없나요??
master님의 댓글
master 작성일
run=0;
이 변수를 설정하기 때문에 마지막 딜레이와 상관이 없습니다.
//
void flash(){ //서보모터 작동
static char flag=0;
if(run){ flag=0;
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{
if(flag==0){ flag=1;
pos=0; myservo1.write(0); myservo2.write(0);
}
}
}
인터럽트 함수를 변경해서 돌려보세요
kshdlfaldfh님의 댓글
kshdlfaldfh 작성일처음이랑 똑같습니다ㅜㅜ
master님의 댓글
master 작성일
선이 길어서 케이블에 노이즈가 탈까요?
왜 혼자서 움직일까요?
kshdlfaldfh님의 댓글
kshdlfaldfh 작성일
#include <MsTimer2.h>
#include <Servo.h>
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);
pinMode(Sensor,INPUT);
pinMode(speakerPin, OUTPUT);
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;
}
}
단순히 서보모터만 실행했을 때는 잘 실행됩니다.
#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); //블루투스 연결
void setup() {
Serial.begin(9600);
dht.begin();
BTserial.begin(9600);
}
void loop() {
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) { //온도가 29도가 넘고 습도가 80%가 넘을시
BTserial.println("기저귀를 확인하세요."); //출력
} else{
BTserial.println("기저귀가 뽀송합니다.");
}
delay(1000);
}
이 코드와 합치면서 문제가 생긴 듯해요..ㅜ^ㅜ
master님의 댓글
master 작성일
myservo1.attach(6);
myservo2.attach(5);
서보모터를 9번 10번으로 옮겨서 돌려보세요 ( 3번 11번도 있습니다.)
다른핀이 이미 사용하고 있다면 그 핀도 옮기세요
kshdlfaldfh님의 댓글
kshdlfaldfh 작성일3,11과 9,10번으로 옮겨도 똑같네요 대체 뭐가 문제인지 ㅜㅜ
master님의 댓글
master 작성일
PWM핀이 아닌 곳으로 옮겨보세요
타이머 충돌 때문에 생기는 것 같습니다.
DHT도 타이머2를 사용합니다.
kshdlfaldfh님의 댓글
kshdlfaldfh 작성일9,10이 PWM핀이 아닌 곳 아닌가요?
master님의 댓글
master 작성일
PWM핀은 보드에 적혀있자나요?
이런 내용까지 질문하시면 곤란합니다.
kshdlfaldfh님의 댓글
kshdlfaldfh 작성일PWM 아닌 4,7번에 서보모터 옮겼는데 똑같아요ㅜ
master님의 댓글
master 작성일
#include "DHT.h"
#include <SoftwareSerial.h>
둘 중 하나에서 서보모터와 타이머 충돌이 있는 것으로 생각됩니다.
해결 방법은 간단하지 않을 것 같습니다.
아두이노 메가를 사용하고 타이머와 라이브러리를 공부하면 될 것 같기는 한데
초보자에겐 쉽지 않을테니...
kshdlfaldfh님의 댓글
kshdlfaldfh 작성일그래도 도움 주셔서 감사합니다...!!!