Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino IDE esp8266 zawiesza się losowo

rafik73 22 Cze 2016 09:43 2037 16
  • #1 22 Cze 2016 09:43
    rafik73
    Poziom 13  

    Witam
    Poniższy programik obsługuje esp8266 z podpiętym wyświetlaczem LCD 2x16. Esp łączy się z serwerem czasu w sieci lokalnej i co 3 sekundy sprawdza status serwera. Serwer generuje czas timera oraz bieżący czas (godziny,minuty i sekundy). Jeśli na serwerze jest uruchomiony timer to esp odczytuje raz wartości minut i sekund a następnie uruchamia swój wewnętrzny timer w oparciu o dane z serwera. Gdy timer na serwerze jest zatrzymany esp pobiera dane zegara z serwera i wyświetla aktualny czas.
    Użyty sprzęt:
    - ESP8266-01
    - Wyświetlacz LCD 2x16 HD44780 - blue - alfanumeryczny LCD QC1602A
    - Konwerter I2C do wyświetlacza LCD HD44780
    - Moduł zasilania AMS1117 - 3,3V 800mA
    - płytka stykowa oraz przewody 15 cm.
    - zasilacz 5V 2A Huawei HW-050200E2W

    Zasilanie z jednego zasilacza, LCD bezpośrednio, esp poprzez moduł AMS1117.
    Nie dopinałem żadnych kondensatorów.

    Tyle wstępu.
    PROBLEM:
    Co jakiś losowy czas układ się zawiesza, czas na wyświetlaczu staje i pomaga tylko reset.
    Co może być przyczyną?

    Poniżej wklejam kod programu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 16
  • #3 22 Cze 2016 10:06
    rafik73
    Poziom 13  

    Jakaś solucja?

    Dodano po 2 [minuty]:

    Cytat z kompilatora:

    Szkic używa 236 370 bajtów z (54%) pamięci programu. Maksimum to 434 160 bajtów.
    Globalne zmienne używają 32 645 bajtów z (39%) dynamicznej pamięci, pozostawiając 49 275 bajtów dla lokalnych zmiennch. Maksimum to 81 920 bajtów

    0
  • #5 22 Cze 2016 10:13
    rafik73
    Poziom 13  

    piotr411 napisał:
    2. Zmienić środowisko programistyczne.

    Próbowałem w LUA, ale tam problemy z pamięcią jeszcze większe.

    0
  • #6 22 Cze 2016 10:25
    piotr411
    Poziom 22  

    LUA, Basic, Arduino, jest ten sam problem. Można i w Arduino poprawnie uruchomić aplikację, ale jak pisałem wymaga to ekwilibrystyki na drobnych plikach, i zapisywanie ich do jednego z którego pobierasz. Należy unikać tablic, zmiennych znakowych i wszystkiego co zjada RAM. Albo zabrać się za RTOS, choć z tego co widze też nie jest tam różowo. Osobiście ze wszystkich IDE pamięciożernych wybieram Basic, ale ten ma spore wady właśnie z alokacją zmiennych w pamięci no i jeszcze ciągle szczupłe referencje, choć w wersji 3.0 jest po japońsku czyli jako tako. A na dziś robię wszytko w LUA i jak na razie, problemy z zarządzeniem pamięcią udaje mi się obchodzić bez konfliktowo. Właśnie przez rozdrobnienie programu na drobne plik ze zmiennymi lokalnymi i do maksimum ograniczeniem zmiennych globalnych. Nie używam modułów dodatkowych, wszytko od początku na własne potrzeby tworzę i jakoś to idzie:) A LUA jest na tyle prosta,że w dwa wieczory dało się przyswoić przekaz autora LUA i dość swobodnie kodować w tym języku.

    0
  • #7 22 Cze 2016 12:12
    rafik73
    Poziom 13  

    Zastanawiam się,czy JSON nie pożera za dużo RAMu. Zmienne globalne postaram się poprzerzucać na lokalne. Może spróbować client.flush() po responsie?

    Dodano po 8 [minuty]:

    Nie wykluczam problemu z zasilaniem. Proszę o opinię mojego układu zasilania.

    0
  • #8 22 Cze 2016 12:22
    piotr411
    Poziom 22  

    Któraś z funkcji zatrzymuje ci stok na 11ms, jak w tym czasie następuje zapytanie masz "zawiechę". Przypuszczam, że to jakiś błąd kompilatora Arduino. Wieczorem spróbuję to przepisać do LUA i pównam ten moment zwiechy. Między czasie powtarzaj krótkie przerwy między wywolaniami.

    0
  • #9 22 Cze 2016 19:03
    rafik73
    Poziom 13  

    Musiałem skrócić delay'e o 75ms, bo wychodziły mi rozjazdy i sekunda "trwała dłużej". Skąd wniosek, że 11ms?

    Dodano po 1 [minuty]:

    piotr411 napisał:
    Między czasie powtarzaj krótkie przerwy między wywolaniami.

    Czyli?

    Dodano po 1 [godziny] 32 [minuty]:

    Bufor JSON ustawiony wg zaleceń "producenta za pomocą wyników funkcji jsonBuffer.size()
    na stronie:
    https://github.com/bblanchon/ArduinoJson/wiki/FAQ#why-does-my-device-crash-or-reboot

    Odpaliłem i czekam, ale nie nie wiem, czy to problem z pamięcią...dam znać

    Dodano po 19 [minuty]:

    No i wisi.... :(

    Dodano po 11 [minuty]:

    Po jakimś czasie ruszyło samo....co jest grane?

    Dodano po 3 [godziny] 38 [minuty]:

    Po obserwacji... Zawiesza się co jakieś 10-15 minut, stoi przez około 10 minut po czym rusza, i tak cyklicznie.

    0
  • #10 23 Cze 2016 11:34
    rafik73
    Poziom 13  

    Kolejna próba...Działam na linuksie (Fedora 23). Do tej pory kompilowałem na Arduino 1.6.4, bo takie było do zainstalowania w Fedorze. Teraz zmieniłem na najnowszą wersję 1.6.9. Kompilacja...wgrałem na esp...uruchomiłem....i czekam.....

    Dodano po 2 [godziny] 8 [minuty]:

    Bez zmian,zawisło.... :(

    0
  • Pomocny post
    #11 23 Cze 2016 19:04
    JacekCz
    Poziom 36  

    piotr411 napisał:
    ... Przypuszczam, że to jakiś błąd kompilatora Arduino. ...


    Kuszące stwierdzenie. Ja po wielu latach przestałem widzieć "błędy kompilatora" a zacząłem widzieć swoje. W praktyce C/C++ są liczne undefined behavior (UB), czyli kod jest zły, ale wystąpienie błędu może się długo ukrywać, nie zawsze palnie w łeb.

    A serio, twoja rada jest szkodliwa.

    1. temat jest "Zawieszenie się losowo" a wątek co do zużycia pamięci, nie umiem się w tym rozczytać.

    2. tablice bajtów mają dać się napisać tak, aby mieściły się we flashu a nie RAM.

    3. nie szukaj zjadania RAM w bibliotece, jeśli sam jej zużywasz lekką ręką KB na niekontrolowane bufory, zaprojektowane CtrlC CtrlV

    4. Mimo dyskusji w poprzednim wątku, nadal używasz potencjalnie zawieszającej pętli. W telekomunikacji ja byłem zdania, że czasem się zdarzy niewłaściwa transmisja, Ty że zawsze będzie dobrze.

    5. Mimo wskazania które zastosowanie bilioteki json było najbardziej ortodoksyjne (pierwsze CtrC CtrlV w poprzednim wątku - nie należało się zniechęcać na oślep wklejając inne, tylko naprawić wskazane błędy) , kopiujesz dziwne fragmenty z prawa i lewa (z dobrych i złych wzorów), łącząc wady wszystkich bez wykorzystania ich zalet.

    5 Nadal uważasz że nie masz czasu zrobić to porządnie? Z poprzedniego.

    0
  • #12 23 Cze 2016 20:53
    rafik73
    Poziom 13  

    JacekCz napisał:
    3. nie szukaj zjadania RAM w bibliotece, jeśli sam jej zużywasz lekką ręką KB na niekontrolowane bufory, zaprojektowane CtrlC CtrlV

    Bufory są wyliczone indywidualnie do zapytań:
    rafik73 napisał:
    Bufor JSON ustawiony wg zaleceń "producenta za pomocą wyników funkcji jsonBuffer.size()
    na stronie:
    https://github.com/bblanchon/ArduinoJson/wiki/FAQ#why-does-my-device-crash-or-reboot

    Kod po edycji:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Co do :
    JacekCz napisał:
    4. Mimo dyskusji w poprzednim wątku, nadal używasz potencjalnie zawieszającej pętli. W telekomunikacji ja byłem zdania, że czasem się zdarzy niewłaściwa transmisja, Ty że zawsze będzie dobrze.

    masz na myśli ten fragment?:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 14 [minuty]:

    JacekCz napisał:
    5 Nadal uważasz że nie masz czasu zrobić to porządnie? Z poprzedniego.

    Coś ci w iteracji nie poszło, powinno być 6 a nie 5 ;)
    Nie twierdzę, że mam wiedzę (staram się ją nabywać) - a z braku czasu i lenistwa idę na łatwiznę. Nieprawda, że wszystko to projektowane na zasadzie ctrlC ctrlV (chociażby funkcje timer, clock, pisane i wymyślane od zera).
    Zmieniłem fragment:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    na

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Warunek if jest bezpieczniejszy (przynajmniej wg mojej ograniczonej wiedzy)

    0
  • Pomocny post
    #13 23 Cze 2016 23:27
    piterek-23
    Poziom 32  

    rafik73 napisał:
    esp poprzez moduł AMS1117.
    Nie dopinałem żadnych kondensatorów.
    rafik73 napisał:
    Nie wykluczam problemu z zasilaniem. Proszę o opinię mojego układu zasilania.

    Ja robię tak:
    Arduino IDE esp8266 zawiesza się losowo
    plus kondensaror 100nF przy samej nodze VCC ESP

    0
  • #15 25 Cze 2016 14:01
    rafik73
    Poziom 13  

    Zamierzam zasilić 3 takie zestawy z jednego zasilacza 5V. Czy trzeba stosować separację napięcia?

    Dodano po 3 [minuty]:

    rafik73 napisał:
    Zmieniłem fragment:

    Kod: c [rozwiń] [zaznacz wszystko]
    unsigned int i = 0; //timeout counter
    int n = 1; // char counter
    char json[350] ="{";
    while (!client.find("{")){
    i++;
    if(i>600) {
    break;
    lcd.setCursor(0,0);
    lcd.print("brak danych...");
    return;
    }
    }
    while(client.available())
    {
    char c = client.read();
    json[n]=c;
    if(c == '}') break;
    n++;
    }


    na


    Kod: c [rozwiń] [zaznacz wszystko]

    int n = 1; // char counter
    char json[350] ="{";

    if (client.find("{")){
    while(client.available())
    {
    char c = client.read();
    json[n]=c;
    if(c == '}') break;
    n++;
    }
    }


    Warunek if jest bezpieczniejszy (przynajmniej wg mojej ograniczonej wiedzy)


    po tej poprawce nie zawiesza się, chodzi non stop bez problemu. potestuję jeszcze pare dni i jeśli ok to temat do zamknięcia.

    0
  • #16 25 Cze 2016 14:54
    JacekCz
    Poziom 36  

    przeskakiwania z kwiatka na kwiatek (zasilanie /oprogramowanie) nie wróży znalezienia problemu

    Zawieszenie po którym jest zmartwychwstanie po minutach mocno wskazuje na wady oprogramowania, chyba że masz dowody że odwieszenie jest po resecie. Musisz zebrać dowody.

    EDIT:
    zamieszczone fragmenty nadal dalekie są od ideału, zwiecha w innych okolicznościach zawsze kiedyś nastąpi.
    A że autor testami zawsze sam sobie udowodni, że jest OK, to .... widziałem tysiące pozytywnych testów na błędnym oprogramowaniu.

    1
  • #17 25 Cze 2016 16:16
    rafik73
    Poziom 13  

    JacekCz napisał:
    zamieszczone fragmenty nadal dalekie są od ideału, zwiecha w innych okolicznościach zawsze kiedyś nastąpi.
    A że autor testami zawsze sam sobie udowodni, że jest OK, to ....
    tak jak moja wiedza i doświadczenie, zawiesi się to będę szukał dalej. od tego programu nie zależy czyjeś życie. ;)
    JacekCz napisał:
    widziałem tysiące pozytywnych testów na błędnym oprogramowaniu.

    ja też, np.: MS Windows :)
    Proponuję skupić się na bardziej merytorycznej dyskusji a nie tylko na gradzie krytyki. dziękuję z góry. :)

    0