#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* DroneID = "1"; // номер дрон порта и дрона
const char* ssid = "Wokwi-GUEST"; //drone
const char* password = ""; //1234567890
const char* serverUrl = "https://drone-portal.ru/DroneResponses/BaseRequest";
int period = 1000;
String status;
String oldstatus;
int action = 0; // Параметр для управления (0 - ничего, 2 - закрыть, 3 - открыть)
const char* message = "";
// Определения пинов для управления крышкой
#define pinButton 1 // Пин кнопки управления
#define pinClosedSwitch 3 // Пин концевика "закрыто"
#define pinOpenedSwitch 2 // Пин концевика "открыто"
#define pin_ENA 5 // Пин драйвера ENA+
#define pin_DIR 6 // Пин драйвера DIR+
#define pin_PUL 7 // Пин драйвера PUL+
uint32_t f = 1000; // Базовая частота следования шагов в Гц
uint32_t t = 1000000 / (f * 7) / 2; // Увеличение скорости в 7 раз
unsigned long lastStatusLogTime = 0; // Время последней записи состояния
void setup() {
// Инициализация пинов
pinMode(pin_ENA, OUTPUT);
pinMode(pin_DIR, OUTPUT);
pinMode(pin_PUL, OUTPUT);
pinMode(pinButton, INPUT_PULLUP); // Подтягивающий резистор для кнопки
pinMode(pinClosedSwitch, INPUT_PULLUP); // Включаем внутренний подтягивающий резистор для концевика "закрыто"
pinMode(pinOpenedSwitch, INPUT_PULLUP); // Включаем внутренний подтягивающий резистор для концевика "открыто"
// Включение драйвера
digitalWrite(pin_ENA, LOW); // Разрешить работу драйвера
// Настройка Serial для логов
Serial.begin(115200);
Serial.println("Дронпорт включен!");
message = "Дронпорт включен!";
// Проверяем состояние концевиков на старте
if (digitalRead(pinClosedSwitch) == HIGH && digitalRead(pinOpenedSwitch) == HIGH) {
Serial.println("Оба концевика разомкнуты. Закрываем крышку...");
closeCover();
} else {
Serial.println("Крышка находится в корректной позиции.");
}
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
}
void loop() {
// Проверяем состояние концевиков на старте
if (digitalRead(pinClosedSwitch) == HIGH && digitalRead(pinOpenedSwitch) == HIGH) {
Serial.println("Оба концевика разомкнуты. ");
message = "Крышка в полуоткрытом состоянии";
status = "2";
}
if (digitalRead(pinClosedSwitch) == LOW) {
message = "Крышка закрыта.";
status = "0";
}
if (digitalRead(pinOpenedSwitch) == LOW) {
message = "Крышка открыта.";
status = "1";
}
if (oldstatus != status) {
Serial.print("Статус крышки: ");
Serial.println(message);
} else{message ="";}
oldstatus = status;
// Читаем кнопку
if (digitalRead(pinButton) == LOW && action == 0) {
Serial.println("Активирована кнопка ручного открытия/закрытия дронпорта.");
if (digitalRead(pinOpenedSwitch) == HIGH){
message = "Активирована кнопка ручного открытия дронпорта.";
openCover(); // Открываем крышку
} else if(digitalRead(pinClosedSwitch) == HIGH){
message = "Активирована кнопка ручного закрытия дронпорта.";
closeCover(); // Закрываем крышку
}
}
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
http.addHeader("x-api-key", "d655f4fe9fd831bc2793ce64721cac36");
// Формирование тела POST-запроса
StaticJsonDocument<200> jsonDoc;
jsonDoc["DroneId"] = DroneID;
jsonDoc["device"] = "port";
jsonDoc["message"] = message;
jsonDoc["portCoverStatus"] = status;
String requestBody;
serializeJson(jsonDoc, requestBody);
// Отправка POST-запроса
int httpResponseCode = http.POST(requestBody);
Serial.println(requestBody);
message = 0;
if (httpResponseCode > 0) {
String response = http.getString();
//Serial.println("Response: " + response);
// Обработка ответа
StaticJsonDocument<200> responseJson;
DeserializationError error = deserializeJson(responseJson, response);
if (!error) {
const char* arm = responseJson["arm"];
const char* message = responseJson["message"];
if (message != nullptr) {
if (strstr(message, "land") != nullptr) {
Serial.println("Получена информация о приземлении дрона (открываем)");
message = "Получена информация о приземлении дрона (открываем дронпорт)";//message = "";
action = 1; //этап посадки
} else if (strstr(message, "close") != nullptr) {
Serial.println("Получена команда ЗАКРЫТЬ днонпорт");
message = "Закрытие дронпорта.";
action = 2; //закрыть
} else if (strstr(message, "open") != nullptr) {
Serial.println("Получена команда ОТКРЫТЬ днонпорт");
action = 3; //открыть
message = "Открытие дронпорта.";
} else {
//Serial.println("Пока нет команд для дронпорта");
action = 0;
}
} else {
Serial.println("Пока нет команд для дронпорта.");
}
if (action == 1 && arm == 0) {
Serial.println("Дрон сел. Закрываем крышку.");
message = "Дрон сел и отключил моторы.";
action = 2;
}
//Serial.println(action);
} else {
Serial.println("Failed to parse JSON response");
}
} else {
Serial.print("Ошибка при отрпавке запроса дронпорта: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi Не подключен");
}
// Управление крышкой в зависимости от параметра action
if (action == 2) {
closeCover();
action = 0; // Обнуляем действие после завершения
}
if (action == 3) {
openCover();
action = 0; // Обнуляем действие после завершения
}
delay(period); // Задержка в 3 секунды
}
// Функция открытия крышки
void openCover() {
Serial.println("Открытие крышки...");
moveMotor(true); // Движение в сторону открытия
}
// Функция закрытия крышки
void closeCover() {
Serial.println("Закрытие крышки...");
moveMotor(false); // Движение в сторону закрытия
}
// Функция для движения мотора
void moveMotor(bool isOpening) {
// Устанавливаем направление (исправлено направление вращения)
digitalWrite(pin_DIR, isOpening ? LOW : HIGH); // Инверсия направления
delayMicroseconds(5); // Задержка для стабилизации
Serial.print("Начало движения в направлении: ");
Serial.println(isOpening ? "Открытие" : "Закрытие");
while (true) {
// Подаем шаговый импульс
digitalWrite(pin_PUL, HIGH);
delayMicroseconds(t);
digitalWrite(pin_PUL, LOW);
delayMicroseconds(t);
// Проверяем состояние концевиков
if (isOpening && digitalRead(pinOpenedSwitch) == LOW) { // Концевик открыт сработал (LOW)
Serial.println("Достигнут концевик открытия. Остановка.");
message = "Дронпорт открыт";
break;
}
if (!isOpening && digitalRead(pinClosedSwitch) == LOW) { // Концевик закрыт сработал (LOW)
Serial.println("Достигнут концевик закрытия. Остановка.");
message = "Дронпорт закрыт";
break;
}
}
// Остановка двигателя
Serial.println("Двигатель остановлен.");
}