- 締切済み
Arduino 条件式
Arduinoでシリアルモニタを使用しています。 それで、入力した数字を条件式で判断し、真ならLEDを光らせるプログラムを作りたいのですが、入力した数字をどのようなコードで描いたらいいでしょうか? ちなみに、if (Serial.readString() <= 40) { と書いたらダメでした。 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); int RST = 3; int RstFlag = 0; int Tr = 4; int TrFlag = 0; int LED = 2; //初期設定 void setup() { pinMode(RST, INPUT); pinMode(Tr, INPUT); pinMode(LED, OUTPUT); lcd.init(); lcd.backlight(); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Lab"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } void loop() { RstFlag = digitalRead(RST); TrFlag = digitalRead(Tr); lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Trigger = "); //シリアルポートにデータがあるか判断 if (Serial.available()) { delay(100); lcd.clear(); //データがある場合の動作 if (Serial.available() > 0) { //print"ln"はモニタに入力後改行するコマンド Serial.println("LCD Received!"); //Serial.readString():データを”文字列”として読み込む lcd.setCursor(10, 1); lcd.print(Serial.readString() + "s"); } } if (RstFlag == 0) { delay(100); lcd.clear(); Serial.println("LCD Clear!"); } /*if ( ○○○ <= 40) { //仮に40とする delay(100); Serial.println("Trigger Out!"); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); } */ length(readString()); }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- FoolWord
- ベストアンサー率73% (14/19)
回答No.3に対して >>delay(200); >>lcd.clear(); >>//ここから追加 >>i = 0; >> >>を書き込んでもダメでした。 >>なぜですか? 変数sの内容が残ってるからです。 変数iはsの内容を数値変換してセットしているので、i=0しても元に戻ります。 クリアしたいのであれば、変数sを"0"にしてやるか、ローカル変数に変更してみてください。
- FoolWord
- ベストアンサー率73% (14/19)
(1)モニタに(文字を)入力し、送信 (2)カーソルが移動した先では"s"の部分しか表示されない 同時に、モニタ上では”LCD Received”がたくさん表示されるようになった。(1回の送信に対して、1回のみの表示にしたい) setup内に s = Serial.readString(); i = s.toInt(); の2文があるのが原因です。 落ち着いて処理の流れを考えてください。 簡単に箇条書きで書くと、以下の感じかと。 1.シリアル内に受信データがあるかチェック(Serial.available) 2.受信データがある場合は、データを読み込む(Serial.readString) 3.読み込んだデータをLCDに表示(lcd.print) 4.読み込んだデータを数値に変換(toInt関数) 5.変換したデータを判定して処理を行う(if文) 6.1に戻る
- FoolWord
- ベストアンサー率73% (14/19)
LCDに表示する部分は、どう記述していますか? String s; int i; s = Serial.readString(); i = s.toInt(); //lcd.print(Serial.readString() + "s"); lcd.print(s + "s"); if (i >=40) { /*条件成立処理*/ }
補足
現在のスケッチは以下の感じです。 //PC Modeの基本形(Not I2C) #include <LiquidCrystal.h> //LCDを使用する際のピン設定 LiquidCrystal lcd(7, 6, 5, 4, 3, 2); int Tr = 9; int TrFlag = 0; int LED = 11; String s; int i; //初期設定 void setup() { pinMode(Tr, INPUT); pinMode(LED, OUTPUT); s = Serial.readString(); i = s.toInt(); //LCDの初期設定(縦横のスケール) lcd.begin(16, 2); //起動後一回のみ表示 lcd.setCursor(0, 0); lcd.print("(*^^)v < Hello!!"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } //動作開始 void loop() { //Auto Mode使用時は以下を常に表示 lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Trigger = "); //シリアルポートにデータがあるか判断 if (Serial.available()) { delay(100); lcd.clear(); //データがある場合の動作 while (Serial.available() > 0) { //print"ln"はモニタに入力後改行するコマンド Serial.println("LCD Received!"); lcd.setCursor(10, 1); lcd.print(s + "s"); } } TrFlag = digitalRead(Tr); if (TrFlag == 0) { if (i <= 450) { delay(100); Serial.println("Trigger Out!"); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); } } } 以上 (1)モニタに(文字を)入力し、送信 (2)カーソルが移動した先では"s"の部分しか表示されない 同時に、モニタ上では”LCD Received”がたくさん表示されるようになった。(1回の送信に対して、1回のみの表示にしたい)
- FoolWord
- ベストアンサー率73% (14/19)
Serial.readString()は文字列読込みなので、 文字列と数値を比較しても条件成立はしません。 数値で比較を行いたいのであれば、文字列を数値に変換してあげることが必要です。 String s; int i; s = Serial.readString(); i = s.toInt(); if (i >=40) { /*条件成立処理*/ }
補足
回答ありがとうございます。 早速試してみたのですが、今度はシリアルモニタに入力した文字がLCDに反映できなくなりました。 すいませんが、原因がわからないので教えて頂けませんか。
補足
#include <LiquidCrystal.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); int Tr = 9; int TrFlag = 0; int LED = 11; String s; int i; //初期設定 void setup() { pinMode(Tr, INPUT); pinMode(LED, OUTPUT); //LCDの初期設定(縦横のスケール) lcd.begin(16, 2); //起動後一回のみ表示 lcd.setCursor(0, 0); lcd.print("(*^^)v < Hello!!"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } //動作開始 void loop() { //Auto Mode使用時は以下を常に表示 lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Trigger = "); //シリアルポートにデータがあるか判断 if (Serial.available()) { delay(100); lcd.clear(); //データがある場合の動作 while (Serial.available() > 0) { //print"ln"はモニタに入力後改行するコマンド Serial.println("LCD Received!"); s = Serial.readString(); lcd.setCursor(10, 1); lcd.print(s); } } TrFlag = digitalRead(Tr); if (TrFlag == 0) { i = s.toInt(); { if (i >= 450) { delay(100); Serial.println("Trigger Out!"); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); lcd.clear(); } else { delay(100); lcd.clear(); } } } } とりあえず、デキるようになりました! 有難うございます。 それで、内部に i のデータが残ってるらしく試しにトリガボタンを連続押しするとLEDが点滅しました。 delay(200); lcd.clear(); //ここから追加 i = 0; を書き込んでもダメでした。 なぜですか?