• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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);"
Пришлите ссылку на библиотеку
 
Сверху Снизу