diff --git a/doorbell/DFRobotDFPlayerMini-1.0.3.zip b/doorbell/DFRobotDFPlayerMini-1.0.3.zip new file mode 100644 index 0000000..c0869ca Binary files /dev/null and b/doorbell/DFRobotDFPlayerMini-1.0.3.zip differ diff --git a/doorbell/Doorbell-Sender.fzz b/doorbell/Doorbell-Sender.fzz new file mode 100644 index 0000000..80247a9 Binary files /dev/null and b/doorbell/Doorbell-Sender.fzz differ diff --git a/doorbell/Doorbell-Sender.ino b/doorbell/Doorbell-Sender.ino new file mode 100644 index 0000000..0d5bb52 --- /dev/null +++ b/doorbell/Doorbell-Sender.ino @@ -0,0 +1,93 @@ +/* + * Sources: + * https://www.arduino.cc/en/Tutorial/Button + * https://techtutorialsx.com/2017/05/19/esp32-http-get-requests/ + */ + +#include +#include + +const char* ssid = "LeWe"; +const char* password = "5275274365464843"; +const char* bellUrl = "http://192.168.1.117/bell/on"; + +const int buttonPin = 21; // the number of the pushbutton pin +const int ledPin = 23; // the number of the LED pin +int buttonState = 0; + + +void setup() { + + Serial.begin(115200); + btStop(); // turn off bluetooth + + 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()); +} diff --git a/doorbell/Doorbell-Speaker.fzz b/doorbell/Doorbell-Speaker.fzz new file mode 100644 index 0000000..3616d56 Binary files /dev/null and b/doorbell/Doorbell-Speaker.fzz differ diff --git a/doorbell/Doorbell-Speaker.ino b/doorbell/Doorbell-Speaker.ino new file mode 100644 index 0000000..381ad73 --- /dev/null +++ b/doorbell/Doorbell-Speaker.ino @@ -0,0 +1,235 @@ +/* +Sources: +https://www.youtube.com/watch?v=kq2RLz65_w0 +https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299 +https://github.com/pcbreflux/espressif/blob/master/esp32/arduino/sketchbook/ESP32_DFPlayer_full/ESP32_DFPlayer_full.ino +https://github.com/pcbreflux/espressif/blob/master/esp32/arduino/sketchbook/ESP32_DFPlayer_full/setup.png +https://randomnerdtutorials.com/esp32-web-server-arduino-ide/ +https://randomnerdtutorials.com/solved-reconnect-esp32-to-wifi/ +*/ + +/* Anmerkungen: +- Übertragung aus Arduino IDE mit Board "ESP32 Dev Module", siehe https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md +- Zum Übertragen an das ESP-32-WROOM muss (manchmal?) der BOOT-Button gedrückt werden +- Die Library DFRobotDFPlayerMini-1.0.3.zip muss in der Arduino IDE über Sketch > Bibliothek einbinden > .ZIP-Bibliothek geöffnet werden +*/ + +#include +#include "DFRobotDFPlayerMini.h" +#include + +HardwareSerial hwSerial(1); +DFRobotDFPlayerMini dfPlayer; +int volume = 22; + +const char* ssid = "LeWe"; +const char* password = "5275274365464843"; +WiFiServer server(80); // Set web server port number to 80 + +String header; +const int ledPin = 26; + +int charCount = 0; + +unsigned long previousMillis = 0; +unsigned long interval = 120000; +unsigned long lastcheck = 120000; + +void setup() +{ + btStop(); // turn off bluetooth + hwSerial.begin(9600, SERIAL_8N1, 18, 19); // speed, type, TX, RX + Serial.begin(115200); + + pinMode(ledPin, OUTPUT); + digitalWrite(ledPin, LOW); + + Serial.println("Connecting to dfPlayer"); + dfPlayer.begin(hwSerial); //Use softwareSerial to communicate with mp3 + dfPlayer.setTimeOut(500); //Set serial communication time out 500ms + dfPlayer.volume(volume); //Set volume value (0~30). + dfPlayer.EQ(DFPLAYER_EQ_NORMAL); + dfPlayer.outputDevice(DFPLAYER_DEVICE_SD); + + setupServer(); +} + +void setupServer() { + digitalWrite(ledPin, LOW); + + // Connect to Wi-Fi network with SSID and password + Serial.print("Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + + charCount++; + if (charCount >= 80) { + charCount = 0; + Serial.println(""); + } + + } + // Print local IP address and start web server + Serial.println(""); + Serial.println("WiFi connected."); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + server.begin(); + delay(500); + + dfPlayer.play(2); // play the second mp3 + + digitalWrite(ledPin, HIGH); + Serial.println("Setup completed"); +} + +void loop() { + if ((WiFi.status() == WL_CONNECTED)) { + + WiFiClient client = server.available(); // Listen for incoming clients + + if (client) { + String currentLine = ""; // make a String to hold incoming data from the client + while (client.connected()) { // loop while the client's connected + if (client.available()) { // if there's bytes to read from the client, + char c = client.read(); // read a byte, then + Serial.write(c); // print it out the serial monitor + header += c; + if (c == '\n') { // if the byte is a newline character + // if the current line is blank, you got two newline characters in a row. + // that's the end of the client HTTP request, so send a response: + if (currentLine.length() == 0) { + // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) + // and a content-type so the client knows what's coming, then a blank line: + client.println("HTTP/1.1 200 OK"); + client.println("Content-type:text/html"); + client.println("Connection: close"); + client.println(); + + // turns the GPIOs on and off + if (header.indexOf("GET /") >= 0) { + client.println("{ \"status\": \"true\" }"); + } + else if (header.indexOf("GET /bell/on") >= 0) { + dfPlayer.play(1); //Play the first mp3 + } + else if (header.indexOf("GET /volume/") >= 0) { // yes, I know this is not RESTful + 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); + } + + // Display the HTML web page + client.println(""); + client.println(""); + client.println(""); + client.println(""); + + client.println("

LeWe Türklingel

"); + client.println("

Volume: " + String(volume) + "

"); + client.println("

"); + client.println("

dfplayer status: " + printDetail(dfPlayer.readType(), dfPlayer.read()) + "

"); + client.println(""); + + // The HTTP response ends with another blank line + client.println(); + + // Break out of the while loop + break; + } else { // if you got a newline, then clear currentLine + currentLine = ""; + } + } else if (c != '\r') { // if you got anything else but a carriage return character, + currentLine += c; // add it to the end of the currentLine + } + } + } + // Clear the header variable + header = ""; + // Close the connection + client.stop(); + Serial.println("Client disconnected"); + Serial.println(""); + } + } + else if (lastcheck >= interval) { + Serial.println("Reconnecting..."); + dfPlayer.play(3); // play the third mp3 + WiFi.disconnect(); + WiFi.reconnect(); + previousMillis = millis(); + } + else { + lastcheck = millis() - previousMillis; + } +} + +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: + return "UNKNOWN ERROR"; + break; + } + break; + default: + return "UNKNOWN TYPE"; + break; + } +} \ No newline at end of file diff --git a/klingel_sender_nano_serial/doorbell.py b/doorbell/klingel_sender_nano_serial/doorbell.py similarity index 100% rename from klingel_sender_nano_serial/doorbell.py rename to doorbell/klingel_sender_nano_serial/doorbell.py diff --git a/klingel_sender_nano_serial/klingel_sender_nano_serial.ino b/doorbell/klingel_sender_nano_serial/klingel_sender_nano_serial.ino similarity index 100% rename from klingel_sender_nano_serial/klingel_sender_nano_serial.ino rename to doorbell/klingel_sender_nano_serial/klingel_sender_nano_serial.ino diff --git a/doorbell/sounds/01.mp3 b/doorbell/sounds/01.mp3 new file mode 100644 index 0000000..21abeb7 Binary files /dev/null and b/doorbell/sounds/01.mp3 differ diff --git a/doorbell/sounds/02.mp3 b/doorbell/sounds/02.mp3 new file mode 100644 index 0000000..a19e85e Binary files /dev/null and b/doorbell/sounds/02.mp3 differ diff --git a/doorbell/sounds/03.mp3 b/doorbell/sounds/03.mp3 new file mode 100644 index 0000000..56169b7 Binary files /dev/null and b/doorbell/sounds/03.mp3 differ