【Arduino实验12 1602 LCD显示】

目录

一、实验目的

二、实验设备与环境

三、实验重点

四、实验难点

五、实验内容

5.1实验任务

5.2实验原理

5.3实验内容

5.4实验结果  

5.5思考题


一、实验目的

        (1)熟悉1602LCD液晶显示模块的功能

        (2)熟悉DHT1温湿度传感器的功能

        (3)掌握DHT11、liquidCrystal库函数功能与用法;

        (4)掌握温湿度传感器、LCD液晶显示控制程序编写;

        (5)编程实现一个数字显温湿度计的功能

二、实验设备与环境

        Arduino UNO套件、Arduino IDE、计算机、DHT1温湿度传感器、1602LCD显示器、电阻、电位器等

三、实验重点

        (1)数字显示温湿度计实验电路连接;(2)温湿度传感器、LCD液晶显示控制程序编写;(3)数字显示温度、湿度计编程

四、实验难点

        (1)LCD显示控制原理;(2)数字温度、湿度计显示编程

五、实验内容

5.1实验任务

        任务描述:DHT11温湿度传感器测试;编程控制1602 LCD显示;编程实现数字显示温湿度计        

5.2实验原理

        1.温湿度传感器

        DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连。DHT11温湿度传感器多用于冷暖空调、气象站、除湿器、数据记录器、测试及检测设备等。

        产品为4针单排引脚封装。

        DHT11温湿度传感器参数:

        测量范围:20-90%RH;0-50°C

        测量精度:±2°C;±5RH

        针脚:4针直排,1-VCC(3-5V);2-DATA,串行数据;3-NC,悬空脚;4-GND,接地

        串行接口通信:

        DATA 用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右。操作流程如下:

         数据分小数部分和整数部分, 一次完整的数据传输为40bit,高位先出。

        数据传送正确时,数据=“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和”。        

        2.1602LCD显示器

        液晶显示器在控制显示面板中应用广泛,称为Liquid CrystalDisplay,简称LCD,是各种便携式电子产品的理想显示器,1602LCD叫1602字符型液晶,是一种专门用来显示字母、数字、符号等的点阵型液晶模块,字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD,常用16×1,16×2,20×2和40×2等的模块。一般的LCD1602字符型液晶显示器的内部控制器大部分为HD44780,能够显示英文字母、阿拉伯数字、日文片假名和一般性符号,多用于电子仪表、数字仪表、冰箱、空调等装置。

        1602 LCD显示屏引脚定义: 

        3.数字温湿度显示电路

        注:调节电位器,可以调节LCD背景光亮度。

        4.库函数

        (1)DHT1库函数

        dht11库函数:

        DHT11数字温湿度传感器是一款含有已校准数字信号输出的复合传感器,要通过DHT11类库函数进行温湿度检测与信息编码。

        dht11类只有一个成员函数:read()

        功能:读取DHT11传感器数据,并将温度值、湿度值分别存入temperature、humidity两个成员变量中

        语法:DHT11.read(pin)

        参数:DHT11,一个dht11类的对象;pin,Arduino连接传感器的引脚编号

        返回值:int类型,为0、-1或2

        0对应宏DHTLIB_OK,收到数据,且校验正确;

        -1对应宏DHTLIB_ERROR_CHECKSUM,表示接收到数据但校验错误;

        2对应宏DHTLIB_ERROR_TIMEOUT,表示通信超时

        成员变量:

        dht11.humidity–存储检测到的湿度值

        dht11.temperature–存储检测到的温度值 

       

        (2)LiquidCrystal库函数

        #include <LiquidCrystal.h> // 包含库的头文件

        LiquidCrystal LCD(rs,enable,d4,d5,d6,d7)//声明一个LiquidCrystal类对象示例LCD,4位数字接法

        LiquidCrystalLCD(rs,rw,enable,d0,d1,d2,d3,d4,d5,d6,d7) //8位数据线接法

        引脚参数:

        rs,连接RS的Arduino的引脚编号

        rw,连接R/W的Arduino的引脚编号

        enable,连接到E的Arduino的引脚编号

        d0,d1,d2,d3,d4,d5,d6,d7 数据线连接Arduino的引脚编号

        LiquidCrystal类实体LCD的成员函数:

        LCD.begin(cols,rows) //设置显示的宽度和高度

        LCD.clear() //清屏,光标移到左上角

        LCD.home //光标复位到左上角

        LCD.setCursor(col,row) //设置光标到指定位置

        LCD.write(data) //输出一个字符到

        LCDLCD.print(data) //输出一串字符到LCD,返回输出的字符数

        LCD.cursor()/noCursor() //显示/隐藏光标

        LCD.blink/noBlink //开启/关闭光标闪烁

        LCD.display/noDisplay //开启/关闭LCD显示

        LCD.scrollDisplayLeft()/scrollDisplayRight() //向左/右滚屏显示

        LCD.leftToRight()/rightToLeft() // 文本输入方式从左至右/从右至左

        LCD.autoscroll()/noAutoscroll() // 自动滚屏/关闭自动滚屏

        (3)serial()–串口通信函数

        Serial.begin(speed)

        // 初始化串口的波特率,常用9600、19200、57600、115200。

        // 波特率,每秒传输的bit数

        Serial.available( )

        // 不带参数

        // 返回串口缓冲区当前剩余字符的个数,用以判断串口缓冲区有无数据。

        // 当serial.available()>0时,判断串口收到了数据,可以读取

        Serial.read( )

        // 读取串口缓冲区1个Byte的数据,不带参数,返回int型。

        // 反复读取串口数据直到读完(Serial.available()=0)时止

while (Serial.available()>0){
    data= Serial.read();     // 读取串口数据并赋值给变量
    datadelay(2);     // 延迟2ms,避免数据错误
}
Serial.flush()      // 清除缓冲区buffer内的资料
Serial.print( data,encoding)
// 从串口输出data数据,可以是变量、字符串;encoding,数据采用的进制。
// serial.print( data,encoding)语句范例:
Serial.print(75);        // 串行输出"75"
Serial.print(75,DEC);    // 串行输出"75"
Serial.print(75, HEX);    // 串行输出"4B",(75 的十六进位)
Serial.print(75, OCT);    // 串行输出"113" ,(75 的八进位)
Serial.print(75, BIN);    // 串行输出"1001011",(75的二进位)
Serial.print(75, BYTE);   // 串行输出"K" ,以byte进行传送,显示以ASCII编码方式

         Serial.println(data,encoding ) // 与Serial.print()输出内容相同,在末尾加换行

5.3实验内容

        1.温湿度传感器测试

        步骤1:按温湿度检测电路原理图连接电路

        步骤2:参考示例程序输入DHT11检测程序代码

// DHT11 温湿度传感器示例程序 
// Written by Tony DiCola for Adafruit Industries 
// 需要以下 Arduino 库函数: 
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library 
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor 
// 头文件 
#include <Adafruit_Sensor.h> 
#include <DHT.h> 
#include <DHT_U.h> 
#define DHTPIN A0 // 连接 DHT11 传感器的 Arduino 板数字引脚 
#define DHTTYPE DHT11 // DHT 11 // 宏定义传感器类型常量 
DHT_Unified mydht(DHTPIN, DHTTYPE); //声明一个实体对象 
uint32_t delayMS; // uint_32_t 是指 32 位的无符号整形变量 
void setup() { 
    Serial.begin(9600); 
    mydht.begin(); 
    Serial.println("DHT11 Sensor Example:"); 
    // 输出温度传感器参数. 
    sensor_t sensor; //声明一个传感器结构体对象 
    mydht.temperature().getSensor(&sensor); 
    Serial.println("------------------------------------"); 
    Serial.println(F("Temperature Sensor")); 
    Serial.print("Sensor Type:"); Serial.println(sensor.name); 
    Serial.print("Driver Ver: "); Serial.println(sensor.version); 
    Serial.print("Unique ID: "); Serial.println(sensor.sensor_id); 
    Serial.print("Max Value: ");Serial.print(sensor.max_value); Serial.println("`C"); 
    Serial.print("Min Value: ");Serial.print(sensor.min_value); Serial.println("`C"); 
    Serial.print("Resolution: ");Serial.print(sensor.resolution); Serial.println("`C"); 
    Serial.println("------------------------------------"); 
    // 输出湿度传感器参数 
    mydht.humidity().getSensor(&sensor); 
    Serial.println("Humidity Sensor"); 
    Serial.print("Sensor Type: ");Serial.println(sensor.name); 
    Serial.print("Driver Ver: ");Serial.println(sensor.version); 
    Serial.print("Unique ID: ");Serial.println(sensor.sensor_id); 
    Serial.print("Max Value: ");Serial.print(sensor.max_value); Serial.println("%"); 
    Serial.print("Min Value: ");Serial.print(sensor.min_value); Serial.println("%"); 
    Serial.print("Resolution: ");Serial.print(sensor.resolution); Serial.println("%"); 
    Serial.println("------------------------------------"); 
    // 设定传感器两次读取的基础时间间隔 
    delayMS = sensor.min_delay/1000; 
}
void loop() { 
    delay(delayMS); // 两次读取传感器数值的间隔时间 
    // 读取当前温度,并输出温度值 
    sensors_event_t event; 
    mydht.temperature().getEvent(&event); 
    if (isnan(event.temperature)) { 
        Serial.println("Error reading temperature!"); 
    } 
    else { 
        Serial.print("Temperature: "); 
        Serial.print(event.temperature); 
        Serial.println("°C"); 
    } 
    // 读取当前湿度,并输出湿度值 
    mydht.humidity().getEvent(&event); 
    if (isnan(event.relative_humidity)) { 
        Serial.println("Error reading humidity!"); 
    } 
    else { 
        Serial.print("Humidity: "); 
        Serial.print(event.relative_humidity); 
        Serial.println("%"); 
    } 
} 

        步骤3:运行、测试、调试程序功能

        2.1602LCD显示器功能测试

        步骤1:如电路原理图所示,将1602 LCD功能、数字引脚与Arduino UNO板I/O口连接

        步骤2:编写1602LCD显示测试程序:

#include <LiquidCrystal.h> // 包括库函数的头文件 
const int rs = 10, en =12, d4 = 4, d5 = 5, d6 =6,d7 = 7; // 初始化针脚 
LiquidCrystal mylcd(rs, en, d4, d5, d6, d7); // 4 位数字接法对象实体 
int time; 
void setup() { 
    mylcd.begin(16, 2); // 设置 LCD 显示 2 行 16 列 
    mylcd.print("Hello, Arduino UNO R3!"); // 显示“Hello, Arduino UNO R3!”信息 
} 
void loop() { 
    mylcd.setCursor(0, 1); //设置光标定位到第 0 列,第 1 行(从 0 列 1 行开始显示) 
    time = millis(); 
    mylcd.print( time / 1000); //打印从重置后的秒数 
} 

        步骤3:运行、测试、调试程序功能

        步骤4:编写1602LCD显示串口输入的数据

#include <LiquidCrystal.h> // 包括库函数的头文件 
const int rs = 10, en =12, d4 = 4, d5 = 5, d6 =6,d7 = 7; // 初始化针脚 
LiquidCrystal mylcd(rs, en, d4, d5, d6, d7); // 4 位数字接法对象实体 
int time; 
void setup() { 
    mylcd.begin(16, 2); // 设置 LCD 显示 2 行 16 列 
    Serial.begin(9600); // 初始化串口通信参数 
} 
void loop() { 
    mylcd.setCursor(0, 0); //设置光标定位到第 0 列,第 0 行(从 0 列 0 行开始显示) 
    if (Serial.available()){ 
        delay(100); //延时等待所有数据进入缓冲区 
        mylcd.clear(); // 清屏 
        while (Serial.available()>0){ // 只要缓冲区还有字符则显示输出 
            character = Serial.read(); // 读取串口输入的字符赋给变量 
            mylcd.Write(character); // LCD 输出字符 
        } 
    } 
} 

         步骤5:程序功能扩展:

        实验任务:用LCD实现自动滚屏显示、从左向右或从右向左显示、光标任意定位与闪烁等显示功能

#include<LiquidCrystal.h>
const int rs=10,en=12,d4=4,d5=5,d6=6,d7=7;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
void setup() {
  lcd.begin(16,2);
  lcd.print("hello,world");
  for(int i=0;i<13;i++)
  {
    lcd.scrollDisplayLeft(); 
    }
}
void loop() {
    for(int i=0;i<29;i++)
  {
    lcd.scrollDisplayRight();
    delay(500);
    }
    for(int i=0;i<29;i++)
  {
    lcd.scrollDisplayLeft();
    delay(500);
    }
  lcd.setCursor(0,1);
}

        3.数字显示温湿度计

        实验任务:根据已给定的电路图和温度传感器、1602 LCD显示功能的测试程序,编写程序,实现一个LCD数字显示温度计。

        略。

5.4实验结果  

        结论:用 LCD 实现自动滚屏显示、从左向右或从右向左显示

        反思:通过本次实验,我学到了很多知识,掌握了1602LCD 液晶显示模块的功能和DHT1温湿度传感器的功能。学会了DHT11、liquidCrystal 库函数功能与用法和掌握温湿度传感器、LCD 液晶显示控制程序编写。但还需要学习更多的知识。

        作品:

         

5.5思考题

1.如何用1602LCD制作一个数字显示时钟?

注:从ArduinoIDE的库管理下载的DHT11库的时候可能会遇到编译错误的问题 错误信息类似“为某某开发板编译时出错” In file included from C:\Users\admin\Documents\Arduino\libraries\DHT_sensor_library\DHT_U.cpp:15:0: C:\Users\admin\Documents\Arduino\libraries\DHT_sensor_library\DHT_U.h:36:29: fatal error: Adafruit_Sensor.h: No such file or directory compilation terminated. exit status 1

为开发板 Arduino/Genuino Uno 编译时出错。 编译还说了:C:\Users\16285\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.h:36:29: fatal error: Adafruit_Sensor.h: No such file or directory #include <Adafruit_Sensor.h> 意思是找不到Adafruit_Sensor.h这个头文件

解决办法:给"DHT-sensor-library-master"放一个“Adafruit_sensor.h”文件进去 安装使用的库目录参考:C:\Users\admin\Documents\Arduino\libraries\DHT_sensor_library

版权声明:本文为CSDN博主「张小花-Soleil」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_50509016/article/details/122781493

生成海报
点赞 0

张小花-Soleil

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

【Arduino实验16 步进电机的控制】

目录 一、实验目的 二、实验设备与环境 三、实验重点 四、实验难点 五、实验内容 5.1实验任务 5.2实验原理 5.3 实验内容 5.4实验结果 5.5思考题 一、实验目的 (1)掌握ULN2003AN驱动阵列的原理&#x

AD原理图设计与Clion源码工具学习

一、AD绘制电路原理图 1.准备工作 下载Altium Designer,具体安装步骤以及百度网盘分享参考:Altium Designer2018下载安装及基本使用 STM32F103C8T6元件库&#xff1a

单片机物联网升级方案

单片机物联网远程升级方案,直接上干货 一般消费级产品,为了性价比,选用的mcu,一般资源很有限,以stm32103c6t6为例 ram 20k rom64k,主