【C++】Arduionoについて、while文の中に入れない。
受付中
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,274
前提・実現したいこと
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/ツール等のバージョンなど)
より詳細な情報
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
こんにちは。
まず、ソースが非常に見づらいですので下記2点をお願いします。
①2つめ3つめのソースも最初と同じように'''
で囲ってインデントを付けて下さい
②ソースは最小にしましょう。無駄な情報が多すぎて見る気力がなくなります。
最小にして再現を確認すると的確な回答が返ってきやすくなりますよ。
次に、2つめのソースで適切に動作するのでしたら、そのif文を単純にwhile文へ変更してどうなりますか? その時、while文へ入らないということはありえませんので、その場合は確認方法に問題がある可能性が高いです。ちゃんとSWをHIGHにしてそのままの状態でloop()を呼び出していますか?などなどです。
ところで、val_Read_SW_1=digitalRead(Read_SW_1);
がループの外にあり、かつ、val_Read_SW_1をループ内で更新していないようですので、一度ループに入ると二度とでてこないということはありませんか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
【Arudiono】While文の抜け出せないと全く同じ過ちをしていませんか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる