esp8266、Arduino用LCD1602(iic接口)进行显示
这里用了两个esp8266设备,分别是NodeMCU和Wemos D1 mini两个模块,Arduino设备是Arduino UNO。设备如下图示。
三个设备的引脚说明如图,后面连接屏幕要用到。
显示设备Lcd1602,能显示两行,每行16个字,后面焊接了IIC接口转接模块(PCA8574),如图。
IIC接口有GND、VCC、SDA、SCL三个接口,分别根据上面的引脚图,找到想要的引脚连接(NodeMcu的SCL与SDA对应引脚D1 D2),由于这个屏幕是5v工作电压,VCC要接5V,NodeMCU没有标识5V引脚,要接Vin。
下面是编写代码,都用Arduino IDE进行,要安装LiquidCrystal I2C库,代码如下。
#include <Wire.h>#include <LiquidCrystal_I2C.h>// I2C地址, 一般为0x3F, 0x20或0x27LiquidCrystal_I2C lcd(0x27, 16, 2);int i;char str[16];void setup(){ lcd.init();//初始化显示屏 lcd.backlight(); // 打开背光 i = 0; strcpy (str,"#"); }void loop(){ lcd.setCursor(0, 0);//设置起始坐标 lcd.print("Hello World!"); lcd.setCursor(0, 1); if(i<16){ i++; lcd.print(str); strcat(str,"#"); }else{ strcpy(str,"#"); i=0; lcd.clear();//清屏 } delay(500); }
I2C地址还可以通过写入arduino一段代码,通过串口监视器查询到。
// I2C Scanner// Written by Nick Gammon// Date: 20th April 2011#include <Wire.h>void setup() { Serial.begin (115200); // Leonardo: wait for serial port to connect while (!Serial) { } Serial.println (); Serial.println ("I2C scanner. Scanning ..."); byte count = 0; Wire.begin(); for (byte i = 8; i < 120; i++) { Wire.beginTransmission (i); if (Wire.endTransmission () == 0) { Serial.print ("Found address: "); Serial.print (i, DEC); Serial.print (" (0x"); Serial.print (i, HEX); Serial.println (")"); count++; delay (1); // maybe unneeded? } // end of good response } // end of for loop Serial.println ("Done."); Serial.print ("Found "); Serial.print (count, DEC); Serial.println (" device(s)."); } // end of setupvoid loop() {}
效果如图。
LCD1602和超声波传感器,进行整合后代码如下:
#include <Wire.h> #include <LiquidCrystal_I2C.h> // 定义I2C地址和LCD尺寸 // LCD1602 D1 D2针脚 #define I2C_ADDR 0x27 // 根据你的I2C模块设置正确的地址 #define LCD_COLS 16 #define LCD_ROWS 2 // 初始化LCD LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLS, LCD_ROWS); // 定义超声波传感器的引脚 const int trigPin = 2; //D4 const int echoPin = 0; //D3 void setup() { Wire.begin(); // 初始化I2C总线 lcd.init();//初始化显示屏 lcd.backlight(); // 打开背光 lcd.setCursor(0, 0); // 设置LCD光标位置 lcd.print("Distance: "); // 在LCD上显示文本 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; // 将时间转换为距离(厘米) // 检查距离是否在有效范围内 if (distance >= 0 && distance <= 400) { lcd.clear(); // 清除LCD屏幕 lcd.setCursor(0, 0); // 设置LCD光标位置 lcd.print("Distance: "); // 显示文本 lcd.setCursor(9, 0); // 设置光标位置以显示距离值(留出空间给文本) lcd.print(distance, DEC); // 显示距离值 lcd.print(" cm"); // 显示单位 } delay(1000); // 等待一秒钟再次读取 }