読者です 読者をやめる 読者になる 読者になる

Arduinoで温湿度センサ(DHT11)を使う

・目的

 温湿度センサDHT11を使って湿度と気温(℃)を表示すること。

 今回DHTライブラリを使用することで簡単に温度データと湿度データを

 表示する。

 

・使用したもの

 温湿度センサ(DHT11)

  ジャンパワイヤ

 ブレッドボード

 Arduino UNO

  ノートPC(Windows10)

 

 

・方法

 (1)回路を作成

    DHT11は左のピンから順にVCC,I/O,NC,GNDである。表1にまとめた。

    今回はNCピンは使わない。DHT11のDCは3.5~5.5V。回路図を図1に

    示した。

 

 表1:ピン割り当て

pinNo

 

1

VCC

2

I/O

3

NC

4

GND

 

f:id:shangtian:20170409210011p:plain

図1:

 (2)プログラムコード

#include <DHT.h>

const int PIN_DHT = 8;
DHT dht(PIN_DHT,DHT11);

void setup() {
  Serial.begin(9600);
  Serial.println("DHT11");
  dht.begin();
}

void loop() {

  delay(3000);

  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  Serial.print("Humidity:  ");
  Serial.print(humidity);
  Serial.println("%\t");
  Serial.print("Temperature:  ");
  Serial.print(temperature);
  Serial.println(" *C");
}

図2:プログラムコード

 

(3)ライブラリをインポート

   Adafruit_SensorライブラリとDHTライブラリをインポートする。

   Adafruit_Sensorライブラリはhttps://github.com/adafruit/Adafruit_Sensor

          からダウンロードし、ZIP形式でライブラリーをインポートする。

   図3も参照のこと。DHTライブラリをインポートは図4を参照。

   

f:id:shangtian:20170409211149p:plain

図3:zip形式ライブラリのインポート

 

f:id:shangtian:20170409211147p:plain

図4:DHTライブラリインポート

 

・結果

 図5に結果を示した。

f:id:shangtian:20170409205737p:plain

図5:測定結果

ドスパラ スティック型PC!!

 超音波センサhc-sr04を使って入退室判定を行う

目的

 超音波センサを使って入退室の判定をする。

 

・使ったもの

 超音波センサhc-sr04

HC-SR04 超音波距離センサーモジュール For Arduino

HC-SR04 超音波距離センサーモジュール For Arduino

 

  ブレッドボード

 ジャンパワイヤ

 ノートパソコン(windows10)

 

・方法

 (1)回路作成

    TrigピンをArduinoのデジタルピン8に接続、Echoピンをデジタル9ピン

    に接続。回路図を図1に示した。また組み立てた回路の写真を図2に

    示した。

f:id:shangtian:20170408232852p:plain

図1:超音波センサの回路

f:id:shangtian:20170408232811j:plain

図2:組み立てた回路の写真

 

 (2)プログラムコード

   超音波センサで測定し距離(cm)の値を返す関数を作成。

   超音波センサで距離を0.5秒ごとに測定し、0.5秒前の測定値と

   現在の測定値を比較する。0.5秒前の測定値をa、現在の測定値を

   bとしたとき、b-a<0であればセンサに人が近づいてきたことを

   意味している。b-a>0であればセンサから遠ざかっていること

   意味している。図3を参照。図3では、矢印方向に人がすすむこととする。

   0を境界とすると誤判定が多くなったのでb-a<-2であれば入室判定。

   b-a>2であれば退室判定とする。それ以外はout of range と表示する。

f:id:shangtian:20170409001452p:plain

図3:判定

#define TRI 8  //trigをD8pinに設定
#define ECH 9  //echoをDピンに設定

void setup() {

  Serial.begin(9600);
  pinMode(TRI,OUTPUT);
  pinMode(ECH,INPUT);
  
  
}

void loop() {
  float a;
  float b;
  a = echo();
  delay(500);
  b = echo();
  delay(500);

  if(b-a<-2) {
    Serial.println("Someone entered the room");
    }else if(b-a>2){
      Serial.println("Someone left the room");
    }else {
      Serial.println("out of range");
    }
    

  a = b; //aにbの値を代入する。
    
}
float echo() {

  int dur; 
  float dis;
  digitalWrite(TRI,HIGH);
  delayMicroseconds(10);
  digitalWrite(TRI,LOW);
  dur = pulseIn(ECH,HIGH);
  dis = (float) dur*0.017;
  return floor(dis); //小数点以下を切り捨て、値を返す
}

図4:プログラムコード

*図2のコードをコンパイルしたときはコメントを消すとエラーを

 解消できる。

 

・結果

 入退室の判定をシリアル通信にて表示した。判定に使うデータが2つしか

 無いため短い感覚で判定がころころ変わってしまうので改良が必要。

f:id:shangtian:20170408233651p:plain

図5:入退室判定結果

<参考文献>

みんなのArduino入門

みんなのArduino入門

みんなのArduino入門

 

 

esp-wroom-02でLCD(I2C)ディスプレイを使う

・目的

  esp-wroom-02を使いLCDディスプレイにHello worldを表示させる

 

・使用したもの

   esp-wroom-02

 

ESP-WROOM-02ピッチ変換済みモジュール《T型》

ESP-WROOM-02ピッチ変換済みモジュール《T型》

 

 

   STNキャラクタ液晶(16x2) [1602A-V2]

 

 

   液晶I/Fモジュール(I2C) [IFB-I2C-8574]

 

キャラクタLCD(1602LCD)用I2C変換モジュール

キャラクタLCD(1602LCD)用I2C変換モジュール

 

 

   単三乾電池

   ノートパソコン

   ブレッドボード

   ジャンパワイヤ

 

 

・方法

  (1)回路を組みたてる

     Esp-wroom-02は電源電圧が3V、ディスプレイは電源電圧が5V

                  となっていることに注意すること。I/FモジュールのSDAを

                  デジタルピン12に、SCLを12に接続。

                  図1に回路図を示した。(但し1602A-V2とIFB-I2C-8574の図が

     見つからなかったので他のもので代用して図1の回路図を描いた。)

     

f:id:shangtian:20170407090352p:plain

 図1:ダウンロードモード

    (2)I2Cアドレスを確認

     LCDディスプレイを使用するにはI2Cアドレスを

     調べる必要が有ります。詳しくは以下の記事(方法(3))

     に載っています。

shangtian.hatenablog.com

    

 

  (3)プログラム

       プログラムコードを図2に示した。esp-wroom-02にプログラム

                 を書き込むときは、ダウンロードモードにする必要がある。

                 図1の回路を組んだ後、RSTからGNDをジャンパワイヤで

                 接続し、引き抜くことでモードの変更が可能になる。

                 この作業を行わないとプログラムを書き込むときにエラー

                 が発生するので注意が必要だ。

 

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define SDA 12 //SDAの接続先をD12ピンに設定
#define SCL 13 //SCLの接続先をD13ピンに設定

LiquidCrystal_I2C lcd(0x3F,16,2); //I2Cアドレス入力
void setup()
{
  Wire.begin(SDA,SCL);//I2C通信で使用するピンを設定
  lcd.init();
  lcd.backlight();
  lcd.print("Hello World");
  
}
 
 
void loop() {

}
 

図2:プログラムコード

  (4)プログラム実行

    プログラムを実行するときは回路を少し組み替える必要がある。

    図3を参照。赤丸で囲まれているように、ジャンパワイヤを組み

    RSTからGNDにジャンパワイヤをつなげて抜くことでesp-wroom-02

              は実行モードに変更できる。

 

f:id:shangtian:20170407092600p:plain

図3:実行モード

 

 

・結果

  うまくいくと図4の写真のようになる。

f:id:shangtian:20170407092445j:plain

図4:こんにちは

<参考文献>

ESP8266 と I2C | macsbug

 

Arduino 高精度IC温度センサ LM35DZ

・目的 

 温度センサを使い、室温を計測する。

 

・使用したもの

 Arduono uno

 ジャンパワイヤ

 ブレッドボード

 デジタルテスター

 IC温度センサ LM35DZ

 ノートPC(Windows 10)

方法

 (1)回路を組む

f:id:shangtian:20170325110625p:plain

 

   (2)プログラム

  

   秋月電子のホームページ(http://akizukidenshi.com/catalog/g/gI- 00116/)による  とLM53DZの温度係数は10.0mV/℃、測定温度範囲 は0~100℃である。ここで  温度センサの出力電圧をVoutとし、

   電源電圧をVとする。またVoutより出力される電圧の範囲は0~1V

  である。以上のことを表1に示した。

 

      表1:基本データ

温度係数

10mV/℃

測定温度範囲

0~100℃

Vout範囲「

0~1V

 

Arduinoがアナログピンで読み取ることのできる電圧の範囲は

0~5Vである。またanalogRead()で読み取ることのできる値は

0~1023でる。今回、温度センサは0~1Vまでの出力なので、

analogRead()で読み取る値は、0℃è0 100℃à204.8したがって、

変換式はt = Vout*V/204.8*100である。

プログラムコードを図2に示した。

nt analog_no = 5 ;// define A5 as input signal pin
unsigned long time;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  int pin_value;
  int vol;
  float t;
  time = millis();
  pin_value = analogRead(analog_no);
  t = pin_value*1*100/204.8;
  Serial.print(time);
  Serial.print(",");
  Serial.println(t);
  
  delay(500);
}

図2:プログラムコード

 

 

 

・結果

f:id:shangtian:20170325110727p:plain

図3:測定結果

 

  とれたデータは図3に示した。1列目はシリアル通信を

  始めてからの経過時間(単位:ミリ秒)、2列目はセンサから 

  読み取った値(単位:℃)である。

 

・考察

  他の温度計で室温を計測したところ、20度前後だが、arduino

  読み取った値は、30度付近であり、うまくセンサの値を読み取れていない可能性が  大きい。

 

 <参考文献>

IC温度センサ

http://www.marutsu.co.jp/contents/shop/marutsu/mame/49.html

 

http://www.rm.kanagawa-it.ac.jp/~kawaralab/sens7.pdf

 

processingにてcvsファイルを読み取り 

・目的

 Arduinoから送られてきたデータを保存したtxtファイルを

 processingで読み込 み、グラフとしてプロットする。

 

・使用したもの

 ノートpc(Windows 10

    Processing IDE

 

・方法

 プログラムコードを図1に示した。読み取るファイルは1列目はarduino

 データを取得してからの時間(単位:ミリ)、2列目は温度センサが

 返した値(変換式に通して℃にしてはない)である。

 ファイルの内容の一部を図1に示した。

f:id:shangtian:20170323221924p:plain

図1:ファイルの内容の一部

 String lin;
int ln;
String lines[];

void setup() {
  ln = 0;
  lines = loadStrings("teraterm.txt");
//txtファイルの読み込み background(0); size(1000,800); } void draw() { lin = lines[ln];//ln行目を収納 String [] co = split(lin,',');
//カンマの前後で区切り配列に収納 if (co.length == 2){ float x = float(co[0]); float y = float(co[1]); fill(#FC0A0A); noStroke(); ellipse(x/200,500-y*5,10,10); } ln++;//次の行に移行 if(ln == lines.length) noLoop(); //最後の行まで読み込み終わった時、ループを終了させる。 }

図2:プログラムコード

 

 読み込ませるtxtファイルをprocessingのスケッチが入れてある

 フォルダーに入れる。

 

 

・結果

 縦軸はセンサーの値を5倍したもの、横軸はセンサーの値を読み込み

 始めてからの時間(単位:ミリ秒)としたグラフを図2に示した。

f:id:shangtian:20170323220832p:plain

 図2:データのプロット

Arduino-processing シリアル通信により連携させる その3

・目的

 複数のセンサーの値をarduino側で読み取りシリアル通信にてデータをprocessing側に送信する。Processing が受け取った値に対応して立方体の大きさと回転速度を変化するようにプログラムを組む。

 

 

・使用したもの

 可変抵抗(10KΩ)2個

 

小型 ボリューム 可変 抵抗器 10K Ω B 10 個 セット

小型 ボリューム 可変 抵抗器 10K Ω B 10 個 セット

 

 

    Arduino uno

    Processing IDE

   ノートPC(Windows 10

 ブレッドボード

 ジャンパワイヤ

 

・方法

 

 (1)回路を組む

可変抵抗を2個使い、任意の可変抵抗をアナログピンA4に、

残りの可変抵抗をアナログピンA5に接続した。可変抵抗の

VCCピンをブレッドボードの+に、GNDをブレッドボードの

マイナスに接続した。回路図を図1に示した。

f:id:shangtian:20170321220819p:plain

図1:回路図

 

 (2)Arduino側のプログラム

 

int sensors[2];
int inByte;

void setup() {
  Serial.begin(9600);

  sensors[0] = 0;
  sensors[1] = 0;
  inByte = 0;

  establishContact();
 
}

void loop() {

  if(Serial.available() > 0){

    inByte = Serial.read();

    sensors[0] = analogRead(A0);
    sensors[1] = analogRead(A1);

    Serial.print(sensors[0]);
    Serial.print(",");
    Serial.println(sensors[1]);
    }
   

}

void establishContact() {

  while(Serial.available() <= 0) {
    Serial.println("0,0");
    delay(300);
  }
}

.

(3)processing側のプログラム

 import processing.serial.*;
Serial myPort;

float i;
float j;
void setup() {
  size(800,800,P3D);
  
  myPort = new Serial(this,"COM3",9600);
  
  myPort.bufferUntil('\n');
}

void draw() {
  
  background(0);
 
  translate(width/2,height/2);
  fill(#E4FA03);
  rotateY(frameCount/i);
  rotateX(frameCount/i);
  box(j);
  
}

void serialEvent(Serial myPort){
  
  String myString = myPort.readStringUntil('\n');
  
  myString = trim(myString);
  
  int sensors[] = int(split(myString, ','));
  
  if (sensors.length > 1) {
  //0~1023を0~255に変換 i = map(sensors[0],0,1023,0,255); j = map(sensors[1],0,1023,0,255); } myPort.write("A"); }

.

・結果

 


accept arduino date by serial 3 2017 03 21 9 04 05

お名前.com

 

 

shangtian.hatenablog.com

shangtian.hatenablog.com

 

processing JSON web APIを使って天気情報を表示させる

・目的

 JSON形式のweb APIを使ってProcessing にて天気予報を表示させる

 

・使用したもの

 Processing 3.2.1

 ノートPC(Windows 10

 

・方法

(1)天気予報サービスを利用する

    今回はJSONデータで天気予報を配布しているライブドアのお天気

webサービスを使用する。仕様はhttp://weather.livedoor.com/weather_hacks/webservice

に載っている。

 

--JSONとは--

 JSON(JavaScript Object Notation)は、軽量のデータを交換するフォーマット。

詳しくはhttp://www.json.org/json-ja.htmlを見てください。

 

 

 (2)プログラムコード

String baseURL = "http://weather.livedoor.com/forecast/webservice/json/v1?city="; 
String city = "120010";  //都市コード
String title;
String publicTime;
String image;
JSONArray forecasts;
JSONArray description;



void setup() {
  size(800,800);
  JSONObject w = loadJSONObject(baseURL+city); //JSON形式のデータを取得 baseURLと都市コードを結合  
  title = w.getString("title");                 
  forecasts = w.getJSONArray("forecasts");   //forecastsのプロパティーを取得
  publicTime = w.getString("publicTime");
  
  
}


void draw() {
  background(255);
  fill(0);
  text(title,150,30);
   text(publicTime,width/2,height/2);
  
  //配列に収納されているので データを取り出す
  for(int i=0; i<forecasts.size(); i++){
    JSONObject f = forecasts.getJSONObject(i);
    String s =  f.getString("dateLabel")+":" +f.getString("telop");
    JSONObject t = f.getJSONObject("temperature");
    JSONObject v = f.getJSONObject("image");
    for (int j=0; j<v.size();j++){
      String link = v.getString("url");
          textSize(30);
          text(link,170,330);
    }
    
    
text(s,150,100+20*i);
  }
    
}

図1:プログラムコード

 

・結果 

 文字を拡大するコードを入力し実行した結果が図2。文字化けしている。

for (int j=0; j<v.size();j++){
      String link = v.getString("url");
          textSize(30);//この行を削除したのが図3
          text(link,170,330);
    }

 

f:id:shangtian:20170321165024p:plain

図2:文字化け

f:id:shangtian:20170321165026p:plain

図3:天気情報

・考察

 表示される文字の大きさが小さいため

 textSize(); 

  で大きくしたが、日本語が文字化けしてしまう。

 おそらくProcessing側のフォントをUTF-8にすることで解決

 しそうだが、設定画面で変更しようとしても、そもそも設定画面にUTF-8

 が存在しないため解決できなかった。英語のサイトから天気情報を持ってくれば

 一応は解決しそうだ。

<参考文献>

JSON の紹介

 (http://www.json.org/json-ja.html

Processing で Web API (Web サービス) を利用するプログラムを作る

 (http://www2.kobe-u.ac.jp/~tnishida/misc/processing-web-api.html)

ヘテムル