ELEGOO:Lesson 22 & 23

Lesson 22 LCD Display

LCD 1602。16文字 x 2行表示なので1602って型番です。パーツ正式な型番は「1602A」ですね。
画像で表示するのではなくて、内部に文字のフォントを持っていて、それを表示するタイプです。なので、自由な描画はできないです。こちらがくわしいです。

基礎からの IoT 入門:Arduino を用いて LCD に文字を表示
https://iot.keicode.com/arduino/arduino-project-lcd.php

端子いっぱいあります。
VSS / VDD / VO / RS / RW / E / D0~D7 / A / K

なので、接続のケーブルもいっぱい。

D0~D3は使わないです。電源は5V。電源とGND、数か所で繋ぐ必要あるんですね。

ライブラリは、LiquidCrystal Libraryを使用。

LiquidCrystal Library
https://www.arduino.cc/en/Reference/LiquidCrystal

ライブラリを使えば、文字表示処理は簡単です。

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Hello, World!");
}
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

初期化は LiquidCrystal(rs, enable, d4, d5, d6, d7) です。

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

インスタンス生成。

lcd.begin(16, 2);

縦横サイズ指定

lcd.print("Hello, World!");

文字列表示。

lcd.setCursor(0, 1);

これで表示位置を指定。

lcd.print(millis() / 1000);

上で指定した位置に、起動からの秒数を表示。

Hello~!

可変抵抗器で、画面のコントラスト調整ができます。最初何も表示されなくて、回路間違えたのかとビックリしましたが、調整すると表示されるようになりました。


Lesson 23 Thermometer

LCD表示回路に、サーミスタを追加して、温度を表示します。


サーミスタは、温度によって抵抗値が変化する抵抗器です。
普通の抵抗器も、温度によってあるていど抵抗値が変化するのですが、計測できないぐらいのわずかな値。
サーミスタは、その値がとても大きい部品です。(1℃に付き100Ωぐらい変化する)

サーミスタには、温度が高いと抵抗値が小さくなるNTC (negative temperature coefficient)と、逆に温度が高いと抵抗値が大きくなるPTC (positive temperature coefficient)があるとのこと。
温度を測るときは、通常はNTCを使います。
PTCは、リセット可能なヒューズに使われています。(高温になると抵抗が大きくなって通電されなくなる。冷えると戻る。)

回路は Lesson 22にサーミスタを追加したもの。

全体のスケッチはこんな。

#include <LiquidCrystal.h>
int tempPin = 0;
// BS E D4 D5 D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup()
{
  lcd.begin(16, 2);
}
void loop()
{
  int tempReading = analogRead(tempPin);
  // This is OK
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK ); // Temp Kelvin
  float tempC = tempK - 273.15; // Convert Kelvin to Celcius
  float tempF = (tempC * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
  /* replaced
  float tempVolts = tempReading * 5.0 / 1024.0;
  float tempC = (tempVolts - 0.5) * 10.0;
  float tempF = tempC * 9.0 / 5.0 + 32.0;
  */
  // Display Temperature in C
  lcd.setCursor(0, 0);
  lcd.print("Temp C ");
  // Display Temperature in F
  //lcd.print("Temp F ");
  lcd.setCursor(6, 0);
  // Display Temperature in C
  lcd.print(tempC);
  // Display Temperature in F
  //lcd.print(tempF);
  delay(500);
}

温度ピンはアナログ0番。(A0って書いてもどっちでもいい)

int tempPin = 0;
// BS E D4 D5 D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

LiquidCrystal の定義では、コメントでピンの順番書いておくと分かりやすいですよ、とのこと。(Lesson 22 の時はそこまで気が回らなかったのだな…)

温度計測のロジックはこちら。

int tempReading = analogRead(tempPin);
// This is OK
double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK ); // Temp Kelvin
float tempC = tempK - 273.15; // Convert Kelvin to Celcius
float tempF = (tempC * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit

係数いろいろ使って計算です。セ氏、カ氏、必要なものに変換。あとは、位置指定して表示しているだけです。

文字表示だけで、グラフィック表示ができないので、いろいろ遊ぶには物足りないとこですね。