21243
@21243

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

arduinoについて

arduinoのコードのプログラムを記述しないといけないので解決お願いします。
【コード】
 void setup(){
pinMode(1,OUTPUT);
pinMode(0,OUTPUT0);
}
void loop(){
int val;
analogRead(0);
val=analogRead(0)/2;

if(val>260){

digitalWrite(0,LOW);
digitalWrite(1,LOW);

}else if(val>260){
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
analogWrite(3,val-260);
}
else{
digitalWrite(0,HIGH);
digitalWrite(1,LOW);
analogWrite(3,val); }
}
このプログラムの内容を1行ずつ日本語で記述していただけると助かります。

0

3Answer

使用しているArduinoのボード、もしくは、使用しているマイコンの型名は何ですか?

C言語は理解されている前提で、使用しているArduino関数は、
pinMode / analogRead / analogWrite / digitalWrite の4つのみ。

ソースコードの疑問点
 その1:OUTPUT0とはタイプミスか?
 その2:2箇所のif文の条件が同じだが、どちらかがタイプミスか?
 その3:最初のanalogReadは結果を読み捨てている。何のため?

やっていること(想像も含めて)は、
光センサ等からのアナログ入力値に応じて、2つのLEDのON/OFFと
3つ目のLEDの明るさをアナログ出力で変化させている。
かな?

1Like

Comments

  1. @21243

    Questioner

    やっていることは光センサ等からのアナログ入力値に応じて、2つのLEDのON/OFFと
    3つ目のLEDの明るさをアナログ出力で変化させています。

```c
  コードは半角```で囲みましょう
```

このプログラムの内容を1行ずつ日本語で記述

そもそも、情報なさすぎます。

まず、シール(多分LED)とarduinoのpinアサイン(構成図)、シールの仕様URLがないと、何をしているか?本人さえわからないです。

助言:
URLを参考に構成図をみながら、読み解いてください。

最初にシールとarduinoの通信モードを設定
単純ループにanalogRead(0)/2の閾値を判定し、LEDチカチカでしょうか?

★ポエム
arduinoは自前でデバイス(モジュール、シール)を用意し、電源回路を作成し、プログラムしながら、デバックし、回路図を変更を繰り返して、回路図とプログラムを完成させるものです。
大変な作業ですが、その反面、webプログラミングでは味わえない醍醐味があります。

0Like

コメントアウトの希望ですね。インデントなども整えておきます。コードを投稿するときはコードブロック(半角バッククオーテーション3つでコードの前後の行を挟みます)内に記述していただけるとありがたいです。ぜひ覚えておきましょう。

また、少し文法が違う(ように感じる)ところが幾つかありましたので訂正もしておきます。またそれに関連して省略しても動作する箇所は削除しています。

光センサ(CdSかな?)の入力に応じて動作を変えているようですね。それに合わせてコメントを書いていきます。

また、Arduino UNOで動作させているものとして作ります。

LED.ino
/*
コメントアウトされたソースコード
コメントアウトは消さなくても動作します。
そのままコピー&ペーストして書き込めば動くはずです。

便宜上、D0ピンに接続されたLEDをLED0、D1ピンに接続されたLEDをLED1、D3(アナログ出力)に接続されたLEDをLED3と呼びます。
*/
void setup () { // 初期化を行います
  // 初期化プロセスは行いません
} // 初期化を終了します

void loop(){ // 永続的に繰り返します
  int val = analogRead(A0) / 2; // 変数valを定義し、A0ピン(アナログ入力)の入力値を2で割ったものを代入します
  
  if (val > 260) { // 条件分岐の開始 もし変数valの値が260より大きいならば
    digitalWrite(0, LOW); // LED0を消灯させます
    digitalWrite(1, LOW); // LED1を消灯させます
    analogWrite(3, 0); // LED3を消灯させます
  } else { // そうでないならば(=260以下ならば)
    digitalWrite(0, LOW); // LED0を消灯させます
    digitalWrite(1, HIGH); // LED1を点灯させます
    analogWrite(3, val - 260); // LED3に対してデューティー比を(val - 260)の値に設定し、出力します
  } // 条件分岐の終了
} // 繰り返しの単位(1つのまとまり)の終わりです もう1度 void loop () { のところへ戻り繰り返します

色々と崩壊しかけていたコードだったので自分なりに訂正してみましたがこれで期待通りの動作をしましたでしょうか。また、} else {のあとのdigitalWrite(0, LOW);digitalWrite(0, HIGH);ではないでしょうか。元のままだとLED0はいかなる状態でも光りませんので、間違っているような気がします。

しかも、これをシミュレーションすると、LED3は明るさの閾値付近で1番明るく、暗くなるほど暗く光ります。一応Web上のシミュレーターをご覧ください。可変抵抗器は明るさのシミュレーション用のものです。

0Like

Your answer might help someone💌