【雕爷学编程】Arduino动手做(85)---LCD1602液晶屏模块4

news2024/11/26 16:43:51

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十五:LCD1602液晶显示屏1602A模块 蓝屏黄绿屏灰屏5V 3.3V焊排针 IIC/I2C

在这里插入图片描述
在这里插入图片描述
知识点:1602液晶

也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

在这里插入图片描述
1602模块电原理图

在这里插入图片描述
IC/I2C接口LCD1602转接板
控制板IO口只有20个,加些传感器、SD卡啥的,继电器等模块多了,IO口就不够用了,原来的1602屏至少需要7个IO口才能驱动起来,这个模块可以帮你省5个IO口。

参数
1.供电电压:+5V
2.支持I2C协议
3.具有背光灯,和对比度调节电位器
4.4线输出更简单
5.设备地址:0x27

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
项目二十:循环显示常用的键码
实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
  项目二十:循环显示常用的键码
  Arduino------LCD1602
  5V-------------VCC
  GND-----------GND
  A4-----------SDA IIC 数据线
  A5-----------SCL  IIC 时钟线
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

uint8_t bell[8]  = {0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4};
uint8_t note[8]  = {0x2, 0x3, 0x2, 0xe, 0x1e, 0xc, 0x0};
uint8_t clock[8] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};
uint8_t heart[8] = {0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0};
uint8_t duck[8]  = {0x0, 0xc, 0x1d, 0xf, 0xf, 0x6, 0x0};
uint8_t check[8] = {0x0, 0x1, 0x3, 0x16, 0x1c, 0x8, 0x0};
uint8_t cross[8] = {0x0, 0x1b, 0xe, 0x4, 0xe, 0x1b, 0x0};
uint8_t retarrow[8] = {        0x1, 0x1, 0x5, 0x9, 0x1f, 0x8, 0x4};

// 对于 16 个字符和 2 行显示,将 LCD 地址设置为 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  lcd.init();                      // 初始化液晶显示器
  lcd.backlight();

  lcd.createChar(0, bell);
  lcd.createChar(1, note);
  lcd.createChar(2, clock);
  lcd.createChar(3, heart);
  lcd.createChar(4, duck);
  lcd.createChar(5, check);
  lcd.createChar(6, cross);
  lcd.createChar(7, retarrow);
  lcd.home();

  lcd.print("Hello world...");
  lcd.setCursor(0, 1);
  lcd.print(" i ");
  lcd.printByte(3);
  lcd.print(" arduinos!");
  delay(1000);
  displayKeyCodes();
}

// 显示所有键码
void displayKeyCodes(void) {
  uint8_t i = 0;
  
  while (1) {
    lcd.clear();
    lcd.print("Codes 0x"); lcd.print(i, HEX);
    lcd.print("-0x"); lcd.print(i + 16, HEX);
    lcd.setCursor(0, 1);
    for (int j = 0; j < 16; j++) {
      lcd.printByte(i + j);
    }
    i += 16;
    delay(1000);
  }
}

void loop() {
}

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
项目二十:循环显示常用的键码

实验场景图

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
项目十:用LCD1602A屏显示水流量传感器输出
实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
  项目十:用LCD1602A屏显示水流量传感器输出
  实验接线:Uno D2接流量传感器OUT
  Arduino------LCD1602
  5V-------------VCC
  GND-----------GND
  A4-----------SDA IIC 数据线
  A5-----------SCL  IIC 时钟线
*/

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

unsigned char flow_sensor_pin = 2;
unsigned int flow_per_min;
unsigned long current_time;
unsigned long cloop_time;
volatile int sensor_pulses;

void setup() {
  Serial.begin(9600);
  lcd.init(); //初始化LCD
  lcd.backlight(); //打开背光
  sei();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Flow Meter ");

  pinMode(flow_sensor_pin, INPUT);
  digitalWrite(flow_sensor_pin, HIGH);
  attachInterrupt(0, pulses_measure, RISING);

  current_time = millis();
  cloop_time = current_time;
}

void loop ()
{
  current_time = millis();
  if (current_time >= (cloop_time + 1000))
  {
    cloop_time = current_time;
    flow_per_min = (sensor_pulses / 7.5);
    sensor_pulses = 0;

    Serial.print(flow_per_min, DEC);
    Serial.println(" L/MIN");

    lcd.setCursor(0, 1);
    lcd.print(" ");
    lcd.setCursor(0, 1);
    lcd.print(" Flow:");
    lcd.print(flow_per_min, DEC);
    lcd.print(" L/MIN");
    delay(100);
  }
}

void pulses_measure () {
  sensor_pulses++;
}

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
项目十:用LCD1602A屏显示水流量传感器输出

实验场景图

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
项目二十一:水流量传感器、5V继电器模块和LCD1602 I2C模块
实验接线:Uno D2接流量传感器OUT,继电器接D4
Arduino------LCD1602
5V-------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
  项目二十一:水流量传感器、5V继电器模块和LCD1602 I2C模块
  实验接线:Uno D2接流量传感器OUT,继电器接D4
  Arduino------LCD1602
  5V-------------VCC
  GND-----------GND
  A4-----------SDA IIC 数据线
  A5-----------SCL  IIC 时钟线
*/

#include <LiquidCrystal_I2C.h> //include LiquidCrystal Library

LiquidCrystal_I2C lcd(0x27, 16, 2);
#define FLOWSENSORPIN 2 //连接到 Arduino 数字引脚 2 的水流传感器
#define relayPin 4    // 连接到 Arduino 数字引脚 4 的 5v 继电器模块
volatile uint16_t pulses = 0; // count how many pulses
volatile uint8_t lastflowpinstate; // track the state of the pulse pin
volatile uint32_t lastflowratetimer = 0; // you can try to keep time of how long it is between pulses
volatile float flowrate; // and use that to calculate a flow rate
// Interrupt is called once a millisecond, looks for any pulses from the sensor!

SIGNAL(TIMER0_COMPA_vect) {
  uint8_t x = digitalRead(FLOWSENSORPIN);

  if (x == lastflowpinstate) {
    lastflowratetimer++;
    return; // nothing changed!
  }

  if (x == HIGH) {
    //low to high transition!
    pulses++;
  }
  lastflowpinstate = x;
  flowrate = 1000.0;
  flowrate /= lastflowratetimer;  // in hertz
  lastflowratetimer = 0;
}

void useInterrupt(boolean v) {
  if (v) {
    // Timer0 is already used for millis() - we'll just interrupt somewhere
    // in the middle and call the "Compare A" function above
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
  } else {
    // do not call the interrupt function COMPA anymore
    TIMSK0 &= ~_BV(OCIE0A);
  }
}

void setup() {
  Serial.begin(9600);
  Serial.print("---Water flow sensor---");
  lcd.init();                      // 初始化液晶显示器
  lcd.backlight();
  lcd.begin(16, 2);                            //16X2 lcd display
  lcd.setBacklight(HIGH);
  lcd.setCursor(0, 0);                       //setting display position
  lcd.print("Aqua counter");
  pinMode(FLOWSENSORPIN, INPUT); //sets the FLOWSENSORPIN as an INPUT
  pinMode(relayPin, OUTPUT);//sets the relayPin as OUTPUT
  digitalWrite(relayPin, LOW);
  digitalWrite(FLOWSENSORPIN, HIGH);//optional Internal Pull-Up
  lastflowpinstate = digitalRead(FLOWSENSORPIN);
  useInterrupt(true);
  delay(2000);
  lcd.clear();
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Pulses:"); lcd.print(pulses, DEC);
  lcd.print(" Hz:");
  lcd.print(flowrate);
  //lcd.print(flowrate);
  Serial.print("Freq: "); Serial.println(flowrate);
  Serial.print("Pulses: "); Serial.println(pulses, DEC);

  // if a plastic sensor use the following calculation
  // Sensor Frequency (Hz) = 7.5 * Q (Liters/min)
  // Liters = Q * time elapsed (seconds) / 60 (seconds/minute)
  // Liters = (Frequency (Pulses/second) / 7.5) * time elapsed (seconds) / 60
  // Liters = Pulses / (7.5 * 60)
  float liters = pulses;
  liters /= 7.5;
  liters /= 60.0;

  /*
    // if a brass sensor use the following calculation
    float liters = pulses;
    liters /= 8.1;
    liters -= 6;
    liters /= 60.0;
  */
  Serial.print(liters); Serial.println(" Liters");
  lcd.setCursor(0, 1);
  lcd.print(liters); lcd.print(" Litres        ");
  if (liters >= 0.15) //water limit set
  {
    digitalWrite(relayPin, HIGH);
  }
  else {
    digitalWrite(relayPin, LOW);
  }
  delay(2000);
  lcd.clear();
}

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
项目二十一:水流量传感器、5V继电器模块和LCD1602 I2C模块
实验接线:Uno D2接流量传感器OUT,继电器接D4

实验串口返回情况

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
项目二十一:水流量传感器、5V继电器模块和LCD1602 I2C模块
实验接线:Uno D2接流量传感器OUT,继电器接D4

实验场景图

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
项目二十二:LCD1602显示超声波测距(单位cm)
实验接线:Uno D7接HC-SR04模块TRIG,D8接ECHO
Arduino------LCD1602
5V-------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验八十八: LCD1602A液晶屏5V显示模块(IIC/I2C接口)
  项目二十二:LCD1602显示超声波测距(单位cm)
  实验接线:Uno D7接HC-SR04模块TRIG,D8接ECHO
  Arduino------LCD1602
  5V-------------VCC
  GND-----------GND
  A4-----------SDA IIC 数据线
  A5-----------SCL  IIC 时钟线
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); //0x27   0x3F

#define TRIGGER_PIN  7  // Arduino 引脚连接到超声波传感器上的触发引脚
#define ECHO_PIN     8  // Arduino 引脚连接到超声波传感器上的回声引脚
#define MAX_DISTANCE 400 // 我们想要 ping 的最大距离(以厘米为单位)。 最大传感器距离为 400-500cm

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // 引脚和最大距离的新 Ping 设置

void setup() {
  Serial.begin(115200); // 以 115200 波特打开串行监视器以查看 ping 结果
  lcd.init();
  lcd.backlight();
}

void loop() {
  delay(100);                      // 在两次 ping 之间等待 50 毫秒(大约 20 次 ping/秒)。 29ms 应该是两次 ping 之间的最短延迟。
  unsigned int uS = sonar.ping(); // 发送 ping,以微秒 (uS) 为单位获取 ping 时间
  Serial.print("Ping: ");
  Serial.print(uS / US_ROUNDTRIP_CM); // 将 ping 时间转换为以厘米为单位的距离并打印结果(0 = 超出设定的距离范围)
  Serial.println("cm");
  lcd.setCursor(0, 0);
  lcd.print("Distance:");
  lcd.setCursor(0, 1);
  lcd.print("             ");
  lcd.setCursor(9, 1);
  lcd.print(uS / US_ROUNDTRIP_CM);
  lcd.setCursor(12, 1);
  lcd.print("cm");
}

Arduino实验场景图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA学习——实现任意倍分频器(奇数/偶数倍分频器均可实现)

文章目录 一、分频器二、Verilog实现任意倍分频器2.1、Verilog源码2.2、仿真文件 三、仿真波形图 一、分频器 在FPGA&#xff08;可编程逻辑门阵列&#xff09;中&#xff0c;分频器是一种用于将时钟信号的频率降低的电路或模块。它可以根据输入的时钟信号生成一个较低频率的输…

Vivado 差分输出引脚配置

diff_out输出如下所示 在引脚配置时&#xff0c;如下图所示&#xff0c;只能设置一个Pos Diff的引脚&#xff0c;此时设置完Pos Diff的引脚后&#xff0c;Neg Diff默认被绑定在相邻的引脚 我们可以打开上图中Package Pins页面&#xff0c;发现这一对引脚设置完毕

基于Java+Swing+mysql人力资源管理系统_员工信息管理系统

基于JavaSwingmysql人力资源管理系统/员工信息管理系统 一、系统介绍二、效果展示1、登陆2、查看个人信息--员工3、更新个人信息--员工4、管理员主页&#xff08;增删改查&#xff09; 三、其他系统实现四、获取源码 一、系统介绍 系统主要分为两个角色&#xff1a; 员工&…

【LeetCode-中等】剑指 Offer 67. 把字符串转换成整数(详解)

题目 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时&#…

【ArcGIS Pro微课1000例】0029:绘制全球海洋波纹荡漾效果图

本文讲解ArcGIS Pro3.0中,基于全球航洋面状矢量数据,绘制震撼全球海洋波纹荡漾效果图。 文章目录 一、效果预览二、效果制作三、参数详解一、效果预览 绘制好的海水波纹荡漾效果图如下: 下面我们来学习绘制过程。 二、效果制作 波纹荡漾效果需要在全局或者局部场景中制作…

7月最新大模型排名!3700道保密试题、20个大模型参与评测|SuperCLUE

7月最新大模型排名&#xff01;3700道保密试题、20个大模型参与评测&#xff5c;SuperCLUE CLUE中文语言理解测评基准 中文通用大模型综合性评测基准SuperCLUE 2023年7月榜单 7月25日&#xff0c;SuperCLUE发布大模型7月榜单。 SuperCLUE: A Benchmark for Foundation Mo…

【TypeScript】类型推断与类型别名的使用方式。

什么是类型推断&#xff1f; 在 TypeScript 中&#xff0c; 如果声明变量时&#xff0c;没有明确的指定类型&#xff0c;那么 TypeScript 会依照类型推论&#xff08;Type Inference&#xff09;的规则推断出一个类型。 以下代码虽然没有明确指定类型&#xff0c;但是会在编译的…

web安全漏洞总结

目录 &#xff08;一&#xff09;网络安全常见漏洞 1、sql注入漏洞 漏洞解释与形成原因 漏洞分类&#xff1a; 漏洞存在常见地方&#xff1a; 漏洞利用: 漏洞防御: 攻击流量特征 绕开waf拦截的常用方法 2、文件上传漏洞 漏洞解释与形成原因&#xff1a; 漏洞利用 漏…

20230720在ubuntu22.04系统下载+解密+合并ts切片的步骤

20230720在ubuntu22.04系统下载解密合并ts切片的步骤 2023/7/20 23:06 1、视频源头&#xff0c;打开时效肯定有时间限制的&#xff01; 【并且不同时间打开&#xff0c;下载链接/参数会有区别的&#xff01;以前的链接就会失效/出错了&#xff01;】 https://app1ce7glfm1187.…

深“扒”云原生高性能分布式文件系统JuiceFS

JuiceFS 是一款面向云原生设计的高性能分布式文件系统&#xff0c;在 Apache 2.0 开源协议下发布。提供完备的 POSIX 兼容性&#xff0c;可将几乎所有对象存储接入本地作为海量本地磁盘使用&#xff0c;亦可同时在跨平台、跨地区的不同主机上挂载读写。 JuiceFS 简介 JuiceFS…

【100天精通python】Day13:面向对象编程_多态和封装,实战模拟电影院的自动售票机选票页面

目录 1 多态&#xff08;Polymorphism&#xff09; 2 封装&#xff08;Encapsulation&#xff09; 3 总结 4 实战&#xff1a;模拟电影院的自动售票机选票页面 在 Python 中&#xff0c;多态和封装是面向对象编程的两个重要概念。 1 多态&#xff08;Polymorphism&#xf…

GoogleLeNet Inception V1

文章目录 Inception V1Inception Modulenative versionInception module with dimensionality reduction1 * 1网络的降维说明 多个Softmax的输出整体结构 GoogleLeNet主要是把深度扩充到了22层&#xff0c;能增加网络深度而不用担心训练精度和梯度消失问题。 总共是提出了4个版…

【stm32L152】段码屏驱动注解、MX_LCD_Init()初始化失败的解决方法

文章目录 断码屏驱动补充MX_LCD_Init()驱动初始化失败 断码屏驱动补充 已经有大神写过较详细的教程&#xff1a;https://blog.csdn.net/CSDN_Gao_16/article/details/115463499&#xff0c;但这篇博文仍然比较抽象&#xff0c;我看了好多遍才看明白-_-||&#xff0c;为了节省和…

金融中的数学:贝叶斯公式

1.贝叶斯定理 贝叶斯定理是概率论中的一项重要定理&#xff0c;用于在已知某一事件的条件下&#xff0c;求另一事件发生的概率。它是根据条件概率推导出来的&#xff0c;得名于英国数学家托马斯贝叶斯。 贝叶斯定理可以表示为&#xff1a; 这个式子就是贝叶斯公式&#xff0c…

LabVIEW使用自定义模板和示例项目来开发LabVIEW项目

LabVIEW使用自定义模板和示例项目来开发LabVIEW项目 创建项目时&#xff0c;LabVIEW将显示“创建项目”对话框&#xff0c;以帮助您选择模板或示例项目来作为开发起点。如果要使用您创建的项目作为自定义模板和示例项目&#xff0c;您必须将每个项目的源文件和元数据添加到相应…

算法与数据结构(四)--队列

一.队列的基本概念 队列是另一种特殊的表&#xff0c;这种表只在表首&#xff08;也称为队首&#xff09;进行删除操作&#xff0c;只在表尾进行插入操作。队列的修改是按先进先出的规则进行的&#xff0c;所以队列又称为先进先出表&#xff0c;First In First Out&#xff0c…

高温介电参数测试

高温介电参数测试 在新材料科研领域&#xff0c;高温介电参数的测量是众多高校和研究所经常会面临的问题。精科声学所事业部电子和专业的高温介电系统集成商合作&#xff0c;使用 JKZC-YDZK03A型高温压电阻抗综合分析仪进行配套系统集成&#xff0c;满足客户高温介电测量和曲线…

什么是 web3?

在百度搜索引擎输入 “Web3”、“大厂”。跳出来基本都是这样的标题. 以及如今的互联网行业 “哀鸿遍野”&#xff0c;不仅内卷&#xff0c;还裁员。然后掀起一阵风&#xff0c;猛吹 Web3 的好&#xff0c;数据回归用户……最后再 “威逼利诱” 一下&#xff0c;Web3 就是 20 年…

【业务功能篇50】ObjectMapper-将java对象转为json字符串

ObjectMapper可以实现Java对象和json字符串间互相转换&#xff0c;我们经常用到的是它的Java对象转json字符串功能。 这里目的是 Java对象 json字符串相互转换 api 【json字符串转为Java对象&#xff1a;readValue(json字符串,类.class)】【Java对象转为json字符串&#xff1a…

读kafka生产端源码,窥kafka设计之道(下)

背景 在上一篇文章《读kafka生产端源码&#xff0c;窥kafka设计之道&#xff08;上&#xff09;》 留下了kafka设计上比较优秀的一个点&#xff1b;内存的循环使用。本篇文章准备盘盘它。 好奇 为什么 kafka减少发送消息时向JVM频繁申请内存&#xff0c;就可以降低JVM GC的执…