Page

Rabu, 11 November 2020

NodeMCU LCD I2C with DHT21/AM2301

    Rangkaian


    Sebelum memprogram sesuai perancangan, dilakukan cek pada koneksi LCD I2C untuk mengetahui alamat yang akan digunakan atau yang terhubung. Install terlebih dahulu library "LiquidCrystal I2C" oleh Frank de Brabander.


    Setelah selesai diinstall, upload kode program berikut ini untuk melakukan scanning alamat I2C-nya.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/

#include <Wire.h>
 
void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
}
 
void loop() {
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
      nDevices++;
    }
    else if (error==4) {
      Serial.print("Unknow error at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
  delay(5000);          
}

    Perhatikan feedback dari serial monitor, apabila menggunakan LCD 16x2 maka kemungkinan akan keluar hasil 0x27, seperti pada gambar berikut.


    Berdasarkan alamat I2C yang sudah didapatkan, maka dapat kita lanjutkan ke pemrograman utama dari rangkaian yang dibuat.
 
    Kode Program
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/////LCD I2C///////
#include  <Wire.h>
#include  <LiquidCrystal_I2C.h>
////DHT////////////
#include <DHT.h>
#include <DHT_U.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

#define DHTPIN D7
#define DHTTYPE DHT22
DHT_Unified dht(DHTPIN, DHTTYPE);

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

  dht.begin();
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  dht.humidity().getSensor(&sensor);
  delay(2200);
  lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight

  lcd.backlight();
  delay(250);
  lcd.noBacklight();
  delay(250);
  lcd.backlight();
}

void loop() {
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    lcd.setCursor(0,0);
    lcd.print("Err read Temp!");
    delay(1000);
  }
  else {
    lcd.setCursor(0,0);
    lcd.print("Temp:"+String(event.temperature)+char(223)+"C");
    delay(1000);    
  }
  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    lcd.print("Err read Humd!");
  }
  else {
    lcd.setCursor(0,1);
    lcd.print("Humd:"+String(event.relative_humidity)+"%");
    delay(1000);
  }
}

    Kode program di atas menemui beberapa kendala saat dibuat, kendala tersebut diantaranya adalah penulisan integer yang ingin ditampilkan dengan cara digabung dengan string, kemudian penulisan "°C" yang tidak bisa dituliskan langsung dalam string untuk ditampilkan. Kendala pertama dapat diatasi dengan digunakan fungsi String() untuk variabel integer yang ingin dikonversi. Kendala berikutnya dapat diatasi dengan merujuk ke HD44780 set karakter kode dengan kode dari derajat yaitu 223.

Usefull source
1. ESP32 I2C LCD

2. Arduino I2C LCD 16x2

3. Concatenate String and Integer(converted)

4. Print Celcius Degree


Tidak ada komentar:

Posting Komentar