• 6. 毕业设计温湿度监控系统(ESP8266 + DHT11 +OLED 实时上传温湿度数据给公网服务器并在OLED显示屏上显示实时温湿度)


    硬件环境

    1. ESP8266开发板一块;
    2. DHT11温湿度传感器一个;
    3. OLED 128*64分辨率显示屏幕一个;

    硬件连线图入下所示:

    在这里插入图片描述

    软件环境

    1. WiFi联网和HttpPost配置

    参照我的另一篇博文,该博文中展示了如何建立PostHttpClient工程,修改后上传数据到公网服务器的Web服务器,
    《5. ESP8266使用PostHttpClient例程上传数据给Web服务器后台》

    2. DHT11温湿度读取和OLED显示配置

    参照我的另一篇博文,该博文中展示了如何使用ESP8266 NodeMCU开发板获取DHT11温湿度传感器并将数据显示在OLED显示屏上,《4. ESP8266通过OLED实时显示DHT11温湿度参数》

    3. Web服务器配置(用于接收HTTP数据请求)

    Web服务器环境搭建过程最为复杂,如果是小白可以根据B站视频的内容一步步来搭建。
    代码的git将Web服务器的代码下载到本地,命令如下:

    git clone git://116.198.42.221/ESP8266_IOT.git
    
    • 1

    Use_Mysql目录下的代码就是Django工程的所有代码,下载后在服务器中运行,需要修改其中的mysql数据库相关信息
    在这里插入图片描述

    在这里插入图片描述

    实验过程

    1. ESP8266 NodeMCU完整代码

    将下面代码编程上传到ESP8266 NodeMCU中,代码中只需要修改服务器地址和WiFi相关信息即可

    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    
    #include <DHT.h>                         // Include DHT library code
    
    //begin********http head and define***************
    #include <ESP8266WiFi.h>
    #include <ESP8266HTTPClient.h>
    
    #define SERVER_IP "116.198.42.221"  //这里是我的公网服务器的IP地址,这个需要修改
    
    #ifndef STASSID
    #define STASSID "WiFi name"
    #define STAPSK  "WiFi password"
    #endif
    //end********http head and define***************
    #define DHTPIN  14                    // DHT11 data pin is connected to ESP8266 GPIO14 (NodeMCU D5)
    #define DHTTYPE DHT11                 // DHT11 sensor is used
    DHT dht(DHTPIN, DHTTYPE);             // Configure DHT library
    
    char temperature[] = "00.0";
    char humidity[]    = "00.0";
    
    // OLED FeatherWing buttons map to different pins depending on board.
    // The I2C (Wire) bus may also be different.
    #if defined(ESP8266)
      #define BUTTON_A  0
      #define BUTTON_B 16
      #define BUTTON_C  2
      #define WIRE Wire
    #elif defined(ESP32)
      #define BUTTON_A 15
      #define BUTTON_B 32
      #define BUTTON_C 14
      #define WIRE Wire
    #elif defined(ARDUINO_STM32_FEATHER)
      #define BUTTON_A PA15
      #define BUTTON_B PC7
      #define BUTTON_C PC5
      #define WIRE Wire
    #elif defined(TEENSYDUINO)
      #define BUTTON_A  4
      #define BUTTON_B  3
      #define BUTTON_C  8
      #define WIRE Wire
    #elif defined(ARDUINO_FEATHER52832)
      #define BUTTON_A 31
      #define BUTTON_B 30
      #define BUTTON_C 27
      #define WIRE Wire
    #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040)
      #define BUTTON_A  9
      #define BUTTON_B  8
      #define BUTTON_C  7
      #define WIRE Wire1
    #else // 32u4, M0, M4, nrf52840 and 328p
      #define BUTTON_A  9
      #define BUTTON_B  6
      #define BUTTON_C  5
      #define WIRE Wire
    #endif
    
    Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &WIRE);
    
    void setup() {
      Serial.begin(9600);
    
      Serial.println("OLED FeatherWing test");
      // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x32
      //display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)
    
      Serial.println("OLED begun");
    
      // Show image buffer on the display hardware.
      // Since the buffer is intialized with an Adafruit splashscreen
      // internally, this will display the splashscreen.
      display.display();
      delay(1000);
    
      // Clear the buffer.
      display.clearDisplay();
      display.display();
    
      Serial.println("IO test");
    
      pinMode(BUTTON_A, INPUT_PULLUP);
      pinMode(BUTTON_B, INPUT_PULLUP);
      pinMode(BUTTON_C, INPUT_PULLUP);
    
      // text display tests
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
    
    
      dht.begin();                // Initialize the DHT library
      // Clear the display buffer.
      display.clearDisplay();
    
    
      display.setTextSize(1);
      display.setTextColor(WHITE, BLACK);
      display.setCursor(10, 5);
      display.print("DHT11 TEMPERATURE:");
      display.setCursor(19, 37);
      display.print("DHT11 HUMIDITY:");
      display.display();
    
      //begin************WiFi Setup*****************
      WiFi.begin(STASSID, STAPSK);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.print("Connected! IP address: ");
      Serial.println(WiFi.localIP());
      //end************WiFi Setup*****************
    }
    
    void loop() {
      
      // Read humidity
      byte RH = dht.readHumidity();
      //Read temperature in degree Celsius
      byte Temp = dht.readTemperature();
    
      temperature[0] = Temp / 10 + '0';
      temperature[1] = Temp % 10 + '0';
      humidity[0]    = RH / 10   + '0';
      humidity[1]    = RH % 10   + '0';
    
      // print data on serial monitor
      Serial.printf("Temperature = %02u°C\r\n", Temp);
      Serial.printf("Humidity    = %02u %%\r\n\r\n", RH);
      
      // Clear the display buffer.
      display.clearDisplay();
      // print data on the SSD1306 display
      display.setTextSize(1);
      display.setTextColor(WHITE, BLACK);
      display.setCursor(10, 5);
      display.print("DHT11 TEMPERATURE:");
      display.setCursor(19, 37);
      display.print("DHT11 HUMIDITY:");
      display.display();
      display.setCursor(46, 20);
      display.print(temperature);
      display.setCursor(46, 52);
      display.print(humidity);
      display.drawRect(71, 20, 3, 3, WHITE);     // Put degree symbol ( ° )
      display.display();
    
      //begin********HttpPost wait for WiFi connection
      if ((WiFi.status() == WL_CONNECTED)) {
    
        WiFiClient client;
        HTTPClient http;
    
        Serial.print("[HTTP] begin...\n");
        // configure traged server and url
        http.begin(client, "http://" SERVER_IP "/IOT/add_environments"); //HTTP
        http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    
        Serial.print("[HTTP] POST...\n");
        // start connection and send HTTP header and body
        String content = "temperatures=";
        String str2 = temperature;
        String str3 = "&humidity=";
        String str4 = humidity;
        String str5 = "&pressure=111";
        content.concat(str2);
        content.concat(str3);
        content.concat(str4);
        content.concat(str5);
    
        //const String content = "temperatures=" + temperature + "&humidity=" + humidity +"&pressure=111";
        int httpCode = http.POST(content);
    
        // httpCode will be negative on error
        if (httpCode > 0) {
          // HTTP header has been send and Server response header has been handled
          Serial.printf("[HTTP] POST... code: %d\n", httpCode);
    
          // file found at server
          if (httpCode == HTTP_CODE_OK) {
            const String& payload = http.getString();
            Serial.println("received payload:\n<<");
            Serial.println(payload);
            Serial.println(">>");
          }
        } else {
          Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }
    
        http.end();
      }
      //end********HttpPost wait for WiFi connection
      delay(5000);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203

    2. 服务器Web后台代码运行

    使用git将代码下载到本地,修改一下settings.py文件中的数据库配置信息,进入Use_Mysql目录,运行如下命令:

    cd Use_Mysql/
    sudo python3 manage.py runserver 0.0.0.0:80
    
    • 1
    • 2

    在这里插入图片描述
    数据库中增加的环境数据:
    在这里插入图片描述
    Web服务器接收到的来自ESP8266的HttpPost请求:
    在这里插入图片描述
    前端的get_environments请求:
    在这里插入图片描述

    3. 实验效果展示

    通过前端地址访问:http://116.198.42.221/IOT/get_environments/
    前端展示效果:
    在这里插入图片描述
    ESP8266 + DHT11 + OLED 展示效果:
    在这里插入图片描述
    整体效果图:
    在这里插入图片描述
    视频展示:

    毕业设计--ESP8266自建联网温湿度监控系统

  • 相关阅读:
    redis基本数据类型
    C和指针 第15章 输入/输出函数 15.8 字符I/O
    补盲激光雷达「PK」4D成像雷达,车企会作何选择?
    撕开AEB的「遮羞布」
    Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数,导致叠加执行问题解决
    qt模块依赖
    golang singleflight资料整理
    Tilemap瓦片资源
    python带你对北京二手房进行数据分析,看看大概都什么价位
    Linux- fg命令 & bg命令
  • 原文地址:https://blog.csdn.net/qq_30135687/article/details/125399190