这里使用Arduino IDE进行ESP8266开发。
使用了两个8266:
1.一个运行在AP模式,将客户端发送过来的温湿度数据显示在一个0.96寸的OLED屏幕上。
2.第2个8266为STA模式运行,外接一个DHT11温湿度传感器,将传感器数据发送给服务器端。
关于OLED屏幕和DHT11的连接,网上有很多这里不再赘述,下面是两个8266的代码。
服务器端8266:
#include <ESP8266WiFi.h>
#include "SSD1306Wire.h"
SSD1306Wire display(0x3c, 2, 14);
#define AP_SSID "ESP8266"// 设置热点的名字
#define AP_PSW "12345678"// 设置热点的密码
#define MAX_CONNECT 5// 设置wifi模块的最大连接数
const int SERVER_PORT = 80;// 设置wifi服务的端口地址
IPAddress local_IP(192, 168, 1, 1); // 设置wifi的ip地址(wifi的ip地址好像不能和网关地址在同一个网段)
IPAddress gateway(192, 168, 0, 1);// 设置网关
IPAddress subnet(255, 255, 255, 0); // 设置子网掩码
WiFiServer WiFi_Server(SERVER_PORT);// wifiServer服务
WiFiClient *WiFi_Client[MAX_CONNECT] = {0} ;// wificlient对象,因为我们要想办法实现多个连接,所以我们创建一个指针数组来存储连接对象
WiFiClient WiFi_Client_Tmp;// 临时wifi连接
void setup()
{ WiFi.mode(WIFI_AP); // 设置wifi模块为AP模式
WiFi.softAPConfig(local_IP, gateway, subnet); // 设置IP地址网关和子网掩码
WiFi.softAP(AP_SSID,AP_PSW);// 设置wifi的名字和密码
WiFi_Server.begin();// 启动wifiserver服务
Serial.begin(9600); // 设置串口通讯波特率,用来串口来进行开发测试,实际使用时若不需要可以注释掉
Serial.println();
Serial.println("IP address = "); // 串口打印wifi模块的ip地址
Serial.print(WiFi.softAPIP());
Serial.println("Server online.");
// Initialising the UI will init the display too.
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
}
void loop()
{ display.clear();
WiFi_Client_Tmp = WiFi_Server.available();// 判断是否有新的连接
if(WiFi_Client_Tmp.connected()) // 判断这个连接是否有效
{Serial.println("new connect");
WiFi_Client_Tmp.setNoDelay(true);// 如果有效,那么设置连接发送数据不延时
for(int i =0; i< MAX_CONNECT; i++)// 使用for循环来遍历我们的连接池,因为连接池里面可能会有连接,所以我们需要找到一个空的位置放入连接对象
{ if (WiFi_Client[i] == 0 || !WiFi_Client[i]->connected())
{ WiFi_Client[i] = new WiFiClient(WiFi_Client_Tmp);// 我们新建一个TCP连接,然后把这个连接放入我们的连接池,放入后跳出循环
break;
}
}
}
for(int i =0; i< MAX_CONNECT; i++)// 我们遍历连接池来接收数据
{ if (WiFi_Client[i] != 0 && WiFi_Client[i]->connected())// 先判断连接池里面的连接是否有效,如果有效,尝试获取tcp发送的数据
{if (WiFi_Client[i]->available() > 0)
{
String data = WiFi_Client[i]->readStringUntil('\n');// 这里说明有数据,我们直接读取tcp连接发送的数据
Serial.println(data.substring(0,4));//串口打印发送的数据
Serial.println(data.substring(5,data.length()));
display.setFont(ArialMT_Plain_10);
display.drawString(0, 0, "Humidity is "+data.substring(0,4)+"°C");
display.setFont(ArialMT_Plain_10);
display.drawString(0, 12, "Temperature is "+data.substring(5,data.length())+"°%C");
display.display();
}
}
}
delay(500);
}
STA端8266程序
#include <DHT.h>
#include <ESP8266WiFi.h>
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define AP_SSID "ESP8266"//const char *ssid = "EPS8266";
#define AP_PSW "12345678"//const char *password = "12345678";
const IPAddress serverIP(192, 168, 1, 1); //欲访问的地址
uint16_t serverPort = 80; //服务器端口号
WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
void setup()
{ Serial.begin(9600);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.begin(AP_SSID, AP_PSW);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
dht.begin();
}
void loop()
{ float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.println("尝试访问服务器");
if (client.connect(serverIP, serverPort)) //尝试访问目标地址
{
Serial.println("访问成功");
Serial.println(String(h));
client.print(String(h)+String(t)); //向服务器发送数据
/* while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据
{
if (client.available()) //如果有数据可读取
{
String line = client.readStringUntil('\n'); //读取数据到换行符
Serial.print("读取到数据:");
Serial.println(line);
//client.write(line.c_str()); //将收到的数据回发
}
}
*/
Serial.println("关闭当前连接");
client.stop(); //关闭客户端
}
else
{
Serial.println("访问失败");
client.stop(); //关闭客户端
}
delay(5000);
}
本人为初学者,仅实现了初步功能,代码还有很大美化空间,欢迎大家补充。