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

esp 8266 esp now time

Mirdo

New member
Здравствуйте! У меня есть вопрос, можно ли как-то сделать так что бы когда сообщение отправлялось включался таймер, а когда принималось то выключался?
 

CodeNameHawk

Moderator
Команда форума
Для начала опишите, что такое таймер в вашем понимании.
Я вам подсказал как измерить длительность отправки сообщеия.
 

Mirdo

New member
Для начала опишите, что такое таймер в вашем понимании.
Я вам подсказал как измерить длительность отправки сообщеия.
Я немного ошибся в формулировке своего вопроса, но не суть.
Примерно как то так:
Таймер 1 начался
Таймер 2 начался
Отправка сообщения
Таймер 2 закончился
Пришло сообщение
Таймер 1 закончился
 

CodeNameHawk

Moderator
Команда форума
Код:
nachalo1 = millis();
//vash kod
konec1 = millis();

dlitelnost1 = kenec1 - nachalo1;
Для второго аналогично.
 

Mirdo

New member
Пытался как поставить всё никак не получается.
Вот мой код, если возможно будет можете помочь. Мне нужно считать задержку отправки сообщения.

C++:
#include <ESP8266WiFi.h>
#include <espnow.h>
 
// ЗАМЕНИТЕ МАС-АДРЕСОМ ПОЛУЧАТЕЛЯ
uint8_t broadcastAddress[] = {0xBC, 0xFF, 0x4D, 0x31, 0x9A, 0x3D};

int amd = 2009;

typedef struct struct_message {
    int c;
} struct_message;

struct_message myData;
 
#define BOARD_ID 1
 
// Callback-функция при отправке сообщения
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("\r\nСтатус пакета: ");
  if (sendStatus == 0){
    Serial.println("Доставлен");
  }
  else{
    Serial.println("Потерялся");
  }
}
void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len) {
  char macStr[18];
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Пакет от: ");
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(macStr);
    Serial.print("Сколько весит: ");
  Serial.println(len);
  Serial.print("Сикрет число: ");
  Serial.println(myData.c);
}


void setup() {
  // Запускаем монитор порта
  Serial.begin(115200);
  // Выставляем режим работы Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  // Инициализируем ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  // Указываем роль платы в ESP-NOW
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  // После запуска протокола получаем обратную связь о состоянии отправки
  esp_now_register_send_cb(OnDataSent);
  // Регистрируем пиры
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_COMBO, 1, NULL, 0);
  esp_now_register_recv_cb(OnDataRecv);
}

long lastTime;
long timerDelay = 2000;
void loop() {
  if (millis() - lastTime > timerDelay) {
    
    esp_now_send(broadcastAddress, (uint8_t *) &amd, sizeof(amd));
    lastTime = millis();
 
  }
}
 

Mirdo

New member
В void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) добавьте Serial.println(lastTime-millis()).
Это покажет время между отправкой и приемом подтверждения.

Пригодится - https://pnu.edu.ru/media/vestnik/articles-2021/021-028_Зинкевич_А._В..pdf
Работает почему то через раз.
Вот монитор порта:
19:01:43.712 -> Статус пакета: Доставлен
19:01:43.712 -> 0
19:01:43.712 -> Пакет от: bc:ff:4d:31:9a:3d
19:01:43.759 -> Сколько весит: 4
19:01:43.759 -> Сикрет число: 2009
19:01:48.727 ->
19:01:48.727 -> Статус пакета: Доставлен
19:01:48.727 -> 4294967295
19:01:48.727 -> Пакет от: bc:ff:4d:31:9a:3d
19:01:48.727 -> Сколько весит: 4
19:01:48.727 -> Сикрет число: 2009
19:01:53.741 ->
19:01:53.741 -> Статус пакета: Доставлен
19:01:53.741 -> 0
19:01:53.741 -> Пакет от: bc:ff:4d:31:9a:3d
19:01:53.741 -> Сколько весит: 4
19:01:53.741 -> Сикрет число: 2009
 

aZholtikov

Active member
Начнем с того, что я немного ошибся... ;-)
Вместо Serial.println(lastTime-millis()) надо Serial.println(millis()-lastTime).
 

aZholtikov

Active member
А почему так можете догадаться?
millis() не зря так называется... И long тоже... Они отображают миллисекунды.
ESP-NOW оперирует микросекундами...

Ссылку внимательно читали?
 
Хотел проверить ваш скетч, но не нашел espnow.h которая бы позволила компилировать простейший пример. С найденной мною espnow.h ошибки компиляции.
Первая из множества ошибок:
"In file included from K:\Arduino\Scathes\ExampleESPNOW\ExampleESPNOW.ino:3:
K:\Arduino\Scathes\ExampleESPNOW\espnow.h:41:35: error: typedef 'esp_now_recv_cb_t' is initialized (use decltype instead)
typedef void (*esp_now_recv_cb_t)(u8 *mac_addr, u8 *data, u8 len);"
Пришлите ссылку на библиотеку
 
Сверху Снизу