아두이노

아두이노 시리얼통신으로 제어하기

ADELA_J 2023. 7. 25. 16:56

<String 문자열 더하기>

더보기
String strData1 = "hello";
String strData2 = "arduino";
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  String strData3 = strData1 + strData2;
  Serial.println(strData3);
  delay(2000);
}

▶ 공백 넣으려면 이렇게

  String strData3 = strData1 + " " + strData2;
 
 
<String.equals() 함수를 사용하여 문자열을 비교해보기>
더보기
String strData1 = "hello arduino";
 
void setup(){
  Serial.begin(9600);
}
 
void loop() {
  if (strData1.equals("hi")==1)
  {
    Serial.println("hi를 찾았습니다.");
  }
  if (strData1.equals("hello")==1)
  {
    Serial.println("hello를 찾았습니다");
  }
  if (strData1.equals("hello arduino")==1)
  {
    Serial.println("hello arduino를 찾았습니다.");
  }
  delay(2000);
}

<문자열 길이 구하기>- .length() 함수

더보기
String strData1 = "hello arduino";
String strData2 = "hello";
String strData3 = "arduino";
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  Serial.print(strData1 + "길이는 :");
  Serial.println(strData1.length());
 
  Serial.print(strData2 + "길이는 :");
  Serial.println(strData2.length());
 
  Serial.print(strData3 + "길이는 :");
  Serial.println(strData3.length());
  delay(2000);
}

<indexOf() 함수 사용하여 문자열 찾기>

더보기
String strData1 = "hello arduino python";
 
void setup(){
  Serial.begin(9600);
}
 
void loop() {
  Serial.print("hello의 위치: ");
  Serial.println(strData1.indexOf("hello"));
 
  Serial.print("arduino의 위치: ");
  Serial.println(strData1.indexOf("arduino"));
 
  Serial.print("python의 위치: ");
  Serial.println(strData1.indexOf("python"));
 
  Serial.print("hi의 위치: ");
  Serial.println(strData1.indexOf("hi"));
  delay(2000);
}

특정위치부터 찾으려면 > indexOf("찾을문자열", from)

더보기
String strData1 = "hello arduino python";
 
void setup(){
  Serial.begin(9600);
}
 
void loop() {
  if(strData1.indexOf("arduino")!= -1)
  {
    Serial.println("arduino를 찾았습니다.");
  }
  delay(2000);
}

<뒤에서부터 찾으려면, lastIndexOf>

더보기
String strData1 = "hello arduino python";
 
void setup(){
  Serial.begin(9600);
}
 
void loop() {
  Serial.print("hello의 위치(뒤에서부터): ");
  Serial.println(strData1.lastIndexOf("hello"));
 
  Serial.print("arduino의 위치(뒤에서부터): ");
  Serial.println(strData1.lastIndexOf("arduino"));
 
  Serial.print("python의 위치(뒤에서부터): ");
  Serial.println(strData1.lastIndexOf("python"));
 
  Serial.print("hi의 위치(뒤에서부터): ");
  Serial.println(strData1.lastIndexOf("hi"));
  delay(2000);
}

<슬라이싱>

더보기
String strData1 = "hello arduino python";
 
void setup(){
  Serial.begin(9600);
}
 
void loop() {
  Serial.print("6부터 끝까지: ");
  Serial.println(strData1.substring(6));
 
  Serial.print("6부터 13전까지: ");
  Serial.println(strData1.substring(6,13));
 
  Serial.print("0부터 5전까지: ");
  Serial.println(strData1.substring(0,5));
  delay(2000);
}

 

<string을 숫자형으로 변환하기 > toInt()>

 

더보기
String strData = "123";
 
void setup(){
  Serial.begin(9600);
}
 
void loop() {
  Serial.print("strData:");
  Serial.print(strData);
  Serial.print("size:");
  Serial.println(sizeof(strData));
 
  int numData=strData.toInt();
  Serial.print("numData:");
  Serial.print(numData);
  Serial.print("size:");                                                                                                   
  Serial.println(sizeof(numData));
  delay(2000);
}

<문자열을 float로, toFloat()>

더보기
String strPi = "3.141592";
 
void setup(){
  Serial.begin(9600);
}
 
void loop() {
  Serial.print("strPi:");
  Serial.print(strPi);
  Serial.print("size:");
  Serial.println(sizeof(strPi));
 
  float numPi=strPi.toFloat();
  Serial.print("numData:");
  Serial.print(numPi);
  Serial.print("size:");
  Serial.println(sizeof(numPi));
 
  delay(2000);
 
}

소수점 2자리까지 나옴

> integer(2^16)보다 더 크게 하고 싶으면 float(2^32), float보다 하고 싶으면 double(2^64)

 

trim > 양쪽 끝, 앞뒤에 있는 공백을 제거함

 <공백제거>

더보기
void setup(){
  Serial.begin(9600);
}
 
void loop() {
  String strData = " hello arduino python ";
 
  Serial.print("strData:");
  Serial.println(strData);
  Serial.print("공백제거:");
  strData.trim();
  Serial.println(strData);
  delay(2000);
}

<하나의 문자를 받아 RGB LED 제어하기>

더보기
#define LED_RED 5
#define LED_YELLOW 6
#define LED_GREEN 11

void setup(){
  Serial.begin(9600);
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
}

void loop() {
  if (Serial.available() > 0)
  {
    char sData = Serial.read();
    if (sData == 'r')
    {
      digitalWrite(LED_RED, HIGH);
      digitalWrite(LED_YELLOW, LOW);
      digitalWrite(LED_GREEN, LOW);
    }
    else if (sData == 'y') {
      digitalWrite(LED_RED, LOW);
      digitalWrite(LED_YELLOW, HIGH);
      digitalWrite(LED_GREEN, LOW);
    }
    else if (sData == 'g')
    {
      digitalWrite(LED_RED, LOW);
      digitalWrite(LED_YELLOW, LOW);
      digitalWrite(LED_GREEN, HIGH);
    }
    else if(sData == 'o')
    {
      digitalWrite(LED_RED, LOW);
      digitalWrite(LED_YELLOW, LOW);
      digitalWrite(LED_GREEN, LOW);
    }
    else if(sData == 'a')
    {
      digitalWrite(LED_RED, HIGH);
      digitalWrite(LED_YELLOW, HIGH);
      digitalWrite(LED_GREEN, HIGH);
    }
  }
}

<<<< RGB LED를 제어하는 통신규칙 만들기>>>>

1.

<\n (새줄, 엔터) 종료 문자까지 문자열을 입력받기>

더보기
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  if (Serial.available() > 0)
  {
    String strRead = Serial.readStringUntil('\n');
    Serial.print("read:");
    Serial.print(strRead);
  }
}

2. RGB=255,50,0 값 입력받아 255,50,0의 값 찾아 분리하기

더보기
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  if (Serial.available() > 0)
  {
    String strRead = Serial.readStringUntil('\n');
    if (strRead.indexOf("RGB=")!= -1)
    {
      int commaIndex1 = strRead.indexOf(",");
      int commaIndex2 = strRead.indexOf(",", commaIndex1 + 1);
 
      int redValue = strRead.substring(4, commaIndex1).toInt();
      int greenValue = strRead.substring(commaIndex1 + 1,commaIndex2).toInt();
      int blueValue = strRead.substring(commaIndex2 + 1, strRead.length()).toInt();
 
      Serial.print("red:"); Serial.println(redValue);
      Serial.print("green:"); Serial.println(greenValue);
      Serial.print("blue:"); Serial.println(blueValue);
    }
  }
}

3. RGB=빨간,노랑,녹색 숫자값 입력받아 RGB LED 제어하기

더보기
#define LED_RED 5
#define LED_YELLOW 6
#define LED_GREEN 11
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  if (Serial.available() > 0)
  {
    String strRead = Serial.readStringUntil('\n');
    if (strRead.indexOf("RGB=")!= -1)
    {
      int commaIndex1 = strRead.indexOf(",");
      int commaIndex2 = strRead.indexOf(",", commaIndex1 + 1);
 
      int redValue = strRead.substring(4, commaIndex1).toInt();
      int greenValue = strRead.substring(commaIndex1 + 1,commaIndex2).toInt();
      int blueValue = strRead.substring(commaIndex2 + 1, strRead.length()).toInt();
 
      redLedSet(redValue,greenValue,blueValue);
      Serial.println("OKRGB");
    }
  }
}
void redLedSet(int red, int green, int blue){
  analogWrite(LED_RED, red);
  analogWrite(LED_YELLOW, green);
  analogWrite(LED_GREEN,blue);
}

▷ RGB=255.0.0 빨간색만 / RGB=0.255.0 노랑만 / RGB=0,0.255 초록만/  128.128.128 모두 중간밝기

 

<<<서보모터 제어하기>>>>>

1. 시리얼통신으로 서보모터 명령어 입력받아 시리얼 통신으로 값 전송하기>>>>>

- 메시지를 받아서 시리얼모니터에 출력하는 코드 작성

더보기
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  if (Serial.available()>0)
  {
    String strRead = Serial.readStringUntil('\n');
    if (strRead.indexOf("SERVO=")!=-1)
    {
      int servoDigree = strRead.substring(6,strRead.length()).toInt();
      if(servoDigree<=180)
      {
        Serial.print("SERVO DIGREE:");
        Serial.println(servoDigree);
      }
      else Serial.println("error digree");
    }
  }
}

2. 명령어 입력받아서 서보모터를 제어하는 코드를 추가합니다.

더보기
#include <Servo.h>
 
#define SERVO_PIN 8
 
Servo myservo;
 
void setup(){
  Serial.begin(9600);
  myservo.attach(SERVO_PIN);
}
 
void loop(){
  if (Serial.available()>0)
  {
    String strRead = Serial.readStringUntil('\n');
    if (strRead.indexOf("SERVO=")!=-1)
    {
      int servoDigree = strRead.substring(6,strRead.length()).toInt();
      if(servoDigree<=180)
      {
        myservo.write(servoDigree);
        Serial.println("OKSERVO");
      }
      else Serial.println("error digree");
    }
  }
}

180도를 넘으면 error 뜨고, 180도 이하에서는 각도가 제어되고 OKSERVO라는 응답이옴.