esp8266接收LCD1602里的数据同时控制继电器通断程序
时间: 2024-02-12 10:05:59 浏览: 158
下面是一个示例程序,使用ESP8266接收LCD1602里的数据并控制继电器的通断:
```c
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
const char* ssid = "YourSSID"; // 替换成你的Wi-Fi网络名称
const char* password = "YourPassword"; // 替换成你的Wi-Fi网络密码
const int relayPin = 0; // 继电器连接的GPIO引脚
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiServer server(80);
void setup() {
Wire.begin(D2, D1); // SDA连接到D2,SCL连接到D1
lcd.init();
lcd.backlight();
pinMode(relayPin, OUTPUT); // 设置继电器引脚为输出模式
digitalWrite(relayPin, HIGH); // 继电器默认关闭
Serial.begin(115200);
delay(10);
// 连接Wi-Fi网络
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// 启动Web服务器
server.begin();
Serial.println("Server started");
}
void loop() {
// 读取LCD1602的数据
Wire.beginTransmission(0x27);
Wire.write(0x80);
Wire.endTransmission();
Wire.requestFrom(0x27, 16);
String line1 = "";
String line2 = "";
while (Wire.available()) {
char c = Wire.read();
if (c == '\n') {
break;
}
line1 += c;
}
while (Wire.available()) {
char c = Wire.read();
if (c == '\n') {
break;
}
line2 += c;
}
// 更新LCD1602的显示
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
// 等待新的客户端连接
WiFiClient client = server.available();
if (client) {
Serial.println("New client");
while (client.connected()) {
if (client.available()) {
String request = client.readStringUntil('\r');
Serial.println(request);
if (request.indexOf("/on") != -1) {
digitalWrite(relayPin, LOW); // 继电器打开
}
if (request.indexOf("/off") != -1) {
digitalWrite(relayPin, HIGH); // 继电器关闭
}
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head><title>ESP8266 Relay Control</title></head>");
client.println("<body>");
client.println("<h1>ESP8266 Relay Control</h1>");
client.println("<p>Relay is currently " + String(digitalRead(relayPin) == LOW ? "on" : "off") + "</p>");
client.println("<p><a href=\"/on\">Turn relay on</a></p>");
client.println("<p><a href=\"/off\">Turn relay off</a></p>");
client.println("</body>");
client.println("</html>");
break;
}
}
client.stop();
Serial.println("Client disconnected");
}
}
```
在这个示例程序中,我们使用ESP8266通过I2C协议连接LCD1602,读取LCD1602的显示内容,并更新LCD1602的显示。
同时,我们也使用Web服务器控制继电器的通断,与前面的示例程序相同。
在setup()函数中,我们首先使用Wire库初始化I2C总线,并连接到LCD1602。然后,我们将GPIO0引脚设置为输出模式,并且将继电器默认关闭。
然后,我们连接Wi-Fi网络,启动Web服务器。
在loop()函数中,我们首先读取LCD1602的显示内容,并更新LCD1602的显示。
然后,我们等待新的客户端连接。如果有客户端连接,就读取客户端发来的请求,并根据请求的内容控制继电器的通断。然后,我们向客户端发送HTTP响应,告诉客户端当前继电器的状态,并提供控制继电器的链接。
注意:在你的电路中,可能需要使用一个普通的NPN型晶体管来控制继电器,因为ESP8266的GPIO引脚输出的电流可能不足以控制继电器。同时,为了保护ESP8266,你也应该为继电器添加一个保护二极管。
阅读全文