질문게시판 > 답변 : 서보모터, 온습도센서 코드 질문

TODAY17,202 TOTAL4,296,000
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 답변 : 서보모터, 온습도센서 코드 질문

페이지 정보

작성자 master 작성일2022-06-22 14:15 조회80,824회 댓글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); 

}

 

동영상이 안보이니 증상을 정확히는 모르겠고..(무슨 유료 코덱을 설치 하라고 해서 패스)

코드에서 특별히 눈에 띄는 부분은 없습니다.

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 15

조회수 80,824

kshdlfaldfh님의 댓글

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);
}

이 코드와 합치면서 문제가 생