0

そこで、Arduinoで電卓のようなものを作ろうとしています。赤外線リモコンからデータを読み取って、LCD 16x2 ディスプレイに表示することができました。たとえば、「1」と入力すると、ディスプレイに「1」が表示されますが、Enter ボタンの前に 2 つ以上の数字が押された場合、それが 1 より大きい数字であることをプログラムに理解させるにはどうすればよいですか?アルガリズム?1 を押してから 2 を押してから 3 を押すと 123 に等しいですか?

「変数== 11よりも既存の1の後に1が押された場合」などのifステートメントをたくさん作成できますが、それは役に立ちません。

とにかく、どうすればこれを行うことができますか?または、この種の関数/アルゴリズムの名前を教えてください。楽しみにしています。

ありがとう。

4

1 に答える 1

0

これについては、2 つの方法があります。1 つ目は、単純に文字列型を連結し、キャリッジ リターンで終了したときに整数に変換します。

#define _CR 13
String readString;

void setup() {
  Serial.begin(9600);
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the string readString
    delay(2);  //slow looping to allow buffer to fill with next character
  }

  if ((readString.length() >0) || ( c == CR_)) {
    Serial.println(readString);  //so you can see the captured string 
    int n = readString.toInt();  //convert readString into a number

    // do whatever you want
    // ...
    //
    //

    readString=""; //empty for next input
  } 
}

もう 1 つの方法は、Inter Character Timeout を使用することです。通常は注意してください

while (!Serial.available()) {
  // wait for Serial input
};
inkey = Serial.read();

をブロックしています。以下では、char 配列のポインターを使用して、int16_t の長さの最大 5 桁 (つまり 65535) の入力を構築します。うーん、それは肯定的なものだけを扱います。ただし、それを微調整して、負の値を取得したり、「+」、「-」などの他のコマンドを使用したりできます...

私が ICT メソッドを使用する理由は、Arduino の IDE Serial Monitor ユーティリティがデフォルトで No LF/CR に設定されているためです。LF / CRなしで入力を一度に送信するだけです。

int16_t last_ms_char; // milliseconds of last recieved character from Serial port.
int8_t buffer_pos; // next position to recieve character from Serial port.
char buffer[6]; // 0-35K+null
int16_t fn_index;
int16_t Serial_Input_Number;

void setup() {

  Serial.begin(115200);
  last_ms_char = millis(); // stroke the inter character timeout.
  buffer_pos = 0; // start the command string at zero length.

}

void loop() {

  char inByte;
  if (Serial.available() > 0) {
    inByte = Serial.read();
    if (isDigit(inByte)) { // macro for ((inByte >= '0') && (inByte <= '9'))
      // else if it is a number, add it to the string
      buffer[buffer_pos++] = inByte;
    } else {
      // input char is a letter command
      buffer_pos = 0;
      parse_menu(inByte);
    }
    buffer[buffer_pos] = 0; // update end of line
    last_ms_char = millis(); // stroke the inter character timeout.

  } else if ((millis() - last_ms_char) > 500 && ( buffer_pos > 0 )) {
    // ICT expired and have something
    if (buffer_pos == 1) {
      // look for single byte (non-number) menu commands
      parse_menu(buffer[buffer_pos - 1]);

    } else if (buffer_pos > 5) {
      // dump if entered command is greater then uint16_t
      Serial.println(F("Ignored, Number is Too Big!"));

    } else {
      // otherwise its a number, scan through files looking for matching index.
      Serial_Input_Number = atoi(buffer);

      //
      //
      // Do something with "Serial_Input_Number"
      // one time here. Or set flag and do something out of this big if
      // ...
      //
      //


    }

    //reset buffer to start over
    buffer_pos = 0;
    buffer[buffer_pos] = 0; // delimit

    //
    //
    // do other stuff repeatedly between new characters
    // ...
    //
    //
  }

正確なコードは、より大きな例から切り出されてトリミングされたものであり、機能するという保証はありません。

于 2013-02-23T21:54:02.510 に答える