цифровая электроника
вычислительная техника
встраиваемые системы

 

WiFi дверной звонок на основе ESP32 и DFPlayer своими руками

Автор: Mike(admin) от 21-03-2019, 07:55

Домашняя автоматизация с каждым годом проникает все больше в нашу повседневную жизнь. И сегодня уже никого не удивить «умными» звонками, подключаемыми по WiFi. Они позволяют передавать информацию о появлении посетителя на любое WiFi-устройство хозяев, а наиболее продвинутые модели, оснащенные камерой, также могут передавать видео.


WiFi дверной звонок на основе ESP32 и DFPlayer своими руками

К сожалению, пока не каждому по карману такие дверные звонки, но их можно сделать самостоятельно с помощью, подключаемых к WiFi микроконтроллеров, например, ESP32.


Концепция такого самодельного дверного звонка довольно проста. Первый микроконтроллер обнаруживает нажатие кнопки и отправляет запрос второму микроконтроллеру через домашний WiFi. Этот второй микроконтроллер подключен к динамику и воспроизводит звук звонка. Чтобы сделать это еще проще, можно добавить дешевый модуль MP3-плеера, например, DFPlayer с SD-картой, на которой содержится файл со звуком звонка.


Схемы подключения отправителя и получателя звонка показаны далее. Со стороны отправителя помимо микроконтроллера достаточно кнопки и светодиода для индикации. Со стороны получателя обязательно должен присутствовать модуль MP3 плеера и динамик для звукового оповещения при нажатии на кнопку со стороны отправителя.


Схема подключения отправителя

Схема подключения получателя

Код программы отправителя также несколько проще кода получателя. Он отправляет сообщение и мигает светодиодом, а получатель помимо приема информации и выдачи команд на модуль MP3 плеера запускает небольшой веб-сервер, который обеспечивает интерфейс для отправителя и может также использоваться напрямую через браузер. Код получателя также установить громкость динамика. Интерфейс веб-сервера выглядит следующим образом.


Интерфейс веб-сервера дверного звонка

Код отправителя:



#include <WiFi.h>
#include <HTTPClient.h>
 
const char* ssid     = "WiFi SSID";
const char* password = "WiFi password";
const char* bellUrl = "http://192.168.1.149/bell/on";

const int buttonPin = 21;    // номер вывода кнопки
const int ledPin =  23;      // номер вывода светодиода
int buttonState = 0;

 
void setup() {

  Serial.begin(115200);
  btStop(); // выключить блютус

  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);

  connectWifi();

}
 
void loop() {
 
  if ((WiFi.status() == WL_CONNECTED)) {

    buttonState = digitalRead(buttonPin);
    delay(100);

    if (buttonState == HIGH) {
      digitalWrite(ledPin, HIGH);
      
      HTTPClient http;
   
      http.begin(bellUrl);
      Serial.print("GET ");
      Serial.println(bellUrl);
      int httpCode = http.GET();
   
      if (httpCode > 0) {
          //String payload = http.getString();
          Serial.println(httpCode);
          //Serial.println(payload);
        }
      else {
        Serial.println("Error on HTTP request");
      }
   
      http.end();
      delay(200);
    }
    else {
      digitalWrite(ledPin, LOW); 
    }
  }
  else {
    Serial.println("WiFi not connected!");
    digitalWrite(ledPin, HIGH);
    delay(200);
    digitalWrite(ledPin, LOW);
    delay(50);
    digitalWrite(ledPin, HIGH);
    delay(200);
    digitalWrite(ledPin, LOW);
    connectWifi();
  }
 
}

void connectWifi() {
  boolean ledStatus = false;
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    ledStatus = !ledStatus;
    digitalWrite(ledPin, ledStatus);
  }
 
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

Код получателя:



#include <Arduino.h>
#include "DFRobotDFPlayerMini.h" // dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299
#include <WiFi.h>

HardwareSerial hwSerial(1);
DFRobotDFPlayerMini dfPlayer;
int volume = 5;

const char* ssid     = "WiFi SSID";
const char* password = "WiFi password";
WiFiServer server(80); // Установите номер порта веб-сервера на 80

String header;
String ledState = "";
const int ledPin = 26;

unsigned long timestamp = 0;


void setup()
{
  btStop(); // turn off bluetooth
  hwSerial.begin(9600, SERIAL_8N1, 18, 19);  // скорость, тип, TX, RX
  Serial.begin(115200);

// WiFi и светодиод ==================================================================
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);

  // Подключитесь к сети Wi-Fi с помощью SSID и пароля
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Вывести локальный IP-адрес и запустить веб-сервер
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
  delay(500);

  dfPlayer.begin(hwSerial);
  dfPlayer.setTimeOut(500);
  dfPlayer.volume(volume);  // Установите значение громкости (0 - 30)
  dfPlayer.EQ(DFPLAYER_EQ_NORMAL);
  dfPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  
  ledState = "on";
  digitalWrite(ledPin, HIGH);
  timestamp = millis();
  dfPlayer.play(1);  // Воспроизвести первый mp3

}

void loop() {

  WiFiClient client = server.available();   // Слушаем входящих клиентов

  if (ledState == "on" && (millis() - timestamp) > 2000) {
    ledState = "off";
    digitalWrite(ledPin, LOW);
  }

  if (client) {
    String currentLine = ""; 
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        header += c;
        if (c == '\n') 
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // включаем и выключаем GPIO
            if (header.indexOf("GET /bell/on") >= 0) {
              ledState = "on";
              digitalWrite(ledPin, HIGH);
              timestamp = millis();
              dfPlayer.play(1);  // Воспроизвести первый mp3
            }
            else  if (header.indexOf("GET /volume/") >= 0) { 
              String str1 = header;
              str1 = str1.substring(header.indexOf("GET /volume/") + 12);
              volume = str1.substring(0, str1.indexOf(" ")).toInt();
              
              if (volume < 0) {
                volume = 0;
              }
              else if (volume > 30) {
                volume = 30;
              }
              
              dfPlayer.volume(volume);
              Serial.print("volume set to ");
              Serial.println(volume);
            }
            
            // Отобразить веб-страницу HTML
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            client.println("<title>Doorbell</title>");
            client.println("<style>html { font-family: sans-serif; display: inline-block; margin: 0px auto; text-align: center; }");
            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 { background-color: #4CAF50; border: none; color: white; padding: 4px 10px; text-decoration: none; margin: 1px; cursor: pointer;}</style></head>");
            
            client.println("<body><h1>Doorbell</h1>");
            client.println("<p>Volume: <a href=\"/volume/" + String(volume-1) + "\"><button class=\"button2\">&#8722;</button></a> " + String(volume) + " <a href=\"/volume/" + String(volume+1) + "\"><button class=\"button2\">+</button></a></p>");
            client.println("<p><a href=\"/bell/on\"><button class=\"button\">Ring</button></a></p>");
            client.println("<p style='margin-top: 40px; font-size: 8px;'>dfplayer status: " + printDetail(dfPlayer.readType(), dfPlayer.read()) + "</p>");
            client.println("<p style='font-size: 8px;'>LED - State " + ledState + "</p>");
            client.println("</body></html>");
            
            // HTTP-ответ заканчивается другой пустой строкой
            client.println();
            
            // Выход из цикла
            break;
          } else { // если получили новую строку, то очистим currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // если у вас есть что-то еще, кроме символа возврата каретки,
          currentLine += c;      // добавьте это в конец currentLine
        }
      }
    }
    // Очистить переменную header
    header = "";
    // Закрыть соединение
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}

String printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      return "Time Out!";
      break;
    case WrongStack:
      return "Stack Wrong!";
      break;
    case DFPlayerCardInserted:
      return "Card Inserted!";
      break;
    case DFPlayerCardRemoved:
      return "Card Removed!";
      break;
    case DFPlayerCardOnline:
      return "Card Online!";
      break;
    case DFPlayerPlayFinished:
      return "Play Finished!";
      break;
    case DFPlayerError:
      switch (value) {
        case Busy:
          return "Error: Card not found";
          break;
        case Sleeping:
          return "Error: Sleeping";
          break;
        case SerialWrongStack:
          return "Error: Get Wrong Stack";
          break;
        case CheckSumNotMatch:
          return "Error: Check Sum Not Match";
          break;
        case FileIndexOut:
          return "Error: File Index Out of Bound";
          break;
        case FileMismatch:
          return "Error: Cannot Find File";
          break;
        case Advertise:
          return "Error: In Advertise";
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}



© digitrode.ru


Теги: ESP32, WiFi, Wi-Fi



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий