logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ESP8266 - wysyłanie stringa, BMP 280, BME 280, OLED, DS1307

heyka 11 Maj 2019 13:28 3555 36
Najlepsze odpowiedzi

Jak w Arduino dla ESP8266 dodać na końcu wysyłanego tekstu znak nowej linii lub Enter, a przy okazji jak składać taki string z fragmentów i liczb?

W Arduino możesz dopisać na końcu tekstu sekwencję `"\r\n"` albo użyć `println()`, jeśli chcesz wysłać zakończenie linii/Enter [#17955379][#17957189] String zbudujesz przez łączenie `String`-ów i liczb, np. `String0 = String1 + String2 + String(liczba) + String3`, a liczby trzeba jawnie zamieniać na `String()` [#17957189] Bezpieczniejszym rozwiązaniem jest użycie statycznego bufora `char[]` i `sprintf()`, ale bufor musi być odpowiednio duży, żeby pomieścił cały tekst [#17957189][#17958530] Jeśli pracujesz raz na `String`, a raz na `char[]`, Arduino ma funkcje do konwersji między tymi typami [#17957904]
Wygenerowane przez model językowy.
  • #1 17955009
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Witam, testuję na smartfonie program WiFi TCP/UDP controller, wysyłam ze smartfona komendę i ESP8266 odpowiada. To że odpowiada poprawnie wiem ponieważ jak wysyłam komendy z komputera PC to odpowiedzi przychodzą bez problemu, ale w smarftonie w programie nie widzę odpowiedzi. ESP8266 odpowaida np takim ciągiem znaków : "W1_OFF". Podejżewam, że trzeba dodać na koniec tekstu wysyłanego z ESP znak końca linii albo Enter, a może oba. Program w ESP8266 napisany w arduino. W jaki sposób w arduino w wysyłanym tekście dodać na końcu znak nowej linii lub entera?

    Dodano po 20 [minuty]:


    Wysyłam tekst:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Za pomocą polecenia:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 17956468
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Dziękuję za odpowiedź.

    WiFi TCP/UDP Controller nie odbiera danych z ESP, kombinuję na różne sposoby i nic i ze znakami na końcu i bez niestety bez powodzenia.

    Mam pytanie, a gdybym chciał wysłać stringa zbudowanego w nastepujący sposób:

    int napięcie = 5;
    int natexenir =1;

    a string miałby wyglądać :
    nap., wartosc napiecia, natez., wartosc natezenia

    Chodzi mi o to jak budować stringi z gotowych stringów plus pojedyncze znaki plus wartości liczbowe.
  • #4 17956659
    Konto nie istnieje
    Poziom 1  
  • #5 17957189
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 230
    Stringi w Arduino można dodawać i konwertować, np. String0=String1+String2+String(liczba)+String3; i potem Serial.println(String0);. Bezpieczniej jednak korzystać ze statycznej tablicy char jako bufor do wszystkiego i w niej lokować po kolei poszczególne znaki np. funkcją sprintf Link. W jednym i drugim wypadku trzeba mieć na uwadze, że pamięć RAM nie jest z gumy, a w AVR mocno ograniczona. Nie mniej jednak ze Stringami niespodzianki zdarzają się częściej, ze statyczną tablicą od razu zobaczysz, że przegiąłeś i coś ucięło.
    Pomogłem? Kup mi kawę.
  • #6 17957477
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Polecenie powyższe wysyła dane jako string przez port.

    W jaki sposób wysłać to przez UDP?

    polecenie

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    wysyła tablicę char, a mi chodzi o to żeby wysłać string c .
  • #8 17958507
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Taki przykład:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    czy tak będzie wyglądał tekst w zmiennej buf??

    napiecie,5,natezenie,1
  • Pomocny post
    #9 17958530
    Konto nie istnieje
    Poziom 1  
  • #10 17958915
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Super, dzięki jest OK.

    Mam moduł NodeMCU i bibliotekę do BPM 280 działa po SPI

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Co trzeba zmienić aby odpalić ją na I2C?
  • #11 17958934
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 230
    Ja go po prostu podłączyłem do I2C, nawet nie sprawdzałem działania po SPI. Spróbuj zmienić w szkicu to co zakomentowane do I2C (właściwie przykład jest pod I2C) i podłącz go pod piny I2C Arduino. Gdyby coś nie zaskoczyło sprawdź czy I2C scanner wykrywa go na magistrali.
    Pomogłem? Kup mi kawę.
  • #12 17959175
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    kaczakat napisał:
    Ja go po prostu podłączyłem do I2C, nawet nie sprawdzałem działania po SPI. Spróbuj zmienić w szkicu to co zakomentowane do I2C (właściwie przykład jest pod I2C) i podłącz go pod piny I2C Arduino. Gdyby coś nie zaskoczyło sprawdź czy I2C scanner wykrywa go na magistrali.


    Nie mam płytki Arduino, tylko NodeMcu, a ta płytka nie ma sprzętowego I2C, da się uruchomić I2C skaner?
  • #14 17959267
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Skaner zadziała, choć na stronie jest odwrotny opis D1-SCL, a D2 -SDA, odczytało mi adres 0x76

    Dodano po 5 [minuty]:

    Działa, BMP280.h był adres Ox77, zmieniłem na 0x76 i działa. :)

    Dodano po 1 [minuty]:

    Teraz czas na BME280 i I2C.
  • #15 17960677
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Może się komuś przyda, wiem że żadne odkrycie ale gotowe do wgrania i testowania.

    Działające testowe programiki, płytka NodeMCU v3, moduły działają po I2C
    W pliku BMP280.h należy ustawić adres modułu, w moim przypadku

    #define BMP280_ADDRESS (0x76)

    BMP280

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    BME280

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wyświetlacz OLED, adres 0x3C i #define OLED_RESET -1

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 54 [minuty]:

    Wyświetlam na wyświetlaczu OLED temperaturę, wilgotność i ciśnienie, wielkości wyświetlają mi się z dwoma znakami po przecinku, w jaki sposób obciąć jeden lub dwa znaki występujące po przecinku?

    Np wilgotność wyświetlam za pomocą funkcji:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 17960944
    Konto nie istnieje
    Poziom 1  
  • #17 17961184
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Dzięki, oczywiście działa tak jak chciałem.

    Link, który mi Kolega podał dotyczy Serial.print, ale sposób formatowania działa i dla lcd.print i dla dispaly.print, stąd moje pytanie:
    - czy to jakaś standaryzacja wysyłania wysyłania łańcuchów czy to przez serial port czy to na oled itd?
    -funkcja bme.readPressure() dla bme280 zwraca ciśnienie w postaci łańcucha co to za łańcuch, c-string?
  • #18 17961199
    Konto nie istnieje
    Poziom 1  
  • #19 17961202
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    I jeszcze jedno pytanko czy NodeMCU obsługije jakieś przerwania zewnętrzne takie jak INT dla uP np AVR.
  • #21 17961211
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Klasy dziedziczą. Czyli to programowanie obiektowe? To już za wysoki poziom dla mnie :(.
  • #22 17961216
    Konto nie istnieje
    Poziom 1  
  • #23 17961228
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Zaczynam z Arduino.

    Kiedyś był Bascom, C, a teraz Arduino.
  • #24 17966506
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Biorę teraz na tapetę RTC DS1307, https://abc-rc.pl/product-pol-6190-Modul-czas...s&utm_medium=google_shopping&curr=PLN (nie mogę wstawić linku w znacznikach), korzystam z programów testowych ze strony http://www.jarzebski.pl/arduino/komponenty/zegar-czasu-rzeczywistego-rtc-ds1307.html

    Plik nagłówkowy do biblioteki

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Mam pytanie, pierwsza funkcja inicjalizacyjna moduł wygląda następująco

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    natomiast jej wywołanie w szkicu wygląda:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Skąd wziął się ten "clock"?

    Mam taki szkic

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    funkcja
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ustawia czas z komputera w czasie kompilacji,

    W jaki sposób ustawić inny dowolny czas?

    próbowałem tak

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ale się nie kompiluje :(

    Proszę o pomoc.

    Dodano po 49 [minuty]:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    kompiluje się ale nie ustawia tego czasu.
  • Pomocny post
    #25 17966728
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 230
    Poczytaj sobie o C++, bo pytając o każdą literkę na forum zejdzie Ci długo z tworzeniem czegokolwiek.
    Tak samo jak tworzysz zmienną "int zmienna;" i potem jej używasz w kodzie "zmienna++;" tak samo tworzy się obiekty "DS1307 clock;" i potem używa na nich funkcji/metod.
    Na początek polecam kurs M. Zelent o C++ i C++ obiektowym, jest na Yutube, a jakaś książka uzupełni ten wstęp.
    A z ustawianiem czasu masz podać dwa argumenty do funkcji (oddzielone przecinkami), a próbujesz podać sześć - serio, chociaż ten kurs video.
    Pomogłem? Kup mi kawę.
  • #26 17966846
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Ma cały dzień padać więc, wezmę się za kurs C++.

    Chciałbym jeszcze tylko na moment wrócić do ustawiania czasu, mam w pliku nagłówkowym 3 funkcje(dziwne bo wszystkie maja identyczne nazwy):

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy ta pierwsza nie jest do ustawiania czasu w formacie w takim jak ja to chciałem zrobić czyli podając 6 argumentów.

    Co do trzeciej, czy należy stworzyć tablice typu Char i wstawić je przy wywoływaniu funkcji?
  • #27 17966869
    Slawek K.
    Poziom 35  
    Posty: 3020
    Pomógł: 259
    Ocena: 1301
    Ustawianie czasu z użyciem jednej z funkcji z tej biblioteki https://github.com/jarzebski/Arduino-DS1307 może wyglądać następująco :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pierwszy - podczas kompilacji
    Drugi - z użyciem timestamp czyli liczby sekund od 01.01.1970 do teraz
    Trzeci - poprzez podanie 6 argumentów w odpowiedniej kolejności czyli rok, miesiąc, dzień, godzina, minuta, sekunda

    Pozdr
  • #28 17966887
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Slawek K. napisał:

    Trzeci - poprzez podanie 6 argumentów w odpowiedniej kolejności czyli rok, miesiąc, dzień, godzina, minuta, sekunda



    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    kod testowy ze strony autora, powinien zmienić czas w układzie, ale nie zmienia, dalej pozostaje bieżący który ustawił się przy kompilacji.
  • Pomocny post
    #29 17966902
    Slawek K.
    Poziom 35  
    Posty: 3020
    Pomógł: 259
    Ocena: 1301
    Wyrzuc warunek if i zostaw sama funkcje setDateTime.
  • #30 17966926
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Slawek K. napisał:
    Wyrzuc warunek if i zostaw sama funkcje setDateTime.


    Dzięki.

Podsumowanie tematu

✨ W dyskusji poruszono problem z komunikacją między ESP8266 a aplikacją WiFi TCP/UDP Controller na smartfonie, gdzie odpowiedzi z ESP8266 nie były widoczne. Użytkownik zasugerował dodanie znaków końca linii do wysyłanych danych. Odpowiedzi wskazały na użycie znaków specjalnych w Arduino, takich jak "rn", oraz na metody budowania stringów z wartości liczbowych i gotowych stringów przy użyciu funkcji sprintf(). Użytkownicy dzielili się również doświadczeniami z modułami BMP280 i BME280, a także z RTC DS1307, omawiając różne metody komunikacji I2C oraz SPI. Wskazano na znaczenie pamięci RAM w kontekście użycia stringów oraz na możliwość korzystania z przerwań w NodeMCU.
Wygenerowane przez model językowy.
REKLAMA