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

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

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Arduino

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

Q&A

2回答

1471閲覧

Arduino で温度計を作りたい。

kzk1017

総合スコア0

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Arduino

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

0グッド

0クリップ

投稿2020/07/16 07:02

全くの初心者です。本当に何もわかっていなくて困っています。
Arduinoを使って百葉箱のようなものを作っっているのですが。なかなか進まなくて困っております。
Arduinoで温度、湿度を出すプログラムと、LEDに1から99の数字を移すプログラムを別々に作成(ネットプログラムをほとんどコピペ)しております。
温度をLEDに移す事が目標なのですが、調べてもなかなかたどり着けません。どなたかプログラムの仕方を教えていただけないでしょうか。

湿度センサー DHT11
7セグメントLED
抵抗器(220Ω)

プログラムはこちらの二つです。!

// 2桁の7セグメントLEDを光らせるプログラム // int _cnt = 0; // int _number = 0; // boolean _flg = false; void setup(){ Serial.begin(9600); //2~8番ピン デジタル出力へセット for (int i=2; i<=8; i++){ pinMode(i,OUTPUT); } pinMode(13,OUTPUT); pinMode(11,OUTPUT); } //LEDレイアウトを定義 boolean Num_Array[10][7]={ {1,1,1,1,1,1,0}, //0 {0,1,1,0,0,0,0}, //1 {1,1,0,1,1,0,1}, //2 {1,1,1,1,0,0,1}, //3 {0,1,1,0,0,1,1}, //4 {1,0,1,1,0,1,1}, //5 {1,0,1,1,1,1,1}, //6 {1,1,1,0,0,1,0}, //7 {1,1,1,1,1,1,1}, //8 {1,1,1,1,0,1,1} //9 }; //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+2,-Num_Array[Number][w]); } } //2桁をそれぞれの桁で分解する関数 int NumParse(int Number,int s){ if(s == 1){ return Number % 10; //10で割ったあまり = 一桁目の値 } else if(s == 2){ return Number / 10; //10で割った値を整数にする = 二桁目の値 } return 0; } void loop(){ if(_number >= 100){ _number = 0; } //flg変数をtrue / falseを切り替えることで11番13番ピンの出力を交互に切り替える if(_flg){ digitalWrite(11,LOW); digitalWrite(13,HIGH); _flg = false; NumPrint(NumParse(_number,1)); //1桁目の表示 } else{ digitalWrite(11,HIGH); digitalWrite(13,LOW); _flg = true; NumPrint(NumParse(_number,2)); //2桁目の表示 } //100まで行ったら表示する数値(_number)を1つ足す(実質delayの10×100で1秒に1カウント) if(_cnt >= 100){ _number++; _cnt = 0; Serial.print("NUMBER:"); Serial.println(_number); } _cnt++; delay(10); }``` コード
#include <DHT.h> // DHTクラスの生成 // ※Arduinoのデジタル9ピンでDHT11センサーを接続する DHT dht(9, DHT11); void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000); // 湿度 float humidity = dht.readHumidity(); // 温度 float temperature = dht.readTemperature(); if (isnan(humidity) || isnan(temperature)) { Serial.println("センサーから読み取りに失敗しました。"); return; } // 体感温度 float heatIndex = dht.computeHeatIndex(temperature, humidity, false); Serial.print("温度:"); Serial.print(temperature); Serial.print("℃ 湿度:"); Serial.print(humidity); Serial.print("% 体感温度:"); Serial.print(heatIndex); Serial.println("℃"); }ード

イメージ説明

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

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

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

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

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

y_waiwai

2020/07/16 07:28

で、なにができてなにができないんでしょうか。
SHOMI

2020/07/16 16:01 編集

forの終了条件に7を含めているので、Num_Arrayの範囲外アクセスと9番ピン(センサー接続ピン)のプルアップ設定を変更してしまっていますよ。 //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+2,-Num_Array[Number][w]); } }
guest

回答2

0

まず、回路からいくと、画像をみると、セグメント側に抵抗だけをつけたのですよね?
で、7セグの色が赤、Vfが2Vだと仮定するとLEDを1つ光らせると
(5-2)/220=13.6mAの電流が流れます。
セグメント側のピンは良いのですけど、コモン=桁のピンは例えば8の数字だと7LED分、つまり
7*13.6=95mAほど流す事になります。(実際には内部抵抗によりそこまでは流れません)
これだと最大絶対定格の40mAを大きく超えることになります。(推奨で20mAです)
なので、パラレル側の抵抗を1kΩ程度にするか、コモン側をトランジスタで制御するか、です。
(まぁすぐに壊れるものでも無いですけど)

次に、やりたい事ですけど、このセンサーで取得できるのは、温度と湿度です。
そこから、体感温度や不快指数なども算出可能かもしれません。
で、2桁7セグ1つでどう表示させる予定なのでしょうか?
例えば、温度1秒、湿度1秒、体感温度1秒、無表示1秒を繰り返す、とか、スクロールさせるとか、
そういった発想が全く伝わりません。
また、百葉箱なら、電池駆動が予想されますけど、常にそんな電流を流して表示させれば電池切れも直ぐに起こってしまいます。
スイッチを押したら一定時間表示させるとか、工夫が必要なのではないでしょうか?
正直、何故Arduinoを使いたいのか、何故作りたいのか?といった部分が見えません。
既製品はいくらでもあるのですから、あなたなりのこだわりを持った方が良いです。

スケッチの方ですけど、「ネットプログラムをほとんどコピペ」は、「覚える気がないけれど、とにかく作りたい」人のやる事です。
基本的に自分で書かなければ実力は付きません。
本当に覚える気があるのでしたら、数行のプログラムから始めた方が良いです。
つまり、判らない箇所=知りたい事が1つでないと、どこが悪いのか?で時間を使う事になります。

それはさておき、今回の参考にされた7セグの方のスケッチは、理解は出来ているのでしょうか?
こう言ったら何ですけど、参考にするほどのスケッチでは無いと感じます。それは、

①理解しにくい
②ちゃんとした手順を踏んでいないのでゴーストが出る

というのが理由です。①は主観の問題ですから、質問者が「解り易い」と感じたのならそれでいいのですけど。
コピペから合体するのでも、ある程度の理解は必要です。
※ネット上には良くないコードも転がっています。元が良くっても何人も書き換えていくうちに劣化していたり。
良いサンプルを見極める目も必要です。

※ちゃんとした手順、というのは
①コモン=桁側をすべてオフの状態にする(前提条件)
②セグメントを点灯させる桁の数字形に出力する。
③コモン側の表示させたい桁をオンにして数字を表示する
④表示させたい時間分ディレイ
⑤③で点灯させた桁をオフにする(①の状態にする)
といった順番をちゃんと行っているか?という事です。

下が「トランジスタを使わない場合の」サンプルです。コモンピンは変えてます。

Arduino

1#include <DHT.h> 2 3DHT dht(9, DHT11); 4 5byte seg_pin[]={2,3,4,5,6,7,8};//a-g 6byte dig_pin[]={11,12};//1,10 ※13番ピンは駄目(UNOの場合) 7byte disp_num; 8 9byte fig[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数字形0~10 10 11void fig_set(byte num){//数字形にセット 12 for(byte i=0;i<7;i++)digitalWrite(seg_pin[i],bitRead(fig[num],i)); 13} 14 15void disp(byte t){//unit 0.1s 16 for(byte cnt=0; cnt<t*10; cnt++) {//10ms*10*t=0.1*t[s] 17 fig_set(disp_num%10);//1の桁の数字形に出力 18 pinMode(dig_pin[0],OUTPUT);//1の桁ピンをオン 19 delay(5); 20 pinMode(dig_pin[0],INPUT);//1の桁ピンをオフ(全消灯) 21 22 fig_set(disp_num/10);//10の桁の数字形に出力 23 pinMode(dig_pin[1],OUTPUT);//10の桁ピンをオン 24 delay(5); 25 pinMode(dig_pin[1],INPUT);//10の桁ピンをオフ(全消灯) 26 } 27} 28 29void setup(){ 30 dht.begin(); 31 for(byte i=0;i<7;i++)pinMode(seg_pin[i], OUTPUT); 32} 33 34void loop(){ 35 disp_num =dht.readTemperature();//表示変数に温度をセット 36 disp(20);//2.0秒間表示 37 disp_num=dht.readHumidity();//表示変数に湿度をセット 38 disp(20);//2.0秒間表示 39 delay(1000);//識別の為に1秒無表示 40}

投稿2020/07/19 05:46

nac_tnk

総合スコア463

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

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

0

LED表示側プログラムでforの終了条件に7を含めているので、Num_Arrayの範囲外アクセスと9番ピン(センサー接続ピン)のプルアップ設定を変更してしまっていますよ。
そのせいでセンサーをうまく読めていないのでしょう。

C

1void NumPrint(int Number){ 2 for (int w=0; w<=7; w++){ 3 digitalWrite(w+2,-Num_Array[Number][w]); 4 } 5}

以下、動作未確認。

C

1#include <DHT.h> 2DHT dht(9, DHT11); 3 4void setup() { 5 Serial.begin(9600); 6 dht.begin(); 7 //2~8番ピン デジタル出力へセット 8 for (int i = 2; i <= 8; i++) { 9 pinMode(i, OUTPUT); 10 } 11 pinMode(13, OUTPUT); 12 pinMode(11, OUTPUT); 13} 14//LEDレイアウトを定義 15boolean Num_Array[][7] = { 16 {1,1,1,1,1,1,0}, //0 17 {0,1,1,0,0,0,0}, //1 18 {1,1,0,1,1,0,1}, //2 19 {1,1,1,1,0,0,1}, //3 20 {0,1,1,0,0,1,1}, //4 21 {1,0,1,1,0,1,1}, //5 22 {1,0,1,1,1,1,1}, //6 23 {1,1,1,0,0,1,0}, //7 24 {1,1,1,1,1,1,1}, //8 25 {1,1,1,1,0,1,1}, //9 26 {0,0,0,0,0,0,1}, //- 27 {0,0,0,0,1,0,1}, //r 28 {1,0,0,1,1,1,1}, //E 29}; 30#define CHAR_MINUS (10) 31#define CHAR_O (0) 32#define CHAR_r (11) 33#define CHAR_E (12) 34 35//LED表示関数を定義 36void Print7Seg(int Number) { 37 for (int w = 0; w < 7; w++) { 38 digitalWrite(w + 2, Num_Array[Number][w]); 39 } 40} 41void NumPrintF(float Number) { 42 int num[2] = {0}; 43 if (isnan(Number)) { 44 // Error 45 num[0] = CHAR_E; 46 num[1] = CHAR_r; 47 Serial.println("Error"); 48 } 49 else if (Number <= -10 || 100 <= Number) { 50 // Out of Range 51 num[0] = CHAR_O; 52 num[1] = CHAR_r; 53 Serial.println("Out of Range"); 54 } 55 else if (Number < 0) { 56 // -10 < Number < 0 57 num[0] = CHAR_MINUS; 58 num[1] = (int)-Number % 10; 59 Serial.println(Number); 60 } 61 else { 62 // 0 <= Number < 100 63 num[0] = Number / 10; 64 num[1] = (int)Number % 10; 65 Serial.println(Number); 66 } 67 68 for (int i = 0; i < 2; i++) { 69 digitalWrite(11, i ? LOW : HIGH); 70 digitalWrite(13, i ? HIGH : LOW); 71 Print7Seg(num[i]); 72 } 73} 74void loop() { 75 delay(2000); 76 NumPrintF(dht.readTemperature()); 77}

投稿2020/07/16 17:05

編集2020/07/16 17:32
SHOMI

総合スコア4079

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問