Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ESP8266][LUA] formatowanie string

piterek-23 04 Cze 2016 08:37 3813 51
  • #31 04 Cze 2016 08:37
    piterek-23
    Poziom 30  

    Znalazłem STRONĘ gdzie można zbudować swój firmware dla ESP.
    Co powinno być w firmware dla mojego celu, aby wyszło takie minimum?
    [ESP8266][LUA] formatowanie string

  • #32 04 Cze 2016 13:14
    piotr411
    Poziom 22  

    Znów używasz tekstu, unikaj tego bo zabijasz pamięć. Nazwy sensorów przypisuj do wartości liczbowych. LUA ESP ma ograniczoną. ilość miejsca na zmienne globalne. Po zatym można każdy sensor zrobić w innych pliku, a dane wpisywać do jednego wspólnego.

    Firmware Casotomowy jest bardzo nieprzewidywalny, do tego dziwaczne się go ładuje i obsługuje. Nie musisz nic zaznaczać bo to są tylko moduły poszerzając możliwości standardowych lub nowych funkcji. Na przykład korzystasz z Uart, wersji z 2015r jaką masz obecnie wygraną. ustawić możesz tylko prędkość i ilość bitów, nie można ustawić parzystosci i bitu stopu. Dopiero zaznaczenie modułu uart da takie możliwości. I tak niemal z każdą funkcją, coś tam jest poprawione.

  • #33 04 Cze 2016 14:14
    piterek-23
    Poziom 30  

    Co tu jeszcze mogę zmienić?
    init.lua

    Kod: lua
    Zaloguj się, aby zobaczyć kod

    Z takim plikiem mam błąd w linii 39 czyli tu:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

  • #35 04 Cze 2016 14:29
    piterek-23
    Poziom 30  

    Czyli wcześniejszej dobrze robiłem :)

    Chyba nic z tego nie będzie...

    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Kod: lua
    Zaloguj się, aby zobaczyć kod

  • #36 04 Cze 2016 14:36
    piotr411
    Poziom 22  

    JakiSensor = "rainfall" Po co to? skoro masz nazwę sensora juz tu: Sensor = (Ip0 .. "1")
    Nie używaj zmiennych string !!!!!!!!, zastępuj je liczbami.

    Nie sprawdzę tego programu w całości bu musiał bym zestawić wszytko co masz podłączone, algorytm wyszukiwania sprawdzony działa.

    Możesz użyć zmiennych lokalnych, i każdy sensor umieścić w innym pliku, każdy kolejny plik będzie się odwoływać do następnego i dopisywać do jednego pliku dane sensorów, zwykłe operacje na plikach i stringach.
    Wtedy do dyspozycji masz nie 20kb, a całe 4MB jakie są w ESP 12E.
    Pisałem wcześniej, program jest nie przemyślany i za dużo produkujesz niepotrzebnych zmiennych, nie kasujesz ich kiedy są niepotrzebne. ESP ma tak dużo pamięci że może nie tylko pokazywać nazwy ale tez mówić i śpiewać. Trzeba tylko racjonalnie gospodarować pamięcią.

    Jeszcze jedna uwaga, LUA wgrywa program do pamięci nie kompilowany.
    Czyli ze wszystkimi nazwami, komentarzami etc.... jeśli masz długą nazwę zmiennej tez zje pamięć do czasu kompilacji. unikaj tego.

    Można zrobić to tak:
    - każdy czujnik oprogramuj w osobnym pliku na zmiennych lokalnych, jedną zmienną pozostaw jako globalną i tą globalną zapisuj do wspólnego pliku.

    na koniec pobierasz dane z plików gdzie dopisywałeś wyniki i obrabiasz sobie.
    Dalego pisałem, że pozbycie sie AVR ułatwi sporo cały projekt.

    No i dlaczego z uporem maniaka do programu wkładasz string, skoro wiesz już że to masakruje pamięć?

    Co podeślę Tobie przykład i powywalam zmienne string, a one jak bumerang wracają.

    Czy znasz typy zmiennych?
    - liczbowe, znakowe
    - lokalne, globalne ?
    bo tu chyba mamy największy problem.

  • #37 04 Cze 2016 14:48
    piterek-23
    Poziom 30  

    Do NetTemp muszę posłać:
    - key
    - IP NetTemp
    - type
    - value
    - IP sensora/modułu
    - device

    1. "key" muszę ustawić taki sam w zdalnym module i w Nettemp
    2. "IP NetTemp" to po prostu IP Raspberry
    3. "type" to jakie dane posyłam np:
    - "temp" to temperatura
    - "humid" to wilgotność
    - "press" to ciśnienie
    4. "value" to odczyt z danego sensora
    5. "ip" to IP lub nazwa modułu z którego posyłam dane
    - z jednego IP mogę posłać kilka różnych odczytów, ale różnego typu
    - z jednego IP nie mogę posłać kilka różnych danych tego samego typu
    6. "device" tu akurat "wireless" bo wszystko leci po WiFi

  • #38 04 Cze 2016 23:31
    piterek-23
    Poziom 30  

    piotr411 napisał:
    JakiSensor = "rainfall" Po co to? skoro masz nazwę sensora juz tu: Sensor = (Ip0 .. "1")
    Nie używaj zmiennych string !!!!!!!!, zastępuj je liczbami.

    Jest jakiś inny sposób na to?
    W poście #37 napisałem o co chodzi z tym "JakiSensor"
    piotr411 napisał:
    Możesz użyć zmiennych lokalnych, i każdy sensor umieścić w innym pliku, każdy kolejny plik będzie się odwoływać do następnego i dopisywać do jednego pliku dane sensorów, zwykłe operacje na plikach i stringach.
    Wtedy do dyspozycji masz nie 20kb, a całe 4MB jakie są w ESP 12E.

    piotr411 napisał:
    na koniec pobierasz dane z plików gdzie dopisywałeś wyniki i obrabiasz sobie.

    Możesz podpowiedzieć co gdzie powinno być?

    init.lua
    - połączenie z WiFi
    - ustawienia UART
    avr.lua
    -ustawienia globalne NeTemp
    -odbiór danych z UART
    sensor1.lua
    -przekazanie danej z tablicy [1] do NetTemp
    (...)
    sensor20.lua
    -przekazanie danej z tablicy [20] do NetTemp

    Czy to coś takiego ma być?
    piotr411 napisał:
    Dalego pisałem, że pozbycie sie AVR ułatwi sporo cały projekt.

    Coraz bardziej mnie to przekonuje, ale z moją wiedzą to raczej nic z tego dobrego nie będzie, chyba za wiele tych sensorów jak na tego malutkiego ESP :(

    Przepraszam, że nadwyrężam Twoją cierpliwość.

  • #40 06 Cze 2016 17:33
    piterek-23
    Poziom 30  

    @uzi18 jak masz czas, chcesz pomóc to pokaż jak to zrobić w C

    Kod: lua
    Zaloguj się, aby zobaczyć kod

  • #41 06 Cze 2016 17:44
    uzi18
    Poziom 22  

    Mogę dopiero późnym wieczorem przy tym usiąść (chociaż u mnie ostatnie wieczory króluje Wiedźmin - Krew i Wino),
    problem z LUA to nie brak Flasha a brak RAM-u w procesorze (jego nie rozszerzysz) i program trzeba pisac bardzo oszczednie, pod Arduino juz jest troszke lepiej.
    Linijka ktora dostaje esp konczy sie znakiem CR czy CR+LF?

  • #42 06 Cze 2016 17:48
    piterek-23
    Poziom 30  

    uzi18 napisał:
    Mogę dopiero późnym wieczorem przy tym usiąść

    Poczekam i tydzień :)
    Sam tego nie zrobię bo nie mam pojęcia jak to zrobić...
    uzi18 napisał:
    Linijka ktora dostaje esp konczy sie znakiem CR czy CR+LF?

    Z AVR mogę wysłać co chcę. Wyślę co Ci trzeba ;)

  • #44 06 Cze 2016 17:58
    piterek-23
    Poziom 30  

    Program na AVR piszę w BASCOM i tam dane wysyłam teraz tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [minuty]:

    uzi18 napisał:
    Coś wiecej na temat Twojej pogodynki możesz napisać?

    @uzi18 znamy się z forum NetTemp, a tam już chyba wszystko opisałem :)
    Ogólnie mówiąc to projekt METEO dopiero powstaje.

  • #46 06 Cze 2016 18:18
    piterek-23
    Poziom 30  

    Może inaczej... w jaki sposób mam wysłać dane? Mi do jest obojętne jak je wyślę :)

  • #47 06 Cze 2016 19:19
    piotr411
    Poziom 22  

    uzi18 napisał:
    Ludzie kochani ile sie trzeba nacudowac na takim mocnym procku w lua aby wogole kod dzialal ... i robil cos wiecej niz 1 pomiar.
    Chyba faktycznie lepiej to przepisac na C i miec swiety spokoj.


    Co masz na myśli? Bo wedle mojej wiedzy i doświadczenia, niemal każda funkcja w LUA ma krótszą składanie, do tego jest ich bardzo dużo, znacznie więcej, niż C, nie wspominając o środowisku do testowania modułów jakim jest Arduino.
    Z ciekawości przepisałem aplikację(w części przypisania globalnych zmiennych i obliczeń) do Arduino i same zmienne globalne zajmują 84% pamieci. Arduino ESP, to porażka. Trzeba być wyjątkowym twardzielem, by pisać aplikacje w tym pseudo języku C.

    Autor temu, nierozumie, znaczenia optymalizacji. Temat dotyczy operacji na stringach i to już jest temat zamknięty. Z czasem okazało się, że trzeba pomóc napisać całą aplikację, a to już inny temat.

    Zasugerowalem przeniesienie fragmentów programu do osobnych plików i korzystanie ze zmiennych lokalnych. 4MB Flasha to bardzo dużo pamięci na setki plików, 20kb RAM też w zupełności wystarcza, Atmega8 ma 10 razy mniej jest 16 raz wolniejsza, a można pisać duże aplikacje.

    Kolejna sprawa to, nagminne po każdym moim usunięciu, dokładnie niepotrzebnych zmiennych tekstowych i to zapisanych jako globalne. Nie zerwanie zmiennych, ani razu w programie nie znalazłem NIL.

    Można pomagać, ale nie pisać całe aplikacje. Owszem jest to możliwe, ale odpłatnie.

    LUA, czy też Arduino, koszmarnie dużo pamięci rezerwuje na zmienne Globalne i tu trzeba szukać oszczędności, a cała aplikacja jest tak napisana, że zanim zacznie działać już wykańcza RAM.

    Jak zobaczę jakieś chęci w pisaniu aplikacji to mogę pomóc, ale pisać za kogoś całych fragmentów czy nawet całej aplikacji nie będę.

  • #48 06 Cze 2016 21:44
    uzi18
    Poziom 22  

    Arduino ESP polega na prekompilacie z którego nie ma możliwości wycięcia nieuzywanych funkcjonalności, dlatego część flasha i ramu z zasady tracimy, tu faktycznie jest zonk.

    Za to w C mniej wiecej wiesz ile pamieci program ma do dyspozycji, tutaj lua potrafi sie nagle wykaszanic i nie bardzo wiadomo czemu, co sie stało i dlaczego?

    Zapisze to co jest w kodzie pod to pseudo C i zobaczmy czy mi tez wyjdzie 84%.

    piterek-23: potwierdz mi tylko czy dane przychodza w formacie jak podałem? char(10) to LF, moze tak zostac.

  • #49 06 Cze 2016 22:31
    piterek-23
    Poziom 30  

    piotr411 napisał:
    Autor temu, nierozumie, znaczenia optymalizacji.

    Autor nie rozumie bo się nie zna i dlatego dopytuje :)
    piotr411 napisał:
    Temat dotyczy operacji na stringach i to już jest temat zamknięty.

    Fakt, pytałem o jedno, a wyszło dużo więcej rzeczy...
    piotr411 napisał:
    Z czasem okazało się, że trzeba pomóc napisać całą aplikację, a to już inny temat.

    Bez sensu było by zakładać nowy temat więc "ciągnę" dalej temat tutaj.
    piotr411 napisał:
    Zasugerowalem przeniesienie fragmentów programu do osobnych plików i korzystanie ze zmiennych lokalnych. 4MB Flasha to bardzo dużo pamięci na setki plików, 20kb RAM też w zupełności wystarcza,

    Dlatego dopytywałem co gdzie przenieść bo po prostu nie wiem o co chodzi.
    piotr411 napisał:
    Atmega8 ma 10 razy mniej jest 16 raz wolniejsza, a można pisać duże aplikacje.

    ATmega jest mniejsza, wolniejsza, piszę w dziadowskim języku-BASCOM, a dużo więcej rzeczy potrafi to to robić niż ESP
    piotr411 napisał:
    Kolejna sprawa to, nagminne po każdym moim usunięciu, dokładnie niepotrzebnych zmiennych tekstowych i to zapisanych jako globalne. Nie zerwanie zmiennych, ani razu w programie nie znalazłem NIL.

    Kolego wiem, że chciałeś dobrze, chciałeś pomóc. Za co bardzo Ci dziękuję. Mało jest osób które chcą się podzielić wiedzą. Może tak to wygląda, ale naprawdę nie jestem człowiekiem który tylko bierze-wszędzie tam gdzie mogę pomóc to pomagam...
    piotr411 napisał:
    Można pomagać, ale nie pisać całe aplikacje. Owszem jest to możliwe, ale odpłatnie.

    Jak możesz to napisz na PW ile taka przyjemność by mnie kosztowała.
    piotr411 napisał:
    Jak zobaczę jakieś chęci w pisaniu aplikacji to mogę pomóc, ale pisać za kogoś całych fragmentów czy nawet całej aplikacji nie będę.

    Jak najbardziej rozumiem.
    uzi18 napisał:
    piterek-23: potwierdz mi tylko czy dane przychodza w formacie jak podałem? char(10) to LF, moze tak zostac.

    Naprawdę jest to obojętne jak wyślę:
    "a:10.0"
    "a:10.0 "
    ":10"
    "10 "
    dostosuję się ;)

  • #50 07 Cze 2016 00:32
    piotr411
    Poziom 22  

    1. Bascom jest bardzo dobrym językiem, znacznie lepszym niż Arduino.
    2.

    Cytat:
    "a:10.0"
    "a:10.0 "
    ":10"
    "10 "

    Ten temat jest zamknięty, dostałeś 2 przykłady. Pierwszy napisałem do składni ramki jaką podałeś w pierwszym poście, później zmieniłeś konstrukcję rami to napisałem kolejny przykład, można jak dobrze naliczyłem jeszcze 9 innych metod zastosować by wyciągać informacje.

    Problem Twój to nie wyszukiwanie, tylko ilość wprowadzanych zmiennych tekstowych. Odniosę się do Bascoma i podam przykład o co chodzi:

    W Bascom masz deklarację string i wygląda tak:
    Code:
    Dim zmienna As String * 3   



    czyli Bascom jako bardzo dobry język zajmie tylko 3 bajty w pamięci
    w lua
    Jest to bardziej zakręcone bo:
    Jeśli deklarujesz zmienną w głównej części programu to jest ona Globalna, czyli przenoszona "Function", każdej pętli "For" itd...
    deklarujesz ją

    Code:
    zmienna={} 


    Jak widać nie podajesz ile ma znaków bo domyślnie ma 256 !!!
    W programie masz 20 zdeklarowanych takich zmiennych dla czujników czyli już na dzień dobry znika 256x20=5kb!!
    dalej wprowadzasz kolejne 20 zmiennych dla nazw czujników to kolejne 5kb
    i kolejne, kolejne, aż do końca gdzie zapisujesz kilka bajtów, dlatego masz masz komunikat bo zwyczajnie brakuje pamięci.
    Kasowanie zmiennej czyli jej wartość będzie 0 jak wstawisz do niej NIL
    czyli
    Code:
    czujnik1=NIL
    i już jest -256 bajtów.

    LUA to mix języka Pascal i C, jeśli znasz te języki lua wydaje się być bardzo prosta i przyjemna w programowaniu.

    Należy też rozróżnić LUA od LUA ESP, tak jak Basic i Bascom

    W którymś z postów dostałeś link do Referencji LUA, wystarczą dwa wieczory by w miarę poprawnie pisać programy dla ESP i oszczędzać RAM, po ich przeczytaniu.

    Co do pamięci Flash można ją powiększyć 1GB przy ESP 12E lub F, np podłączając kartę pamięci. ESP13 ma nawet 32MB już sobie, Twój projekt jest na tyle prosty, że nie zajmie nawet 2% pamięci Flash jaka dysponuje ESP12.

    Pisałem o podziale na mniejsze pliki programu, to na pewno oszczędzi RAM i możesz odwoływać się do wybranego czujnika, a nie do wszystkich na raz bo takiej potrzeby nie masz. Pisałem o tym stwierdzając, że nie przemyślałeś konstrukcji programu i w zasadzie trzeba by napisać wszytko od początku.

    Zapomnij o czymś takim, to działać nie będzie:

    Code:
    JakiSensor={"rainfall","speed","wind","temp","temp","temp","temp","temp","temp","temp","humid","vcc","vcc","vcc","ppm","uv","lux","storm","lightning","press"}
    
    Sensor={"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20"}

  • #51 07 Cze 2016 09:30
    piterek-23
    Poziom 30  

    Przesiedziałem pół nocy i nie kumam tego normalnie...
    Zrobiłem coś takiego:
    init.lua

    Kod: lua
    Zaloguj się, aby zobaczyć kod

    avr.lua
    Kod: lua
    Zaloguj się, aby zobaczyć kod

    i otrzymuję:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Czy jest jakiś symulator LUA, abym mógł swój program uruchomić wirtualnie?
    @piotr411
    - w jakim programie piszesz?
    - jak sprawdzasz ile kod zajmuje pamięci RAM itp.

    piotr411 napisał:
    Zapomnij o czymś takim, to działać nie będzie:

    JakiSensor={"rainfall","speed","wind","temp","temp","temp","temp","temp","temp","temp","humid","vcc","vcc","vcc","ppm","uv","lux","storm","lightning","press"}
    Sensor={"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20"}

    Jeżeli wyrzucę z programu odliczanie "licz" a zostawię tylko "licz=1" to pobiera dane z czegoś takiego
    Kod: lua
    Zaloguj się, aby zobaczyć kod

    i nawet LUA nie krzyczy, że jej źle... :D
    Tylko jak tu teraz to odliczyć? Tzn program przechodzi do "function SendData()" robi te 20x "licz" (od 1 do 20)
    Jakaś pętla czy coś?

    Pomału zaczynam mnieć dość tego ESP, LUA...

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME