• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Точка доступа ESP8266 + JSON

Mestniy2496

Member
Спасибо вам большое - именно это я и имел ввиду. Не смею больше вас задерживать. Дальше я точно сам попробую доработать - стыдно перед вами.
Код:
#include <Arduino.h>
#include <ArduinoJson.h>
#ifdef ARDUINO_ARCH_ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define WebServerImpl ESP8266WebServer
#elif ARDUINO_ARCH_ESP32
#include <WiFi.h>
#include <WebServer.h>
#define WebServerImpl WebServer
#else
#error Unsupported architecture, use ARDUINO_ARCH_ESP8266 or ARDUINO_ARCH_ESP32
#endif
// Это ip адрес по которому будет доступен веб-сервер
IPAddress local_ip(192, 168,   4, 22);
// Это ip адрес шлюза, этот шлюз будут использовать wifi клиенты подключившиеся к точке доступа
IPAddress gateway (192, 168,   4,  9);
// Это маска подсети
IPAddress subnet  (255, 255, 255,  0);
// Экземпляр веб-сервера
WebServerImpl server(80);
// Статические переменные, отправляемые на каждом get запросе в котором присутствует нужная url
int volume_value = 0;
boolean on_value = false;
long time_value = 0;
int value_time = 0;
int device_state = 0;
// Это обработчик для всех запросов GET POST и т.д.
void handle_not_found() {
  // Предварительно установим код ответа
  int response_code = 404;
  // Обрабатываем только GET запросы, на все остальные отвечаем 404-м кодом
  if (server.method() == HTTP_GET) {
    if (server.uri().indexOf("/volume_increase") >= 0) {
      // TODO Вот тут что то делаем, был запрошен /volume_increase
      // Устанавливаем значение volume_value, чтоб как-то проинформировать
      // что обрабатывался запрос /volume_increase
      volume_value = valume_sound + 1 ;
      // Устанавливаем код ответа
      response_code = 200;
    } else if (server.uri().indexOf("/volume_decrease") >= 0) {
      // TODO
      volume_value = valume_sound - 1 ;
      response_code = 200;
    } else if (server.uri().indexOf("/device_on") >= 0) {
      // TODO
      int device_state = 1
      on_value = true;
      response_code = 200;
    } else if (server.uri().indexOf("/device_off") >= 0) {
      int device_state = 0
      on_value = false;
      // TODO
      response_code = 200;
    } else if (server.uri().indexOf("/timer_increase") >= 0) {
      // TODO
      value_time = value_time + 10;
     time_value = time_value + 10;
      response_code = 200;
    } else if (server.uri().indexOf("/timer_decrease") >= 0) {
      // TODO
      value_time = value_time - 10;
      time_value = time_value - 10;
      response_code = 200;
    } else if (server.uri().indexOf("/state") >= 0) {
      response_code = 200;
    }
  }
  // Код ответа ответа был установлен отличным от 404, значит нужно ответить статусом
  if (response_code != 404) {
    // Строим json документ
    StaticJsonDocument<256> doc;
    // Устанавливаем значение "volume"
    doc["volume"] = volume_value;
    // Устанавливаем значение "on"
    doc["on"] = on_value;
    // Устанавливаем значение "time"
    doc["time"] = time_value;
    // Серилизуем json документ в строку
    String output;
    serializeJson(doc, output);
    // Отправляем ответ
    server.send(response_code, "application/json", output);
  } else {
    // Отправляем ответ
    server.send(response_code, "text/plain", "File Not Found\n\n");
  }
}
void setup() {
  Serial.begin(115200);
  // Инициализируем wifi
  // Отключаем сохранение параметров во флеш
  WiFi.persistent(false);
  // Выключаем wifi совсем
  WiFi.mode(WIFI_OFF);
  // Устанавливаем параметры ip для интерфейса AP
  WiFi.softAPConfig(local_ip, gateway, subnet);
  // Выбираем режим работы wifi
  WiFi.mode(WIFI_AP);
  // Задаем идентификатор SSID
  WiFi.softAP("MY-ESP");
  // Настраиваем веб-сервер
  // Устанавливаем обработчик для всех запросов, определять методы и запрошенные url будем в нем
  server.onNotFound(handle_not_found);
  // Запускаем сервер
  server.begin();
}
void loop() {
  // Даем серверу обрабатывать запросы
  server.handleClient();
  Serial.println("sound"+volume_value);
  Serial.println("state"+device_state);
  Serial.println("time"+value_time);
  delay (1);
    if (Serial.available() > 0)  //если есть доступные данные
  {

    incomingByte = Serial.read();

  }
}
 

Mestniy2496

Member
Доброго вечера - вот что у меня получилось:
Код на арду:
Код:
#include <SoftwareSerial.h>//Подключаем ESP-шку
SoftwareSerial ESPport(11, 12);////////////////////// RX, TX
//Подключаем MP3
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
DFRobotDFPlayerMini myDFPlayer;
   int soundstate;
   int timing;
   int mytiming;
//Обозначаем пины для РЕЛЕ
#define RELE_PIN_1 7
#define RELE_PIN_2 8
#define RELE_PIN_3 9
//Обозначаем пины для кнопок
const int BUTTON_PIN_1 = 4;
const int BUTTON_PIN_2 = 5;
const int BUTTON_PIN_3 = 6;
int i = 0;
int x = 0;
int y = 0;
int button_old_1 = 1;
int button_old_2 = 1;
int button_old_3 = 1;

int sleeping = 91;
  
int button_old_a = 1;
int button_old_b = 1;
int button_old_c = 1;
int button_old_d = 1;
int button_old_e = 1;


int sec = 60;
void setup()
{

Serial.begin(9600); // Терминал
ESPport.begin(115200);    
pinMode(RELE_PIN_1, OUTPUT);
pinMode(RELE_PIN_2, OUTPUT);
pinMode(RELE_PIN_3, OUTPUT);
pinMode(BUTTON_PIN_1, INPUT_PULLUP);
pinMode(BUTTON_PIN_2, INPUT_PULLUP);
pinMode(BUTTON_PIN_3, INPUT_PULLUP);
digitalWrite(RELE_PIN_1, LOW);
digitalWrite(RELE_PIN_2, LOW);
digitalWrite(RELE_PIN_3, LOW);
myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
  delay(1000);
}
void loop()
{ //Управление Андроид
    if ( ESPport.available() > 0)
  {
    char ch = ESPport.read();
    if (ch == '\r' || ch == '\n')
    {
     
      if (searching == "A")
      {
        if (soundstate <=30){
        soundstate = soundstate+3;
        myDFPlayer.volume(soundstate);
        }
      }
      //Реле 5
      if (searching == "B")
      {
        if (soundstate >= 0) {
        soundstate = soundstate-3;
        myDFPlayer.volume(soundstate);
        }
      }
      if (searching == "C")
      {
            digitalWrite(RELE_PIN_1, LOW);
    digitalWrite(RELE_PIN_2, LOW);
    digitalWrite(RELE_PIN_3, LOW);
    myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
    delay(10);
      }
      //Стоп
      if (searching == "D")
      {
        digitalWrite(RELE_PIN_1, HIGH);
  myDFPlayer.volume(30);  //Set volume value. From 0 to 30
   myDFPlayer.loop(1);  //Play the first mp3
      }
         if (searching == "E")
      {
    
      }
      searching = "";
    }
    else searching += ch;
    Serial.write( ESPport.read());
  }
 
  //УПРАВЛЕНИЕ С КНОПОК
  int buttonState1 = digitalRead(BUTTON_PIN_1); // считываем состояние кнопки 1
  int buttonState2 = digitalRead(BUTTON_PIN_2); // считываем состояние кнопки 2
  int buttonState3 = digitalRead(BUTTON_PIN_3); // считываем состояние кнопки 3
if ((buttonState1==LOW)&&(button_old_1==1))
  {
    i = i + 1;
    if (i > 2)
    {
      i = 1;
    }
     if (i == 1)
  {
  digitalWrite(RELE_PIN_1, HIGH);
  myDFPlayer.volume(30);  //Set volume value. From 0 to 30
   myDFPlayer.loop(1);  //Play the first mp3
  }
   if (i == 2)
  {
    digitalWrite(RELE_PIN_1, LOW);
    digitalWrite(RELE_PIN_2, LOW);
    digitalWrite(RELE_PIN_3, LOW);
    myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
    delay(10);
  }
  }
  button_old_1 = buttonState1;
  delay(10);
 
   if ((buttonState2==LOW)&&(button_old_2==1))
  {
    x = x + 1;
    if (x > 2)
    {
      x = 1;
    }
     if (x == 1)
  {
     myDFPlayer.loop(1)
   myDFPlayer.volume(30);
  }
   if (x == 2)
  {
    myDFPlayer.volume(0);
  }
  }
  button_old_2 = buttonState2;
  delay(10);
 
   if ((buttonState3==LOW)&&(button_old_3==1))
  {
    y = y + 1;
    if (y > 3)
    {
      y = 1;
    }
     if (y == 1)
  {
   digitalWrite(RELE_PIN_2, HIGH);
  }
   if (y == 2)
  {
   digitalWrite(RELE_PIN_3, HIGH);
  }
   if (y == 3)
  {
  digitalWrite(RELE_PIN_2, LOW);
    digitalWrite(RELE_PIN_3, LOW);
  }
  }
  button_old_3 = buttonState3;
  delay(10);

   
}
А вот для ЕСП:
Код:
#include <Arduino.h>
#include <ArduinoJson.h>
#ifdef ARDUINO_ARCH_ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define WebServerImpl ESP8266WebServer
#elif ARDUINO_ARCH_ESP32
#include <WiFi.h>
#include <WebServer.h>
#define WebServerImpl WebServer
#else
#error Unsupported architecture, use ARDUINO_ARCH_ESP8266 or ARDUINO_ARCH_ESP32
#endif
// Это ip адрес по которому будет доступен веб-сервер
IPAddress local_ip(192, 168,   4, 22);
// Это ip адрес шлюза, этот шлюз будут использовать wifi клиенты подключившиеся к точке доступа
IPAddress gateway (192, 168,   4,  9);
// Это маска подсети
IPAddress subnet  (255, 255, 255,  0);
// Экземпляр веб-сервера
WebServerImpl server(80);
// Статические переменные, отправляемые на каждом get запросе в котором присутствует нужная url
int volume_value = 0;
boolean on_value = false;
long time_value = 0;
int value_time = 0;
int device_state = 0;
int state_serial = 0;
int serial_char;
int timingonoff = 0;
char charTable[] = {'a','b','c','d','e'};

// Это обработчик для всех запросов GET POST и т.д.
void handle_not_found() {
  // Предварительно установим код ответа
  int response_code = 404;
  // Обрабатываем только GET запросы, на все остальные отвечаем 404-м кодом
  if (server.method() == HTTP_GET) {
    if (server.uri().indexOf("/volume_increase") >= 0) {
      // TODO Вот тут что то делаем, был запрошен /volume_increase
      // Устанавливаем значение volume_value, чтоб как-то проинформировать
      // что обрабатывался запрос /volume_increase
       state_serial = 1;
       serial_char = 0;
      volume_value = valume_sound + 1 ;
      // Устанавливаем код ответа
      response_code = 200;
    } else if (server.uri().indexOf("/volume_decrease") >= 0) {
      // TODO
      serial_char = 1;
      state_serial = 1;
      volume_value = valume_sound - 1 ;
      response_code = 200;
    } else if (server.uri().indexOf("/device_on") >= 0) {
      // TODO
      serial_char = 3;
      state_serial = 1;
      int device_state = 1
      on_value = true;
      response_code = 200;
    } else if (server.uri().indexOf("/device_off") >= 0) {
      serial_char = 2
      state_serial = 1;
      int device_state = 0
      on_value = false;
      // TODO
      response_code = 200;
    } else if (server.uri().indexOf("/timer_increase") >= 0) {
      state_serial = 1;
      // TODO
      value_time = value_time + 10;
     time_value = time_value + 10;
     timingonoff = 1;
      response_code = 200;
    } else if (server.uri().indexOf("/timer_decrease") >= 0) {
      // TODO
      state_serial = 1;
      value_time = value_time - 10;
      time_value = time_value - 10;
      timingonoff = 1;
      response_code = 200;
    } else if (server.uri().indexOf("/state") >= 0) {
      response_code = 200;
    }
  }
  // Код ответа ответа был установлен отличным от 404, значит нужно ответить статусом
  if (response_code != 404) {
    // Строим json документ
    StaticJsonDocument<256> doc;
    // Устанавливаем значение "volume"
    doc["volume"] = volume_value;
    // Устанавливаем значение "on"
    doc["on"] = on_value;
    // Устанавливаем значение "time"
    doc["time"] = time_value;
    // Серилизуем json документ в строку
    String output;
    serializeJson(doc, output);
    // Отправляем ответ
    server.send(response_code, "application/json", output);
  } else {
    // Отправляем ответ
    server.send(response_code, "text/plain", "File Not Found\n\n");
  }
}
void setup() {
  Serial.begin(115200);
  // Инициализируем wifi
  // Отключаем сохранение параметров во флеш
  WiFi.persistent(false);
  // Выключаем wifi совсем
  WiFi.mode(WIFI_OFF);
  // Устанавливаем параметры ip для интерфейса AP
  WiFi.softAPConfig(local_ip, gateway, subnet);
  // Выбираем режим работы wifi
  WiFi.mode(WIFI_AP);
  // Задаем идентификатор SSID
  WiFi.softAP("MY-ESP");
  // Настраиваем веб-сервер
  // Устанавливаем обработчик для всех запросов, определять методы и запрошенные url будем в нем
  server.onNotFound(handle_not_found);
  // Запускаем сервер
  server.begin();
}
void loop() {
  // Даем серверу обрабатывать запросы
  server.handleClient();
  if (state_serial == 1)
  {
    Serial.println(charTable[serial_char]);
  }
  else {
    state_serial = 0;
  }

    if (Serial.available() > 0)  //если есть доступные данные
  {

    incomingByte = Serial.read();

  }
  // таймер сна
  if (timingonoff == 1)
  {
    if (mytiming >= 10)
  {
    int gettiming = mytiming * 60;
    gettiming = gettiming * 1000;
    for (int clocktime = gettiming; clocktime > 0; clocktime--)
    {
      mytiming = clocktime;
      if (mytiming == 0)
      {
Serial.println("C");
      }
    }
  }
}
else
{
  timingonoff = 0;
  }
}
 

Mestniy2496

Member
Друзья. Доброго дня. Вернулся к этому проекту. Проблемка... Как сделать чтобы андроид и вифи находились в одной сети?
 

Mestniy2496

Member
Друзья. Доброго дня. Вернулся к этому проекту. Проблемка... Как сделать чтобы андроид и вифи находились в одной под сети?
 

Mestniy2496

Member
Друзья. Доброго дня. Вернулся к этому проекту. Проблемка... Как сделать чтобы андроид и вифи находились в одной под сети? Можно ли сделать чтобы маска под сети на андроиде была такой же как и на арде?
 

Mestniy2496

Member
Может быть нужно создать точку доступа на арде? И подключиться к ней с помощью андроид? Только не пойму как это сделать...
 
Сверху Снизу