之前写过一篇Arduino–ESP8266–ESP-01学习笔记–连接WiFi、连接MQTT服务器、web显示获得了网友的很多关注,在那一个方案中使用Arduino+ESP8266+MQTT的方式把温湿度传感器的数据显示在网页上。现在,我将使用ESP8266+MQTT的方式将温湿度传感器的数据显示在网页上,这样就节省了一个MCU,而是把ESP8266当作MCU+WiFi。
需要了解的东西:
在各个物联网社区中大放异彩的ESP8266芯片融合了MCU+WiFi,既可以当MCU使用也可以当WiFi透传使用,它的开发潜力真的是文体两开放啊。于是乎,国外的一些大神就通过自己编写ESP8266的底层固件甚至是支持脚本解释器的固件来发起一些开源项目,
#include
#include
#include
const char ssid[] = "ESP8266-777";
const char password[] = "1234567890";
const int tcpPort = 1010;
WiFiServer server(tcpPort);
IPAddress softLocal(192,168,0,104);//change
IPAddress softGateway(192,168,0,1);
IPAddress softSubnet(255,255,255,0);
dht11 DHT11_A;
dht11 DHT11_B;
#define DHT11PIN_A D2
#define DHT11PIN_B D8
WiFiClient serverClients[2];
SoftwareSerial mySerial(D7, D6);
uint8_t g_temp = 16;
uint8_t g_hume = 16;
uint16_t g_pm25 = 10;
uint16_t g_pm10 = 10;
const uint8_t g_cfgtemp[4] = { 10, 15, 20, 25 }; //1: 0-10 2: 10-15 3: 15-20 4: 20-25 5: 25--
const uint8_t g_cfghume[4] = { 10, 15, 20, 25 }; //1: 0-10 2: 10-15 3: 15-20 4: 20-25 5: 25--
const uint16_t g_cfgpm25[4] = { 25, 45, 60, 75 }; //1: 0-25 2: 25-45 3: 45-65 4: 65-85 5: 85--
const uint8_t g_deltemp = 1; //1: 0-10 2: 10-15 3: 15-20 4: 20-25 5: 25--
const uint8_t g_delhume = 1; //1: 0-10 2: 10-15 3: 15-20 4: 20-25 5: 25--
const uint16_t g_delpm = 5; //1: 0-10 2: 10-15 3: 15-20 4: 20-25 5: 25--
uint8_t g_sendbuffer[5] = { 0xAA,0x03,0x03,0x03,0xBB};
uint8_t debug=0;
void setup()
{
sysinit();
setupWiFi();
server.begin();
server.setNoDelay(true);
g_sendbuffer[0] = 0xAA;g_sendbuffer[1] = 0x03;g_sendbuffer[2] = 0x03;g_sendbuffer[3] = 0x03;g_sendbuffer[4] =0xBB;//debug
}
void loop()
{
Serial.println(""); delay(50);
Dht11ReadOutPut();
Serial.println(""); delay(50);
pmReadOutput();
Serial.println(""); delay(50);
//getSerialData();
getdata();
senddata();
}
void getSerialData(void)
{
uint8_t i = 0;
uint8_t val[5]={0x00,0x00,0x00,0x00,0x00};
while(Serial.available()>0)
{
for( i = 0; i < 5; i++ )
{
if(Serial.available())
{
val[i]=(uint8_t)Serial.read();
}
}
if((val[0]==0xAA) && (val[4]==0xBB))
{
g_temp = val[1];
g_hume = val[2];
g_pm25 = (0x00FF&val[3]);
Serial.print("Getdata:");
Serial.print(g_temp);Serial.print(g_hume);Serial.println(g_pm25);
}
}
}
void getdata()
{
//temp
switch(g_sendbuffer[1])
{
case 1: if( g_temp >= ( g_cfgtemp[0] + g_deltemp ) ){ g_sendbuffer[1] = 2;} break;
case 2: if( g_temp >= ( g_cfgtemp[1] + g_deltemp ) ){ g_sendbuffer[1] = 3; } else if( g_temp <= g_cfgtemp[0] - g_deltemp ) {g_sendbuffer[1] = 1;} break;
case 3: if( g_temp >= ( g_cfgtemp[2] + g_deltemp ) ){ g_sendbuffer[1] = 4; } else if( g_temp <= g_cfgtemp[1] - g_deltemp ) {g_sendbuffer[1] = 2;} break;
case 4: if( g_temp >= ( g_cfgtemp[3] + g_deltemp ) ){ g_sendbuffer[1] = 5; } else if( g_temp <= g_cfgtemp[2] - g_deltemp ) {g_sendbuffer[1] = 3;} break;
case 5: if( g_temp <= g_cfgtemp[3] - g_deltemp ) { g_sendbuffer[1] = 4; } break;
default: g_sendbuffer[1] = 3;
}
//hume
switch(g_sendbuffer[2])
{
case 1: if( g_hume >= ( g_cfghume[0] + g_delhume ) ){ g_sendbuffer[2] = 2;} break;
case 2: if( g_hume >= ( g_cfghume[1] + g_delhume ) ){ g_sendbuffer[2] = 3;} else if( g_hume <= g_cfghume[0] - g_delhume) {g_sendbuffer[2] = 1; }break;
case 3: if( g_hume >= ( g_cfghume[2] + g_delhume ) ){ g_sendbuffer[2] = 4;} else if( g_hume <= g_cfghume[1] - g_delhume) {g_sendbuffer[2] = 2; }break;
case 4: if( g_hume >= ( g_cfghume[3] + g_delhume ) ){ g_sendbuffer[2] = 5;} else if( g_hume <= g_cfghume[2] - g_delhume) {g_sendbuffer[2] = 3;} break;
case 5: if( g_hume <= g_cfghume[3] - g_delhume) g_sendbuffer[2] = 4; break;
default: g_sendbuffer[2] = 3;
}
//pm25
switch(g_sendbuffer[3])
{
//case 1: if( g_pm25 => ( g_cfgpm25[0] + g_delpm ) ){ g_sendbuffer[3] = 3;} break;
//case 2: if( g_pm25 => ( g_cfgpm25[1] + g_delpm ) ){ g_sendbuffer[3] = 3;} else if( g_pm25 <= g_cfgpm25[0] - g_delpm) g_sendbuffer[3] = 3; break;
case 3: if( g_pm25 >= ( g_cfgpm25[2] + g_delpm ) ){ g_sendbuffer[3] = 4;} break;
case 4: if( g_pm25 >= ( g_cfgpm25[3] + g_delpm ) ){ g_sendbuffer[3] = 5;} else if( g_pm25 <= g_cfgpm25[2] - g_delpm){ g_sendbuffer[3] = 3;}break;
case 5: if( g_pm25 <= g_cfgpm25[3] - g_delpm) g_sendbuffer[3] = 4; break;
default: g_sendbuffer[3] = 3;
}
}
void senddata()
{
uint8_t i;
if (server.hasClient())
{
for (i = 0; i < 2; i++)
{
if (!serverClients[i] || !serverClients[i].connected())
{
if (serverClients[i]) serverClients[i].stop();//未联接,就释放
serverClients[i] = server.available();//分配新的
continue;
}
}
WiFiClient serverClient = server.available();
serverClient.stop();
}
for (i = 0; i < 2; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
serverClients[i].write(&g_sendbuffer[0],5); //向所有客户端发送数据
if (serverClients[i].available())
{
//Serial.print( "Clients IP & Port: " );
//Serial.print( serverClients[i].remoteIP());
//Serial.println( serverClients[i].remotePort());
//while (serverClients[i].available())
//Serial.print ( "Get data from Clients: " );Serial.write(serverClients[i].read()); Serial.println ( "End" );
}
}
}
}
void sysinit()
{
const uint8_t pmOndata[9] = {0xAA,0x01,0x00,0x00,0x00,0x00,0x01,0x66,0xBB};
const uint8_t pmOffdata[9] = {0xAA,0x03,0x00,0x00,0x00,0x00,0x01,0x68,0xBB};
Serial.begin(115200);
mySerial.begin(9600);
delay(10);
mySerial.write(pmOndata,9);
delay(1000);
// mySerial.write(pmOffdata,9);
// delay(10);
}
void setupWiFi()
{
WiFi.mode(WIFI_AP);//debug
WiFi.softAPConfig(softLocal, softGateway, softSubnet);
WiFi.softAP(ssid,password);
Serial.println();
Serial.print ( "IP address: " );
Serial.println ( WiFi.softAPIP() );
}
void Dht11ReadOutPut()
{
uint8_t l=0;
int chkA = DHT11_A.read(DHT11PIN_A);
int chkB = DHT11_B.read(DHT11PIN_B);
for( l = 0;l < 20; l++ )
{
if( ( chkA == DHTLIB_OK ) && ( chkB == DHTLIB_OK ) ){ Serial.println("Read DHT OK");changedata(); break;}
else if(chkA == DHTLIB_OK) { Serial.println("Read DHT OK"); changedataA(); ;break; }
else if(chkB == DHTLIB_OK) { Serial.println("Read DHT OK"); changedataA(); ;break; }
else{ chkA = DHT11_A.read(DHT11PIN_A); delay(5); chkB = DHT11_B.read(DHT11PIN_B);}
//Serial.println(l);
}
Serial.println("Read DHT OK");changedata();
/*
switch (chkA)
{
case DHTLIB_OK: Serial.println("Read DHT0 OK"); break;
case DHTLIB_ERROR_CHECKSUM: Serial.println("Read DHT0 chk error"); break;
case DHTLIB_ERROR_TIMEOUT: Serial.println("Read DHT0 timeout"); break;
default: Serial.println("Read DHT0 Unknow error"); break;
}
switch (chkB)
{
case DHTLIB_OK: Serial.println("Read DHT1 OK"); break;
case DHTLIB_ERROR_CHECKSUM: Serial.println("Read DHT1 chk error"); break;
case DHTLIB_ERROR_TIMEOUT: Serial.println("Read DHT1 timeout"); break;
default: Serial.println("Read DHT1 Unknow error"); break;
}
*/
}
void changedata()
{
g_temp = (uint8_t)((DHT11_A.temperature + DHT11_B.temperature ) >> 1);
Serial.print("Temp(oC): "); delay(100); Serial.println(g_temp); delay(100);
g_hume = (uint8_t)((DHT11_A.humidity + DHT11_B.humidity ) >> 1);
Serial.print("Hum ( %): "); delay(100); Serial.println(g_hume); delay(100);
}
void changedataA()
{
g_temp = (uint8_t)DHT11_A.temperature;
Serial.print("Temp(oC): "); delay(100); Serial.println(g_temp); delay(100);
g_hume = (uint8_t)DHT11_A.humidity;
Serial.print("Hum ( %): "); delay(100); Serial.println(g_hume); delay(100);
}
void changedataB()
{
g_temp = (uint8_t)DHT11_B.temperature;
Serial.print("Temp(oC): "); delay(100); Serial.println(g_temp); delay(100);
g_hume = (uint8_t)DHT11_B.humidity;
Serial.print("Hum ( %): "); delay(100); Serial.println(g_hume); delay(100);
}
void pmReadOutput()
{
uint8_t pm25_data[2]={0x00,0x00};
uint8_t pm10_data[2]={0x00,0x00};
char string_25[10];
char string_10[10];
uint8_t data[] = {0xAA,0x02,0x00,0x00,0x00,0x00,0x01,0x67,0xBB};
uint8_t i=0;
mySerial.write(data,9); delay(150);
while(mySerial.available())
{
data[i] = mySerial.read();
i++;
}
if( (data[0] == 0xAA) && (data[1] == 0x02) && (data[8] == 0xBB) )
{
g_pm25 = data[4]*256 + data[5];
g_pm10 = data[2]*256 + data[3];
//Serial.write(data,9);delay(100);//debug
Serial.println("Read PM OK"); delay(110);
Serial.print("PM25:"); delay(50); Serial.print(g_pm25); delay(50); Serial.println(" ug/m3"); delay(50);
Serial.print("PM10:"); delay(50); Serial.print(g_pm10); delay(50); Serial.println(" ug/m3"); delay(50);
}
else
{
Serial.println("Read Pm Error");delay(100);//debug
}
}