Skocz do zawartości

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
(edytowany)
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

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"

(edytowany)

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_
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 😉

 

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

 

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?

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

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?

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

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