Air Freshener With ESP8266

پروژه تبدیل خوشبو کننده به اینترنت اشیا با ESP8266 (قسمت ششم)

در ادامه ی آموزش اینترنت اشیا و تبدیل اسپری خوشبو کننده به سیستم IOT با استفاده از esp8266، به بخش سخت افزار آن رسیده ایم. در این قسمت با طریقه ی اتصال esp8266 به پروگرامر آشنا می شویم. چند نکته ی سخت افزاری که باید هنگام طراحی در نظر داشت را هم مطرح می کنیم.

اتصال esp8266 :

در تصویری که در پایین قرار می دهم، طریقه ی اتصال esp8266 به پروگرامر و همچنین به قطعات دیگر را مشاهده می کنید. پایه های ریست و GPIO 0 را با یک میکرو سوئیچ به زمین وصل می کنیم. تا موقعی که بخواهیم برنامه داخل esp8266 بریزیم بتوانیم آنرا به مد پروگرام کردن ببریم.

ESP8266 Air Freshner

ESP8266 Air Freshner

از GPIO 0 برای راه اندازی موتور هم استفاده کرده ایم. از GPIO 2 برای خواندن سنسور نور استفاده می کنیم.

توجه داشته باشید که esp8266 آنالوگ را نمی تواند بخواند. و زیر 1.5 را صفر می خواند و بالای آن را یک می خواند. پس هنگامی که می خواهیم از سنسور استفاده کنیم باید با مقاومت به خواسته ی خود برسیم، که در چه مقدار نوری یک باشد و کمتر از آن صفر باشد.

esp8266 boot mode

esp8266 boot mode

در این مدار از یک ترانزیستور PNP استفاده می شود. و برای اینکه مدار درست کار کند باید از یک ترانزیستور PNP استفاده کنیم. چون وقتی که esp8266 ریست می شود، روی پایه ی صفر آن ولتاژی میافتد. این کار برای این است که متوجه شود این پایه به زمین وصل است یا نه. که به مد برنامه نویسی برود یا نرود. وقتی از NPN استفاده کنیم هر بار که ریست شود به مد پروگرامینگ میرود.

توجه داشته باشید که ولتاژ بیس اگر بیشتر از 0.7 ولت از ولتاژ امیتر کمتر باشد ترانزیستور راه میافتد. به این نکته در هنگام انتخاب موتور و ولتاژ آن باید دقت داشت. چون ولتاژ خروجی esp8266 حدود 3.3 ولت می باشد. و موتوری که ما استفاده می کنیم باید با همین ولتاژ کار کند. البته در این مداری که ما طراحی کرده ایم به این صورت است. برای استفاده از موتور هایی با ولتاژ بالاتر باید سخت افزار را تغییر داد.

در ادامه نرم افزار پروژه را به طور کامل قرار می دهم:

#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <EEPROM.h>


String _SSID = "";
String _PASSWORD = "";
const char* ssid = "";
const char* password = "";
const char* mySSID = "SobhanIOT";
const char* passwordAP = "sobhanmovassagh";

// Constant IP for APWiFi and WiFi
IPAddress ip(192, 168, 11, 22);
IPAddress gateway(192, 168, 11, 1);
IPAddress subnet(255, 255, 255, 0);

IPAddress ipWiFi(192, 168, 1, 22);
IPAddress gatewayWiFi(192, 168, 1, 249);
IPAddress subnetWiFi(255, 255, 255, 0);
// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);


////////////////////////////////////////////////////////////////////////define & declare value
#define sprayPin 0
#define lightPin 2
#define eepromTime 500
#define eepromFlagLight 508
#define eepromSSID 400
#define eepromPass 450
/////////////////////////
Ticker timer;
/////////////////////////
String sVal = "";
String ModeOfSpray = "";
int TimeForSpray = 0;
byte flagLight = 0 ;
byte val;
bool flagConnectWiFi = false;
byte n = 0;
/////////////////////////////////////////////////////////////////////////////////////////setup
void setup() {
  Serial.begin(115200);
  delay(10);
  ///////////////////////////////////////////////////////////////////////////////set timer
  timer.attach (0.5, spraying);
  ///////////////////////////////////////////////////////////////////////////////read eeprom
  EEPROM.begin(512);
  delay(10);
  val = EEPROM.read(eepromTime);
  if (val < 10 || val > 60)
    val = 10;

  flagLight = EEPROM.read(eepromFlagLight);
  if (flagLight != 11 && flagLight != 22 && flagLight != 33)
    flagLight = 33;
  /////////////////////////////////////////////////////////////EEPROM SSID
  while (EEPROM.read(eepromSSID + n) != 255)
  {
    sVal += (char)EEPROM.read(eepromSSID + n);
    n++;
    delay(1);
  }
  _SSID = sVal;
  ssid = &_SSID[0];
  Serial.println("");
  Serial.println(ssid);
  sVal = "";
  n = 0;
  flagConnectWiFi = true;
  ////////////////////////////////////////////////////////////EEPROM PASSWORD
  while (EEPROM.read(eepromPass + n) != 255)
  {
    sVal += (char)EEPROM.read(eepromPass + n);
    n++;
    delay(1);
  }
  _PASSWORD = sVal;
  password = &_PASSWORD[0];
  Serial.println(password);
  sVal = "";
  n = 0;
  flagConnectWiFi = true;


  ///////////////////////////////////////////////////////////////////////////////Set up PIN & AP WiFi & Server
  // prepare GPIO'S
  pinMode(sprayPin, OUTPUT);
  pinMode(lightPin, INPUT);
  digitalWrite(sprayPin, HIGH);
  //WiFi Mode
  WiFi.mode(WIFI_AP_STA);

  // Start the server
  server.begin();
  Serial.println("Server started");

  //Start AP WiFi
  WiFi.softAPConfig(ip, gateway, subnet);
  WiFi.softAP(mySSID, passwordAP);
  Serial.println(WiFi.softAPIP());

  //////////////////////////////////////////////////////////////////////////////////////Connect to Local WiFi/////

  Serial.print(F("Connecting to "));
  Serial.println(ssid);
  Serial.print(F("With PassWord : "));
  Serial.println(password);
  WiFi.config(ipWiFi, gatewayWiFi, subnetWiFi);
  WiFi.begin(ssid, password);
  for (int l = 0; l < 50; l++) {
    delay(500);
    Serial.print(F("."));
    if (WiFi.status() == WL_CONNECTED) {
      Serial.println(F("WiFi connected"));
      Serial.println(WiFi.localIP());
      break;
    }
  }
  if (WiFi.status() != WL_CONNECTED)
    Serial.println(F("SSID or PASSWORD is not Correct"));
}

/////////////////////////////////////////////////////////////////////////////////////////Method Of Time For Spraying
void spraying()
{
  TimeForSpray++;
  switch (flagLight) {
    case 11:
      if ((digitalRead(lightPin) == HIGH) && (TimeForSpray == 1))
      {
        digitalWrite(sprayPin, LOW);
        Serial.println(F("Spraying In Light"));
      }
      else if ((TimeForSpray == (val * 120)) || (digitalRead(lightPin) == LOW))
        TimeForSpray = 0;
      break;
    case 22:
      if ((digitalRead(lightPin) == LOW) && (TimeForSpray == 1))
      {
        digitalWrite(sprayPin, LOW);
        Serial.println(F("Spraying In Dark"));
      }
      else if (TimeForSpray == (val * 120) || digitalRead(lightPin) == HIGH)
        TimeForSpray = 0;
      break;
    case 33:
      if (TimeForSpray == 1)
      {
        digitalWrite(sprayPin, LOW);
        Serial.println(F("Spraying In All Time"));
      }
      else if (TimeForSpray == (val * 120))
        TimeForSpray = 0;
      break;
  }
  if (TimeForSpray == 2 || TimeForSpray == 0) {
    digitalWrite(sprayPin, HIGH);
  }
}
///////////////////////////////////////////////////////////////////////////////////////////Check for Available Client
void loop() {

  // Check if a client has connected این قسمت تا وقتی که کلاینت چیزی ارسال نکند باعث می شود که بقیه ی برنامه اجرا نشود
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println(F("new client"));
  while (!client.available()) {
    delay(1);
  }
  /////////////////////////////////////////////////////////////////////////////////////////////Read the first lines of POST request
  while (client.connected())
  {
    // read line by line what the client (web browser) is requesting
    if (client.available())
    {
      String line = client.readStringUntil('\r');
      Serial.print(line);
      // wait for end of client's request, that is marked with an empty line
      if (line.length() == 1 && line[0] == '\n')
      {
        break;
      }
    }
  }
  // Read the line of the POST request
  String req = client.readStringUntil('\r');
  Serial.println(req);

  // Match the request
  ///////////////////////////////////////////////////////////////////////////////////////Set SSID And PassWord
  if (req.indexOf("SSID=") > 0) {
    int i = 6;
    while (req[i] != '&')
    {
      sVal += req[i];
      i++;
      delay(1);
    }
    _SSID = sVal;
    ssid = &_SSID[0];
    Serial.println(ssid);
    sVal = "";
  }
  if (req.indexOf("SSID_Pass=") > 0) {
    int i = req.indexOf("SSID_Pass=") + 10;
    while (req[i] != '\0')
    {
      sVal += req[i];
      i++;
      delay(1);
    }
    _PASSWORD = sVal;
    password = &_PASSWORD[0];
    Serial.println(password);
    sVal = "";
    flagConnectWiFi = true;
  }
  ///////////////////////////////////////////////////////////////////////////////////////set time of Spray
  if (req.indexOf("TimeSpray=") > 0) {
    int i = 11;
    while (req[i] != '&')
    {
      sVal += req[i];
      i++;
      delay(1);
    }
    val = sVal.toInt();
    Serial.println(val);
    sVal = "";
  }
  /////////////////////////////////////////////////////////////////////////////////////////Setting Mode
  if (req.indexOf("Mode=") > 0) {
    int i = 19;
    while (req[i] != '\0')
    {
      sVal += req[i];
      i++;
      delay(1);
    }
    flagLight = sVal.toInt();
    sVal = "";
  }
  switch (flagLight) {
    case 11:
      ModeOfSpray = "Working With Light";
      Serial.println(F("Mode in on Light"));
      break;
    case 22:
      ModeOfSpray = "Working With Dark";
      Serial.println(F("Mode in on Dark"));
      break;
    case 33:
      ModeOfSpray = "Working All Time";
      Serial.println(F("Mode in on AllTime"));
      break;
  }

  ///////////////////////////////////////////////////////////////////////Write on EEPROM
  if (flagConnectWiFi) {
    byte l;
    for (l = 0; l < 40; l++) {
      EEPROM.write((eepromSSID + l), _SSID[l]);
      delay(5);
    }
    for (l = 0; l < 40; l++) {
      EEPROM.write((eepromPass + l), _PASSWORD[l]);
      delay(5);
    }
    flagConnectWiFi = false;
  }
  EEPROM.write(eepromTime, val);
  EEPROM.write(eepromFlagLight, flagLight);
  EEPROM.commit();

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  TimeForSpray = 0;
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n";
  s += "<html>\r\n<head>\r\n<title>Air Freshner</title>\r\n<style>\r\n body {text-align: center; \r\n background : #abfbfb;}\r\n</style>\r\n</head>";
  s += "<body>";
  s += "<h1>Enter Time for Period Spray</h1>";
  s += "<form method=""POST"">";
  s += "<input type=""number"" name=""TimeSpray"" min=""10"" max=""60"" value=""10"">";
  s += "<p>Working With : Light <input type=""radio"" value=""11"" name=""Mode"">";
  s += "Dark <input type=""radio"" value = ""22"" name=""Mode""> AllTime <input type=""radio"" checked=""checked"" value=""33"" name=""Mode""></p>";
  s += "<input type=""submit"" value=""Submit"">\r\n<br>";
  s += "Time : ";
  s += (String)val;
  s += "<br>\r\n Spray ";
  s += ModeOfSpray;
  s += "\r\n <br>\r\n</form>";
  s += "<p>-------------------------------------------------------------------------------</p>";
  s += "<h1>Enter SSID Name and PassWord Of Local WiFi</h1>";
  s += "<form method=""POST"">";
  s += "<p>SSID : <input type=""text"" name=""SSID""></p>";
  s += "<p>PassWord : <input type=""text"" name=""SSID_Pass""></p>";
  s += "<input type=""submit"" value=""Submit"">";
  s += "</form>";
  s += "</body>";
  s += "</html>\r\n\r\n\r\n\r\n";
  // Send the response to the client
  client.println(s);
  delay(1);
  Serial.println(F("Client disconnected"));

  // The client will actually be disconnected
  // when the function returns and 'client' object is detroyed
}

 

در ادامه فیلمی که برای شما تهیه کرده ام را قرار می دهم:

 

 

دیدگاه ها :

من بات نیستم

  1. فرشاد گفت:

    ممنونم بابت اموزش کلی مطلب یاد گرفتم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *