查看: 6614|回复: 4

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

[复制链接]
  • TA的每日心情
    擦汗
    2016-8-27 23:34
  • 签到天数: 1 天

    [LV.1]初来乍到

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

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

    准备工作一、         硬件准备测试主控核心板(esp8266核心电路)
    首先我们使用esp8266-12E为主控芯片,其规格说明书链接为http://www.aithinker.com/uploadfile/2016/0722/20160722020937770.pdf
    有兴趣或者有问题的可以仔细去看起规格说明书(说明书是中文的,通俗易懂),下面我将把关于项目的一些重要部分摘录出来,主要是如何搭建其核心外围电路。
    1、我们先来看他的接口定义
    ESP-12E 共接出 18 个接口,图1-1是他的管脚图。,表 1-1是接口定义。

    (图1-1ESP-12E 管脚图
    (表1-1ESP-12E 管脚功能定义
    大家使用时注意每个管脚的功能就好了,大概有印象就好!
    注意:
    EN使能端需要接入一个10-15K的电阻上拉使能,没有10-15k的电阻的话其他的也可以代替,大家可以试试,反正EN上拉使能了就好!
    GPIO15需一个10-15K的电阻接地,如果没有合适的电阻,也可以试试其他的,亲测太小的电阻不行!

    接下来芯片使能了就要设置他的下载模式了,下载模式如下表1-2所示,我们采用串口下载模式,如GPIO15通过10-15K的电阻接地并没连接其他外部设备,那么只把GPIO0拉低然后复位即可进入串口下载模式。(GPIO2悬空即可!)
    4.png
    (表1-2ESP-12E 引脚模式
    基本电路大概就是如下图所示了(画法有些魔性,第一次写帖子,没找到好的画图工具,原来的AD原理图也丢了…)
    KEY1应该用个跳线帽或者自锁开关,不嫌麻烦可以每次都用线连接起来,主要用于下载程序,成品中可以去掉.

    KEY2为复位按键,可以用那种按键开关焊接上,一般成品中需做保留。

    当时自己用ad做了个pcb(如下图1-3所示),而且本人还在学校进行了小作坊“生产”了,大部分智能家居部件都使用了这个核心板或者再此基础上的扩展电路!有条件可以自己做一个,很简单!网上也有成品的核心板,自己在洞洞板上焊接也可以,这个自己把握。

    20170606102942.jpg

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


    二、         软件
    使用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”写入附加开发板管理器地址中并保存。

    7.png

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



                                                                                              8.png

                                                                                         (图2-2)添加“附加开发板管理器地址”示意图

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



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




                                                                                                     9.png

    (图2-3)打开“开发板管理器”示意图

                                                                                                        10.png

    (图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>


                                                                                                  11.png

    (图2-5)打开“管理库”示意图

                                                                                               12.png

                                             (图2-6)搜索 安装“库”示意图



    • 开工测试
    •           Blink测试

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



                                                                                                 13.png

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

    接下来我们将安装oled屏幕及传感器。


                                                                                                           14.png

    (图3-2)开发板选择示意图
    Blink程序:
      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 }

                                                                                                           15.png

    (图3-3Blink测试结果

    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。
    其显示结果应为三个界面轮番显示,分别为主页界面,温湿度显示界面,温度气压显示界面。
    至此,传感器及显示屏连接测试工作完成。



                                                                                                           16_副本.jpg
    (图3-4)传感器及oled屏连接示意图
    测试程序1:(包括两个 .h库Sensor.h、images.h)

    kittenblock中小学创客名师推荐的图形化编程软件

    // 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
    SSD1306  display(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=":";                                    //if  t<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=":";                                    //if  t<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=":";                                    //if  t<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=":";                                    //if  t<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>库文件内容:            (传感器库文件集合)

    kittenblock中小学创客名师推荐的图形化编程软件

    #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>库文件内容:            (存储图像)

    kittenblock中小学创客名师推荐的图形化编程软件

    #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测量,最终显示器剩余电量!





                                                                                                     17.png

    至此,全部硬件连接测试完成,接下来进入wifi部分。

    WIFI远程查看部分测试
    1)         1.在测试程序1的基础上添加
            #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[5]; char buffer[MAX_PAGENAME_LEN+1]; char Host[17]; 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() {}函数中
    中添加如下代码:

    kittenblock中小学创客名师推荐的图形化编程软件

    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查看室内环境;也可通过路由映射,将此小型服务器挂载至公网,远程查看。
    也可利用手机直接连接ESP8266AP,访问192.168.4.1ESP8266AP默认网关)进行查看操作。
    至此所有调试测试工作完成!
    装配与修饰通过以上各个步骤调试,如结果如上述各个调试结果,那么,恭喜你!可以按照你的想法进行装配修饰了。
    完工后,它就能加入您的智能家庭系统啦!


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










    3.png
    2.png
    1.png

    评分

    参与人数 1金币 +5 收起 理由
    michael_llh + 5 很给力!

    查看全部评分

  • TA的每日心情
    开心
    2017-9-11 09:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2017-6-7 15:38 | 显示全部楼层
    感谢楼主分享
  • TA的每日心情
    擦汗
    2016-8-27 23:34
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2017-6-7 19:55 | 显示全部楼层

    第一次  ,要考研了  可能后续分享有些慢。。。
  • TA的每日心情
    慵懒
    2019-1-14 10:28
  • 签到天数: 299 天

    [LV.8]以坛为家I

    发表于 2017-6-13 20:30 | 显示全部楼层
    非常详细,感谢分享!
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2018-5-7 20:22 | 显示全部楼层
    感谢蛋哥分享,顶顶顶
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    关于arduino编译问题
    关于arduino编译问题
    编译示例程序老是这个问题,换了电脑都不行
    莫名乱码 —— Arduino+RFID-RC522 读写实验
    莫名乱码 —— Arduino+RF
    目标:想把自己房间门改成感应门锁 器材:Arduino Uno (淘宝七星虫LY-F2)、RFID-RC
    [blinker开发实战2]数据反馈
    [blinker开发实战2]数据反
    [md] ### 添加DIY组件 在编辑模式下,点击按键进入编辑组件页面,可以看到 **按键
    用Arduino控制PS2无线手柄为什么一直连接不上
    用Arduino控制PS2无线手柄
    用Arduino UNO板 连接PS2手柄接收器,为什么指示灯已经显示对接上了,但是打开串口监
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表