Kód Arduina a video pre digitálny snímač teploty a vlhkosti Aosong AM2320 s LCD1602 a modulom I2C
V tomto návode si ukážeme, ako používať digitálny senzor teploty a vlhkosti Aosong AM2320 spolu s displejom LCD1602, ktorý využíva modul I2C. Cieľom je zobraziť hodnoty teploty vo stupňoch Fahrenheita aj Celzia, ako aj relatívnu vlhkosť. Toto zapojenie je ideálne na monitorovanie podmienok prostredia v rôznych projektoch, čo z neho robí všestranný doplnok vašej výbavy pre Arduino.

Na získanie údajov o teplote a vlhkosti budeme používať senzor AM2320, ktoré sa potom zobrazia na displeji LCD1602. Modul I2C zjednodušuje proces zapojenia, pričom vyžaduje iba štyri pripojenia: VCC, GND, SDA a SCL. Pre jasné pochopenie zapojenia a programovania odporúčam pozrieť si príslušné video (vo videu v čase 00:00).
Vysvetlenie hardvéru
Medzi kľúčové komponenty tohto projektu patria senzor AM2320, displej LCD1602 a modul I2C. AM2320 je digitálny senzor, ktorý poskytuje presné merania teploty a vlhkosti prostredníctvom rozhrania I2C. Pracuje pri napätí 3,3 V až 5,5 V a má rozsah merania -40 °C až +80 °C pre teplotu a 0 % až 100 % pre vlhkosť.
Displej LCD1602 umožňuje vizualizáciu hodnôt zo senzora. Je to znakový displej 16x2, ktorý komunikuje cez protokol I2C, čo znižuje počet potrebných pripojení na iba štyri. Modul I2C konvertuje paralelné dáta z LCD na sériový formát, čo uľahčuje pripojenie k Arduinu.
Podrobnosti z datasheetu
| Výrobca | Aosong |
|---|---|
| Označenie súčiastky | AM2320 |
| Logické/Výstupné napätie | 3,3 V - 5,5 V |
| Napájacie napätie | 3,3 V - 5,5 V |
| Výstupný prúd | ≤ 1,5 mA |
| Rozsah merania (Teplota) | -40 °C až +80 °C |
| Rozsah merania (Vlhkosť) | 0 % až 100 % |
| Čas odozvy | ≤ 2 s |
| Puzdro | DIP-4 |
| Poznámky / varianty | Pre pripojenia I2C sa odporúčajú pull-up rezistory. |
- Zabezpečte správne napájanie v rámci špecifikovaného rozsahu napätia.
- Použite pull-up rezistory (odporúča sa 4,7 kΩ) pre linky SDA a SCL.
- Skontrolujte správnu I2C adresu (predvolená je 0x27 pre väčšinu LCD).
- Riešte potenciálne chyby kontrolou chybového kódu senzora.
- Pred zobrazením nových hodnôt vyčistite LCD, aby ste predišli prekrývaniu.
Pokyny na zapojenie

Na zapojenie senzora AM2320 pripojte ľavý pin (VCC) na 5V na Arduine. Druhý pin (SDA) ide na pin A4 na Arduino Uno (alebo pin 20 na Mega). Tretí pin (GND) by mal byť pripojený na zem a štvrtý pin (SCL) sa pripája na pin A5 na Arduino Uno (alebo pin 21 na Mega). Okrem toho pripojte 4,7 kΩ rezistor medzi pin SDA a 5V a ďalší 4,7 kΩ rezistor medzi pin SCL a 5V, aby ste zabezpečili správne úrovne signálu.
Pre displej LCD1602 s I2C pripojte pin VCC na 5V a pin GND na zem. Pripojte pin SDA z LCD na rovnaký pin SDA (A4), ktorý sa používa pre senzor. Podobne pripojte pin SCL z LCD na rovnaký pin SCL (A5), ktorý sa používa pre senzor. Toto spoločné zapojenie umožňuje obom zariadeniam komunikovať po rovnakej zbernici I2C.
Príklady kódu a vysvetlenie
Nasledujúci kód inicializuje senzor AM2320 a displej LCD1602. Začína zahrnutím potrebných knižníc a vytvorením inštancie senzora.
#include
AM2320 sensor;
#include
LiquidCrystal_I2C lcd(0x27, 16, 2);
Tu sa vytvorí objekt sensor z knižnice AM2320 a objekt lcd sa inicializuje s I2C adresou displeja.
Vo funkcii setup() inicializujeme senzor aj LCD. To zahŕňa zapnutie podsvietenia a vytlačenie úvodnej správy.
void setup() {
sensor.begin();
lcd.begin();
lcd.backlight();
lcd.print("Robojax AM2320 ");
lcd.setCursor (0,1);
lcd.print("LCD1602 I2C Demo");
delay(3000);
}
Tento kód nastaví displej tak, aby zobrazoval uvítaciu správu po dobu 3 sekúnd, čo používateľovi poskytne čas na to, aby videl, že sa systém inicializuje.
Funkcia loop() nepretržite kontroluje merania senzora a podľa toho aktualizuje displej. Ak je meranie k dispozícii, vymaže obrazovku a vytlačí teplotu vo stupňoch Fahrenheita aj Celzia spolu s relatívnou vlhkosťou.
void loop() {
if (sensor.measure()) {
lcd.clear();
lcd.print("T:");
lcd.print(temp('F'));
lcd.print("F/");
lcd.print(temp('C'));
lcd.print("C");
lcd.setCursor (0,1);
lcd.print("R.H. :");
lcd.print(sensor.getHumidity());
lcd.print("%");
}
else {
int errorCode = sensor.getErrorCode();
switch (errorCode) {
case 1: lcd.print("ERR: Sensor offline"); break;
case 2: lcd.print("ERR: CRC failed."); break;
}
}
delay(500);
}
Tento úryvok ukazuje, ako program získava a zobrazuje údaje zo senzora, pričom spracúva prípadné chyby kontrolou errorCode.
Demonštrácia / Čo očakávať
Po dokončení nastavenia očakávajte, že LCD zobrazí teplotu vo stupňoch Fahrenheita aj Celzia, ako aj percentuálnu relatívnu vlhkosť. Ak je senzor offline alebo dôjde k chybe CRC, displej zobrazí príslušné chybové hlásenia. Je dôležité zabezpečiť, aby boli všetky pripojenia pevné, aby sa predišlo problémom (vo videu v čase 02:45).
Časové značky videa
- 00:00 - Úvod do projektu
- 01:30 - Pokyny na zapojenie
- 03:15 - Vysvetlenie kódu
- 04:45 - Demonštrácia funkčnosti
++
/**
* This is Arduino code for AM2320 Temperature and Humidity Sensor with LCD1602 and I2C Module
* which displays the temperature and RH (relative humidity)
* on an LCD1602 with an I2C module. The code was combined by Robojax.
*
Original Code For AM2320 :https://github.com/hibikiledo/AM2320
Copyright 2016 Ratthanan Nalintasnai
Modified for Robojax.com video by
Ahmad S. on March 22, 2018 at 23:55 in Ajax, Ontario, Canada
This code, with library and other codes, is available at
https://robojax.com
Watch the video instruction for this code: https://youtu.be/ym567hneDpE
**/
// Include library for AM2320
#include <AM2320.h>
// Create an instance of the sensor
AM2320 sensor;
#include <Wire.h>
// Include the LiquidCrystal library for display
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Call sensor.begin() to initialize the library
sensor.begin();
// Robojax code for LCD with I2C
// Initialize the LCD,
lcd.begin();
// Turn on the backlight and print a message.
lcd.backlight();
lcd.print("Robojax AM2320 ");
lcd.setCursor (0,1);
lcd.print("LCD1602 I2C Demo");
delay(3000);
}
void loop() {
if (sensor.measure()) {
lcd.clear();
lcd.print("T:");
lcd.print(temp('F'));
lcd.print("F/");
lcd.print(temp('C'));
lcd.print("C");
lcd.setCursor (0,1); // go to start of 2nd line
lcd.print("R.H. :");
lcd.print(sensor.getHumidity());
lcd.print("%");
}
else { // An error has occurred
int errorCode = sensor.getErrorCode();
switch (errorCode) {
case 1: lcd.print("ERR: Sensor offline"); break;
case 2: lcd.print("ERR: CRC failed."); break;
}
}
delay(500);
}
/*
* temp()
* Returns the temperature based on the input character T.
* If T == 'F', converts Celsius to Fahrenheit.
* Otherwise, returns Celsius.
* How to use:
* To get Fahrenheit, use temp('F').
* To get Celsius, use temp('C') or temp('').
* temp('') uses an empty single quote.
*
*/
float temp(char T)
{
if (sensor.measure()) {
if(T =='F')
{
// Convert to FAHRENHEIT and return
// Robojax video tutorial
return sensor.getTemperature()* 1.8 + 32;
}else{
return sensor.getTemperature();// Return CELSIUS
}
}// if sensor.measure
}
/*********************************************************************
Original source: http://playground.arduino.cc/Main/I2cScanner
This program will find the I2C address on the I2C device. Just upload the code into your Arduino
and open the serial monitor and wait. It will display the I2C address as 0x3C or similar.
* Please view other RoboJax codes and videos at http://robojax.com/learn/arduino
* If you are sharing this code, you must keep this copyright note.
*
*********************************************************************/
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The I2C scanner uses the return value of
// the Wire.endTransmission to see if
// a device did acknowledge the 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.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown 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); // wait 5 seconds for next scan
}
Veci, ktoré by ste mohli potrebovať
-
Amazon
-
AliExpressPurchase AM2302, DHT11, or DHT22 sensor from AliExpresss.click.aliexpress.com
Zdroje a referencie
-
ExternéAM2320 Library (from GitHub)github.com
-
ExternéStránka s dokumentáciou k Arduino Wirearduino.cc
Súbory📁
Datasheet (pdf)
-
Adafruit-am2320-temperature-humidity-i2c-sensor user's manual
adafruit-am2320-temperature-humidity-i2c-sensor.pdf1.27 MB
Súbor Fritzing
-
AM2320 Humidity and Temperature Sensor
AM2320 Humidity and Temperature Sensor.fzpz0.01 MB