首页
NodeMcu
NodeMcu_ESP8266开发板--TCP Server
NodeMcu_ESP8266简介
NodeMcu_温湿度传感器(DHT11)的使用
esp8266+DHT11温湿传感器 制作web室内温度计
ESP8266NodeMcu网页控制四个LED灯
NodeMcu用网页上传图片来驱动1.44寸TFT屏幕
esp8266使用1.44寸tft屏Arduino模块示例程序
1.44寸TFT屏ST7735使用方法
NodeMcu_ESP8266编程
NodeMcu环境监控+远程控制
NodeMcu实现网页远程控制+温湿度显示
NodeMcu网页控制+温湿度显示+TFT
NodeMcu、ESP8266、ESP32区别
本文档由 内网文摘 发布,转载请注明出处
-
+
首页
NodeMcu网页控制+温湿度显示+TFT
实现功能:网页显示温湿度+网页控制引脚+TFT屏显示温湿度+wifi断开90秒后则重启开发板 参考: [NodeMcu实现网页远程控制+温湿度显示](/project-14/doc-125/ "NodeMcu实现网页远程控制+温湿度显示") [esp8266使用1.44寸tft屏Arduino模块示例程序](/project-14/doc-127/ "esp8266使用1.44寸tft屏Arduino模块示例程序") [ESP8266WiFiSTA库wifi.status()](http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-c-plus-plus-reference/esp8266wifista/status/ "ESP8266WiFiSTA库wifi.status()") [ESP8266该用哪种方式重启](https://www.jianshu.com/p/131336711b76 "ESP8266该用哪种方式重启") [esp8266断网后通过软件自动重启的方法](https://www.arduino.cn/thread-95933-1-1.html "esp8266断网后通过软件自动重启的方法") 温湿度模块引脚连接位置: DHT11上标有(+或VCC)引脚的连接nodemcu的+ 3V引脚。 DHT11上标有(S或OUT)引脚的连接nodemcu的D6引脚。 DHT11上标有(-或GND)引脚的连接nodemcu的GND引脚。 关于重启方式: arduino 软复位 定义一个reset函数: void(* resetFunc) (void) = 0; 示例中使用 ESP.restart() 重启。 ```cpp /********************************************************************** 访问8266所建立的基本网页并通过该页面点亮/熄灭NodeMCU所连接的LED灯(控制引脚电平) 访问8266所建立的基本网页并通过该页面显示温湿度数据 ----------------------------------------------------------------------- 参考链接: http://localnetwork.cn/project-14/doc-123/ http://localnetwork.cn/project-14/doc-124/ ***********************************************************************/ #include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi库 #include <ESP8266WiFiMulti.h> // ESP8266WiFiMulti库 #include <ESP8266WebServer.h> // ESP8266WebServer库 #include "DHT.h" #define DHTTYPE DHT11 #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library #include <SPI.h> // For the breakout, you can use any 2 or 3 pins // These pins will also work for the 1.8" TFT shield #define TFT_CS D1 #define TFT_RST D2 // you can also connect this to the Arduino reset #define TFT_DC D3 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // DHT Sensor uint8_t DHTPin = D6; // Initialize DHT sensor. DHT dht(DHTPin, DHTTYPE); float Temperature; float Humidity; ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti' ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80) int LEDYellow=D0;//GPIO5,D1引脚 int LEDWhit=D4;//GPIO4,D2引脚 int LEDBlue=D8;//GPIO0,D3引脚 int wendu = 0; int shidu = 0; uint32_t con_time = 0; int netonoff = 1; void setup(void){ Serial.begin(9600); // 启动串口通讯 tft.initR(INITR_144GREENTAB); //初始化ST7735S芯片,黑色标签 tft.fillScreen(ST7735_BLACK); //填充背景颜色(必须填充,否则之前的图像,将不会消失) tft.setCursor(10, 40); tft.setTextColor(ST7735_YELLOW); tft.setTextSize(0); tft.println("Hello World!"); pinMode(DHTPin, INPUT); dht.begin(); pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED pinMode(D0,OUTPUT); //设置D1引脚为输出模式以便控制黄色LED pinMode(D4, OUTPUT); //设置D2引脚为输出模式以便控制白色LED pinMode(D8, OUTPUT); //设置D3引脚为输出模式以便控制蓝色LED digitalWrite(D4, HIGH); wifiMulti.addAP("a1", "12345678"); // 将需要连接的一系列WiFi ID和密码输入这里 wifiMulti.addAP("a2", "12345678"); // ESP8266-NodeMCU再启动后会扫描当前网络 wifiMulti.addAP("a3", "12345678"); // 环境查找是否有这里列出的WiFi ID。如果有 Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。 int i = 0; while (wifiMulti.run() != WL_CONNECTED) { // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前 delay(1000); // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。 } // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是 // 此处while循环判断是否跳出循环的条件。 Serial.println(WiFi.status()); // WiFi连接成功后将通过串口监视器输出连接成功信息 Serial.println('\n'); Serial.print("Connected to "); Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称 Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP esp8266_server.begin(); // 启动网站服务 esp8266_server.on("/", HTTP_GET, handleRoot); // 设置服务器根目录即'/'的函数'handleRoot' esp8266_server.on("/LED", HTTP_POST, handleLED); // 设置处理LED控制请求的函数'handleLED' esp8266_server.on("/LED1", HTTP_POST, handleLEDYellow); // 设置处理LED控制请求的函数'handleLED' esp8266_server.on("/LED2", HTTP_POST, handleLEDWhite); // 设置处理LED控制请求的函数'handleLED' esp8266_server.on("/LED3", HTTP_POST, handleLEDBlue); // 设置处理LED控制请求的函数'handleLED' esp8266_server.on("/c", HTTP_GET, handle_OnConnect); // 温湿度 esp8266_server.onNotFound(handleNotFound); // 设置处理404情况的函数'handleNotFound' Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动 } void(* resetFunc) (void) = 0; void loop(void){ Serial.println(WiFi.status()); if (WiFi.status() != WL_CONNECTED && netonoff==1) { con_time = millis(); //输出程序运行时间 //delay(500); netonoff = 0; Serial.print(F(".")); } else if(WiFi.status() != WL_CONNECTED && netonoff==0) { if ((millis() - con_time) >= 90000) //判断断网时间超90秒后执行重启,这个时间可根据实际需要调整 { resetFunc(); //ESP.restart(); } } else { con_time = millis(); //输出程序运行时间 netonoff = 1; } Temperature = dht.readTemperature(); // Gets the values of the temperature Humidity = dht.readHumidity(); // Gets the values of the humidity String tft_str = ""; int wd = Temperature; if (wd != wendu || shidu != Humidity){ if (wd>=30){ tft_str ="re"; } if (29>=wd&&wd>20){ tft_str ="hao"; } if (wd<10){ tft_str ="leng"; } //tft.fillScreen(ST7735_BLACK); //填充背景颜色(必须填充,否则之前的图像,将不会消失) tft.fillRect(0, 60, 40, 30, ST7735_BLACK); tft.setCursor(0, 60); tft.setTextColor(ST7735_YELLOW); tft.setTextSize(0); tft.println((int)Temperature); tft.println((int)Humidity); tft.println(tft_str); } wendu = wd; shidu = Humidity; delay(1500); esp8266_server.handleClient(); // 检查http服务器访问 } /*设置服务器根目录即'/'的函数'handleRoot' 该函数的作用是每当有客户端访问NodeMCU服务器根目录时, NodeMCU都会向访问设备发送 HTTP 状态 200 (Ok) 这是send函数的第一个参数。 同时NodeMCU还会向浏览器发送HTML代码,以下示例中send函数中第三个参数, 也就是双引号中的内容就是NodeMCU发送的HTML代码。该代码可在网页中产生LED控制按钮。 当用户按下按钮时,浏览器将会向NodeMCU的/LED页面发送HTTP请求,请求方式为POST。 NodeMCU接收到此请求后将会执行handleLED函数内容*/ void handleRoot() { esp8266_server.send(200, "text/html", "<!DOCTYPE html> <html>\n<head> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n<meta charset=\"UTF-8\">\n<title>智能温湿计</title>\n<style>html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #333333;}\n</style>\n</head>\n<body>\n<h1>控制台系统</h1>\n<a href=\"\/c\" title=\"温湿度\">温湿度</a><form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form><form action=\"/LED1\" method=\"POST\"><input type=\"submit\" value=\"Toggle LEDYellow\"></form><form action=\"/LED2\" method=\"POST\"><input type=\"submit\" value=\"Toggle LEDWhite\"></form><form action=\"/LED3\" method=\"POST\"><input type=\"submit\" value=\"Toggle LEDBlue\"></form></body>\n</html>\n"); } //处理LED控制请求的函数'handleLED' void handleLED() { digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));// 改变LED的点亮或者熄灭状态 esp8266_server.sendHeader("Location","/"); // 跳转回页面根目录 esp8266_server.send(303); // 发送Http相应代码303 跳转 } void handleLEDYellow() { digitalWrite(D0,!digitalRead(16));// 改变LED的点亮或者熄灭状态 esp8266_server.sendHeader("Location","/"); // 跳转回页面根目录 esp8266_server.send(303); // 发送Http相应代码303 跳转 } void handleLEDWhite() { digitalWrite(D4,!digitalRead(2));// 改变LED的点亮或者熄灭状态 esp8266_server.sendHeader("Location","/"); // 跳转回页面根目录 esp8266_server.send(303); // 发送Http相应代码303 跳转 } void handleLEDBlue() { digitalWrite(D8,!digitalRead(15));// 改变LED的点亮或者熄灭状态 esp8266_server.sendHeader("Location","/"); // 跳转回页面根目录 esp8266_server.send(303); // 发送Http相应代码303 跳转 } // 设置处理404情况的函数'handleNotFound' void handleNotFound(){ esp8266_server.send(404, "text/plain", "404: Not found"); // 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found" } void handle_OnConnect() { Temperature = wendu; //dht.readTemperature(); // Gets the values of the temperature Humidity = shidu; //dht.readHumidity(); // Gets the values of the humidity esp8266_server.send(200, "text/html", SendHTML(Temperature,Humidity)); } String SendHTML(float Temperaturestat,float Humiditystat){ String ptr = "<!DOCTYPE html> <html>\n"; ptr +="<head> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n"; ptr +="<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n"; ptr +="<meta charset=\"UTF-8\">\n"; ptr +="<title>智能温湿计</title>\n"; ptr +="<style>html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #333333;}\n"; ptr +="body{margin-top: 50px;}\n"; ptr +="h1 {margin: 50px auto 30px;}\n"; ptr +=" .wd {margin: 50px auto 30px;width: auto;color: #f39c12}\n"; ptr +=" .wd1 {margin: 50px auto 30px;width: auto;color: #3498db}\n"; ptr +=".side-by-side{display: inline-block;vertical-align: middle;position: relative;}\n"; ptr +=".humidity-icon{background-color: #3498db;width: 30px;height: 30px;border-radius: 50%;line-height: 36px;}\n"; ptr +=".humidity-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n"; ptr +=".humidity{font-weight: 300;font-size: 60px;color: #3498db;}\n"; ptr +=".temperature-icon{background-color: #f39c12;width: 30px;height: 30px;border-radius: 50%;line-height: 40px;}\n"; ptr +=".temperature-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n"; ptr +=".temperature{font-weight: 300;font-size: 60px;color: #f39c12;}\n"; ptr +=".superscript{font-size: 17px;font-weight: 600;position: absolute;right: -20px;top: 15px;}\n"; ptr +=".data{padding: 10px;}\n"; ptr +="</style>\n"; ptr +="</head>\n"; ptr +="<body>\n"; ptr +="<div id=\"webpage\">\n"; ptr +="<h1>室内温室检测系统</h1>\n"; ptr +="<div class=\"data\">\n"; ptr +="<div class=\"side-by-side temperature-icon\">\n"; ptr +="<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n"; ptr +="width=\"9.915px\" height=\"22px\" viewBox=\"0 0 9.915 22\" enable-background=\"new 0 0 9.915 22\" xml:space=\"preserve\">\n"; ptr +="<path fill=\"#FFFFFF\" d=\"M3.498,0.53c0.377-0.331,0.877-0.501,1.374-0.527C5.697-0.04,6.522,0.421,6.924,1.142\n"; ptr +="c0.237,0.399,0.315,0.871,0.311,1.33C7.229,5.856,7.245,9.24,7.227,12.625c1.019,0.539,1.855,1.424,2.301,2.491\n"; ptr +="c0.491,1.163,0.518,2.514,0.062,3.693c-0.414,1.102-1.24,2.038-2.276,2.594c-1.056,0.583-2.331,0.743-3.501,0.463\n"; ptr +="c-1.417-0.323-2.659-1.314-3.3-2.617C0.014,18.26-0.115,17.104,0.1,16.022c0.296-1.443,1.274-2.717,2.58-3.394\n"; ptr +="c0.013-3.44,0-6.881,0.007-10.322C2.674,1.634,2.974,0.955,3.498,0.53z\"/>\n"; ptr +="</svg>\n"; ptr +="</div>\n"; ptr +="<div class=\"side-by-side temperature-text\">室内温度:</div>\n"; ptr +="<div class=\"side-by-side temperature\">"; ptr +=(int)Temperaturestat; ptr +="<span class=\"superscript\">°C</span></div>\n"; ptr +="</div>\n"; ptr +="<div class=\"data\">\n"; ptr +="<div class=\"side-by-side humidity-icon\">\n"; ptr +="<svg version=\"1.1\" id=\"Layer_2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\"; width=\"12px\" height=\"17.955px\" viewBox=\"0 0 13 17.955\" enable-background=\"new 0 0 13 17.955\" xml:space=\"preserve\">\n"; ptr +="<path fill=\"#FFFFFF\" d=\"M1.819,6.217C3.139,4.064,6.5,0,6.5,0s3.363,4.064,4.681,6.217c1.793,2.926,2.133,5.05,1.571,7.057\n"; ptr +="c-0.438,1.574-2.264,4.681-6.252,4.681c-3.988,0-5.813-3.107-6.252-4.681C-0.313,11.267,0.026,9.143,1.819,6.217\"></path>\n"; ptr +="</svg>\n"; ptr +="</div>\n"; ptr +="<div class=\"side-by-side humidity-text\">室内湿度:</div>\n"; ptr +="<div class=\"side-by-side humidity\">"; ptr +=(int)Humiditystat; ptr +="<span class=\"superscript\">%</span></div>\n"; ptr +="</div>\n"; //定义温度变量,并且赋值,用于逻辑判断。 int wd = Temperaturestat ; if (wd>=30){ ptr +="<div class=\"wd\">今天天气热,注意防暑哦</div>\n"; } if (29>=wd&&wd>20){ ptr +="<div class=\"wd1\">今天天气不错吆,尽情的玩耍吧</div>\n"; } if (wd<10){ ptr +="<div class=\"side-by-side humidity-text\">今天天气比较冷,多穿点衣服,小心着凉</div>\n"; } ptr +="</div>\n"; ptr +="<a href=\"\/\" title=\"控制台\">控制台</a>\n"; ptr +="</body>\n"; ptr +="</html>\n"; return ptr; } ```
local
2021年11月3日 11:27
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 LocalNetwork
LocalNetwork
是由mrdoc开源
LocalNetwork.cn
修改的在线文档系统,作为个人和小型团队的云笔记、文档和知识库管理工具。
如果此文档给你或你的团队带来了帮助,欢迎支持作者持续投入精力更新和维护!内网文摘 & LocalNetwork
>>>主页
logo
logo
下载Markdown文件
分享
链接
类型
密码
更新密码