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

Нужна помощь Мониторить данные с нескольких ESP

VeronikaKap

New member
Добрый день, господа!

Посоветуйте, пожалуйста, как лучше и проще реализовать задачу:

В наличии:
1) ESP-12E - 3 шт.
2) Arduino UNO
3) Датчик вибрации SW-420 Motion Vibration Sensor 3-шт.
4) Wi-Fi Роутер
5) Телефон на Android
6) Ноутбук

Задача:

1) Считывать данные о вибрации с каждой ESP на один интерфейс (со всех трех)
2) Выдавать информацию о вибрации на одном интерфейсе со всех ESP (Желательно реализовать мониторинг на web интерфейс и приложение в android)
3) В перспективе так же нужно вести последовательный учет о сработках (последовательный лог вибраций)

На данный момент работаю с NodeMCU v2 - Lua based ESP8266 development kit
Но она всего одна. Есть запас ESP-12E.

Так же сопутствующий вопрос. ESP будут расположены на разном расстоянии друг от друга.
До самого дальнего, расстояние от точки доступа будет 250 метров, на открытом пространстве.
Будет ли стабильный сигнал на таком расстоянии или нужна внешняя антена?

Так же имеются несколько штук датчиков+передатчиков 433MHz KIT transceiver но на сколько я понял, они не умеют разделять сигнал, а мне нужно получать информацию с каждого датчика вибрации отдельно.

P.S Не судите строго, я начинающий пользователь ESP и с подобной задачей столкнулся впервые.
 

VeronikaKap

New member
Подскажите, хотя бы, приложение на Android, которое может подключатся к нескольким ESP сразу?
Спасибо.
 

Arthur

Active member
Подскажите, хотя бы, приложение на Android, которое может подключатся к нескольким ESP сразу?
Спасибо.
Готовое не подскажу, но самому можно написать без особых сложностей.
Готов написать вам Android приложение за умеренную плату. Да и весь проект готов реализовать. Возможна почасовая оплата. Дёшево - деньги не помешали бы сейчас...
 

Сергей_Ф

Moderator
Команда форума
@VeronikaKap зачем приложению подключаться к есп? Пусть есп подключаются к приложению. Смотрите в сторону mqtt-сервера. Ставьте его, хоть на планшет, хоть на роутер, хоть на любое промежуточное устройство. Данные все туда. Что с ними потом делать - решать вам, хотите выводите, хотите графики стройте.
 

VeronikaKap

New member
Готовое не подскажу, но самому можно написать без особых сложностей.
Готов написать вам Android приложение за умеренную плату. Да и весь проект готов реализовать. Возможна почасовая оплата. Дёшево - деньги не помешали бы сейчас...
Большое спасибо за предложение, но вынужден отказаться.
 

VeronikaKap

New member
Добрый день Господа! Снова вынужден просить Вашей помощи!

Задача реализована следующим образом. (Опишу кратко, но если потребуется в дальнейшем могу дать развернутое решение)

Показания датчика считываются и передают информацию на web страницу
Опрос ESP происходит посредством приложения созданного с помощью конструктора appinventor (приложение спрашивает веб интерфейс по ip адресу о состоянии строки)

И вот в чем проблема:

При опросе модуля из приложения, модуль зависает в зависимости от частоты опроса.
Чем чаще частота опроса, тем быстрее происходит зависание.
Например при опросе раз в 2сек. может работать до получаса, при опросе раз в 1сек. зависание происходит быстрее.
При зависании перестает работать индикация о вибрации на LedPin, а так же модуль пробует переподключится к сети, но подключение сбрасывается (видно в логах роутера)
То же самое происходит при работе с телефоном напрямую (так что роутер не причем)
Для тестирования причины в скетч был добавлен код с таймером и авто обновлением страницы раз в 1 сек.
При опросах с веб страницы работает нормально, то есть зависание происходит только при опросе через приложение.

Так же вчера при тестирование выяснилось следующее:

Не зависимо от частоты опроса модуля из приложения, модуль может работать без зависания если есть показания вибрации.
То есть, если создавать вибрацию на датчике через небольшой промежуток времени, модуль может работать без зависания и нормально отдает показания состояния в приложение, тестирование проводил в течении 40 минут.

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

Код скетча
Код:
#include <ESP8266WiFi.h>

// Имя и пароль вашей сети WiFi
const char* ssid = "вайфай";
const char* password = "пароль";


WiFiServer server(80);

int ledPin = 13; // пин светодиода
int EP =12; // пин к которому сенсор подключен
static unsigned long VibrationTime; // время жизни сигнала
static boolean VibrationEvent = false; // событие вибрации

///// добавить эту функцию

long TP_init(){
delay(10);
long measurement=pulseIn (EP, HIGH); //wait for the pin to get HIGH and returns measurement
return measurement;
}
//////// конец функции

void setup(){
pinMode(ledPin, OUTPUT);
pinMode(EP, INPUT); //set EP input for measurment

Serial.begin(115200); //init serial 9600
delay(10);

// Подключаемся к сети WiFi
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");

// Запуск сервера
server.begin();
Serial.println("Server started");

// Вывод полученного IP адреса
Serial.println(WiFi.localIP());

Serial.println("--Vibration demo--");
}


void loop() {

/////////// ловим вибрацию ///////////////
long measurement =TP_init();
delay(20);
Serial.print("measurment = ");
Serial.println(measurement);
if (measurement > 1000){
digitalWrite(ledPin, HIGH); // включ светодиод
VibrationEvent = true; //если вибрация больше 1000 значит мы ее поймали
VibrationTime = millis(); // время когда поймана вибрация
}
else{
digitalWrite(ledPin, LOW);
}
////////////// конец ловли вибрации ///////////////


// ЗДЕСЬ ИДЕТ ВСЯ ОСТАЛЬНАЯ ПРОГРАММА

// Проверка подключения
WiFiClient client = server.available();
if (!client) {
return;
}

// Ожидание данных
Serial.println("new client");
while (!client.available()) {
delay(1);
}

// Чтение первой строки запроса
String req = client.readStringUntil('\r');
Serial.println(req);
client.flush();

// послать стандартный заголовок http ответа

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();

client.println("<!DOCTYPE html>"); //web страница создана с помощью html
client.println("<html>");
client.println("<head>");
client.println("<meta http-equiv=\"refresh\" content=\"1\">");
//client.println("</head>");
//client.println("<body>");

if (VibrationEvent == true) // если была вибрация
{
client.println("<h3>'F'ON'L'</h3>"); // то это передаем
VibrationEvent = false; // сброс флага вибрации
}
else
{
client.println("<h3>'F'OFF'L'</h3>"); // если не было то это
VibrationEvent = false; // сброс флага вибрации
}

//client.println("</body>");
//client.println("</html>");

String s ;

// Подстчет UpTime

int Sec = (millis() / 1000UL) % 60;
int Min = ((millis() / 1000UL) / 60UL) % 60;
int Hours = ((millis() / 1000UL) / 3600UL) % 24;
int Day = ((millis() / 1000UL) / 3600UL / 24UL);
s += Day;
s += "d ";
s += Hours;
s += ":";
s += Min;
s += ":";
s += Sec;
s += "</body></html>\n";
client.print(s);

delay(2); // даем время, чтобы принять данные радиомодулем хватит 2 мс.

client.stop();

client.flush();

return;

Приложение в appinventor

 
Последнее редактирование:

recosh

New member
А там не предусмотрена функция по очистке мусора? Наверняка опертивная память захламляется.

Сейчас обкатываю espruino, всю ночь модуль проработал, но как клиент, раз в 2 сек опрашивал сервер. Не завис.
 
Сверху Снизу