Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ESP8266][Arduino, LUA] UDP i deep.sleep

korteksik 29 Aug 2016 12:53 3132 15
Optex
  • #1
    korteksik
    Level 10  
    Witam,
    Używam ESP12E i Arduino v.1.6.8

    Może ktoś z kolegów umie znaleźć wytłumaczenie mojego problemu. Otóż, gdy w programie uaktywniam przejście do trybu głębokiego uśpienia, to po wybudzeniu nic nie dostaję po UDP. Gdy jednak zaremuję usypianie, to program śmiga jak ta lala. Wszystkie dane po UDP dochodzą.
    Dodam, że po wybudzeniu z deep.sleep dane po uarcie przychodzą prawidłowo.
    Nie mam pojęcia co jest nie tak. Przeszukałem chyba już wszystkie linki co wujek google wypluł i nic. Dalej nie wiem jak to ugryźć...

    Oto kod:
    Code: c
    Log in, to see the code


    Może ktoś spotkał się z podobnym problemem...

    ps. Program testowałem na dwóch różnych ESP12E oraz modułach WROOM-02 - zachowanie identyczne.

    Pozdrawiam
    Korteksik
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Optex
  • Optex
  • #6
    piotr411
    Level 22  
    korteksik wrote:
    Dzięki za odpowiedź piotr411,
    rozumiem, że sugerujesz LUA?


    Nie sugerowałem LUA, a jedynie odstąpienie od środowiska do testownia predefiniowanych modułów. Dla ESP jest dostępne C,Basic,Phyton, LUA. Arduino jest ultra wysoko poziomowym środowiskiem dla ultra początkujących. Taka jest filozofia panów z Italii.

    Ponieważ Arduino jest dla bardzo początkujących,a Twoje pytanie dotyczy już średnio zaawansowanych, dlatego nie dostałeś odpowiedzi. Początkujący nie pomogą Tobie, a Ci co coś wiedzą nie interesują sie Arduino ;-)
  • #7
    korteksik
    Level 10  
    No więc po wstępnym zapoznaniu się z LUA spłodziłem program testujący UDP:
    Code: c
    Log in, to see the code


    I program działa jak powinien - po każdorazowym uruchomieniu łączy się z siecią WiFi i wysyła jedną paczkę po UDP. Na 100 prób - 100 udanych.
    Gdy odremuję instrukcję node.dsleep to ESP prawidłowo się usypia i po 3s się resetuje - ale nic nie dostaję po UDP...
    Ale zauważyłem jedną ciekawą rzecz - przy aktywnej instrukcji usypiania - nawet po resecie sprzętowym nic nie dochodzi po UDP - a przecież powinno, bo wejście w tryb uśpienia następuje po wykonaniu wcześniejszych instrukcji... Czyli powinienem przynajmniej dostać jeden pakiet po UDP zanim ESP pójdzie spać w kolejnej instrukcji...
    Działa dokładnie tak jak przy Arduino...
    Nic z tego nie rozumiem, może teraz są jakieś pomysły???

    ps. ESP ma taki wsad:
    NodeMCU 0.9.5 build 20150318 powered by Lua 5.1.4

    ps.
    Po ponad godzinnej pracy z uśpieniem dotarł 1 (jeden) pakiet. Ale nadal nie wiem co o tym sądzić...
    Przez 2 godziny pracy z usypianiem dotarł tylko ten 1 pakiet.
  • #8
    korteksik
    Level 10  
    Ponieważ nadal nie znalazłem rozwiązania swojego problemu, a i chętnych do pomocy nie ma za wielu - mam pytanie - czy ktokolwiek testował wysyłanie danych po UDP z wykorzystaniem trybu głębokiego uśpienia ESP?
    Teoretycznie mogę obejść swój problem dodając zewnętrzny układ sterujący zasilaniem ESP, ale nie o to chodzi...
  • #9
    User removed account
    User removed account  
  • #10
    piotr411
    Level 22  
    Problem nie dotyczy bezpośrednio usypiania i wysyłki po uśpieniu. ESP wysyła swoje czasem puste pakiety.
    Mam pewne zastępcze rozwiązanie napisane na Androidzie do pobierania danych z pamięci Flash ESP. Występuje podobny problem. Losowo ESP wysyła paczki i to potrafi trochę namieszać.
    Mogę Tobie dać przykład jaki wykorzystuję w pewnych urządzeniach, gdzie Android wymiana dane z ESP
    Code: vbnet
    Log in, to see the code
  • #11
    User removed account
    User removed account  
  • #12
    piotr411
    Level 22  
    Piotrus_999 wrote:
    piotr411 wrote:
    Losowo ESP wysyła paczki i to potrafi trochę namieszać.


    Ten przykłd jest niewiarygodnie prymitywnie napisany - i do tego podejrzewam, że jest w dużej części "zwinięty" z internetu - widać to po mikście języków : raz mamy "dane pobrane" a raz "wait....."

    A kolegi autora problem to zbyt wczesne usypianie.


    "Wait" jest chwilowo wyświetlany 300ms, to czas na ponowienie transmisji i sprawdzenie czy pakiet nie przyszedł pusty.

    <ciach>

    Moderated By dondu:

    Zbędne wyciąłem.

  • Helpful post
    #13
    User removed account
    User removed account  
  • #14
    korteksik
    Level 10  
    Piotrus_999 wrote:


    @korteksik W każdym praktycznie procesorze musisz sprawdzić czy wykonały się operacje, które zleciłeś zanim przejdziesz w trym takiego uśpienia. Jezeli "ubijesz" proceosr i peryferia w trakcie to oczywiście transmisje się nie powiodą.


    Dziękuję za podpowiedzi! Okazało się, że dodanie sporych opóźnień rozwiązało problem. Teraz wysyłanie po UDP po wybudzeniu działa prawie w 100% - prawie, bo po 4 godzinach testów nie doszły chyba ze 2 pakiety ( a były wysyłane co 5s) - więc nieźle.
    Na wszelki wypadek dodałem wysyłanie powtórne pakietu.
    W LUA dodałem opóźnienie na timerze:
    Code: c
    Log in, to see the code


    Przetestowałem również program w Arduino, po dodaniu opóźnień - tez działa :)
    Metodą prób i testów najpewniej działa opóźnienie delay(1000); przed instrukcją uśpienia.

    Nie wiem, czy tak powinno się robić - ale działa.

    Dziękuję wszystkim za pomoc, a w szczególności dlaPiotrus_999

    Korteksik
  • #15
    User removed account
    User removed account