정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

시리얼통신
신재연 | 2016-12-14

 

(COM4:수신부  /COM5:송신부)COM5 로드셀 값을 받아 COM4서 받아들여 그 값을 출력하면서 동시에 인체감지센서의 감지결과를 출력하고 로드셀 값이 30이상이 될경우 서브모터가 작동되지 않게 하는 코딩입니다. 그런데 수신부에서 byte형으로 받아들여서 그런지 33.8라는 숫자를 받아들였으면 위의 그림처럼 한줄에 첫번째자릿수,인체감지센서결과/두번째자릿수,인체감지센서결과/세번째 자릿수,이런식으로 나와서 서브모터가 항상 작동해 버립니다.어떤식으로 해야 숫자가 한번에 나올 수 있을까요??

//수신부

#include  <Servo.h>

Servo myservo;
int pos=0;
int inputPin=2;
int PIR_val=0;

void setup()

  
  myservo.attach(5);
  pinMode(4,INPUT_PULLUP);
  Serial.begin(9600);

  pinMode(inputPin,INPUT);   
}

void loop() 
{
  while(Serial.available()){
  byte data = Serial.read();

  
  PIR_val=digitalRead(inputPin);
     if(digitalRead(4)==LOW)
     {
     if((data<30)&&(PIR_val==HIGH))
      { 
        Serial.println("Motion detected!"); Serial.write(data);
                for (pos = 0; pos <= 65; pos += 1)
                    { myservo.write(pos);
                        delay(10);}
                 delay(2000);
                for (pos = 65; pos >= 0; pos -= 1) 
                   { myservo.write(pos);
                       delay(10);}
                 delay(5000);
             }
            else {Serial.println("Motion end");Serial.write(data); myservo.write(0);}
      }
        else  myservo.write(0);}
  
}

------------------------------------------------------------------------------------------------

//송신부

#include <LiquidCrystal.h>
#include "HX711.h"
#define calibaration_factor -7050.0
#define DOUT 3
#define CLK 2

HX711 scale(DOUT, CLK);
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
byte SpecialChar1[8] = { B01001, B10101, B10101, B01001, B00001, B10000, B10000, B11111};
byte SpecialChar2[8] = { B01000, B10101, B01001, B00011, B11101, B01001, B10000, B11111};
byte SpecialChar3[8] = { B00000, B00100, B00100, B00000, B00000, B00100, B00100, B00000};
byte SpecialChar4[8] = { B11101, B10111, B10101, B11111, B00001, B01110, B10001, B01110};

void setup()
{
  Serial.begin(9600);
 
  scale.set_scale(calibaration_factor);
  scale.tare();
   lcd.begin(16, 2);
  lcd.createChar(0, SpecialChar1);
  lcd.createChar(1, SpecialChar2);
  lcd.createChar(2, SpecialChar3);
  lcd.createChar(3, SpecialChar4);

  for(int i = 0; i<3 ; i++)
  {
    lcd.setCursor(i, 0);
    lcd.write(byte(i));
  }
}

void loop()
{
 
  Serial.println(scale.get_units());  
  lcd.setCursor(3,0);
  if(scale.get_units()>0&&scale.get_units()<3){lcd.print("   ");lcd.print(0);lcd.write(byte(3));}
  else if(scale.get_units()>3&&scale.get_units()<15){lcd.print("   ");lcd.print(1);lcd.write(byte(3));}
  else if(scale.get_units()>15&&scale.get_units()<30){lcd.print("   ");lcd.print(2);lcd.write(byte(3));}
  else if(scale.get_units()>30&&scale.get_units()<50){lcd.print("   ");lcd.print(3);lcd.write(byte(3));}
  else if(scale.get_units()>50){lcd.setCursor(3,0);lcd.print("FULL");lcd.print("    ");}
}

프로필사진

수박쨈 2016-12-14 09:35:29

밑의 게시물 딩딩님과 같은 코드의 질문이네요.

 

이 부분은 스스로 생각하셔서 풀어보셨으면 좋겠습니다^^;

 

 

아두이노에는 parseInt()라는 함수가 있습니다.(https://www.arduino.cc/en/Reference/ParseInt)

parseInt를 쓰면 시리얼모니터에서 입력한 값을 Serial.read()와 달리 숫자값으로 받을 수 있습니다.

 

read()를 사용하여 45를 쓰면 char값으로 4, 5로 각각 출력되지만 parseInt()로는 45로 출력됩니다.

 

근데 parseInt()를 UART통신으로 사용해 본적은 똑같이 적용되는지는 모르겠네요.

 

그리고 atoi()함수도 있습니다. atoi는 문자열을 숫자로 변환합니다.

arr[0]에 4를 넣고 arr[1]에 5를 넣고 atoi를 통해 arr를 변환하면 45라는 숫자로 변환됩니다.

 

사용법에 관해서는 인터넷을 참고하여 직접 응용하여 사용해보셨으면 좋겠네요!ㅎ

 

 

이전글   |    알코올센서로 음주측정기 코딩하기 2016-12-13
다음글   |    문제점 및 궁금점 문의드립니다! 2016-12-14