首页
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_ESP8266编程
链接 [ESP32,ESP8266 教程汇总](https://mc.dfrobot.com.cn/thread-271930-1-1.html "ESP32,ESP8266 教程汇总") ### ESP8266使用WIFI #### 连接本地WiFi(dhcp获取ip) ```cpp #include <ESP8266WiFi.h> const char *ssid = "a1"; const char *password = "12345678"; // void setup(){ Serial.begin(9600); // 启动串口通讯 connect_to_wifi(); } void loop() { Serial.printf("信号强度 db = %d\n", WiFi.RSSI()); delay(500); } void connect_to_wifi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.printf("Connecting to %s", ssid); //这里不能用println,会报错找不到 int i = 0; while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(i++); Serial.print('.'); } // 一旦连接WiFI成功,WiFi.status()将会返回“WL_CONNECTED”。这也是 // 此处while循环判断是否跳出循环的条件。 Serial.print("Connected to "); Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称 Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP } ``` #### 连接本地WiFi(指定静态ip) ```cpp #include <ESP8266WiFi.h> // IPAddress staticIP(192, 168, 43, 248); //开发板使用的地址 IPAddress gateway(192, 168, 43, 1); //网关 IPAddress subnet(255, 255, 255, 0); //子网掩码 IPAddress dns(223, 6, 6, 6); //dns服务器地址 const char *deviceName = "localnetwork_esp8266"; //设备在网络中的名字,路由器中可以查看到 const char *ssid = "a1"; const char *password = "12345678"; // void setup(){ Serial.begin(9600); // 启动串口通讯 connect_to_wifi(); } void loop() { Serial.printf("信号强度 db = %d\n", WiFi.RSSI()); delay(500); } void connect_to_wifi() { WiFi.disconnect(); //防止使用以前的配置连接wifi WiFi.hostname(deviceName); WiFi.config(staticIP, gateway, subnet, dns); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.printf("Connecting to %s", ssid); //这里不能用println,会报错找不到 int i = 0; while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(i++); Serial.print('.'); } // 一旦连接WiFI成功,WiFi.status()将会返回“WL_CONNECTED”。这也是 // 此处while循环判断是否跳出循环的条件。 Serial.print("Connected to "); Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称 Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP } ``` #### 创建异步web服务器 下载所需库文件,打开如下链接下载zip文件,然后到ArduinoIDE中选 项目>载库>添加ZIP库,导入成功即可使用。 https://github.com/me-no-dev/ESPAsyncTCP https://github.com/me-no-dev/ESPAsyncWebServer ```cpp #include <ESP8266WiFi.h> #include <ESPAsyncTCP.h> #include <ESPAsyncWebServer.h> AsyncWebServer server(80); const char *MESSAGE = "HELLO"; const char *MESSAGE2 = "WORLD"; void notFound(AsyncWebServerRequest *request) { request->send(404, "text/plain", "Not found"); } // const char *ssid = "a1"; const char *password = "12345678"; // void setup(){ Serial.begin(9600); // 启动串口通讯 connect_to_wifi(); //创建异步web服务器,只需写在setup里,loop里可以是空的。 server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", MESSAGE); }); server.on("/get", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", MESSAGE2); }); //访问未定义的路由时使用notFound函数 server.onNotFound(notFound); //启动web服务器 server.begin(); } void loop() { Serial.printf("信号强度 db = %d\n", WiFi.RSSI()); delay(500); } void connect_to_wifi() { WiFi.disconnect(); //防止使用以前的配置连接wifi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.printf("Connecting to %s", ssid); //这里不能用println,会报错找不到 int i = 0; while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(i++); Serial.print('.'); } // 一旦连接WiFI成功,WiFi.status()将会返回“WL_CONNECTED”。这也是 // 此处while循环判断是否跳出循环的条件。 Serial.print("Connected to "); Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称 Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP } ``` #### wifi.status() status函数可以在无线终端模式下,获取当前的ESP8266模块网络连接状态。 `Serial.printf(WiFi.status());//打印当前连接状态` 参数: 无 返回值: 返回值类型为uint8_t。以下是返回值数值以及对应的信息: 255: WL_NO_SHIELD – 返回值为255说明无扩展板。8266本来带有网络功能,不需要额外的扩展板(sheld),因此一般不会出现这个报错 0: WL_IDLE_STATUS – 返回值为0说明正在尝试连接 1: WL_NO_SSID_AVAIL – 返回值为1说明没有找到设定的SSID的网络 2: WL_SCAN_COMPLETED – 返回值为2说明网络扫描完毕 3: WL_CONNECTED – 返回值为3说明连接成功成功 4: WL_CONNECT_FAILED – 返回值为4说明连接失败 5: WL_CONNECTION_LOST – 返回值为5说明连接丢失 6: WL_DISCONNECTED – 返回值为6说明未连接 参考: [ESP8266WiFiSTA库wifi.status()](http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-c-plus-plus-reference/esp8266wifista/status/ "ESP8266WiFiSTA库wifi.status()") ### NTP 安装NTP库文件,打开ArduinoIDE的工具>管理库>搜索"NTPClient"并安装。 [参考](https://blog.csdn.net/qq_17351161/article/details/90551624 "参考") ```cpp #include <NTPClient.h> // change next line to use with another board/shield #include <ESP8266WiFi.h> //#include <WiFi.h> // for WiFi shield //#include <WiFi101.h> // for WiFi 101 shield or MKR1000 #include <WiFiUdp.h> const char *ssid = "a1"; const char *password = "12345678"; WiFiUDP ntpUDP; // You can specify the time server pool and the offset (in seconds, can be // changed later with setTimeOffset() ). Additionaly you can specify the // update interval (in milliseconds, can be changed using setUpdateInterval() ). //翻译://您可以指定时间服务器池和偏移量(以秒为单位,稍后可以使用setTimeOffset()进行更改)。 //此外,还可以指定更新间隔(以毫秒为单位,可以使用setUpdateInterval()进行更改)。 NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 28800, 300000); //北京时区 GMT +8 = 28800 void setup(){ Serial.begin(9600); WiFi.begin(ssid, password); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } timeClient.begin(); //timeClient.setTimeOffset(28800); //60min*60s*8=28800,偏移量,北京时区+8 //setUpdateInterval(300000); //5min*60s*1000ms=300000,更新间隔设置为5分钟 timeClient.update(); } void loop() { timeClient.update(); //联网更新时间 Serial.println(timeClient.getFormattedTime()); delay(1000); } ``` 获取时分秒的API函数如下: ```cpp int hours = timeClient.getHours(); int minu = timeClient.getMinutes(); int sece = timeClient.getSeconds(); Serial.printf("hour:%d minu:%d sece:%d\n", hours,minu,sece); ``` 注意到`Serial.printf("hour:%d minu:%d sece:%d\n", hours,minu,sece);`,通常其他的arduino板子不使用格式化这种,它们总是数据和字符串分开的输出的,而ESP8266/ESP32可以直接使用这种格式化输出(像C或者C++),详情:[Arduin之sprintf 和浮点数](https://www.e-tinkers.com/2020/01/do-you-know-arduino-sprintf-and-floating-point/ "Arduin之sprintf 和浮点数") ### 其它 #### ESP8266该用哪种方式重启 **一:** ESP8266有两种重启方法,分别为:ESP.reset()和ESP.restart(),很多人代码中都用ESP.reset()重启,但是通常情况下使用ESP.restart()会更好, 这两者区别如下: ESP.reset() 是一个硬复位,这种重启方式可能会使一些寄存器回归到原始状态,即丢失寄存器数据,这会导致重启后的程序出现问题,它或多或少像计算机上的复位按钮。 ESP.restart() 是通过向ESP8266的SDK发送信号重启,而不是简单粗暴的复位,所以它是一个更‘软’的重启方式。 所以,把你代码中的ESP.reset()换成ESP.restart()吧! 参考:[ESP8266该用哪种方式重启?ESP.reset()和ESP.restart()的区别](https://www.jianshu.com/p/131336711b76 "ESP8266该用哪种方式重启?ESP.reset()和ESP.restart()的区别") **二:** arduino 软复位 定义一个reset函数: void(* resetFunc) (void) = 0; 需要复位时这样调用: resetFunc(); #### esp8266断网后通过软件自动重启的方法 我用ESP-12系列模块时,程序运行7至10天左右会掉网,只能重启才能联网,经探索找到1个解决办法,不使用任何硬件引脚,利用resetFunc()内置函数,实现重启。 实现方法如下: 1、定义变量 uint32_t con_time = 0; //断网记时 int con_flag = 0; //断网标记,1为断网 void(*resetFunc) (void) = 0; 2、在loop中加入 if (Blinker.connected()) { con_flag = 0; } else { if (con_flag == 0) { con_time = millis(); //给断网时间赋初始值 con_flag = 1; } else { if ((millis() - con_time) >= 90000) //判断断网时间超90秒后执行重启,这个时间可根据实际需要调整 { resetFunc(); } } } 以上方法已在4个模块中运行1个月以上,还需注意的是,在有些情况下不能重启,如晚上灯已打开,若重启会造成灯灭,可以在重启函数前再加一层判断或延时,控制在灯开时不重启或开灯状态下延时几个小时再重启。 例如: if ((millis() - con_time) >= 90000 && !digitalRead(LED1_PIN)) //判断断网时间超90秒并且LED1_PIN为低电平时执行重启 参考:https://www.arduino.cn/thread-95933-1-1.html
local
2021年11月4日 15:42
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 LocalNetwork
LocalNetwork
是由mrdoc开源
LocalNetwork.cn
修改的在线文档系统,作为个人和小型团队的云笔记、文档和知识库管理工具。
如果此文档给你或你的团队带来了帮助,欢迎支持作者持续投入精力更新和维护!内网文摘 & LocalNetwork
>>>主页
logo
logo
下载Markdown文件
分享
链接
类型
密码
更新密码