Skocz do zawartości

Jeden odbiornik ESP32 i kilka nadajników ESP32


Pomocna odpowiedź

Napisano

Witam,

Jestem przed rozpoczęciem mojego pierwszego projektu bazujacego na ESP32.

Generalnie potrzebuje wykonać system składający się z jednego odbiornika i kilku nadajników.

Poczytałem trochę o możliwościah ESP32 i zdecydowałem sie na komunikację ESP NOW.

Projekt generalnie ma wygladać tak:

Nadajnik ( moim przypadku ESp32 C3) reaguje na zwarcie przycisku i wysyła o tym informację do odbiornika. Po tym fakcie powiniem wejść w tryb deep sleep.

Odbiornik odbiera dane i wyśietla informację webowo.

Generalnie do tej pory udało mi się wykonać podstawy powyższej komunikacji ale mam problem z trybem deep sleep.

Nie jestem pewiem czy ESP32 C3 jest najlepszy jako nadajnik który w przyszłości ma dzialać bezprzewodowo na baterii ( czy są tu jakieś problemy z kompatybilnością w stosunku do ESP32 WROOM?)

Z mojego doświadczenia przy próbach Na arduino IDE( jestem poczatkujący) ESP32 C3 gubił port co troche komplikowało postępy.

 

Domyślam się że projekt jest podobny do tych które pobieraja dane z różnych czujników.

Czy moglibyście polecić jakiś stabilny kod który byłby zgodny z moimi założeniami do lekkiej modyfikacji? 

Czy kombinacja ESP32 wroom jako odbiornik ( w tym wypadku mozliwe jest zasilanie siecowe) i wiele esp32 C3 to dobry pomysł?

Z góry dziękuję za sugestie.

 

 

 

@mmllmm powinno działać, ale pamiętaj że esp now nie jest z gumy i odbiornik ma ograniczenia do ilości rozpoznawanych nadajników.

co do c3 nie miałem nigdy problemów z gubieniem portów, ale używam "gołego" arduino-cli na Linuksie.

Zasilanie c3 bateria czy akumulator? Jeśli akumulator to jak ładowany?

I jescze jedno: te ceramiczne antenki na małych płytkach c3 są raczej do połączeń w okolicy metra... gdzieś był sposób na proste przerobienie ale teraz na telefonie nie znajdę.

(edytowany)

Myślałem o adapterze jak w załączniku do zasilamoa akumulatorem ( dajcie znać jeśli jestem w błędzie)

Znalazłem w sieci również esp32 z wbudowanym epaper i obsługa akumulatora ( załącznik 2).

Która z tych opcji byłaby według Was bardzie wydajna i wygodna?

Czy ktoś miał z tym tematem do czynienia?

Jakie języki programowania mógłbym użyć?

adapter.jpg

esp32.jpg

Edytowano przez mmllmm
11 godzin temu, mmllmm napisał:

Nadajników może być do 20

Nie może - przy szyfrowanym max. 10 (ustawiane w idf, 10 jest ustawione w Arduino), nieszyfrowanych o ile pamiętam 16.

16 godzin temu, mmllmm napisał:

Znalazłem w sieci również esp32 z wbudowanym epaper i obsługa akumulatora ( załącznik 2).

Po co epaper w urządzeniu które ma jeden guzik i nic poza tym?

Jak dla mnie istnieją dwie opcje:

Opcja 1: XIAO C3 - jeśli chcesz mieć od razu ładowarkę na pokładzie

Opcja 2: Dowolna mała C3 (jakieś supermini albo coś) - akumulator podłączany bezpośrednio do wejścia 5V (najlepiej do gniazda USB żeby nie dostał nagle 5V przy programowaniu, albo przez jakąś diodkę Schottky). Tu można podłączyć np. 3 baterie AA/AAA zamiast aku.

16 godzin temu, mmllmm napisał:

Czy ktoś miał z tym tematem do czynienia?

Akurat ci co tu się wypowiadają 🙂

16 godzin temu, mmllmm napisał:

Jakie języki programowania mógłbym użyć?

C++ (czyli to czego używasz w Arduino IDE)

Uważam że espnow w tym przypadku to komplikacja choćby z przydzielaniem peerow - trzeba myśleć nad jakimś interfejsem do tego i tak dalej. Plus ograniczenia szyfrowania o czym wspominał kolega wyżej. Ja spróbowałbym rozwiązać to za pomocą bluetooth low energy, jeden serwer który nasłuchuje klientów. 

19 minut temu, _LM_ napisał:

trzeba myśleć nad jakimś interfejsem do tego i tak dalej.

Niekoniecznie. Pamiętaj, że MACa można sobie zmienić - wtedy np. odbiornik może mieć ostatni oktet zero, a nadajniki od 01 w górę, przy czym pierwsze pięć oktetów jest ustalone arbitralnie i identyczne dla wszystkich. Odpada problem jakichś webowych interfejsów, odpada problem kilku urządzeń pracujących niedaleko siebie (każda grupa może mieć np. inny przedostatni oktet). MAC zapisany w preferencjach i ustawiany prostym poleceniem przez serial. Ćwiczyłem takie wynalazki, działają bardzo ładnie... tylko to ograniczenie ilościowe 😞

(edytowany)

Mam namyśli system parowania takich urządzeń, dziś będzie ich 10 jutro trzydzieści pomijając wspominane ograniczenia, kto za kilka lat będzie pamiętał jak dodać kolejny czujnik. To mam na myśli mówiąc o interfejsie

EDIT ok doczytałem że nimBle w esp32 może obsłużyć 9 klientów jednocześnie, ale chyba niema ograniczeń co do ilości sparowanych

Edytowano przez _LM_

Pomijamy ograniczenie ilościowe...

8 minut temu, _LM_ napisał:

Mam namyśli system parowania takich urządzeń

A to proste. Odbiornik dodaje sobie peery XX:XX:XX:XX:XX:01 do XX:XX:XX:XX:XX:cośtam (mogą jeszcze nie istnieć przecież, esp now nie sprawdza), a nadajnik tylko XX:XX:XX:XX:XX:00. A napisanie prostego helpa w serialu to kwestia chęci - obejrzyj sobie np. mój kod: https://github.com/ethanak/ESP32Pogodynka/blob/main/Pogodynka/seria.cpp

Tyle że i tak ograniczenie ilości eliminuje esp now 😞

 

  • Lubię! 1
Dnia 12.08.2025 o 12:15, mmllmm napisał:

Odbiornik odbiera dane i wyśietla informację webowo.

 Z tym też bywały niegdyś problemy, ale ostatni raz używałem espnow z esp8266. Problem był wtedy taki że esp nie mógł obsługiwać jednocześnie wifi sta i espnow. 

Wtedy rozwiązałem to tak że esp przełączał się na wifi wysyłał dane i wracał do trybu espnow 

11 minut temu, _LM_ napisał:

Problem był wtedy taki że esp nie mógł obsługiwać jednocześnie wifi sta i espnow

O ile pamiętam to nie miałem takich problemów, ale dawno tej kombinacji nie używałem. W ESP32 na pewno tego nie ma (jeśli ktoś pamięta wątek o kolejarstwie modelowym to tam właśnie ESP32 gadał z semaforami po esp now i wyświetlał sobie webowy interfejs). Zresztą w Pogodynce jest podobnie - ustrojstwo sobie gada z openmeteo, wystawia webowy interfejs i odbiera dane po esp now z termometru za oknem. Warunkiem jest ten sam kanał.

 

Dziekuje wszystkim za podpowiedzi.

2 godziny temu, ethanak napisał:

Opcja 1: XIAO C3 - jeśli chcesz mieć od razu ładowarkę na pokładzie

mam do testów plytkę:PŁYTKA ROZWOJOWA ESP32-C3 SUPERMINI Z MODUŁEM WIFI BLUETOOTH Z ADAPTEREM ale w docelowym projekcie mogę użyć bardziej odpowiednią jesli taka istnieje.

2 godziny temu, ethanak napisał:

Opcja 2: Dowolna mała C3 (jakieś supermini albo coś) - akumulator podłączany bezpośrednio do wejścia 5V (najlepiej do gniazda USB żeby nie dostał nagle 5V przy programowaniu, albo przez jakąś diodkę Schottky). Tu można podłączyć np. 3 baterie AA/AAA zamiast aku.

Opcja z podłączenie, paluszków do USB jak najbardziej możliwa i wydaje się najprostsza.

Czy jest cos mniejszego od 3xAAA?

Myślałem o akumulatorkach ale one mają 3,7V a potrzebne jest 3,3V

. Nie wiem czy kolejny układ do redukcji napięcia byłby wartościa dodaną.

 

Powalczyłem trochę z wersja prototypową na parze ESP32 WROOM i ESP32 C3.

W C3 jest nieco inny sposób wprowadzania w stan deep sleep co odkryłem po dłuższych testach niestety.

Poniżej podaje kody dla odbiornika i nadajnika.

Generalnie nadajnik (C3) wysyła sygnał do odbiornika (wroom)

Odbiornik wyświetla informacje z nadajnika w webowej wersji pod adresem 192.168.4.1

Oczywiście to wstęp do dalszej pracy.

Kolejne etapy to dołóżenie kolejnych ESP jako nadajniki.

W interfejsie webowym chciałbym mieć podgląd aktywności wszystkich urządzeń.

3 godziny temu, ethanak napisał:

Nie może - przy szyfrowanym max. 10 (ustawiane w idf, 10 jest ustawione w Arduino), nieszyfrowanych o ile pamiętam 16.

Jakie wady ma opcja nieszyfrowana?

Dajcie znać jeśli widzicie w kodzie jakies rażące błędy albo sposób na poprawę.

ODBIORNIK ESP32 WROOM
  #include <WiFi.h>
#include <esp_now.h>
#include <WebServer.h>

// 📦 Struktura danych odbieranych
typedef struct struct_message {
  int value;
} struct_message;

struct_message incomingData;
char lastSender[18];  // MAC nadawcy
int lastValue = -1;   // Ostatnia wartość

WebServer server(80);

// 📥 Callback odbioru danych
void OnReceive(const esp_now_recv_info *recv_info, const uint8_t *data, int len) {
  memcpy(&incomingData, data, sizeof(incomingData));

  snprintf(lastSender, sizeof(lastSender), "%02X:%02X:%02X:%02X:%02X:%02X",
           recv_info->src_addr[0], recv_info->src_addr[1], recv_info->src_addr[2],
           recv_info->src_addr[3], recv_info->src_addr[4], recv_info->src_addr[5]);

  lastValue = incomingData.value;

  Serial.print("📥 Odebrano od: ");
  Serial.print(lastSender);
  Serial.print(" — Wartość: ");
  Serial.println(lastValue);
}

// 🌐 Strona główna z AJAX
void handleRoot() {
  String html = R"rawliteral(
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset='UTF-8'>
      <title>ESP-NOW Monitor</title>
      <style>
        body { font-family: Arial; text-align: center; margin-top: 50px; }
        .data { font-size: 1.5em; margin: 20px; }
      </style>
      <script>
        function fetchData() {
          fetch('/data')
            .then(response => response.json())
            .then(json => {
              document.getElementById('sender').textContent = json.sender;
              document.getElementById('value').textContent = json.value;
            });
        }
        setInterval(fetchData, 1000); // Odświeżaj co sekundę
        window.onload = fetchData;
      </script>
    </head>
    <body>
      <h1>📡 Odbiornik ESP-NOW</h1>
      <div class="data"><strong>Nadawca:</strong> <span id="sender">---</span></div>
      <div class="data"><strong>Wartość:</strong> <span id="value">---</span></div>
    </body>
    </html>
  )rawliteral";

  server.send(200, "text/html", html);
}

// 🔄 Endpoint AJAX
void handleData() {
  String json = "{";
  json += "\"sender\":\"" + String(lastSender) + "\",";
  json += "\"value\":" + String(lastValue);
  json += "}";
  server.send(200, "application/json", json);
}

void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_AP_STA);
  WiFi.softAP("ESP-NOW-Odbiornik", "", 1);  // kanał 1

  Serial.print("🌐 Serwer dostępny pod IP: ");
  Serial.println(WiFi.softAPIP());

  if (esp_now_init() != ESP_OK) {
    Serial.println("❌ Błąd inicjalizacji ESP-NOW");
    return;
  }

  esp_now_register_recv_cb(OnReceive);

  server.on("/", handleRoot);
  server.on("/data", handleData);
  server.begin();

  Serial.println("✅ Odbiornik gotowy");
}

void loop() {
  server.handleClient();
}
NADAJNIK ESP32 C3
  #define WAKEUP_PIN 2
RTC_DATA_ATTR int bootCount = 0;

void setup() {
  pinMode(WAKEUP_PIN, INPUT_PULLUP);  // when the pin does not have external pull-up resistor

  Serial.begin(115200);
  delay(1000);

  print_wakeup_reason();

  Serial.printf("Going to sleep, to be wakeup by GPIO %d\n", WAKEUP_PIN); 
  delay(3000);

  esp_deep_sleep_enable_gpio_wakeup(1 << WAKEUP_PIN, ESP_GPIO_WAKEUP_GPIO_LOW);
  esp_deep_sleep_start();

  Serial.println("This will never be printed");
}

void loop() { }

void print_wakeup_reason() {

  Serial.printf("Boot number: %d\n", ++bootCount);

  esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();

  switch (wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup caused by external signal using RTC_IO");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup caused by external signal using RTC_CNTL");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup caused by timer");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup caused by touchpad");
      break;
    case ESP_SLEEP_WAKEUP_GPIO:    // 05 - this is used by ESP32-C3 as EXT0/EXT1 does not available in C3
      Serial.println("Wakeup by GPIO");
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup caused by ULP program");
      break;
    default:
      Serial.printf("Wakeup was not caused by deep sleep: %d\n", wakeup_reason);
      break;
  }
}

 

Przed chwilą, ethanak napisał:

O ile pamiętam to nie miałem takich problemów

to może o co innego chodziło? Nie wiem, ograniczenia jakieś na pewno były, z resztą co za problem sprawdzić. W każdym razie ja widziałbym to nieco inaczej, rozwiązanie dla kolegi @mmllmm ustawić BLE w trybie obserwer, a czujniki mogą reklamować się ze swoimi treściami -> tryb ble broadcaster z reklamą swoich parametrów.

Na plus: szybki transfer, brak ograniczeń ilości użytych nadajników*, niskie zużycie energii

*pod warunkiem że dane nie będą przesyłane w jednym momencie z wszystkich

Ograniczenia: broadcaster może jednorazowo przesłać 31 bajtów

trudniejsze oprogramowanie

2 minuty temu, mmllmm napisał:

Dajcie znać jeśli widzicie w kodzie jakies rażące błędy albo sposób na poprawę

przecież nie będziemy poprawiać gpt, czy tam innego czata 😄

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...