Arduino의 Serial 모니터에서 두 자리 이상의 숫자를받는 템플릿

14038 단어 Arduino

개요



제목대로
있으면 편리하지만 인터넷에 유용한 템플릿을 찾을 수 없었기 때문에

참고 : htps : // 코 m / 히코 lp는 / ms / 633c677f5cd12d536dc

사용상의 주의





에서 줄 바꿈을 "LF"로 만드십시오.
LF는 10진수로 "10"입니다.

주의: 4자리 이상이 되면 pow 함수의 오차가 커지므로
int(pow(10,3))=999

코드


byte NUMs[100];    //データ保存用
int digit_inv=0;   //保存桁番号逆順

void setup() {
  Serial.begin(250000);

}

void loop() {

  if(Serial.available()>0){

    byte data = Serial.read();

    if(data != 10){                    //改行で分岐
      if(data >=48 and data<=57){      //受け取ったのが整数なら保存
        digit_inv++;
        NUMs[digit_inv]=data-48;
      }
    }else{
      //整数化
      int hoge = 0;
      int digit_all = digit_inv;
      while(true){
        hoge += NUMs[digit_inv]*int(pow(10,digit_all - digit_inv));
        digit_inv --;
        if(digit_inv < 0){
          break;
        }
      }


      //hoge に結果が保管されている
      Serial.println(hoge);
    }
  }

추가, 일단 움직이지만
digit_inv의 움직임이 조금 이상할 수 있습니다.
NUMs [0] 사용하지 않음

서보 사용에 사용한 예



숫자 입력뿐만 아니라
"a"로 +10
"s"로 +1
"d"로 -1
"f"로 -10
의 기능을 추가한 결과
#include <Servo.h>
Servo myservo;

#define sw_s A0
#define servo 10

byte NUMs[100];    //データ保存用
int digit_inv = 0; //保存桁番号逆順
int result = 0;
boolean shortcut_flag = false;  //ショートカットキーを使った後ならLFを無視する

int angle;

void setup() {
  pinMode(sw_s, INPUT);
  pinMode(servo, OUTPUT);
  myservo.attach(servo);
  Serial.begin(250000);
  angle = 90;
}

void loop() {

  if (Serial.available() > 0) {

    byte data = Serial.read();

    if (data != 10) {                  //改行で分岐
      if (data >= 48 and data <= 57) { //受け取ったのが整数なら保存
        NUMs[digit_inv] = data - 48;
        digit_inv++;
        shortcut_flag = false;

      } else if (data == 97) {          // a
        result += 10;
        shortcut_flag = true;

      } else if (data == 115) {          // s
        result += 1;
        shortcut_flag = true;

      } else if (data == 100) {          // d
        result -= 1;
        shortcut_flag = true;

      } else if (data == 102) {          // f
        result -= 10;
        shortcut_flag = true;
      }
    } else {
      if (shortcut_flag == false) {
        //整数化
        int hoge = 0;
        digit_inv --;
        int digit_all = digit_inv ;
        while (true) {
          hoge += NUMs[digit_inv] * int(pow(10, digit_all - digit_inv));
          digit_inv --;
          if (digit_inv < 0) {
            digit_inv = 0;
            break;
          }
        }
        result = hoge;

      } else {
        digit_inv = 0;                  //とりあえず初期化
      }
    }
  }

  angle = result;
  if (angle < 0) {
    angle = 0;
  } else if (angle > 180) {
    angle = 180;
  }
  myservo.write(angle);
  Serial.print(result);
  Serial.print(" ");
  Serial.println(angle);
  delay(50);

}

좋은 웹페이지 즐겨찾기