Skocz do zawartości

Pomocna odpowiedź

Upierasz się żeby to robic w ten sposób... no to nie pomogę.

Przede wszystkim w onDataSend warto sprawdzić status, bo to on informuje czy było potwierdzenie odbioru (a jeśli to broadcast to i tak nie dostaniesz).

Dlaczego nie możesz po prostu tak jak mają wszyscy wysłać tego po kolei do wszystkich? Sprawdź sobie na randomnerdach, tam masz praktycznie gotowca.

A z tą baterią... ech...

Zaraz mnie coś trafi...jak rozumiem ESP now tx otrzymuje informację o DOSTARCZONEJ wiadomości od RX tak?? Jeśli tak to co jest tym potwierdzeniem w końcu?? Bo wychodzi mi na to że ondatasend jest wywoływana za każdym razem gdy wiadomość jest tylko wysłana...😭

Ondatasend pokazuje czy rx potwierdził odbiór właśnie w argumencie status. Zajrzyj może jednak do randomnerdsów, to nie wstyd, ja też tam zaglądam 🙂 Tam jest taku fajny przykład...

  • Lubię! 1
2 godziny temu, ethanak napisał:

 Zajrzyj może jednak do randomnerdsów, to nie wstyd, ja też tam zaglądam 🙂 Tam jest taku fajny przykład...

Właśnie z stamtąd zazwyczaj biorę przykłady 😉 już się połapałem z tym wszystkim...nie zainicjowałem poprawnie ESP now/ miałem nawias nie w tym miejscu i do tego jeszcze na trzy godziny pomyliły mi się adresy i się dziwiłem czemu RX nie odbiera...ech🤭

Gość
4 godziny temu, ethanak napisał:

Zajrzyj może jednak do randomnerdsów, to nie wstyd, ja też tam zaglądam

Czyli wychodzi na to, że korzystanie z gotowych przykładów mówi o tym, iż człowiek uczy się C całe życie. A ja myślałem, że ta zasada obowiązuje tylko w elektronice etc. gdzie często można podpatrzeć jakieś rozwiązanie. Nie mówię o całym schemacie, a wybranym jego fragmencie który jest bieżąco potrzebny w innym projekcie. Okazuje się, że w C jest podobnie. Szczerze mówiąc to myślałem, że jak poznam nuty, to w C będę grał jak Chopin na fortepianie. XD 

Gość
53 minuty temu, ethanak napisał:

Tak samo jest z językami programowania...

Tyle że "ponoć" angielski Hamlet jest prostszy od polskiego Tadeusza... To mnie nie pocieszyłeś. XD 

Nie chcę tu nikogo oceniać, ale kolega @farmaceuta jest jeszcze młody, jednak patrząc na jego progress, to nie wiem czy dobrze robię, że się porywam w zabawę w C. Może jednak powinienem pozostać przy samej elektroenergetyce i elektronice zważywszy na mój wiek ? Ja na chwile obecną mam problemy, bo gdzieś tam zapomniałem klamerkę, albo przecinek (czego nie ułatwiają długie kompilacje kodu). Ale jeżeli po 4 latach nauki będę zmuszony zakładać temat z powodu jakiś błędów na poziomie podstawowym, to jakoś zbytnio tematu programowania nie widzę nawet w aspekcie hobbystycznym... XD

@rafal220 nie wiem ile masz lat, zdaje się że uznałeś to za tajną informację - ale ja do najmłodszych też nie należę, a często nowych rzeczy się uczę. Tyle że nie tracę czasu na poprawianie świata i narzekanie że to powinno być inaczej...

Wróćmy do tematu.

 

Takie coś mi się napisało:

// tu pewnie jakieś mądre includy

uint8_t mac1[6];
uint8_t mac2[5];

uint8_t RTC_NOINIT_ATTR coto;
uint8_t sData[2];
int repeats;
uint8_t sendStatus;

// zwraca np. 0..255 dla zakresu napięć 2.5..4.5V
uint8_t getBatteryLevel()
{
    // jakiś fajnisty kod
    return cośtam;
}

void onDataSent(const uint8_t *mac, esp_now_send_status_t status)
{
    if (status == ESP_NOW_SEND_SUCCESS) {
        if (!memcmp(mac,mac1)) sendStatus |= 1;
        if (!memcmp(mac,mac2)) sendStatus |= 2;
    }
}


#define DOORBELL_PIN GPIO_NUM_32

void idz_spac()
{
    // wstanie mniej więcej po 24 godzinach
    esp_sleep_enable_timer_wakeup(1000000ULL * 86400ULL);
    // albo po wciśnięciu dzwonka
    esp_sleep_enable_ext0_wakeup(DOORBELL_PIN,0);
    esp_deep_sleep_start();
}

void setup()
{
    // można użyć rtc_reset_reason ale jest trochę niewygodna
    // a tu chodzi tylko o odróżnienie czy dostał powera
    // czy się obudził
    if (!coto) {
        coto = 1;
        idz_spac();
    }
    // tu inicjalizacja maców i esp_now
    ...
    // no i na koniec:

    // pierwszy bajt: zero jeśli timer, inaczej dzwonek
    sData[0] = esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_EXT0;
    sData[1] = getBatteryLevel();
    sendStatus = 0;
    esp_now_send(mac1,sData,2);
    esp_now_send(mac2,sData,2);
    repeats = 100; // dla 10 sekund
    delay(10);
}

void loop()
{
    if (sendStatus == 3) idz_spac();
    if (!(send Status & 1)) esp_now_send(mac1,sData,2);
    if (!(send Status & 2)) esp_now_send(mac2,sData,2);
    repeats--;
    if (!repeats) idz_spac(); // dłużej nie czekam
    delay(100);
}

@farmaceuta Co powiesz na to?

  • Pomogłeś! 1

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