蛋蛋的智能家居基础篇——家庭环境监测仪(简易wifi版)-Arduino中文社区 - Powered by Discuz! Archiver

egg 发表于 2017-6-6 10:53

蛋蛋的智能家居基础篇——家庭环境监测仪(简易wifi版)

蛋蛋的智能家居基础篇——家庭环境监测仪(简易wifi版)一款可充电的便携式wifi家庭环境检测仪!
可检测温度、湿度、气压等环境量。
本次的的教程的主旨为学习在oled上使用UI切换界面,及远程wifi查看的入门操作,为以后的智能硬件的制作打下基础。
可通过本次学习添加更多环境信息传感器。
这个可是基础篇哦!比较详细,以后写的就会不那么啰嗦啦~
PS:由于PM2.5检测模块没钱买了,so本篇未添加!高级版中有pm2.5、CO2、甲醛等浓度的检测
作者:蛋   联系方式:mr.egg@foxmail.com硬件lAM2315/AM2320数字高温型温湿度传感器(iic通信) //dht11/dht21等温湿度传感器都可,但需要改变驱动io与驱动程序。
lBMP280BOSCH气压传感器   
lOLED12864液晶屏模块(iic通信)
lESP8266-12EWIFI模块
l18650锂电池
l18650电池盒带线l18650锂电池充电板
l10K电阻 *2
l4K 电阻 *1
l1K 电阻 *1

软件lArduino IDE
lArduino库文件:<Adafruit_AM2315.h>、<Adafruit_Sensor.h>、<Adafruit_BMP280.h>、<SSD1306.h>、<OLEDDisplayUi.h>等(请在https://github.com/搜索或联系mr.egg@foxmail.com)。工具l128x64取字软件
lESP8266核心板(有能力者自行制备,某宝也有卖)
lUSB转TTL 串口下载器

准备工作一、         硬件准备测试主控核心板(esp8266核心电路)
首先我们使用esp8266-12E为主控芯片,其规格说明书链接为http://www.aithinker.com/uploadfile/2016/0722/20160722020937770.pdf有兴趣或者有问题的可以仔细去看起规格说明书(说明书是中文的,通俗易懂),下面我将把关于项目的一些重要部分摘录出来,主要是如何搭建其核心外围电路。1、我们先来看他的接口定义ESP-12E 共接出 18 个接口,图1-1是他的管脚图。,表 1-1是接口定义。http://www.arduino.cn/forum.php?mod=image&aid=33395&size=300x300&key=9d8f902fca4593e9&nocache=yes&type=fixnone(图1-1)ESP-12E 管脚图http://www.arduino.cn/forum.php?mod=image&aid=33396&size=300x300&key=e109f9912352f3f6&nocache=yes&type=fixnonehttp://www.arduino.cn/forum.php?mod=image&aid=33397&size=300x300&key=4132ee677810bfb6&nocache=yes&type=fixnone(表1-1)ESP-12E 管脚功能定义大家使用时注意每个管脚的功能就好了,大概有印象就好!注意:EN使能端需要接入一个10-15K的电阻上拉使能,没有10-15k的电阻的话其他的也可以代替,大家可以试试,反正EN上拉使能了就好!GPIO15需一个10-15K的电阻接地,如果没有合适的电阻,也可以试试其他的,亲测太小的电阻不行!
接下来芯片使能了就要设置他的下载模式了,下载模式如下表1-2所示,我们采用串口下载模式,如GPIO15通过10-15K的电阻接地并没连接其他外部设备,那么只把GPIO0拉低然后复位即可进入串口下载模式。(GPIO2悬空即可!)(表1-2)ESP-12E 引脚模式基本电路大概就是如下图所示了(画法有些魔性,第一次写帖子,没找到好的画图工具,原来的AD原理图也丢了…)KEY1应该用个跳线帽或者自锁开关,不嫌麻烦可以每次都用线连接起来,主要用于下载程序,成品中可以去掉.
KEY2为复位按键,可以用那种按键开关焊接上,一般成品中需做保留。
当时自己用ad做了个pcb(如下图1-3所示),而且本人还在学校进行了小作坊“生产”了,大部分智能家居部件都使用了这个核心板或者再此基础上的扩展电路!有条件可以自己做一个,很简单!网上也有成品的核心板,自己在洞洞板上焊接也可以,这个自己把握。

(图1-2)核心板原理图(图1-3)pcb印制图

二、         软件使用arduino IDE下载并安装及安装ESP8266主控板及传感器库。

[*]         下载arduino IDE并安装
         下载地址:https://www.arduino.cc/en/Main/Software
2)               安装ESP8266相关开发板驱动         左击“文件”→左击“首选项” 出现首选项界面如下图2-2

         将“http://arduino.esp8266.com/stable/package_esp8266com_index.json”写入附加开发板管理器地址中并保存。

(图2-1)左击“文件”示意图


                                                                                                                                                                            (图2-2)添加“附加开发板管理器地址”示意图2.      回到初始界面左击“工具”→“开发板:xxx”→“开发板管理器”(图2-3所示)

               显示结果及安装过程如图2-4所示




                                                                                                
(图2-3)打开“开发板管理器”示意图
                                                                                                   
(图2-4)安装“ESP8266开发板”示意图
3)         安装所需传感器库

   左击“项目”→“加载库”→“管理库”(图2-5所示)
   显示结果及库安装过程如图2-6所示
   *也可以在https://github.com/上搜索,选择图2-5中左击“添加一个.zip库”添加
      本次需要库如下:
      <Adafruit_AM2315.h>、<Adafruit_Sensor.h>、<Adafruit_BMP280.h>、 <SSD1306.h>、<OLEDDisplayUi.h>
                                                                                             
(图2-5)打开“管理库”示意图
                                                                                                                                 (图2-6)搜索 安装“库”示意图


[*]开工测试

[*]           Blink测试

使用串口连接已经焊好的核心板如图3-1所示(图中利用8266代替核心板).



                                                                                          
(图3-1)ESP8266连接串口示意图如上硬件准备中所示,将gnd与GPIO0短接后复位,进入串口烧写模式;新建工程,选择开发板:WeMos D1(如图3-2所示)将后边附的Blink程序编译上传(不会的请自行百度 )测试结果如图3-3所示,串口每秒输出一次“OK”,且ESP8266上的蓝灯亮灭变化一次。至此,我们胜利完成了主控芯片的焊接调试工作。
接下来我们将安装oled屏幕及传感器。

                                                                                                      
(图3-2)开发板选择示意图Blink程序:void setup() {Serial.begin(115200);
// initialize digital pin 2 as an output.
pinMode(2, OUTPUT);
Serial.println("ESP8266测试!");
}

// the loop function runs over and over again forever
void loop() {
Serial.println("OK");
digitalWrite(2, HIGH);   // turn the LED on (HIGH is the voltage level)
delay(1000);            // wait for a second
digitalWrite(2, LOW);    // turn the LED off by making the voltage LOW
delay(1000);            // wait for a second
}



                                                                                                      
(图3-3)Blink测试结果
2)   2    传感器、oled的安装与调试l我们所使用的oled显示屏、AM2315/AM2320数字高温型温湿度传感器、BMP280气压传感器都是使用的iic通信协议,在WeMosD1开发板中,默认的iic接口为GPIO4(SDA)、GPIO5(SCL),所以我们将传感器的SCL、SDA分别连接至ESP8266的GPIO5、GPIO4引脚。连接如图3-4所示。连接完成后,将以下测试程序1编译烧写入ESP8266,测试传感器及oled。
其显示结果应为三个界面轮番显示,分别为主页界面,温湿度显示界面,温度气压显示界面。
至此,传感器及显示屏连接测试工作完成。



                                                                                                      
(图3-4)传感器及oled屏连接示意图测试程序1:(包括两个 .h库Sensor.h、images.h)// Include the correct display library
// For a connection via I2C using Wire include
#include "Sensor.h"
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`


// Include the UI lib
#include "OLEDDisplayUi.h"

// Include custom images
#include "images.h"



// Initialize the OLED display using Wire library
SSD1306display(0x3c, 4, 5);
// SH1106 display(0x3c, D3, D5);
Adafruit_AM2315 am2315;
OLEDDisplayUi ui   ( &display );
float h,t,t2,p;
int d1=20;
unsigned long oldtime,oldtime1;
int ii=0;
void msOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) {
   int b=analogRead(A0);
display->setTextAlignment(TEXT_ALIGN_RIGHT);
display->setFont(ArialMT_Plain_10);
   display->drawString(128, 0,"min");
display->drawString(105, 0, String(millis()/60000));
   display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(ArialMT_Plain_16);
// Serial.println(b);   //790-590
b=(b-590)/2;
String V="";
V+=b;
display->drawXbm(0,0, 14, 16, bb);
display->drawString(14, 0 ,V);
}

void drawFrame1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
// draw an xbm image.
// Please note that everything that should be transitioned
// needs to be drawn relative to x and y

display->drawXbm(x + 34, y + 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits);
}

void drawFrame2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
// Demonstrates the 3 included default sizes. The fonts come from SSD1306Fonts.h file
// Besides the default fonts there will be a program to convert TrueType fonts into this format
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(ArialMT_Plain_24);
    display->drawXbm(x + 0, y + 14,15,23,wen);
      display->drawXbm(x + 15, y + 14,15,23,du);

String d=":";                                    //ift<0   x=x+7

d+=t;

display->drawString(30 + x, 14 + y, d);
   display->drawXbm(x + 100, y + 14,15,23,shesidu);
display->setFont(ArialMT_Plain_24);
   display->drawXbm(x + 0, y + 35,15,23,shi);
      display->drawXbm(x + 15, y + 35,15,23,du);
d=":";                                    //ift<0   x=x+7

d+=h;   
d+="%";   
display->drawString(30 + x, 35 + y, d);

//display->setFont(ArialMT_Plain_24);
//display->drawString(0 + x, 60 + y, "Arial 24");
}

void drawFrame3(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
   display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(ArialMT_Plain_16);
    display->drawXbm(x + 0, y + 14,15,23,wen);
      display->drawXbm(x + 15, y + 14,15,23,du);
display->drawString(30 + x, 24 + y, "2");
String d=":";                                    //ift<0   x=x+7

d+=t2;
display->setFont(ArialMT_Plain_24);
display->drawString(40 + x, 14 + y, d);
   display->drawXbm(x + 110, y + 14,15,23,shesidu);
display->setFont(ArialMT_Plain_24);
   display->drawXbm(x + 0, y + 35,12,23,qi);
      display->drawXbm(x + 12, y + 35,12,23,ya);
d=":";                                    //ift<0   x=x+7

d+=p;   
d+="";   
display->drawString(24 + x, 35 + y, d);
   display->drawXbm(x +116, y + 35,6,23,P);
      display->drawXbm(x +122, y + 35,6,23,a);

}

void drawFrame4(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
// Demo for drawStringMaxWidth:
// with the third parameter you can define the width after which words will be wrapped.
// Currently only spaces and "-" are allowed for wrapping
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(ArialMT_Plain_10);
display->drawStringMaxWidth(0 + x, 10 + y, 128, "Lorem ipsum\n dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore.");
}

void drawFrame5(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {

}

// This array keeps function pointers to all frames
// frames are the single views that slide in
FrameCallback frames[] = { drawFrame1, drawFrame2, drawFrame3 };//, drawFrame4, drawFrame5 };

// how many frames are there?
int frameCount =3; //5;

// Overlays are statically drawn on top of a frame eg. a clock
OverlayCallback overlays[] = { msOverlay };
int overlaysCount = 1;

void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
Serial.println("AM2315 Test!");
oldtime=oldtime1=millis();
if (! am2315.begin()) {
    delay(1000);
if (! am2315.begin()) {
   Serial.println("Sensor not found, check wiring & pullups!");
    while (1);   
    // while (! am2315.begin());
}}
   if (!bme.begin()) {
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
}
        // The ESP is capable of rendering 60fps in 80Mhz mode
        // but that won't give you much time for anything else
        // run it in 160Mhz mode or just set it to 30 fps
ui.setTargetFPS(60);

        // Customize the active and inactive symbol
ui.setActiveSymbol(activeSymbol);
ui.setInactiveSymbol(inactiveSymbol);

// You can change this to
// TOP, LEFT, BOTTOM, RIGHT
ui.setIndicatorPosition(BOTTOM);

// Defines where the first frame is located in the bar.
ui.setIndicatorDirection(LEFT_RIGHT);

// You can change the transition that is used
// SLIDE_LEFT, SLIDE_RIGHT, SLIDE_UP, SLIDE_DOWN
ui.setFrameAnimation(SLIDE_LEFT);

// Add frames
ui.setFrames(frames, frameCount);

// Add overlays
ui.setOverlays(overlays, overlaysCount);

// Initialising the UI will init the display too.
ui.init();

display.flipScreenVertically();

}


void loop() {
if(t>=500)
{

    if (! am2315.begin()) {
    h=t=0;
   delay(10000);
if (! am2315.begin()) {
   Serial.println("Sensor not found, check wiring & pullups!");
    while (1);   
    // while (! am2315.begin());
}
}
   else
   ii=0;
}
if((millis()-oldtime1)>=2000)
{
t2=bme.readTemperature();
p=bme.readPressure();

oldtime1=millis();
}
if((millis()-oldtime)>=5000)
{
if (ii%2==0)
h=am2315.readHumidity();

Serial.println(ii);
if (ii%2==1)
t=am2315.readTemperature();
oldtime=millis();
ii++;
int d=h*10;
h=d/10.0;
d=t*10;
t=d/10.0;
Serial.println(h);
Serial.println(t);



}

int remainingTimeBudget = ui.update();
if (remainingTimeBudget > 0) {

    // You can do some work here
    // Don't do stuff if you are below your
    // time budget.
    delay(remainingTimeBudget);
}
}

<Sensor.h>库文件内容:            (传感器库文件集合)#include <Wire.h>// Only needed for Arduino 1.6.5 and earlier
#include <Adafruit_AM2315.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bme; // I2C

<images.h>库文件内容:            (存储图像)#define WiFi_Logo_width 60
#define WiFi_Logo_height 36
const char WiFi_Logo_bits[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x60,0xFF,0x03,0x00,0x00,0x00,0x00,0x80,0x87,0x01,0x0E,0x00,0x00,0x00,
0x00,0xC0,0xFC,0x60,0x38,0x00,0x00,0x00,0x00,0x00,0x40,0x70,0x60,0x00,0x00,0x00,
0x00,0x00,0x78,0x40,0xC0,0x00,0x00,0x00,0x00,0xF0,0x2F,0x41,0x98,0x01,0x00,0x00,
0x00,0x1F,0xA0,0x01,0x10,0x03,0x00,0x00,0x00,0x00,0x90,0x00,0x10,0x02,0x00,0x00,
0x00,0x00,0xD0,0x00,0x10,0x02,0x00,0x00,0x00,0x00,0x40,0x00,0x10,0x06,0x00,0x00,
0x00,0x00,0x60,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0x20,0x40,0x00,0x04,0x00,0x00,
0x00,0x00,0x30,0x40,0x60,0x06,0x00,0x00,0x00,0x00,0x10,0x40,0x3C,0x02,0x00,0x00,
0x00,0x00,0x10,0xC0,0x07,0x0E,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x0B,0x00,0x00,
0x00,0x00,0x30,0x00,0x00,0x19,0x00,0x00,0x00,0x00,0x3C,0x00,0x80,0x11,0x00,0x00,
0x00,0x00,0x67,0x00,0xC0,0x10,0x00,0x00,0x00,0xC0,0xC1,0x00,0x60,0x10,0x00,0x00,
0x00,0x00,0x80,0x03,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x0E,0x1F,0x10,0x00,0x00,
0x00,0x00,0x00,0xFE,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,
0x00,0x00,0x80,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x30,0x00,0x00,0x00,
0x00,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x00,
0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
};

const char activeSymbol[] PROGMEM = {
    B00000000,
    B00000000,
    B00011000,
    B00100100,
    B01000010,
    B01000010,
    B00100100,
    B00011000
};

const char inactiveSymbol[] PROGMEM = {
    B00000000,
    B00000000,
    B00000000,
    B00000000,
    B00011000,
    B00011000,
    B00000000,
    B00000000
};
const char shesidu[] PROGMEM = {
   
0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x01,0xCC,0x02,0x4C,0x04,0x2C,0x08,0x20,0x08,
0x10,0x08,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x20,0x00,
0x20,0x08,0x20,0x04,0x40,0x04,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00//"℃",0
};

const char wen[] PROGMEM = {

0x00,0x00,0x00,0x00,0x24,0x00,0xE4,0x07,0x28,0x04,0x30,0x04,0xE8,0x07,0x28,0x04,
0x2A,0x04,0x2A,0x04,0xE8,0x07,0x28,0x04,0x04,0x00,0xF4,0x0F,0x54,0x0A,0x54,0x0A,
0x56,0x0A,0x54,0x0A,0x54,0x0A,0x54,0x0A,0x54,0x1A,0xA8,0x05,0x00,0x00};//"温",0
const char du[] PROGMEM = {
0x00,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x24,0x02,0x24,0x02,0x24,0x0A,
0xFC,0x1F,0x24,0x02,0x24,0x02,0xC4,0x03,0x04,0x00,0x04,0x04,0xE4,0x07,0x44,0x02,
0x42,0x02,0x82,0x01,0x82,0x01,0xC2,0x03,0x21,0x1E,0x19,0x08,0x00,0x00};//"度",1
const char shi[] PROGMEM = {
0x00,0x00,0x00,0x00,0x20,0x08,0xE4,0x0F,0x24,0x08,0x30,0x08,0xE8,0x0F,0x2A,0x08,
0x2A,0x08,0x2C,0x08,0xE8,0x0F,0x84,0x02,0x84,0x02,0x94,0x12,0xA4,0x0A,0xA6,0x0A,
0xA4,0x06,0xA4,0x02,0x84,0x02,0x86,0x02,0xFC,0x1F,0x00,0x00,0x00,0x00};//湿



const char qi[] PROGMEM = {
0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x04,0x01,0xFC,0x00,0x02,0x00,0x82,0x00,
0x72,0x00,0x01,0x00,0xFD,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,
0x40,0x00,0x40,0x00,0x80,0x01,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x00};//"气",0*/
const char ya[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x01,0x12,0x00,0x22,0x00,0x22,0x00,0x22,0x00,
0x22,0x00,0x22,0x00,0x22,0x00,0xFA,0x00,0x22,0x00,0x62,0x00,0x62,0x00,0xA2,0x00,
0xA2,0x00,0x22,0x00,0x22,0x00,0x21,0x01,0xDD,0x00,0x01,0x00,0x00,0x00};//"压",1*/

const char P[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x1F,0x36,0x36,0x36,0x36,0x36,0x36,0x1E,0x06,0x06,0x06,
0x06,0x06,0x06,0x0F,0x00,0x00,0x00
};
const char a[] PROGMEM = {

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x36,0x36,0x38,0x3C,0x36,
0x36,0x36,0x36,0x3C,0x00,0x00,0x00
};

const char bb[] PROGMEM = {

0x00,0x00,0xF8,0x00,0x88,0x00,0xFE,0x03,0x02,0x02,0xFE,0x03,0x02,0x02,0xFE,0x03,
0x02,0x02,0xFE,0x03,0x02,0x02,0xFE,0x03,0x02,0x02,0xFE,0x03,0x00,0x00,0x00,0x00
};

3       3.    18650电池及充电板的连接
18650电池及充电板的连接如图3-5所示
由于ESP8266的ADC量程为0-1V分为1024级(1-1023),但单节18650电池的最高电压可达4V多,所以我们采用了1:4的电阻分压,将其电压除5倍后进入adc测量,最终显示器剩余电量!



                                                                                                
至此,全部硬件连接测试完成,接下来进入wifi部分。
WIFI远程查看部分测试 1)         1.在测试程序1的基础上添加      <esp1client.h>:#include <ESP8266WiFi.h>
const char* ssid = "your ssid.";
const char* password = "your password";
WiFiClient client;
WiFiClient client86;
WiFiServer server(80);
WiFiServer server86(86);
#define MAX_PAGENAME_LEN 5
char KTbuffer;
char buffer;
char Host;
void espclient(float a1,float a2,float a3,float a4)
{
         client = server.available();
   client86 = server86.available();

if(client86)   //
{Serial.println("new client86");
client86.println("OK ");


delay(150);
client86.stop();

}

if(client)
{   
    memset(buffer,0, sizeof(buffer)); // clear the buffer
client.find("GET /");
      if(client.readBytesUntil('H', buffer,6)){
       client.find("Host: ");
memset(Host,0, sizeof(Host));
if(client.readBytesUntil( '\r', Host,16))
         {
          //   Serial.println(Host);
         }
       if(strcmp(buffer, "clear ") == 0 )
   {   
String f="<html><head><title>正在清零</title><meta http-equiv=\"Content-Language\" content=\"zh-CN\"><meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=gb2312\"><meta http-equiv=\"refresh\" content=\"0.2;url=http://";
f+=Host;
f+="\"></head><body></body></html>";
//      Serial.println(f);
   }
   else
    {
//Serial.println("HTTP/1.1 200 OK");

client.println("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\nCharset=utf-8\r\nRefresh: 5\r\n\r\n<!DOCTYPE html><html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><head><style>#big {height:1024px;width:768px;margin:2% 5%;clear:both;text-align:center;font-size:80%;margin:40px auto;}#header {    background-color:black;    color:white;    text-align:center;    padding:5px;width:768px;}#nav {      background-color:#eeeeee;    height:1000px;    width:100%;    float:left;    padding:5px;      }#footer {    background-color:black;    color:white;    clear:both;    text-align:center;   padding:5px;    }</style></head><body><div id=\"big\"><div id=\"header\"><h1 style=\"font-size:50px;\">基于物联网的分布式温湿度系统</h1></div><div id=\"nav\"><table style=\"font-size:50px;\" align=center table border=\"1\" cellpadding=\"10\"><br><caption>家庭环境情况</caption><br>");
String s = "<tr> <td >室内温度:</td> <td>";
s +=a1;
s +="℃</td></tr><tr><td>室内湿度:</td><td>" ;
s += a2;
    s +="%</td></tr><tr><td>气压传感器温度:</td><td>" ;
      s +=a3 ;
      s +="℃</td></tr><tr><td>****:</td><td>****" ;
       // s += KWH_value;
          s +="</td></tr><tr><td>气压值:</td><td>" ;
            s += a4;
s +="Pa</td></tr><tr><td>其他:</td><td>" ;
s += "***";
s += "%</td></tr><tr><td>其他:</td><td>";
s +=" ***";
s += "%</td></tr></table><a href=\"http://";
s+= Host;
s+="/clear\">点击此处<a>进行峰值清零</div><div id=\"footer\">Copyright SDUT 330</div></div></body></html>";         
client.println(s);
//Serial.println(s);

delay(500);
    client.stop();
} }}
}



2.      在void setup() {}函数中中添加如下代码:
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
    server.begin();
      server86.begin();
3)       
在void loop() {}程序中
添加如下代码:
espclient(t,h,t2,p);
替换void msOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) {}函数如下所示

void msOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) {
   int b=analogRead(A0);
display->setTextAlignment(TEXT_ALIGN_RIGHT);
display->setFont(ArialMT_Plain_10);
String vv="";
vv+=WiFi.localIP();
   display->drawString(128, 0,vv);

   display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(ArialMT_Plain_16);
// Serial.println(b);   //790-590
b=(b-590)/2;
String V="";
V+=b;
display->drawXbm(0,0, 14, 16, bb);
display->drawString(14, 0 ,V);
}


修改后重新编译烧录入ESP8266芯片,oled右上方会显示接入ip;利用手机接入同网段网关,访问上述ip查看室内环境;也可通过路由映射,将此小型服务器挂载至公网,远程查看。也可利用手机直接连接ESP8266的AP,访问192.168.4.1(ESP8266AP默认网关)进行查看操作。至此所有调试测试工作完成!装配与修饰通过以上各个步骤调试,如结果如上述各个调试结果,那么,恭喜你!可以按照你的想法进行装配修饰了。
完工后,它就能加入您的智能家庭系统啦!


后续还会有智能WIFI插排、智能WIFI RGB灯、智能WIFI安防、远程摄像头等










全天假日 发表于 2017-6-7 15:38

感谢楼主分享

egg 发表于 2017-6-7 19:55

全天假日 发表于 2017-6-7 15:38
感谢楼主分享

第一次,要考研了可能后续分享有些慢。。。

michael_llh 发表于 2017-6-13 20:30

非常详细,感谢分享!:)

wjh0811 发表于 2018-5-7 20:22

感谢蛋哥分享,顶顶顶:)

chensr 发表于 2019-1-20 22:12


感谢蛋哥分享

mantou.in 发表于 2019-4-8 11:55

感谢楼主分享!~

wangyirun 发表于 2019-5-28 20:16

顶!非常详细。
页: [1]
查看完整版本: 蛋蛋的智能家居基础篇——家庭环境监测仪(简易wifi版)