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

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

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

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

2176閲覧

光センサの値を読み取って1回だけ乱数を発生させてその結果に応じた文字を表示させるプログラムがうまく動作しない

退会済みユーザー

退会済みユーザー

総合スコア0

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

1クリップ

投稿2017/06/30 10:10

Arduinoの光センサ(CdSセル5mmタイプ使用)で読み取った値に応じて、Processingでおみくじを表示させるプログラムを書いています。Arduinoの光センサからその数値をProcessingに表示することはできています。

しかしながら、条件分岐で
「センサの値がいくつ以上+乱数を発生させておみくじ結果を表示」
しようとすると以下のコードでは最初に読み込んだ画像しか表示されず、おみくじ結果が表示されません。

Processing

1/* 2 * Arduino - Processingシリアル通信 3 * Firmataを使用したコード 4 * Processing側 5 */ 6 7PImage img; 8 9import processing.serial.*; 10import cc.arduino.*; 11Arduino arduino; 12int input0 = 0; 13 14 15void setup() { 16 size(500, 800); 17 noStroke(); 18 arduino = new Arduino(this, Arduino.list()[1], 57600); 19 img = loadImage("omikuji.jpg"); 20 image(img, 0, 0); 21 22 int analog0 = arduino.analogRead(input0); 23 if (analog0 > 990) { 24 int r = (int)random(0, 3); 25 if (r == 0 ) { 26 text("中吉", 30, 20, 30, 350); 27 } 28 if (r == 1) { 29 text("大吉", 30, 20, 30, 350); 30 } 31 if (r == 2) { 32 text("小吉", 30, 20, 30, 350); 33 } 34 if (r == 3) { 35 text("末吉", 30, 20, 30, 350); 36 } 37 } 38} 39 40void draw() { 41} 42

void draw()内に以下の部分を書くと、センサで990以上の値を毎回読み取るたびに、書かれてしまって、文字が読めないという問題が発生しています。

Processing

1int analog0 = arduino.analogRead(input0); 2 if (analog0 > 990) { 3 int r = (int)random(0, 3); 4 if (r == 0 ) { 5 text("中吉", 30, 20, 30, 350); 6 } 7 if (r == 1) { 8 text("大吉", 30, 20, 30, 350); 9 } 10 if (r == 2) { 11 text("小吉", 30, 20, 30, 350); 12 } 13 if (r == 3) { 14 text("末吉", 30, 20, 30, 350); 15 } 16 }

ご回答やアドバイスをいただけましたら幸いです。どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな方針だとどうでしょう?

  • boolean型のグローバル変数を追加する(名前は仮にdidReadとする)。
  • おみくじ表示はdrawで行う。
  • drawの中で、didReadがtrueなら何もせずreturn。
  • アナログ値を読み、990を超えていればおみくじ表示するとともにdidReadをtrueにする。

これで初回おみくじ表示以降はdrawが何もしないようになるのではないでしょうか。

[コメントを受けて追記]
私の案だと、omikuji.jpgはsetupで描いて、文字列だけdrawで描く...というのを想定していました。
一例としてこんな感じのものはどうでしょう?

Java

1/* 2* Arduino - Processingシリアル通信 3* Firmataを使用したサンプル 4* Processing側 5*/ 6 7boolean didRead = false; 8PImage img; 9 10import processing.serial.*; 11import cc.arduino.*; 12Arduino arduino; 13int input0 = 0; 14 15void setup() { 16 size(500, 800); 17 noStroke(); 18 arduino = new Arduino(this, Arduino.list()[1], 57600); 19 img = loadImage("omikuji.jpg"); 20 image(img, 0, 0); // 画像だけここで描くようにしました 21} 22 23void draw() { 24 // image(img, 0, 0); // draw内では画像の再描画をしないようにしました 25 26 /* 27 if (didRead == false) { 28 return; 29 } 30 */ 31 if (didRead) { 32 return; // didReadがfalseの時...ではなく、trueの時に何もしないことを想定していました 33 } 34 35 int analog0 = arduino.analogRead(input0); 36 if (analog0 > 990) { 37 didRead = true; 38 // int r = (int)random(0, 3); // randomの上限値はその値を含まないので(この記述では0以上3未満となり、末吉が出ないと予想されたので)上限値を4にしてみました 39 int r = (int)random(4); 40 switch(r) { // switchを使ってみましたが、ifでもいいと思います 41 case 0: 42 text("中吉", 30, 20, 30, 350); 43 break; 44 case 1: 45 text("大吉", 30, 20, 30, 350); 46 break; 47 case 2: 48 text("小吉", 30, 20, 30, 350); 49 break; 50 case 3: 51 text("末吉", 30, 20, 30, 350); 52 break; 53 } 54 } 55 56 // この位置におみくじ表示ロジックがあると、analog0が990以下でもおみくじ表示が行われてしまうはずなので、上に移しました 57 /* 58 int r = (int)random(0, 3); 59 if (r == 0 && didRead == true) { 60 text("中吉", 30, 20, 30, 350); 61 } 62 if (r == 1 && didRead == true) { 63 text("大吉", 30, 20, 30, 350); 64 } 65 if (r == 2 && didRead == true) { 66 text("小吉", 30, 20, 30, 350); 67 } 68 if (r == 3 && didRead == true) { 69 text("末吉", 30, 20, 30, 350); 70 } 71 */ 72}

投稿2017/06/30 22:59

編集2017/07/01 09:01
Bongo

総合スコア10807

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

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

退会済みユーザー

退会済みユーザー

2017/07/01 05:30

ご回答ありがとうございます。 アドバイスをいただいて、以下の様に描いてみましたが、表示がされなくなりました。 もし可能でしたら、問題点をご指摘いただけますと幸いです。 /* * Arduino - Processingシリアル通信 * Firmataを使用したサンプル * Processing側 */ boolean didRead = false; PImage img; import processing.serial.*; import cc.arduino.*; Arduino arduino; int input0 = 0; void setup() { size(500, 800); noStroke(); arduino = new Arduino(this, Arduino.list()[1], 57600); img = loadImage("omikuji.jpg"); } void draw() { image(img, 0, 0); if (didRead == false) { return; } int analog0 = arduino.analogRead(input0); if (analog0 > 990) { didRead = true; } int r = (int)random(0, 3); if (r == 0 && didRead == true) { text("中吉", 30, 20, 30, 350); } if (r == 1 && didRead == true) { text("大吉", 30, 20, 30, 350); } if (r == 2 && didRead == true) { text("小吉", 30, 20, 30, 350); } if (r == 3 && didRead == true) { text("末吉", 30, 20, 30, 350); } }
退会済みユーザー

退会済みユーザー

2017/07/01 10:52

解決できました。とてもわかりやすいご回答をいただきましてありがとうございます。 心より感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問