質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

2371閲覧

【C++】Arduionoについて、while文の中に入れない。

RYOCHAN333

総合スコア7

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/10/27 22:21

###前提・実現したいこと
ArduinoとC++で分別機械を作っています。
現状、2番の入力ピンの値をハードウェア上でHIGHに変えているにもかかわらず、以下のwhile文に入れなくて困っています。

val_Read_SW_1=digitalRead(Read_SW_1);
while(val_Read_SW_1==HIGH)

###発生している問題・エラーメッセージ

エラーメッセージなし。 しかし、2番の入力ピン(Read_SW_1=2)をHighにしているのにもかかわらず、while(val_Read_SW_1==HIGH)の中に入れない。 しかし、ハードウェア上は問題ないと思われプログラム上の問題だと思われる。

###該当のソースコード

#include<LiquidCrystal_I2C.h> #include<Servo.h> LiquidCrystal_I2C lcd(0x27, 16, 2); int Read_SW_1=2; int Solenoid=6; int SS1=7; int SS2=8; int SS3=9; int SS4=10; int val_SS1=0; int val_SS2=0; int val_SS3=0; int val_SS4=0; int val_Read_SW_1=0; int NG_OVER=0; int OK=0; int NG_UNDER=0; Servo myServo; void setup() { lcd.begin(); pinMode(Read_SW_1,INPUT); pinMode(Solenoid,OUTPUT); pinMode(SS1,INPUT); pinMode(SS2,INPUT); pinMode(SS3,INPUT); pinMode(SS4,INPUT); myServo.attach(4); myServo.writeMicroseconds(1425); digitalWrite(Solenoid,HIGH); lcd.setCursor(0,0); lcd.print("Sortting"); lcd.setCursor(0,1); lcd.print(" Machime."); delay(500); lcd.clear(); lcd.setCursor(0,0); lcd.print(" CHANGE 4.0"); delay(300); lcd.clear(); delay(100); lcd.setCursor(0,0); lcd.print(" CHANGE 4.0"); delay(300); lcd.clear(); delay(100); lcd.print(" CHANGE 4.0"); delay(300); lcd.clear(); delay(100); lcd.setCursor(0,0); lcd.print(" CHANGE 4.0"); delay(2000); lcd.clear(); lcd.setCursor(0,0); lcd.print("PULL UP A SWITCH"); lcd.setCursor(0,1); lcd.print(" TO START."); } void loop() { SS1 = digitalRead(7); SS2 = digitalRead(8); SS3 = digitalRead(9); SS4 = digitalRead(10); val_Read_SW_1=digitalRead(Read_SW_1); while(val_Read_SW_1==HIGH){ digitalWrite(Solenoid,LOW ); do{ delay(50); myServo.writeMicroseconds(2000); }while(SS1==LOW); myServo.writeMicroseconds(1425); delay(600); digitalWrite(Solenoid,LOW); do{ if(SS2==HIGH) { NG_OVER=NG_OVER+1; } if(SS3==HIGH) { OK=OK+1; } if(SS4==HIGH) { NG_UNDER=NG_UNDER+1; } }while(SS2==LOW&&SS3==LOW&&SS4==LOW); lcd.clear(); lcd.setCursor(0,0); lcd.print("OVER OK UNDER"); lcd.setCursor(0,1); lcd.print(NG_OVER); lcd.setCursor(6,1); lcd.print; lcd.setCursor(12,1); lcd.print(NG_UNDER); lcd.setCursor(5,1); lcd.print(","); lcd.setCursor(11,1); lcd.print(","); } }

###試したこと
以下の違うプログラムを試した際には、問題なく動きました。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#include<LiquidCrystal_I2C.h> //4.2A Version
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int Read_SW_1=2;
int Solenoid = 6;
int SS1=7;
int SS2=8;
int SS3=9;
int SS4=10;
//int val_SS1=0;
int val_SS2=0;
int val_SS3=0;
int val_SS4=0;
int val_Read_SW_1=0;
int NG_OVER=0;
int OK=0;
int NG_UNDER=0;
Servo myServo;
void setup()
{
lcd.begin();
pinMode(Read_SW_1,INPUT);
pinMode(Solenoid, OUTPUT);
pinMode(SS1,INPUT);
pinMode(SS2,INPUT);
pinMode(SS3,INPUT);
pinMode(SS4,INPUT);
myServo.attach(4);
digitalWrite(Solenoid, HIGH);
myServo.writeMicroseconds(0);
lcd.setCursor(0,0);
lcd.print("Callar sortting");
lcd.setCursor(0,1);
lcd.print(" Machime.");
}
void loop()
{
int val_Read_SW_1=digitalRead(Read_SW_1);
if(val_Read_SW_1==HIGH)
{

SS1 = digitalRead(7); SS2 = digitalRead(8); SS3 = digitalRead(9); SS4 = digitalRead(10); myServo.writeMicroseconds(1451); if (SS1 == HIGH) { myServo.writeMicroseconds(0); delay(460 ); digitalWrite(Solenoid, LOW); delay(500); if(SS2==HIGH) { NG_OVER=NG_OVER+1; } if(SS3==HIGH) { OK=OK+1; } if(SS4==HIGH) { NG_UNDER=NG_UNDER+1; } lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,0); lcd.print("OVER OK UNDER"); lcd.setCursor(0,1); lcd.print(NG_OVER); lcd.setCursor(6,1); lcd.print; lcd.setCursor(12,1); lcd.print(NG_UNDER); lcd.setCursor(5,1); lcd.print(","); lcd.setCursor(11,1); lcd.print(","); } digitalWrite(Solenoid, HIGH); myServo.writeMicroseconds(0); }

}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

しかし、以下のまた違うプログラムはまたしてもwhileに入れず、、
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#include<LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int Read_SW_1=2;
int Solenoid = 6;
int SS1=7;
int SS2=8;
int SS3=9;
int SS4=10;
int val_SS1=0;
int val_SS2=0;
int val_SS3=0;
int val_SS4=0;
int val_Read_SW_1=0;
int NG_OVER=0;
int OK=0;
int NG_UNDER=0;
Servo myServo;
void setup()
{
lcd.begin();
pinMode(Read_SW_1,INPUT);
pinMode(Solenoid, OUTPUT);
pinMode(SS1,INPUT);
pinMode(SS2,INPUT);
pinMode(SS3,INPUT);
pinMode(SS4,INPUT);
myServo.attach(4);
digitalWrite(Solenoid, HIGH);
myServo.writeMicroseconds(0);
lcd.setCursor(0,0);
lcd.print("Callar sortting");
lcd.setCursor(0,1);
lcd.print(" Machime.");
}
void loop()
{
int val_Read_SW_1=digitalRead(Read_SW_1);
if(val_Read_SW_1==HIGH)
{

SS1 = digitalRead(7); SS2 = digitalRead(8); SS3 = digitalRead(9); SS4 = digitalRead(10); myServo.writeMicroseconds(1451); if (SS1 == HIGH) { myServo.writeMicroseconds(0); delay(460 ); digitalWrite(Solenoid, LOW); delay(500); } digitalWrite(Solenoid, HIGH); myServo.writeMicroseconds(0); do { SS2 = digitalRead(8); SS3 = digitalRead(9); SS4 = digitalRead(10); if(SS2==HIGH) { NG_OVER=NG_OVER+1; break; } if(SS3==HIGH) { OK=OK+1; break; } if(SS4==HIGH) { NG_UNDER=NG_UNDER+1; break; } }while(SS2==LOW&&SS3==LOW&&SS4==LOW); lcd.setCursor(0,0); lcd.print("OVER OK UNDER"); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print(NG_OVER); lcd.setCursor(6,1); lcd.print; lcd.setCursor(12,1); lcd.print(NG_UNDER); lcd.setCursor(5,1); lcd.print(","); lcd.setCursor(11,1); lcd.print(","); }

}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

中にあるdo while文も間違っているんですかね、、?
###補足情報(言語/FW/ツール等のバージョンなど)
C++ Arduino

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

【Arudiono】While文の抜け出せないと全く同じ過ちをしていませんか?

投稿2017/10/28 03:16

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

まず、ソースが非常に見づらいですので下記2点をお願いします。

①2つめ3つめのソースも最初と同じように'''で囲ってインデントを付けて下さい

②ソースは最小にしましょう。無駄な情報が多すぎて見る気力がなくなります。
最小にして再現を確認すると的確な回答が返ってきやすくなりますよ。

次に、2つめのソースで適切に動作するのでしたら、そのif文を単純にwhile文へ変更してどうなりますか? その時、while文へ入らないということはありえませんので、その場合は確認方法に問題がある可能性が高いです。ちゃんとSWをHIGHにしてそのままの状態でloop()を呼び出していますか?などなどです。

ところで、val_Read_SW_1=digitalRead(Read_SW_1);がループの外にあり、かつ、val_Read_SW_1をループ内で更新していないようですので、一度ループに入ると二度とでてこないということはありませんか?

投稿2017/10/28 03:02

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問