مشاهده آنلاین دما و رطوبت با ESP8266

  • ۹۷ بازدید

بعد از برنامه نویسی برای ESP8266 در این آموزش قصد داریم اولین پروژه اینترنت اشیا (IoT) خود را با ESP8266 اجرا کنیم. در اینجا از DHT22 به عنوان سنسور دما و رطوبت استفاده شده و همچنین برای به حداقل رساندن توان مصرفی مدار از حالت LIGHT SLEEP (LIGHT_SLEEP_T) در ESP8266 استفاده شده است.

برای آسان تر شدن این پروژه این پستها را هم مطالعه کنید:

لیست قطعات :

  • ماژول Wifi ESP8266 ESP-01
  • رگولاتور ولتاژ 3.3 ولت 800 میلی آمپر LS1117-3.3 یا L4931-3.3 TO-92 برای دریافت ولتاژ 3.3 ولت از 5 ولت
  • DHT22 با مقاومت 10KΩ (نسخه Am2302 در اینجا)
  • کابل USB TTL (برای آپلود برنامه)

هنگامی که ESP-01 شما برنامه ریزی شد، سیم کشی نهایی بسیار ساده است:

مدار را می توانید به یک باتری 3.7 ولتی LiPo، باتری 5 ولتی تلفن همراه یا یک باتری 9 ولتی را وصل کنید. همچنین می توانید از یک شارژر 5 ولتی هم استفاده کنید. در اینجا از یک ماژول USB استاندارد (بریک‌آوت کانکتور USB Micro-B) استفاده شده است تا بتوانیم از یک شارژر قدیمی تلفن همراه استفاده کنیم.

اگر با برنامه نویس ESP8266 آشنایی ندارید مقاله سیم کشی و برنامه ریزی ESP-01 را بررسی کنید.

برنامه نرم افزاری

پست قبلی را بررسی کنید تا آردوینو IDE خود را برای برنامه نویسی ESP8266 پیکربندی کنید . بخش سرور را در اینجا توضیح داده نمی شود (می‌توانید از سرور اینترنت اشیا ابری مانند data.sparkfun.com ، dweet.io استفاده کنید ). کاری که این مدار انجام می دهد خواندن یک حسگر ساده و ارسال داده به سرور توسط پروتکل HTTP GET می باشد.
یک کتابخانه ویژه برای DHT22 یا DHT11 برای ESP8266 وجود دارد. در اینجا از Adafruit DHT-sensor-library استفاده شده است که می توانید آن را از github دانلود کنید .

یک خواب (sleep) کم به کد ESP8266 را اضافه شده است: wifi_set_sleep_type(LIGHT_SLEEP_T);
جریام مصرفی برای این مدار با WiFi.disconnect();اما ESP8266 حدود 80 میلی آمپر می باشد، که با قرار دادن LIGHT_SLEEP تقریباً 10 میلی آمپر می شود (از 3 میلی آمپر تا 30 میلی آمپر شناور). با کتابخانه نسخه Arduino ESP8266 2.0.0، حالت خواب فقط در صورتی کار می کند که وای فای قطع نشود. برخی اطلاعات نیز در بحث ESP8266 github وجود دارد .

این کد با Arduino 1.6.5 IDE و با ESP8266 2.0.0 platform lib کار می کند .

کد زیر را کپی کنید و در فایلی به نام DHTClient.ino ذخیره کنید.

/* DHTClient - ESP8266 client with a DHT sensor as an input
 */
#include <ESP8266WiFi.h>
#include <WiFiClient.h>


#include <DHT.h>
#define DHTTYPE DHT22  //or DHT11
#define DHTPIN  2

const char* ssid     = "PUT HERE YOUR SSID";
const char* password = "PUT HERE YOUR PASSWD";

WiFiClient client;
byte server[] = { 
  192, 168, 1, 11 }; // http server - PUT HERE YOUR SERVER IP as bytes
String serverStr = "192.168.1.11"; // http server - PUT HERE YOUR SERVER IP as string

// Initialize DHT sensor - adafruit note
// NOTE: For working with a faster than ATmega328p 16 MHz Arduino chip, like an ESP8266,
// you need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It's a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// This is for the ESP8266 processor on ESP-01
DHT dht(DHTPIN, DHTTYPE, 15); // 11 works fine for ESP8266

float humidity, temperature;  // Values read from sensor
String webString = "";   // String to display
// Generally, you should use "unsigned long" for variables that hold time
unsigned long previousMillis = 0;        // will store last temp was read
const long interval = 2000;              // interval at which to read sensor

// Required for LIGHT_SLEEP_T delay mode
extern "C" {
#include "user_interface.h"
}


void setup(void)
{  
  // You can open the Arduino IDE Serial Monitor window to see what the code is doing
  Serial.begin(115200);  // Serial connection from ESP-01 via 3.3v console cable
  Serial.println("\n\r \n\rWorking to connect");
  for (uint8_t t = 4; t > 0; t--) {
    Serial.print("[SETUP] WAIT ");
    Serial.println(t);
    delay(1000);
  }

  dht.begin();           // initialize temperature sensor
  Serial.println("\n\r \n\rDHT done");
  gettemperature();
  Serial.println(String(temperature));

  delay(2);
}

void loop(void)
{
  delay(2);
  gettemperature();

  // Connect to WiFi network
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("\n\r \n\rWorking to connect");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("DHT Weather Reading Client");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.println(ESP.getChipId()) ;
  Serial.println("Client started");

  if (client.connect(server, 80)) {  // http server is running on default port 80
    Serial.println("connected");
    client.print("GET /SensorWriteToFile.php?temp=");  // PUT HERE YOUR SERVER URL e.g. from http://192.168.1.11/SensorWriteToFile.php?temp=10.5&hum=58

    client.print(String(temperature));
    client.print("&hum=");
    client.print(String(humidity));
    client.println(" HTTP/1.1");
    client.print("Host: ");   // http server is running on port 80, so no port is specified
    client.println(serverStr); 
    client.println("User-Agent: Mihi IoT 01");   // PUT HERE YOUR USER-AGENT that can be used in your php program or Apache configuration
    client.println(); // empty line for apache server

    //Wait up to 10 seconds for server to respond then read response
    int i = 0;
    while ((!client.available()) && (i < 1000)) {
      delay(10);
      i++;
    }

    while (client.available())
    {
      String Line = client.readStringUntil('\r');
      Serial.print(Line);
    }
    client.stop();
  } 
  else {
    Serial.println("connection failed");
  }
  Serial.println();
  Serial.println(WiFi.status());

  //WiFi.disconnect(); // DO NOT DISCONNECT WIFI IF YOU WANT TO LOWER YOUR POWER DURING LIGHT_SLEEP_T DELLAY !
  //Serial.println(WiFi.status());  

  wifi_set_sleep_type(LIGHT_SLEEP_T);

  delay(60000*3-800); // loop every 3 minutes

}

void gettemperature() {
  // Wait at least 2 seconds seconds between measurements.
  // if the difference between the current time and last time you read
  // the sensor is bigger than the interval you set, read the sensor
  // Works better than delay for things happening elsewhere also
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you read the sensor
    previousMillis = currentMillis;

    // Reading temperature for humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
    humidity = dht.readHumidity();          // Read humidity (percent)
    //temperature = dht.readTemperature(true);     // Read temperature as Fahrenheit
    temperature = dht.readTemperature();     // Read temperature as *C
    // Check if any reads failed and exit early (to try again).
    if (isnan(humidity) || isnan(temperature)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }
  }
}

لاگ سرور آپاچی نشان می دهد که مدار درست کار میکند:

از این فایل php ساده (SensorWriteToFile.php) برای ذخیره داده های اینترنت اشیا در فایل سرور LAMP خود استفاده کنید:

<?php

// URI: /SensorWriteToFile.php?temp=23.50&hum=48.20

date_default_timezone_set('Europe/Bratislava');
$dateTime = new DateTime();
$dateTimeStamp = $dateTime->format('Y-m-d H:i:s');

$data = $_REQUEST;
$data += array("datetime" => $dateTimeStamp ); 
$data += array("user_agent" => $_SERVER['HTTP_USER_AGENT'] );
$req_dump = json_encode( $data ) . "\n";

$fp = file_put_contents( '/var/www/request.log', $req_dump, FILE_APPEND );  //  make /var/www/request.log file writable !!

?>

نمونه فایل لاگ در صورت درست کار کردن مدار (/var/www/request.log) :

{"temp":"25.10","hum":"72.10","datetime":"2016-02-07 20:29:58","user_agent":"Mihi IoT 01"}
{"temp":"25.20","hum":"69.30","datetime":"2016-02-07 20:31:06","user_agent":"Mihi IoT 01"}
{"temp":"25.40","hum":"75.40","datetime":"2016-02-07 20:32:10","user_agent":"Mihi IoT 01"}
{"temp":"25.40","hum":"70.30","datetime":"2016-02-07 20:33:15","user_agent":"Mihi IoT 01"}
{"temp":"25.10","hum":"65.10","datetime":"2016-02-07 20:34:37","user_agent":"Mihi IoT 01"}
{"temp":"25.00","hum":"66.40","datetime":"2016-02-07 20:35:40","user_agent":"Mihi IoT 01"}
{"temp":"25.00","hum":"66.00","datetime":"2016-02-07 20:36:49","user_agent":"Mihi IoT 01"}
{"temp":"25.00","hum":"64.10","datetime":"2016-02-07 20:37:51","user_agent":"Mihi IoT 01"}

در همین رابطه: