ESP8266+Arduino+HTML+EditBox;

Тема в разделе "Arduino & Shields", создана пользователем Mestniy, 28 май 2016.

  1. Mestniy

    Mestniy Гуру

    Всем привет. Недавно на форуме Arduino.ru создал тему в помощь моему проекту, что-то типо умного дома)))
    Но т.к. он почемуто у меня перестал работать(сайт), то пишу здесь.
    Имеется рабочая схема(2 скетча):
    К Ардуино:
    Код (C++):
    HardwareSerial & ESPport = Serial3;
    const int COM_BAUD = 9600;
    String searching = "";
    int readreley;
    int Trig_pin = 2; // управляющий пин подключен к 2 пину на ардуино.
    int Echo_pin = 3; // пин с данными от датчика подключен к 3 пин на ардуино.
    int distacne_cm;//  переменная длины импульса.
    int sm;// переменная расстояния к предмету.
    #define RTIME1 0.5
    #define RTIME2 1
    #define RTIME3 2
    #define RTIME4 1
    #define RTIME5 1
    int reley1 = 4;
    int reley2 = 5;
    int reley3 = 6;
    int reley4 = 7;
    int reley5 = 8;
    int reley6 = 9;
    bool y = false;
    unsigned long currentTime;//переменные для времени
    unsigned long loopTime;
    void setup() {
    pinMode(Trig_pin, OUTPUT);//2 лапка - выход
    pinMode(Echo_pin, INPUT);//3 лапка - вход
      Serial.begin(9600);  // открываем сериал порт
      pinMode(reley1, OUTPUT);
      pinMode(reley2, OUTPUT);
      pinMode(reley3, OUTPUT);
      pinMode(reley4, OUTPUT);
      pinMode(reley5, OUTPUT);
      pinMode(reley6, OUTPUT);
      ESPport.begin(115200);
      Serial.begin(COM_BAUD);
      Serial.println("Setup done");
      currentTime = millis(); // считываем время
      loopTime = currentTime;
    }

    void loop() {
      if ( ESPport.available() > 0)
      {
        char ch = ESPport.read();
        if (ch == '\r' || ch == '\n')
        {
          //Реле 1
          if (searching == "LED1-ON")
          {
            digitalWrite(reley1, 1);
          }
          if (searching == "LED1-OFF")
          {
            digitalWrite(reley1, 0);
          }
          //Реле 2
          if (searching == "LED2-ON")
          {
            digitalWrite(reley2, 1);
          }
          if (searching == "LED2-OFF")
          {
            digitalWrite(reley2, 0);
          }
          //Реле 3
          if (searching == "LED3-ON")
          {
            digitalWrite(reley3, 1);
          }
          if (searching == "LED3-OFF")
          {
            digitalWrite(reley3, 0);
          }
          //Реле 4
          if (searching == "LED4-ON")
          {
            digitalWrite(reley4, 1);
          }
          if (searching == "LED4-OFF")
          {
            digitalWrite(reley4, 0);
          }
          //Реле 5
          if (searching == "LED5-ON")
          {
            digitalWrite(reley5, 1);
          }
          if (searching == "LED5-OFF")
          {
            digitalWrite(reley5, 0);
          }
          //Стоп
          if (searching == "STOP")
          {
            y ^= false;
          }
          searching = "";
        }
        else searching += ch;
        Serial.write( ESPport.read());
      }
      digitalWrite(Trig_pin, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig_pin, LOW);
      distacne_cm = pulseIn(Echo_pin, HIGH);
      sm = distacne_cm / 29 / 2;
      if (sm >= 5)
      {
        if (y == true)
        {
        timereley();
        }
      }
      Serial.println(sm);
      delay(100)
    }
    void timereley()
    {
      currentTime = millis(); // считываем время
      if (currentTime - loopTime >=  RTIME1 * 60000)
      {
        digitalWrite(reley1, HIGH);
        ESPport.write('Q');
      }
      if (currentTime - loopTime >=  RTIME2 * 60000)
      {
        digitalWrite(reley2, HIGH);
        ESPport.write('E');
      }
      if (currentTime - loopTime >=  RTIME3 * 60000)
      {
        digitalWrite(reley3, HIGH);
        ESPport.write('T');
      }
      if (currentTime - loopTime >=  RTIME4 * 60000)
      {
        digitalWrite(reley4, HIGH);
        ESPport.write('U');
      }
      if (currentTime - loopTime >=  RTIME5 * 60000)
      {
        digitalWrite(reley5, HIGH);
        ESPport.write('O');
      }
    }
     
    И для ESP8266(в качестве прошивки):
    Код (C++):
    #include <ESP8266WiFi.h>


    const char* ssid = "DIR-615RU";// ssid вашего роутера
    const char* password = "15091966";// пароль вашего роутера

    //int ledPin = 2; // GPIO2
    WiFiServer server(80);


    boolean PinStatus[] = {1, 2, 3, 4, 5, 6};
    boolean PinTiming[] = {1, 2, 3, 4, 5};
    int incomingByte;

    void setup() {
      Serial.begin(115200);
      delay(10);


      //pinMode(ledPin, OUTPUT);
      //digitalWrite(ledPin, LOW);

      // Connect to WiFi network
      Serial.println();
      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");

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

      // Print the IP address
      Serial.print("Use this URL to connect: ");
      Serial.print("http://");
      Serial.print(WiFi.localIP());
      Serial.println("/");
      for (int i = 0; i < 6; i++) PinStatus[i] = false;
    }

    void loop() {
      // Check if a client has connected
      WiFiClient client = server.available();
      if (!client) {
        return;
      }

      // Wait until the client sends some data
      //Serial.println("new client");
      while (!client.available()) {
        delay(1);
      }

      // Read the first line of the request
      String request = client.readStringUntil('\r');
      //Serial.println(request);
      client.flush();

      // Match the request

      // Return the response
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println(""); //  do not forget this one
      client.println("<!DOCTYPE HTML>");
      client.println("<html>");

      //1 реле
      if (request.indexOf("/LED1=ON") != -1) {
        Serial.println("LED1-ON");
        PinStatus[0] = true;
      }
      if (request.indexOf("/LED1=OFF") != -1) {
        Serial.println("LED1-OFF");
        PinStatus[0] = false;
      }
      //2 реле
      if (request.indexOf("/LED2=ON") != -1) {
        Serial.println("LED2-ON");
        PinStatus[1] = true;
      }
      if (request.indexOf("/LED2=OFF") != -1) {
        Serial.println("LED2-OFF");
        PinStatus[1] = false;
      }
      //3 реле
      if (request.indexOf("/LED3=ON") != -1) {
        Serial.println("LED3-ON");
        PinStatus[2] = true;
      }
      if (request.indexOf("/LED3=OFF") != -1) {
        Serial.println("LED3-OFF");
        PinStatus[2] = false;
      }
      //4 реле
      if (request.indexOf("/LED4=ON") != -1) {
        Serial.println("LED4-ON");
        PinStatus[3] = true;
      }
      if (request.indexOf("/LED4=OFF") != -1) {
        Serial.println("LED4-OFF");
        PinStatus[3] = false;
      }
      //5 реле
      if (request.indexOf("/LED5=ON") != -1) {
        Serial.println("LED5-ON");
        PinStatus[4] = true;
      }
      if (request.indexOf("/LED5=OFF") != -1) {
        Serial.println("LED5-OFF");
        PinStatus[4] = false;
      }
      //6 реле
      if (request.indexOf("/STOP") != -1) {
        Serial.println("STOP");
        PinStatus[5] = true;
      }
      if (request.indexOf("/STOP") != -1) {
        Serial.println("STOP");
        PinStatus[5] = false;
      }
      // Set ledPin according to the request
      //digitalWrite(ledPin, value);




      // client.print("Led pin 1 is now: ");

      // if(PinStatus[1] == true) client.print("ON");

      //if(PinStatus[1] == false) client.print("OFF");

      //client.println("");

      //client.print("Led pin 2 is now: ");

      //if(PinStatus[2] == true) client.print("ON");

      //if(PinStatus[2] == false) client.print("OFF");



      if (PinStatus[0] == false) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[0] == true) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[1] == false) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[1] == true) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[2] == false) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[2] == true) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[3] == false) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[3] == true) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[4] == false) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[4] == true) {
        client.println("RELE 1: <a href=\"/LED1=ON\">OFF</a>");
      }
      if (PinStatus[5] == false) client.println("RELE 6: <a href=\"/STOP\">STOP</a></br>");
      if (PinStatus[5] == true) client.println("RELE 6: <a href=\"/STOP\">STOP</a></br>");
      client.println("</html>");

      delay(1);
      //Serial.println("Client disonnected");
      //Serial.println("");
      if (Serial.available() > 0)  //если есть доступные данные
      {

        incomingByte = Serial.read();

        if (incomingByte == 'Q')PinStatus[0] = true;
        if (incomingByte == 'W')PinStatus[0] = false;
        if (incomingByte == 'E')PinStatus[1] = true;
        if (incomingByte == 'R')PinStatus[1] = false;
        if (incomingByte == 'T')PinStatus[2] = true;
        if (incomingByte == 'Y')PinStatus[2] = false;
        if (incomingByte == 'U')PinStatus[3] = true;
        if (incomingByte == 'I')PinStatus[3] = false;
        if (incomingByte == 'O')PinStatus[4] = true;
        if (incomingByte == 'P')PinStatus[4] = false;
        if (incomingByte == 'A')PinStatus[5] = true;
        if (incomingByte == 'S')PinStatus[5] = false;
      }
    }
     
     
    Последнее редактирование: 28 май 2016
  2. Mestniy

    Mestniy Гуру

    Это полностью рабочие скетчи. Но вот теперь вопрос: Как добавить в прошивку esp8266, Editbox, а желательно вот это чудо:
    HTML:
    <input type="number" id="Editbox1" style="position:absolute;left:125px;top:290px;width:47px;height:18px;line-height:18px;z-index:9;" name="Editbox1" value="" maxlength="3">
    Хочу с помощью Editbox сделать управлением временем включения, которые сейчас определяются массивами
    Код (C++):
    RTIME1-RTIME5
    Буду рад услышать любой совет. Спасибо.
     
  3. Mestniy

    Mestniy Гуру

    Такая фишка не проканывает:D:
    Код (C++):
    client.println(<inputtype="number"id="Editbox1"style="position:absolute;left:125px;top:290px;width:47px;height:18px;line-height:18px;z-index:9;"name="Editbox1"value=""maxlength="3">")
    Ругается на " в скетче - видать путается))).
     
  4. Securbond

    Securbond Гуру

    Кажется внешние и вложенные кавычки не могут быть одинаковыми попробуйте заменить на "...'....' .." или наоборот '..."..."...' И я бы не светил пароль WiFi тем более дату рождения...
     
    Mestniy нравится это.
  5. ZAZ-965

    ZAZ-965 Гуру

    Попробуйте экранировать бэкслешем
    Код (C++):
    input type=\"number\"
     
    Mestniy и Securbond нравится это.
  6. Mestniy

    Mestniy Гуру

    Спасибо попробую))
     
  7. Mestniy

    Mestniy Гуру

    А можете обьяснить принцип работы этих слешей? Почему он так коментирует?
     
  8. Mestniy

    Mestniy Гуру

    Ну и да: Как мне лучше вывести показания с Editbox1 в переменную на ардуино RTIME1, соответственно?
    Заранее спасибо!
     
  9. ZAZ-965

    ZAZ-965 Гуру

    О экранировании –
    Код (C++):

    char str[]="input type="number" id="Editbox1" ";
                           ^ Error
    char str[]="input type=\"number\" id=\"Editbox1\" ";
     
    в первом варианте лексический анализатор вторую двойную кавычку посчитает концом строки, а дальнейший текст будет интерпретировать как операторы языка. Во втором экранирующий символ backslash укажет анализатору, что следующий символ надо интерпретировать как двойную кавычку , а не конец лексемы.
     
    Mestniy нравится это.
  10. Mestniy

    Mestniy Гуру

    Спасибо. Это работает.
    Кто поможет с выводом переменной в ардуино. Заранее спасибо.
     
  11. Mestniy

    Mestniy Гуру

    Как оформить запрос на получение данных с Editbox1? Я просто в html не бум-бум! Потомучто если я получу по запросу данные с каждого из компонентов, то тогда смогу делать с этими данными, что захочу)).
     
  12. Mestniy

    Mestniy Гуру

    Прошу помощи!!! Хотябы совет, по поводу запросов на получение показаний с Editbox1
     
  13. Mestniy

    Mestniy Гуру

    За время мозгобоя:( я пришол к выводу, что в таком варианте либо вообще нельзя выводить строки, либо весьма затруднительно. Спасибо всем кто писал...