Skocz do zawartości

Bezprzewodowy dzwonek (esp-now)


Pomocna odpowiedź

(edytowany)
16 minut temu, ethanak napisał:

@farmaceuta co chcesz zrobić bo chyba coś nie tak...

Nie no w sumie już nic...🤭 Chciałem ustawiać flagi od dzwonków w przerwaniu po przebudzeniu, ale dotarło do mnie że przy ESP nie jest tak jak na avr'ach i po przebudzeniu z deep sleep ESP startuje od początku więc nic ustawiać nie muszę...😉 

Ps... A jak jest z tymi stanami? Są tylko high/low? Nie jest tak jak na avr, czyli przy przerwaniu na high bedziemy wchodzić w to  przerwanie do czasu aż stan się zmieni na low?

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

19 minut temu, farmaceuta napisał:

Nie jest tak jak na avr, czyli przy przerwaniu na high bedziemy wchodzić w to  przerwanie do czasu aż stan się zmieni na low

Nie, bo to nie jest przerwanie,.

Przykład z mojego blueshota:

 

void idz_spac()
{
	esp_sleep_enable_ext0_wakeup(GPIO_NUM_32,0);
    esp_deep_sleep_start();
}

    

W ten sposób wchodzi w deep sleep i czeka aż pin 32 będzie niski (uwaga, nie wszystkie piny to potrafią, musi być pin RTC i w setup() ustawiony jako INPUT_PULLUP).

Możesz odróżnić czy wystartowało od resetu czy od ext, na przykład tak:

uint8_t RTC_NOINIT_ATTR coto;

void setup()
{
    pinMode(PIN_OD_DZWONKA,INPUT_PULLUP); 
    if (!coto) {
      coto = 1;
      idz_spac();
    }
    // tu inicjalizacja wszystkiego co trzeba do dzwonienia
}

void loop() {
  // będzie wywołany tylko wtedy, jeśli wybudził go dzwonek
  // no i teraz ma dzwonić aż do skutku;
  // a jak zadzwoni...
  	idz_spac();
}

 

Edytowano przez ethanak
  • Pomogłeś! 1
Link do komentarza
Share on other sites

A jak to jest z tymi adresami MAC? Muszę "parować" TX z RX za pomocą tych adresów? Wiem że jeśli chce wysłać wiadomość do wszystkich RX to przy "esp_now_send" jako pierwszy parametr podaje "0"

Link do komentarza
Share on other sites

Zero zwykle jest uznawane jako broadcast. Może się to przydać aby poznać adresy espkow w sieci. Mogę się mylić bo nie mam api przed oczami 

@farmaceuta https://randomnerdtutorials.com/esp-now-auto-pairing-esp32-esp8266/

EDIT 2: widzę z przykładu że broadcast to 0xff... 

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ręczne przypisywanie maków jest dobre na próby biurkowe. Domyślnie i tak musisz to zautomatyzować bo chyba nie będziesz za każdym razem programował nowego modułu bo ma inny mac

Edytowano przez _LM_
Link do komentarza
Share on other sites

8 minut temu, farmaceuta napisał:

wersja one-to-many czyli to co mnie interesuje

Dlaczego? Masz w domu sto odbiorników dzwonka?

4 minuty temu, _LM_ napisał:

Domyślnie i tak musisz to zautomatyzować bo chyba nie będziesz za każdym razem programował nowego modułu

Nie chce mi się przepisywać, ale w wątku o modelarstwie kolejowym są pliki wifi.cpp i tam jest to przykładowo zrobione 😉

 

Link do komentarza
Share on other sites

(edytowany)
19 minut temu, _LM_ napisał:

 Domyślnie i tak musisz to zautomatyzować bo chyba nie będziesz za każdym razem programował nowego modułu bo ma inny mac

Bede musial doczytac bo nawet nie wiedziałem że tak się da...😉 

 

14 minut temu, ethanak napisał:

Dlaczego? Masz w domu sto odbiorników dzwonka?

😉

Będą dwa RX i jeden TX 

Przy okazji...co polecacie do porównania dwóch tablic bajtów? Jest coś lepszego niż memcmp()?

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

8 minut temu, farmaceuta napisał:

Będą dwa RX i jeden TX 

 

To niech dzwonek śle do obu a nie do wszystkich. Będziesz wiedział kiedy przestać powtarzać (bo chyba nie polegasz na pojedynczym pakiecie?) i akumulator się oszczędzi bo można wysyłać tylko do tych co nie potwierdzili i pójść spać jak wszystkie potwierdzą. Lepsze to niż przecinanie ścieżek.

10 minut temu, farmaceuta napisał:

Jest coś lepszego niż memcmp()

Wątpię.

 

Link do komentarza
Share on other sites

10 minut temu, farmaceuta napisał:

Przy okazji...co polecacie do porównania dwóch tablic bajtów? Jest coś lepszego niż memcmp()?

Yyy lepszego niż funkcja wbudowana? Zakręciłeś się coś 😄 Są jeszcze różne warianty tej funkcji ale chyba o tym wiesz. Chyba że chcesz porównać stringi?

Link do komentarza
Share on other sites

37 minut temu, ethanak napisał:

Będziesz wiedział kiedy przestać powtarzać (bo chyba nie polegasz na pojedynczym pakiecie?) i akumulator się oszczędzi bo można wysyłać tylko do tych co nie potwierdzili i pójść spać jak wszystkie potwierdzą.

 

Ja to wymyśliłem tak... TX wysyła do wszystkich strukturę (dwie flagi), dostaje potwierdzenie i sprawdza z którego adresu dostał to potwierdzenie i kasuje flagę, jeśli obie flagi zostaną skasowane przestaje nadawać...jeśli nie to nadaje przez powiedzmy 60s (na początek będę wysyłał co 100ms)...przed uśpieniem jeszcze sprawdzam stan baterii i daje sygnał jeśli napięcie spadło za nisko lub jeśli nie to idę spać... 

 

42 minuty temu, _LM_ napisał:

Yyy lepszego niż funkcja wbudowana? Zakręciłeś się coś 😄 Są jeszcze różne warianty tej funkcji ale chyba o tym wiesz. 

Chodziło mi o to czy są jakieś lepsze funkcje wbudowane dla porównywania bajtów, niż ten memcmp() bo on operuje na void

Link do komentarza
Share on other sites

Jeśli wysyła broadcast to nie ma potwierdzenia - chyba że sobie sam to HGW WHY chcesz zaimplementować.

Poza tym napięcie baterii możesz wysyłać pakietem od dzwonka - po co jakieś inne?

Link do komentarza
Share on other sites

memcmp ma typ parametru const void *, co w języku wiadomym oznacza "dowolny wskaźnik". A typ parametru nie ma nic wspólnego z tym, na jakich typach danych operuje wewnętrznie (np. dla wyrównanych adresów w 32-bitowej maszynie może operować na uint32_t)

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)
2 godziny temu, ethanak napisał:

Jeśli wysyła broadcast to nie ma potwierdzenia 

mozesz to rozwinac bo teraz nie wiem czy jak podam parametr 0 przy esp  now send to dostane potwierdzenie z adresem kto otrzymal... 

 

2 godziny temu, ethanak napisał:

Poza tym napięcie baterii możesz wysyłać pakietem od dzwonka - po co jakieś inne?

napiecie bedzie sprawdzane i kazdy tx/rx bedzie wydawal dzwieki jak by napiecie spadlo... 

1 godzinę temu, ethanak napisał:

memcmp ma typ parametru const void *, co w języku wiadomym oznacza "dowolny wskaźnik". A typ parametru nie ma nic wspólnego z tym, na jakich typach danych operuje wewnętrznie

to pierwsze wiem, tego drugiego nie bylem pewny...😅 

mam problem...core 1 panic! 

#include <Milis.h>
#include <BlinkPin.h>
#include <esp_now.h>
#include <WiFi.h>

BlinkPin dzwon(LED_BUILTIN, LOW);
BlinkPin led(LED_BUILTIN, LOW);

Milis send;
Milis dzwonek;
Milis end;

uint8_t broadcastAddress1[] = {0x78, 0x21, 0x84, 0x7E, 0x05, 0xF0}; //ADRES ODBIORNIKA ESP32
uint8_t broadcastAddress2[] = {0xA0, 0xDD, 0x6C, 0x70, 0xB0, 0x5C};  //ADRES ODBIORNIKA LOLIN32 LITE
                             

typedef struct stru {
  bool flaga1 = 1;
  bool flaga2 = 1;
} stru;

stru myData;

esp_now_peer_info_t peerInfo;

void stan_baterii();

void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {

  if (memcmp(mac_addr, broadcastAddress1, 6) == 0) {
    myData.flaga1 = 0;
    Serial.println("Delivery Success 1" );
  }
  if (memcmp(mac_addr, broadcastAddress2, 6) == 0) {
    myData.flaga2 = 0;
    Serial.println("Delivery Success 2");
  }
}


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

  peerInfo.channel = 0;
  peerInfo.encrypt = false;

  memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed 1");
    return;
  }
  memcpy(peerInfo.peer_addr, broadcastAddress2, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed 2");
    return;
  }
}

void loop() {
//******************************************************************
if (Serial.available() > 0) {
  char x = Serial.read();
  if (x == 'h') {
    myData.flaga1 == 1;
    myData.flaga2 == 1;
  }
 }
// *****************************************************************
  if (end.mili(60000)) {
    //stan_baterii();
    //esp_sleep_enable_ext0_wakeup(GPIO_NUM_32, 1); //1 = High, 0 = Low
   // esp_deep_sleep_start();

  } else {
    if (send.mili(100)) {
      if (myData.flaga1 == 1 || myData.flaga2 == 1) {
        esp_now_send(0, (uint8_t *) &myData, sizeof(myData));
      }
    }
  }
}
void stan_baterii() {
  float volt = (analogRead(34) * 3.3) / 4095;
  if (volt <= 2.9) {
    dzwon.blink(5, 50, 50, 500, 20);
    led.blink(5, 50, 50, 500, 20);
    dzwonek.reset();
    while (!dzwonek.mili(30000)) {
      dzwon.update();
      led.update();
    }
  }
}
 

 

 

ELF file SHA256: a6260a5744e82913

Rebooting...
ets Jul 29 2019 12:21:46

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13260
load:0x40080400,len:3028
entry 0x400805e4
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

Core  1 register dump:
PC      : 0x400e0e18  PS      : 0x00060a30  A0      : 0x800d13ed  A1      : 0x3ffb2240  
A2      : 0x400d1384  A3      : 0x3ffc0a8c  A4      : 0x3ffc35e4  A5      : 0x3ffc35e4  
A6      : 0x00000001  A7      : 0x0001c200  A8      : 0x00000000  A9      : 0x3ffb21e0  
A10     : 0x00000001  A11     : 0x00000000  A12     : 0x00000000  A13     : 0x00000000  
A14     : 0x3ffb7c80  A15     : 0x00000000  SAR     : 0x0000001d  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x0000004c  LBEG    : 0x40086110  LEND    : 0x4008611b  LCOUNT  : 0xffffffff  

 

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

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...