(農業)情報工学・課題 (2020/01/15))

 Arduino入門(3)

今回は、Arduinoの最終回となる。
本年、初めてArduinoを利用したため、PCの環境整備などが不十分となり、実際に演習として活用できなかったケースも多かったようである。また、PCも旧型で若干パフォーマンスに問題があった。
それでも、なんとかLチカは成功したようであるので、最低限のIoT体験は出来た物と期待したい。
今回はとりあえず電池で動作する「温湿度計」を完成させて、完了としたい。
なお、更に進める事の出来る班はArduinoUNOを用いて何かの「作品」を作成し、その作品の概要を全員の前で「プレゼンテーション」してもらう事も考えている。

LCDの接続
LCDの1602Aは、16文字X2行の表示が可能である。今回利用する1602AはI2C(アイ・ツー・シー)アダプターによって制御されているので、電源 (VCC/GND) と I2C (SDA/SCL) で接続可能となっている。具体的には、4本の信号線を接続するだけである。I2Cは、Inter-Integrated Circuitという通信規格でArduinoではよく利用されるインターフェースである。
LCDを利用するためのライブラリは、次の手順で組み込む必要がある。 このライブラリで、次のスケッチが動作する。

接続は、LCDの裏側にあるI2Cの4本のコネクタに、次の信号を接続する。
  • GND-GND:(グラウンド)と接続、通常ブレッドボードの(−)を使って接続する。黒線が良い。
  • 5V -VCC:(Voltage Collector)はIC回路の正電圧側。ブレッドボードの(+)を使う。赤線が良い。
  • A4 -SDA:(データ)I2C接続のデータ信号線で、今回はArduinoUnoのA4コネクタに接続する。
  • A5 -SCL:(クロック)I2C接続のクロック信号線で、今回はArduinoUnoのA5コネクタに接続する。
とりあえずこの4本だけ接続して、次のスケッチで動作の確認をしてみよう。

        // LCD
        #include <LiquidCrystal_I2C.h>
        LiquidCrystal_I2C lcd(0x27,16,2);

        void setup() {
          lcd.init(); 
          lcd.backlight();
          lcd.setCursor(0, 0);
          lcd.print("LCD Test");
        }
                
        void loop() {
          for(int i=0; i<10; i++){
            lcd.setCursor(5, 1);
            lcd.print("i=");
            lcd.print(i);
            delay(200); // 0.2秒
          }
        }
      
接続が正しいのにLCDに何も表示されていないときは、I2C基板のボリュームで輝度を調整すると良い場合もある。

温湿度の表示
今度は温湿度センサを接続して、その数値をLCDに表示させる。前回の接続と同じピン配置で良い。 即ち、DHT11モジュールの電源線(GNDと5Vの2本)と信号線(1本のみ)の合計3本をArduinoUNOに接続する。
電源線はArduinoUNOのGNDと5V、信号線は今回、8番ポートを利用する。

  //LCDを利用
  #include <LiquidCrystal_I2C.h>
  
  //DHT(温湿度センサ)を利用
  #include <DHT.h>
  #define DHT_Pin 8 //DHT11のDATAピンを定義
  #define DHT_Type DHT11 //センサの型番定義 DHT11,DHT22など
  
  DHT dht(DHT_Pin, DHT_Type); //センサ初期化
  LiquidCrystal_I2C lcd(0x27,16,2); //LCD初期化
  
  /* 計測値設定 */
  float humidity = 0.0f; //湿度(実数値)
  float tempC = 0.0f; //摂氏温度(実数値)
    
  void setup() {
    Serial.begin(9600); // データ転送レートを9600bpsで指定
    Serial.println("DHT11 読み取り結果"); // モニタ画面に表示
    dht.begin(); //温湿度センサー開始
    //
    lcd.init(); 
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("Temp & Humidity"); // LCDの1行目
  }
  
  void loop() {
    delay(2000); //2秒待つ データの読み出し周期1秒以上必要。
    
    humidity = dht.readHumidity(); //湿度の読み出し
    tempC = dht.readTemperature(); //温度の読み出し 摂氏
    
    // 読み取れたかどうかのチェック
    if (isnan(humidity) || isnan(tempC)) {
      Serial.println("読み取り失敗!");
      return;
    }
    
    // 読み取り値のシリアルモニタ表示
    Serial.print("湿度: ");
    Serial.print(humidity);
    Serial.println("[%]");
    Serial.print("温度: "); 
    Serial.print(tempC);
    Serial.println("[℃]");
    // 
    lcd.setCursor(0, 1);  // LCDの2行目
    lcd.print("T=");
    lcd.print(tempC);
    lcd.setCursor(8, 1);
    lcd.print("H=");
    lcd.print(humidity);
  }
このスケッチを転送すると、現在の気温と湿度がLCDに表示されるはずである。
また、ArduinoIDEの「ツール」から「シリアルモニタ」では、現在の気温と湿度が表示されている。
うまく動作した場合には、電池モジュールを接続すれば、単独に動作する。つまり、温湿度計が完成する。
更なるArduino機器への発展
今回は、この温度湿度計が完成すれば完成とする。完成した班は、次の様な課題に取り組んでみてはどうであろうか。 今年度の情報工学の授業内容について、別紙のアンケートに回答してもらいたい。
なお来年度以降に向けて1時間程度のミーティングに参加しても良い人は、その旨をアンケートに記入して下さい。

リンク集