From 48dcf8c64f0f78bcfb9177b7300f3cf31a6db346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81=E6=BC=8F=E6=B4=9E?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=8C=E6=88=90?= <> Date: Sat, 1 Nov 2025 13:53:58 +0800 Subject: [PATCH] add oled --- .../wifi-mqtt-esp8266-oled.ino | 247 +++++++++++++++++ .../wifi-mqtt-esp8266/wifi-mqtt-esp8266.ino | 248 ++++++++++++++++++ 2 files changed, 495 insertions(+) create mode 100644 wifi-mqtt-esp8266-oled/wifi-mqtt-esp8266-oled/wifi-mqtt-esp8266-oled.ino create mode 100644 wifi-mqtt-esp8266/wifi-mqtt-esp8266/wifi-mqtt-esp8266.ino diff --git a/wifi-mqtt-esp8266-oled/wifi-mqtt-esp8266-oled/wifi-mqtt-esp8266-oled.ino b/wifi-mqtt-esp8266-oled/wifi-mqtt-esp8266-oled/wifi-mqtt-esp8266-oled.ino new file mode 100644 index 0000000..0400feb --- /dev/null +++ b/wifi-mqtt-esp8266-oled/wifi-mqtt-esp8266-oled/wifi-mqtt-esp8266-oled.ino @@ -0,0 +1,247 @@ +#include //调用dht11驱动库 +#include +#include +#include +#include + +#include "SSD1306Wire.h" + +const int I2C_ADDR = 0x3c; // oled屏幕的I2c地址 +#define SDA_PIN D4 // SDA引脚,默认gpio4(D2) +#define SCL_PIN D5 // SCL引脚,默认gpio5(D1) +SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN); + +#define DHTPIN D1 //说明数据接口为8266开发板的D4口,也可以写为#define DHTPIN 2既8266芯片的IO口2 +#define DHTTYPE DHT11//说明使用的模块是DHT11 +DHT dht(DHTPIN,DHTTYPE);//DHT11初始化 + +//定义浮点类型变量保存测量值 +float Temperature; +float Humidity; +//定义WIFI信息 +const char* ssid = "iStoreOS_2.4G"; // Enter SSID here +const char* password = "452131wW"; //Enter Password here + +const char* host = "192.168.3.26:8873"; + + +// MQTT代理 +const char *mqtt_broker = "47.242.184.139"; +const char *topic = "/device/esp8266/001"; +const char *mqtt_username = "admin"; +const char *mqtt_password = "publish452131wW452131wW$"; +const int mqtt_port = 1883; + + +WiFiClient espClient; +PubSubClient client(espClient); + + +ESP8266WebServer server(80); + +void setup() { + pinMode(D2, OUTPUT); + digitalWrite(D2,HIGH);//IO口2设置为高电平,点亮数字2口LED + //digitalWrite(D2,LOW);//IO口2设置为高电平,点亮数字2口LED + Serial.begin(115200); + delay(100); + dht.begin(); + Serial.println("Connecting to "); + Serial.println(ssid); + //connect to your local wi-fi network + WiFi.begin(ssid, password); + //check wi-fi is connected to wi-fi network + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.print("."); + } + Serial.println(""); + Serial.println("WiFi connected..!"); + Serial.print("Got IP: "); Serial.println(WiFi.localIP()); + + server.on("/", handle_OnConnect); + server.onNotFound(handle_NotFound); + + server.begin(); + Serial.println("HTTP server started"); + + //mqtt init + //连接到mqtt代理 + client.setServer(mqtt_broker, mqtt_port); + //client.setCallback(callback); + while (!client.connected()) { + String client_id = "esp8266-client-"; + client_id += String(WiFi.macAddress()); + Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str()); + if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) { + Serial.println("Public emqx mqtt broker connected"); + } else { + Serial.print("failed with state "); + Serial.print(client.state()); + delay(2000); + } + } + // 发布和订阅 + //client.publish(topic, "hello emqx"); + //client.subscribe(topic); + + /* 2. oled屏幕初始化 */ + oled.init(); + oled.flipScreenVertically(); // 设置屏幕翻转 + oled.setContrast(255); // 设置屏幕亮度 + drawRect(); // 测试屏幕显示 + oled.clear(); + oled.display(); // 清除屏幕 +} +void loop() { + //http + server.handleClient(); + //mqtt + client.loop(); + + delay(10000); + Temperature = dht.readTemperature(); // Gets the values of the temperature + Humidity = dht.readHumidity(); // Gets the values of the humidity + if(server.getServer().status()==1){ + Serial.print("当前湿度:");//发送字符“当前湿度:” + Serial.print(Humidity);//发送湿度值 + Serial.println("%");//发送湿度值 + + Serial.print("当前温度:");//发送字符“当前温度:” + Serial.print(Temperature);//发送温度值 + Serial.println("℃");//发送湿度值 + } + //Check the current connection status + Serial.println("------------http start-----------"); + if (WiFi.status() == WL_CONNECTED) { + HTTPClient http; + WiFiClient wifiClient; + String url = "http://"+ String(host) + "/web/temperature/esp/saveEspTemperature?temperature="+Temperature+"&humidity="+Humidity; + Serial.println("url:"+url); + // http.begin(client,"http://jsonplaceholder.typicode.com/todos/1"); + http.begin(wifiClient,url); //Specify the URL + int httpCode = http.GET(); //Send the request + //Check for the returning code + if (httpCode > 0) { //Check for the returning code + String payload = http.getString(); //Get the request response payload + Serial.println(httpCode); + if (httpCode == 200) { + Serial.println("http请求 发送温湿度成功"); + Serial.print("http响应结果:"); + Serial.println(payload); + } + } else { + Serial.println("Error on sending request"); + } + http.end(); //Close connection + }else{ + Serial.println("Error in WiFi connection"); + } + Serial.println("------------http end-----------"); + //mqtt发布消息 + Serial.println("------------mqtt publish start-----------"); + if (WiFi.status() == WL_CONNECTED) { + if(client.connected()){ + String sendStr = String(Temperature)+" "+String(Humidity); + String wendu = String("Tem:")+String(Temperature); + String shidu = String("Hum:")+String(Humidity); + + Serial.println(sendStr); + client.publish(topic,sendStr.c_str()); + + oled.clear(); + oled.setFont(ArialMT_Plain_16); // 设置字体 + oled.drawString(0, 0, wendu); // 将要显示的文字写入缓存 + oled.drawString(0, 20,shidu); // 将要显示的文字写入缓存 + oled.drawString(0, 40,sendStr); // 将要显示的文字写入缓存 + oled.display(); // 将缓存里的文字在屏幕上显示 + + }else{ + Serial.println(client.state()); + String client_id = "esp8266-client-"; + client_id += String(WiFi.macAddress()); + Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str()); + if(client.connect(client_id.c_str(), mqtt_username, mqtt_password)) { + Serial.println("Public emqx mqtt broker connected"); + client.subscribe(topic); + }else{ + Serial.print("failed with state "); + Serial.print(client.state()); + } + } + } + Serial.println("------------mqtt publish end-----------"); +} + +void handle_OnConnect() { + Temperature = dht.readTemperature(); // Gets the values of the temperature + Humidity = dht.readHumidity(); // Gets the values of the humidity + server.send(200, "text/html", SendHTML(Temperature,Humidity)); +} + +void handle_NotFound(){ + server.send(404, "text/plain", "Not found"); +} + +String SendHTML(float Temperaturestat,float Humiditystat){ + String ptr = " \n"; + ptr +=" \n"; + ptr +="\n"; + ptr +="\n"; + ptr +="温湿计\n"; + ptr +="\n"; + ptr +="\n"; + ptr +="\n"; + ptr +="
\n"; + ptr +="

温湿度检测系统

\n"; + ptr +="
\n"; + ptr +="
\n"; + ptr +="
温度:
\n"; + ptr +="
"; + ptr +=Temperaturestat; + ptr +="°C
\n"; + ptr +="
\n"; + ptr +="
\n"; + ptr +="
\n"; + ptr +="
湿度:
\n"; + ptr +="
"; + ptr +=Humiditystat; + ptr +="%
\n"; + ptr +="\n"; + ptr +="\n"; + ptr +="\n"; + ptr +="\n"; + return ptr; +} + +void callback(char *topic, byte *payload, unsigned int length) { + Serial.println("-----------callback------------"); + Serial.print("Message arrived in topic:"); + Serial.println(topic); + Serial.print("Message:"); + for (int i = 0; i < length; i++) { + Serial.print((char) payload[i]); + } + Serial.println(); + Serial.println("-----------callback------------"); +} + +void drawRect(void) { + for (int16_t i = 0; i < oled.getHeight() / 2; i += 2) { + oled.drawRect(i, i, oled.getWidth() - 2 * i, oled.getHeight() - 2 * i); + oled.display(); + delay(50); + } +} diff --git a/wifi-mqtt-esp8266/wifi-mqtt-esp8266/wifi-mqtt-esp8266.ino b/wifi-mqtt-esp8266/wifi-mqtt-esp8266/wifi-mqtt-esp8266.ino new file mode 100644 index 0000000..a274a34 --- /dev/null +++ b/wifi-mqtt-esp8266/wifi-mqtt-esp8266/wifi-mqtt-esp8266.ino @@ -0,0 +1,248 @@ +#include //调用dht11驱动库 +#include +#include +#include +#include + +#include "SSD1306Wire.h" + +// const int I2C_ADDR = 0x3c; // oled屏幕的I2c地址 +// #define SDA_PIN D4 // SDA引脚,默认gpio4(D2) +// #define SCL_PIN D5 // SCL引脚,默认gpio5(D1) +// SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN); +// #define DHTPIN D1 //说明数据接口为8266开发板的D4口,也可以写为#define DHTPIN 2既8266芯片的IO口2 + + +#define DHTPIN D4 //说明数据接口为8266开发板的D4口,也可以写为#define DHTPIN 2既8266芯片的IO口2 +#define DHTTYPE DHT11//说明使用的模块是DHT11 +DHT dht(DHTPIN,DHTTYPE);//DHT11初始化 +//定义浮点类型变量保存测量值 +float Temperature; +float Humidity; +//定义WIFI信息 +const char* ssid = "iStoreOS_2.4G"; // Enter SSID here +const char* password = "452131wW"; //Enter Password here + +const char* host = "192.168.3.26:8873"; + + +// MQTT代理 +const char *mqtt_broker = "47.242.184.139"; +const char *topic = "/device/esp8266/001"; +const char *mqtt_username = "admin"; +const char *mqtt_password = "publish452131wW452131wW$"; +const int mqtt_port = 1883; + + +WiFiClient espClient; +PubSubClient client(espClient); + + +ESP8266WebServer server(80); + +void setup() { + pinMode(D2, OUTPUT); + digitalWrite(D2,HIGH);//IO口2设置为高电平,点亮数字2口LED + //digitalWrite(D2,LOW);//IO口2设置为高电平,点亮数字2口LED + Serial.begin(115200); + delay(100); + dht.begin(); + Serial.println("Connecting to "); + Serial.println(ssid); + //connect to your local wi-fi network + WiFi.begin(ssid, password); + //check wi-fi is connected to wi-fi network + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.print("."); + } + Serial.println(""); + Serial.println("WiFi connected..!"); + Serial.print("Got IP: "); Serial.println(WiFi.localIP()); + + server.on("/", handle_OnConnect); + server.onNotFound(handle_NotFound); + + server.begin(); + Serial.println("HTTP server started"); + + //mqtt init + //连接到mqtt代理 + client.setServer(mqtt_broker, mqtt_port); + //client.setCallback(callback); + while (!client.connected()) { + String client_id = "esp8266-client-"; + client_id += String(WiFi.macAddress()); + Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str()); + if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) { + Serial.println("Public emqx mqtt broker connected"); + } else { + Serial.print("failed with state "); + Serial.print(client.state()); + delay(2000); + } + } + // 发布和订阅 + //client.publish(topic, "hello emqx"); + //client.subscribe(topic); + + /* 2. oled屏幕初始化 */ + // oled.init(); + // oled.flipScreenVertically(); // 设置屏幕翻转 + // oled.setContrast(255); // 设置屏幕亮度 + // drawRect(); // 测试屏幕显示 + // oled.clear(); + // oled.display(); // 清除屏幕 +} +void loop() { + //http + server.handleClient(); + //mqtt + client.loop(); + + delay(10000); + Temperature = dht.readTemperature(); // Gets the values of the temperature + Humidity = dht.readHumidity(); // Gets the values of the humidity + if(server.getServer().status()==1){ + Serial.print("当前湿度:");//发送字符“当前湿度:” + Serial.print(Humidity);//发送湿度值 + Serial.println("%");//发送湿度值 + + Serial.print("当前温度:");//发送字符“当前温度:” + Serial.print(Temperature);//发送温度值 + Serial.println("℃");//发送湿度值 + } + //Check the current connection status + Serial.println("------------http start-----------"); + if (WiFi.status() == WL_CONNECTED) { + HTTPClient http; + WiFiClient wifiClient; + String url = "http://"+ String(host) + "/web/temperature/esp/saveEspTemperature?temperature="+Temperature+"&humidity="+Humidity; + Serial.println("url:"+url); + // http.begin(client,"http://jsonplaceholder.typicode.com/todos/1"); + http.begin(wifiClient,url); //Specify the URL + int httpCode = http.GET(); //Send the request + //Check for the returning code + if (httpCode > 0) { //Check for the returning code + String payload = http.getString(); //Get the request response payload + Serial.println(httpCode); + if (httpCode == 200) { + Serial.println("http请求 发送温湿度成功"); + Serial.print("http响应结果:"); + Serial.println(payload); + } + } else { + Serial.println("Error on sending request"); + } + http.end(); //Close connection + }else{ + Serial.println("Error in WiFi connection"); + } + Serial.println("------------http end-----------"); + //mqtt发布消息 + Serial.println("------------mqtt publish start-----------"); + if (WiFi.status() == WL_CONNECTED) { + if(client.connected()){ + String sendStr = String(Temperature)+" "+String(Humidity); + String wendu = String("Tem:")+String(Temperature); + String shidu = String("Hum:")+String(Humidity); + + Serial.println(sendStr); + client.publish(topic,sendStr.c_str()); + + // oled.clear(); + // oled.setFont(ArialMT_Plain_16); // 设置字体 + // oled.drawString(0, 0, wendu); // 将要显示的文字写入缓存 + // oled.drawString(0, 20,shidu); // 将要显示的文字写入缓存 + // oled.drawString(0, 40,sendStr); // 将要显示的文字写入缓存 + // oled.display(); // 将缓存里的文字在屏幕上显示 + + }else{ + Serial.println(client.state()); + String client_id = "esp8266-client-"; + client_id += String(WiFi.macAddress()); + Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str()); + if(client.connect(client_id.c_str(), mqtt_username, mqtt_password)) { + Serial.println("Public emqx mqtt broker connected"); + client.subscribe(topic); + }else{ + Serial.print("failed with state "); + Serial.print(client.state()); + } + } + } + Serial.println("------------mqtt publish end-----------"); +} + +void handle_OnConnect() { + Temperature = dht.readTemperature(); // Gets the values of the temperature + Humidity = dht.readHumidity(); // Gets the values of the humidity + server.send(200, "text/html", SendHTML(Temperature,Humidity)); +} + +void handle_NotFound(){ + server.send(404, "text/plain", "Not found"); +} + +String SendHTML(float Temperaturestat,float Humiditystat){ + String ptr = " \n"; + ptr +=" \n"; + ptr +="\n"; + ptr +="\n"; + ptr +="温湿计\n"; + ptr +="\n"; + ptr +="\n"; + ptr +="\n"; + ptr +="
\n"; + ptr +="

温湿度检测系统

\n"; + ptr +="
\n"; + ptr +="
\n"; + ptr +="
温度:
\n"; + ptr +="
"; + ptr +=Temperaturestat; + ptr +="°C
\n"; + ptr +="
\n"; + ptr +="
\n"; + ptr +="
\n"; + ptr +="
湿度:
\n"; + ptr +="
"; + ptr +=Humiditystat; + ptr +="%
\n"; + ptr +="\n"; + ptr +="\n"; + ptr +="\n"; + ptr +="\n"; + return ptr; +} + +void callback(char *topic, byte *payload, unsigned int length) { + Serial.println("-----------callback------------"); + Serial.print("Message arrived in topic:"); + Serial.println(topic); + Serial.print("Message:"); + for (int i = 0; i < length; i++) { + Serial.print((char) payload[i]); + } + Serial.println(); + Serial.println("-----------callback------------"); +} + +// void drawRect(void) { +// for (int16_t i = 0; i < oled.getHeight() / 2; i += 2) { +// oled.drawRect(i, i, oled.getWidth() - 2 * i, oled.getHeight() - 2 * i); +// oled.display(); +// delay(50); +// } +// }