Создавая проекты на платформе ардуино, часто сталкивался с необходимостью приобретать различные кнопки, выключатели, потенциометры, дисплеи и прочие элементы. Кроме покупки их нужно было ещё запаивать, что занимало время и пины контроллера.
Неожиданно пришла идея полностью убрать все эти элементы из моих проектов при помощи приложения на телефоне. Заморочился и создал приложение. Было ясно, что создать конкретный пульт будет бесполезно, так как проекты разные и пульты нужны разные. Поэтому в приложении присутствует конструктор, при помощи которого можно создать любой пульт за считанные минуты. Приложение имеет две возможности связи с контроллером - по Bluetooth или WiFi.
Думаю, такая вещь может пригодиться любому, кто разрабатывает проекты.
Установочный АПК файл для андроид 8+ и PDF с подробными объяснениями кода и приложения закинул себе на гугл диск. Ниже ссылка на папку с файлами. Буду рад конструктивным комментариям и предложениям по данному проекту.
https://drive.google.com/drive/folders/1KsZZMWJiBXBHWM7frK42_CDhIAiO_Xps?usp=sharing
Пример использования
создайте пульт и добавьте в следующем порядке элементы управления
- Switch
- Button
- Textfield
- Potentiometer min = 1 max = 3
- Potentiometer min = 0 max = 500
Скетч для WiFi (Wemos)
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
const char* ssid = "Wemos HotSpot";
const char* password = "12345678";
String sendValue = "";
WiFiServer server(80); // Create a server on port 80
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
WiFi.softAP(ssid, password);
Serial.println();
Serial.println("IP address: ");
Serial.println(WiFi.softAPIP());
server.begin(); // Start the server
}
void loop() {
WiFiClient client = server.available(); // Listen for incoming clients
client.setTimeout(100);
if(client){
String data = client.readStringUntil('\n'); // Read the data from the client
data.trim();
if(data != ""){
Serial.println(data);
}
// Switch
if(data == "s0x1") {
digitalWrite(LED_BUILTIN, LOW); // LED on
} else if (data == "s0x0"){
digitalWrite(LED_BUILTIN, HIGH); // LED off
}
// Button
if (data == "b1x1") {
sendValue = "Hello";
} else if (data == "b1x0") {
sendValue = "Bye bye";
}
//Potentiometer 1 - 3
char *p;
char buffer[128];
String potentiometerParts[2];
String potentiometer = data;
potentiometer.toCharArray(buffer, sizeof(buffer));
int i = 0;
p = strtok(buffer, "x");
while(p && i < 2){
potentiometerParts[i] = p;
p = strtok(NULL, "x");
++i;
}
if(potentiometerParts[0] == "p3"){
int potentiometerValue = potentiometerParts[1].toInt();
if(potentiometerValue == 1){
sendValue = "Going slow";
} else if(potentiometerValue == 2){
sendValue = "Going faster";
} else if(potentiometerValue == 3){
sendValue = "Going fast";
}
}
// potentiometer 0 - 500
potentiometer = data;
potentiometer.toCharArray(buffer, sizeof(buffer));
i = 0;
p = strtok(buffer, "x");
while(p && i < 2){
potentiometerParts[i] = p;
p = strtok(NULL, "x");
++i;
}
if(potentiometerParts[0] == "p4"){
String potentiometerValue = potentiometerParts[1];
sendValue = "Value: " + potentiometerValue;
}
// send data to textfield
client.print(sendValue);
}
}
Скетч для Bluetooth (ESP-WROOM-32):
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
String data = "";
void setup() {
pinMode(2, OUTPUT); // Builtin LED
Serial.begin(115200);
// Bluetooth device name
SerialBT.begin("ESP32"); // you can enter any name you want
Serial.println("Bluetooth started");
}
void loop() {
data = "";
// Read received messages (LED control command)
if(SerialBT.available()){
delay(1); // pause the controller for reading the incoming data correctly
while(SerialBT.available()){
char incomingChar = SerialBT.read();
if (incomingChar != '\n'){
data += String(incomingChar);
}
}
}
if(data == "s0x1") {
digitalWrite(2, HIGH); // LED on
} else if (data == "s0x0"){
digitalWrite(2, LOW); // LED off
}
if (data == "b1x1") {
bluetoothPrintLine("Hello*");
} else if (data == "b1x0") {
bluetoothPrintLine("Bye bye*");
}
char *p;
char buffer[128];
String potentiometerParts[2];
String potentiometer = data;
potentiometer.toCharArray(buffer, sizeof(buffer));
int i = 0;
p = strtok(buffer, "x");
while(p && i < 2){
potentiometerParts[i] = p;
p = strtok(NULL, "x");
++i;
}
if(potentiometerParts[0] == "p3"){
int potentiometerValue = potentiometerParts[1].toInt();
if(potentiometerValue == 1){
bluetoothPrintLine("Going slow*");
} else if(potentiometerValue == 2){
bluetoothPrintLine("Going faster*");
} else if(potentiometerValue == 3){
bluetoothPrintLine("Going fast*");
}
}
potentiometer = data;
potentiometer.toCharArray(buffer, sizeof(buffer));
i = 0;
p = strtok(buffer, "x");
while(p && i < 2){
potentiometerParts[i] = p;
p = strtok(NULL, "x");
++i;
}
if(potentiometerParts[0] == "p4"){
String potentiometerValue = potentiometerParts[1];
bluetoothPrintLine("Value: " + potentiometerValue + "*");
}
}
void bluetoothPrintLine(String line) {
unsigned l = line.length();
for (int i = 0; i < l; i++) {
if (line[i] != '\0')
SerialBT.write(byte(line[i]));
}
}