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

ESP8266 - + AVR = Hello World

Morcinek92 01 Maj 2015 18:41 3108 18
  • #1 01 Maj 2015 18:41
    Morcinek92
    Poziom 14  

    Witam,

    Czy ktoś ma jakieś pomocne materiały które pomogą mi stworzyć proste sterowanie modułem ESP8266 z użyciem uC np. Atmega32 . Głównie chodzi mi o jezyk C , w sieci mogę dużo znaleźć materiałów ale tylko na platformę Arduino bądź Luna..

    0 18
  • Relpol
  • #2 03 Maj 2015 17:45
    Morcinek92
    Poziom 14  

    Hejka, aktualnie sprawa wyglada tak :

    Udało mi się w przegladarce uzyskać dowlny napis.
    Używam programu "ESP8266 Config" po połączeniu się z modułem w serial monitor wpisuję takie ustawienia :

    AT+CIPMUX=1
    AT+CIPSERVER=1,80

    Teraz wchodzimy w przeglądarkę wpisujemy adres IP : u mnie : 192.168.4.1 i wciskamy enter. W serial monitorze informuje nas ze jest próba połączenia z modułem więc wpisujemy teraz :

    AT+CIPSEND= (długość znaku)

    Dowolny Napis

    AT+CIPCLOSE=0

    NO i strona się załadowałą i mamy napis który chcieliśmy :)


    Chce to teraz zautomatyzować i użyć procesora.

    PO inicjalizacji modułu :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    następnie
    Powinienem wejść na strone i po wpisaniu IP wcisnąć enter no i dalej :

    Kod: c
    Zaloguj się, aby zobaczyć kod



    NO i właśnie jak zrobić zeby moduł wiedział ze ktos chce wejsc na stonie czyli wpisze Ip i wcisnie ENTER .. zeby moduł mógł wyslać w tedy dlugosc znaku i napis ... NIe wiem jak to programowo rozwiazac jakiej komendy użyć ...
    w arduino wyglada to tak :

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    PROSZĘ O POMOC :(((

    Dodano po 16 [minuty]:

    Głównie chodzi mi o to jak zapisać w C ten fragment :
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Nie mam bladego pojęcia .. POMOCYYYY

    0
  • Relpol
  • #3 05 Maj 2015 05:09
    QuadMan
    Poziom 13  

    Witam.
    Nikt nie napisał, to może ja ;-).

    Kod: c
    Zaloguj się, aby zobaczyć kod
    to upraszczając, daje True, jeśli odebrano poprawny znak. Z jakich bibliotek do obsługi UART-a korzystasz ? W skrócie - ten fragment kodu, o który pytasz, ma działać tak: jeśli odebrano "poprawny" znak, to go odczytaj, jeśli niepoprawny, daj sobie z nim spokój ( niepoprawny - wynik tej funkcji <0 ). Nie dam Ci tu gotowego rozwiązania ( nie to że nie chcę, ale nie mam go tu w kompie ), ale w sumie sprawa jest dość prosta: odbierasz dane z UARTA - jeśli to są poprawne ASCII - zapisujesz je w buforze, parsujesz bufor ( to IPD nieszczęsne ;-) ) i coś z tym robisz, jeśli znalazłeś +IPD. Ale uwaga - ESP8266 potrafi odebrać całą ramkę TCP/IP - tych danych może być sporo, najlepiej by było, gdybyś odbierał te dane " w tle" - dodatkowy bufor cykliczny na kilka ramek wydaje się konieczny - ja przynajmniej używam takiego na 3 ramki i do tego kod jest na STM32F103 - nie wiem na czym to chcesz uruchomić, podejrzewam że na jakimś AVR - więc pewnie będziesz potrzebował bufora co najmniej takiego jak ja, albo nawet większego. I raczej sensowniejsze rozwiązanie to odbieranie całych ramek, aż do \r\n i wtedy dopiero ich parsowanie - inaczej procek raczej nie da rady.
    Pozdrawiam, QuadMan.
    P.S. A właściwie dlaczego nie chcesz skryptów LUA??? NodeMcu jest w sumie dość ok - co prawda RAM-u mało w ESP8266, ale do prostych zastosowań wystarcza. Jeśli to mają być dane z kilku czujników, albo jakichś tam wejść, to, zapewniam Cię, da radę,

    0
  • #4 06 Maj 2015 21:20
    Morcinek92
    Poziom 14  

    Dziękuję Ci za odpowiedź.
    Korzystam z biblioteki UART autorstwa Mirosława Kardasia (mirekk36).

    Więc tak po inicjalizacji modułu i jej zakończeniu , moduł ciągle wysyła dane ? i ja je w tedy odbieram i prasuje ?

    Nurtuje mnie to bo.. mam połączone esp8266 bezpośrednio do rs232 i komunikuję się z nim komendami AT podgladając rezultaty w terminalu no i po inicjalizacji moduł milczy dopiero po wpisaniu IP do przegladarki i wciśnięciu ENTER moduł wysyłą mi odpowiedź:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po dostaniu takiej odpowiedzi moge wysyłać mu co chce.
    Żeby kolejny tekst wyslać muszę znowu otrzymac taka odpowiedź..

    Czytałem o tym LUA.. w ostateczności z niego skorzystam , ale na razie chciałbym pomęczyć sie w C ... głównie mi chodzi o jego rozwój

    0
  • #5 06 Maj 2015 21:47
    QuadMan
    Poziom 13  

    Witam,

    Nie, może nieprecyzyjnie się wyraziłem, moduł zachowuje się tak jak napisałeś, ale dla Ciebie, jako "obserwatora" z zewnątrz mogą przyjść dane w dowolnej chwili. Bo moduł odpowiada jeszcze np. "OK", "busy" i coś tam jeszcze.... Bo wyobraź sobie sytuację, że dostałeś to +IPD i całą resztę, parsujesz te dane, a w tym czasie ktoś nacisnął przycisk "refresh" w przeglądarce. Jeśli masz biblioteki Mirka, to po prostu daj cykliczny bufor tak długi jak tylko możesz ( przynajmniej na 1 ramkę ) i powinno być ok. Tu masz to odbieranie danych:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tylko, zwróć uwagę na to, że jeśli w buforze cyklicznym nie zmieści się cała ramka - aż do EOF, to wszystko się "rozjedzie" i najprawdopodobniej samo już "nie wstanie". Dlatego ja dałem bufor cykliczny ze 4k ( aby na pewno zmieścić kilka nadlatujących odpowiedzi.

    W pętli głównej wywołujesz tą funkcję i jeśli masz true to parsujesz:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    To co powyżej, traktuj jako metodę, nie gotowy kod - piszę z pamięci, może być, że w szczegółach coś pomieszałem.

    DOPISANE:

    Tak jak napisałeś w pierwszym poście:

    AT+CIPSEND= (długość znaku)

    Tu dostajesz znak zachęty ">" od modułu i dopiero teraz możesz:

    Dowolny Napis

    AT+CIPCLOSE=0

    Ogólnie, to sprawa nie jest wcale taka prosta, bo moduł "bombardowany" danymi potrafi się zawiesić i wysyłać w kółko "busy" - nawet z najnowszym SDK 1.coś tam...
    Ja osobiście nie skończyłem tego na "tip - top", zresztą w sumie mam ochotę na napisanie tego od zera w oparciu o maszynę stanów i w przerwaniach, ale w tej chwili kompletnie nie mam na to czasu :-(.

    Pozdrawiam, QuadMan.

    0
  • #6 07 Maj 2015 16:27
    Morcinek92
    Poziom 14  

    Dziękuję Ci bardzo za tak dogłębne wyjaśnienie mojego problemu już mi się dużo rzeczy wyklarowało , powolutku zabieram się za pisanie programu. Mam tylko jeszcze jedno pytanie.

    Moduł ustawiony mam w tryb AP+STA i do tego MUX : SINGIEL,
    chodzi mi o długość wysłanych danych : AT+CIPSEND= (długość znaku), teoretycznie nie jestem w stanie tego obliczyć albo się doliczyć , widze że w kodzie który umieściłem wyżej jest to jakoś rozwiązane ale za bardzo nie umiem się do końca zoriętować jak...

    0
  • #7 07 Maj 2015 17:01
    mpier
    Poziom 16  

    Witam,
    nie zastanawiałeś się może, czy nie zrezygnować z AT i sieci w atmedze i nie przenieść komunikacji WIFI na ESP8266, a na atmedze zostawić część wykonawczą? ESP8266 możesz programować w C.

    0
  • #8 07 Maj 2015 21:06
    QuadMan
    Poziom 13  

    Morcinek92 napisał:
    .... Mam tylko jeszcze jedno pytanie.

    Moduł ustawiony mam w tryb AP+STA i do tego MUX : SINGIEL,
    chodzi mi o długość wysłanych danych : AT+CIPSEND= (długość znaku), teoretycznie nie jestem w stanie tego obliczyć albo się doliczyć , widze że w kodzie który umieściłem wyżej jest to jakoś rozwiązane ale za bardzo nie umiem się do końca zoriętować jak...


    Musi być AT+CIPSEND =ch_id, len_buff, gdzie ch_id to numer kanału, może być 1, a len_buff to musi być dokładnie tyle, ile w danej chwili wysyłasz - bo po tym "znaku zachęty" > ESP8266 czeka na tyle danych, ile mu podałeś jako len_buf ( nie kończysz tego \r\n - to nic w tym przypadku nie da. Co do ilości danych: jeśli wysyłasz mniej niż rozmiar bufora to po prostu :
    Kod: c
    Zaloguj się, aby zobaczyć kod

    albo np.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeśli chcesz wysłać więcej danych niż długość bufora, to musisz zrobić to " na raty", za każdym razem podając właściwą wartość len_buff, ale to chyba oczywiste.

    Pozdrawiam, QuadMan.

    0
  • #9 10 Maj 2015 17:04
    Morcinek92
    Poziom 14  

    Zacząłem pisać program.. no i na początku wyświetlę sobie jakiś tekst pomyślałem sobie a później przejdę dalej... myślałem że po takich wyjaśnieniach dam sobie rade bez większych problemów aż tu naglę ZONK ,

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Działa raz na 1 na 20 razy... czyli nie działa... jeśli podłącze sobie do terminala wpiszę +IPD, dostaję odpowiedź, jeśli podpinal ESP pod teminal wpisuję 192.168.4.1. dostaję +IPD..(...) , no ale razem to jakoś nie współgra już wrzuciłem delaye myślałem ze zbyt szybko się to dzieje dla modułu ale nadal nic .... wpisałem zamiast +IPD, słowo LINK bo takie teoretycznie przychodzi jako pierwsze, no i ruszyło ale też raz na jakiś czas...

    Pomysły :>? może to jest nie do końca poprawne :

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #10 12 Maj 2015 00:21
    QuadMan
    Poziom 13  

    Witam ponownie.

    Po pierwsze:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Bo jeśli następny string przyjdzie szybciej, niż skończy się ten delay, to możesz go utracić !!! ( Zwróć uwagę, że przeglądarka wysyła w odpowiedzi więcej, niż rozmiar Twojego bufora cyklicznego, więc z tym deklay-em w pętli głównej na 100% stracisz dane !!! ). Po drugie, jeśli już po:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    nie czekasz na znak ">", daj na próbę:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    przed:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    i reszta tak jak jest i myśle, że powinno Ci zadziałać :-).

    Pozdrawiam, QuadMan.

    0
  • #11 13 Maj 2015 20:55
    Morcinek92
    Poziom 14  

    QuadMan jesteś genialny :)
    Teraz działa tak jak należy !!
    Bardzo się cieszę ! Pomogłeś mi bez Ciebie by to nie ruszyło, super że są na świecie tacy ludzie !!

    Dziękuję CI :)

    Dodano po 54 [sekundy]:

    Tylko w funkcji odbioru danych powinno być tak :

    Kod: c
    Zaloguj się, aby zobaczyć kod

    1
  • #12 14 Maj 2015 19:48
    Morcinek92
    Poziom 14  

    Hej,
    Myślę właśnie jak zrobić ten fragment :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Podałeś mi mały przykład ale nie wychodziło mi to... ;/

    Chciałbym stworzyć funkcję w której będzie powstawała moja strona np.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    natomiast mam problem z funkcja w której prasuje dane... nie wiem jak się za to logicznie zabrać...

    Kod: c
    Zaloguj się, aby zobaczyć kod

    -1
  • Pomocny post
    #13 18 Maj 2015 22:06
    QuadMan
    Poziom 13  

    Witam,

    To może tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Kod: c
    Zaloguj się, aby zobaczyć kod


    i później:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Napisz proszę, czy to jest jasne.

    Pozdrawiam, QuadMan.

    1
  • #14 19 Maj 2015 14:28
    Morcinek92
    Poziom 14  

    Dziekuje zauart_putint(BUFFER_SIZE,10);odpowiedz.)
    Jestem jak na razie w pracy i nie moge przetestowac kodu , zrobie to dopiero wieczorem, ale mam kilka niejasnosci

    1) funkcje print_webpage moze usunac bo nie jest ona nigdzie wywolywana
    2) tej liniki nie rozumiem:
    uart_putint(BUFFER_SIZE,10);
    dlaczego wstawiam tutuaj jakis buffer size a nie len? skoro to do niego przypisana jest dlugosc strony i dlaczego tutaj jak i przy ch_id wstawiamy 10 ??

    A tak pozatym to wydaje mi sie wszystko przejzyste ;)
    Mowisz na razie strone tworzyc w zmiennych globalnych ? pozniej inaczej to zrobic ? przy wiekszych stronach.

    Co ja bym bez Ciebie zrobil ; d
    dziekuje Ci na prawde !

    0
  • Pomocny post
    #15 19 Maj 2015 15:12
    QuadMan
    Poziom 13  

    Witam,

    tak to jest, jak się coś pisze na kolanie.., sorry.

    ad1. W kodzie miało być

    Kod: c
    Zaloguj się, aby zobaczyć kod
    zamiast
    Kod: c
    Zaloguj się, aby zobaczyć kod
    ze względów formalnych, dlatego tą funkcję zostawiłem, a później... o niej zapomniałem :-(, choć to w sumie "wsio ryba".
    ad2. oczywiście ma być:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    , po to przecież była liczona długość tego stringa.

    Sorry z błędy.

    Pozdrawiam, QuadMan.

    1
  • #16 19 Maj 2015 17:49
    Morcinek92
    Poziom 14  

    Sprawdziłem poprawki które mi podałeś wszystko działa tak jak powinno już nie muszę obliczać długości łańcucha :D działa wszystko super.

    Trochę strony napiszę i bardzo szybko zabiera miejsce w pamięci : O kilka linijek kodu i tu 35 % : P no ale jakoś muszę sobie poradzić ..

    myślisz że dobrze jest pisać stronę w tym miejscu :

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czy może jakoś inaczej to ugryść ? jak radzisz

    zauważyłem że nie zawsze to działą bo np. jeśli dodam <body> Teskt </body> to już nie wyświetla się nic w przeglądarce : P

    Teraz spróbuję napisać program do sterowania diodą led :)
    żeby załączyć i wyłączyć ją ! Trzymaj kciuki :D

    Dotychczas napisałem takie cośik :
    Kod: c
    Zaloguj się, aby zobaczyć kod


    po kliknięciu przycisku pojawia się :
    Kod: c
    Zaloguj się, aby zobaczyć kod


    no i myślałem że odczytam to tak jak w kodzie ale nie działa.. nie widzę w terminalu co wysyła do mnie moduł .. i to jest troche problem ... uart_puts("off" ) to dla mnie informacja w terminalu

    Dotarłem do tego że w terminalu dostaję takie coś po kliknięciu przycisku :
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Szczerze to nie mam bladego pojęcia jak dostać się do tego led_off .
    Strona będzie sterowana tylko komendami
    Czyli :
    załączenie diody 1 ; LED1_ON
    wyłaczenie : LED1_OFF
    stan który będzie odczytywany piny : LED1_?

    takich diod (w przyszłości urządzeń ) będzie 6 no i za każdym razem strona będzie wysyłać jakaś komendę i jak się dostać do niej :> o to jest zagadka :D

    0
  • #17 24 Maj 2015 13:53
    Morcinek92
    Poziom 14  

    Problem rozwiązany !

    przydatna okazała się funkcja do odczytania zawartości łańcucha

    Kod: c
    Zaloguj się, aby zobaczyć kod


    no i dioda ładnie się zapala i gasi :)

    0
  • #18 31 Maj 2015 20:36
    Morcinek92
    Poziom 14  

    Kolejny problem ....

    Sprawa wygląda następująco:

    Chciałbym aby po podłączeniu urządzenia do prądu i wpisaniu IP : 192.168.4.1 , nastąpiła konfiguracja urządzenia z naszą pod siecią domową.. żeby nie trzeba było wpisywać w programie na sztywno tylko w momencie kiedy klient dostaje urządzenie mógł sobie samodzielnie skonfigurwać ESP z swoją pod siecią domową :

    Napisałem program który działa 3/4 ..

    Program:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zasada działania :

    Po wpisaniu IP do przeglądarki wyświetla nam się strona "Konfiguracja połączenia z routerem" wpisujemy SSID czy tam nazwę pod sieci i haslo do niej i klikamy połącz .
    Strona wysyła komende " AT+CWJAP="SSID","HASLO" , no i w odpowiedzi moduł wysyła jeśli się połączył to "OK" a jeśli nie połączył to "FAIL" z tym że na "FAIL " czekamy 15 sec tyle to trwa .. no i tutaj zaczynaja się schody...

    Po wysłaniu AT+CWJAP ma zotać wyświetlona funkcja STRONA

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i w ciele funkcji :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jest że jeśli jest OK to ma wyświetlić komunikat OKw terminalu oraz strone1 w przeglądarce jeśli FAIL to błąd w terminalu i w przegladarce szkielet strony2 ..

    Reasumując mój problem : W funkcji STRONA (BUF ); Jest błąd bo po otrzymaniu komentu "OK" lub "FAIL" nie zostaje ona odczytana przez procesor prawidłowo ...

    POMOCYYY :((

    0
  • #19 02 Cze 2015 23:10
    QuadMan
    Poziom 13  

    Witam ponownie.

    Jednak "na chwilę" tu zajrzałem ;-). Z tego, co pamiętam, to faktycznie jest tak, że po: AT+ CWJAP moduł faktycznie wysyła jedynie: OK lub FAIL. Ja bym spróbował tak:

    1. Wysyłając AT+CWJAP jakoś bym ten fakt "oflagował" i później w funkcji parsującej szukałbym właśnie "OK"lub "FAIL" i wtedy wysyłałbym dane do przeglądarki - aby wyświetlić to co masz w funkcji Strona ( char*buf).
    2. Wprowadziłbym na to jakiś timeout i po jego upływie kasowałbym tą flagę.

    Echh.. maszyna stanów z prawdziwego zdarzenia wydaje się konieczna.... Zastrzegam, że w tej chwili nie mam jak tego sprawdzić i mogę się mylić.

    Pozdrawiam, QuadMan

    0