Skocz do zawartości

ethanak

Użytkownicy
  • Zawartość

    2582
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    116

Wszystko napisane przez ethanak

  1. Czyli jest możliwość. o właśnie: w niektórych sytuacjach, a tutaj akurat z taką niektórą sytuacją nie mamy do czynienia. A właśnie w ESP8266 funkcja loop() powinna się skończyć jak najszybciej, aby zostawić czas na komunikację WiFi i inne ważne sprawy którymi się ESP w międzyczasie zajmuje. Mamy natomiast do czynienia z zewnętrzną aplikacją (termik4temp konkretnie), która wysyła pakiet udp i oczekuje odpowiedzi - i jest to przy okazji odpowiedź na Twoje uwagi: Ano dlatego, że tak to sobie autor owej aplikacji wymyślił i tak to działa... Gdybyś zadał sobie trudu i sprawdził zobaczyłbyś, że ten kod jest po prostu żywcem przepisany z zamieszczonego przez autora termika kodu na arduinopolska. Owszem - kod jest fatalny, ale skąd kolega wątkotwórca (który się na tym niespecjalnie zna) miałby o tym wiedzieć? Tak że następnym razem, kolego @Jarewa sprawdź o czym się tu mówi a potem zabieraj głos w obronie delajów i zależności wysyłania pakietów od ich otrzymania. Bo na pewno delay(5000) nie wpłynie pozytywnie na responsywność.
  2. Nie, nie jest dobrze, ale dzisiaj już mam dość monitora - jutro też jest dzień
  3. Nie - tam jest prawidłowo. Tylko w loop nie może być żadnego delay - po prostu żeby nie zgubić pakietu. No tak, nie zauważyłem jednego: odczyt termometrów musi być niezależny (bezpośrednio w loop a nie za jakimś ifem). Poza tym ten fragment który Ci podałem (z wypisywaniem na serial) miał byc na końcu loop, a nie prawie na końcu. Jeden nawias dalej. Czyli coś takiego: loop() { jeśli odebrano pakiet { rób coś z pakietem } odczytaj termometry; wyświetl wyniki; } Jeśli urządzenie ma mieć podłączony wyświetlacz - odczyt termometru nie może być po odebraniu pakietu, bo co się stanie jak np. wyłączysz zdalny termometr albo padnie sieć? To samo dotyczy wyświetlania.
  4. Wszystko jest fajnie, tylko wyskoczyła jedna niemiła sprawa: dopóki nie było termometrów, na serialu program wypisywał sobie ładnie wszystko co 2 sekundy. Teraz... mija siedem, tak? I to w ciągu tych siedmiu sekund układ może zgubić pakiet Udp... coś tu chyba jest nie tak... Zauważ jedno: co prawda serial wypluwał z siebie wyniki co dwie sekundy - nie było tam żadnego delaya! Magia? Możesz to jakoś poprawić? W razie czego możesz popatrzeć tutaj: https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418
  5. Ty to masz fajnie... ja nie mam pieska i nie mam co wyprowadzać tylko pamiętaj o odczekaniu jakiegoś czasu po request i zrobieniu jakiejś magii, żeby nie czytał temperatury co sekundę (bo to trochę nie ma sensu).
  6. Zrób to. Nie przejmuj się że będzie kulawo działać - za chwilę to odkulawimy
  7. Drobiazg - ale błąd był w przykładzie Masz tam: if (len > 0) { packetBuffer[len] = 0; } Jeśli długość pakietu jest 0 to i tak trzeba to zero wstawić, a więc po prostu: packetBuffer[len] = 0; Teraz przydałoby się zabrać za wyświetlanie... może najpierw kontrolnie będziemy co jakiś czas wypisywać na Serial zawartość tablicy termometr (powiedzmy co 2 sekundy, żeby za dużo nie migało): static uint32_t ostatnio = millis(); if (millis() - ostatnio > 2000) { ostatnio = millis(); printf("%d %d %d %d\n", termometr[0], termometr[1], termometr[2], termometr[3]); } Wstaw ten kod na samym końcu funkcji loop() - w efekcie powinieneś zobaczyć, że termometr[2] ma wartość taką, jaką przesłał mu nadajnik. Gdybyś teraz zrobił drugi nadajnik zmieniając tylko numerek z 1 na 2 - miałbyś obie temperatury na pozycjach 2 i 3... Masz pomysł na to, aby termometry które są podłączone bezpośrednio do serwera wrzucały wyniki swoich pomiarów do tablicy termometry na dwa pierwsze miejsca?
  8. E tam - poddajesz się? A taki fajny pomysł... i już do końca blisko... Dla dwóch czujników na przykład: if (packetBuffer[0] == 'T' && packetBuffer[0] >='1' && packetBuffer[1] <= '2') { int indeks = packetBuffer[1] - '1' + 2; // zaczynany od indeksu 2 bo 0 i 1 to termometry bezpośrednie termometr[indeks] = atoi(packetBuffer+2); } Czego tu nie rozumiesz? Odpocznij, wyjdź na spacer (do drugiego pokoju), wypij kawę, obejrzyj film (koniecznie familijny), prześpij się i wróć.
  9. Punkt pierwszy: czy pierwszym znakiem jest 'T'? Jeśli nie, nie jest to sygnał od termometru. Punkt drugi: czy drugim znakiem jest cyfra określająca numer czujnika (czyli od '1' do 'ilość czujników')? Jeśli nie, to nie jest sygnał od termometru. Indeks tablicy to (drugi_znak - '1') + ilość_termometrów_podłączonych_bezpośrednio; Wartość wpisywana to fragment od trzeciego znaku przekształcony na int. Pamiętaj, że pozycje w napisach liczą się od zera! Indeksy w tablicach też!
  10. No to trochę nie bardzo... ten termometr nie pracuje z dokładnością jednego miejsca po przecinku - masz do wyboru albo 1/8 stopnia, albo 1/16 stopnia. Pomijając ten drobiazg... mnożysz w nadajniku temperaturę przez 10 i masz wymaganą dokładność (pod warunkiem ustawienia termometru na 1/16 stopnia). Cały czas operujesz takim "decystopniem", a dopiero przy wyświetlaniu zamieniasz to na stopnie. Ponieważ wyświetlaniem zajmiesz się później (kiedy będzie co wyświetlać), na razie się nim nie przejmuj.
  11. Bezpośrednio nie... no bo jak? Liczba całkowita to liczba całkowita, i żadnych kawałków mieć nie może. Ale... z jaką dokładnością chcesz mieć temperaturę? Bo wszystko da się zrobić. Przykładowo: jeśli potrzebujesz dokładności do pół stopnia, to operujesz jednostką "pół stopnia" (czyli temperatura razy dwa), a przed wyświetlaniem zamieniasz ją na coś strawnego dla wywietlacza.
  12. OK - czyli sprawę "nadajnika" mamy rozwiązaną - podłączenie termometru nie powinno być trudne (szczególnie, że przy jednym nie musisz bawić się w ręczne szukanie adresów). To teraz pytanie: czy po stronie odbierającej możesz: stwierdzić czy jest to sygnał od termometru? jeśli tak to od którego? jeśli dane się zgadzają, wpisać aktualną temperaturę do jakiejś tablicy? Załóżmy że mamy globalną tablicę: int termometr[4]; // no bo mamy cztery termometry. Niech pozycje 0 i 1 zajmują termometry bezpośrednio podłączone do ESP, a 3 i 4 to odebrane od nadajników... Wiesz jak to zrobić?
  13. Napisałeś: int len=sprintf(bufor,"T%d%d", temp); A gdzie numerek czujnika? Masz w formacie dwa razy %d - czyli za formatem mają być dwa inty. A ile masz?
  14. Da się tylko po co sobie życie komplikować? Wybierz którąś z wersji na int. Wspominałem o funkcji sprintf. Tu masz opis: https://pl.wikibooks.org/wiki/C/printf A na razie zanim poczytasz to coś na szybko: char bufor[16]; // tak na przykład int len=sprintf(bufor,"T%d%d", numer, temp); Udp.beginPacket(....cośtam); Udp.write(bufor, len); Udp.endPacket(); Przeanalizuj sobie jak to działa - sprintf będzie później potrzebny do komunikacji z termikiem!
  15. No to PS HI (polistyren wysokoudarowy). Z obu tych tworzyw produkuje się w końcu obudowy.
  16. Jakie stabilizatory masz na myśli i ile? Pamiętaj, że napięcie w instalacji motocykla to wcale nie 12 V, a coś między 10 a 14 (w porywach więcej). Zakładając że to 14V - na stabilizatorach wytraci się moc ponad 30W - zimą można umieścić pod siedzeniem i mieć ciepło, ale latem... Co zmieni tyle, że te 30W będzie się wytracać dodatkowo w pasku (który ma własne stabilizatorki). Dodatkowo pasków 12V nie można zasilać wyższym napięciem (przynajmniej według instrukcji).
  17. A tam zaraz następny... jeszcze wciąż ten sam. Bo na razie przesyłasz jakąś stałą wartość "T123". A teraz wyobraź sobie, że: cyferka za 'T' to numer czujnika, zdeklarowany gdzieś wyżej i zdefiniowany np. jako stała lub jako zmienna odczytywana skądkolwiek (z preferencji, zwarcia jakiegoś pinu do masy czy skądkolwiek - nieważne co) napis za cyferką to temperatura. Do wyboru: int = temperatura (czyli z dokładnością do stopnia) float = temperatura (czyli z maksymalną ustaloną dokładnością, max. 1/16 stopnia, w sumie najgorsza możliwość) int = 2 * temperatura (czyli z dokładnością do 0.5 stopnia) lub 4 * temperatura (czyli z dokładnością do 0.25 stopnia) Wybierz jedną z nich (będziemy się tego konsekwentnie trzymać), załóż że temperatura siedzi w zmiennej o nazwie "temp" i odpowiednim typie (możesz do niej podstawić na razie stałą wartość albo skorzystać z generatora losowego), zrób tak, aby nadający ESP przekazywał tak skonstruowany napis, pochwal się, odpocznij chwilkę bo dalej będzie trochę trudniej.
  18. Po prostu nie operować, jeśli się nie zmienia Przykład: // globalna zmienna int poprzedniaWartosc = -1; // najlepiej jakaś niemożliwa wartość, np. -100 dla termometru pokojowego // w loop: int wyswietlanaWartosc = cośtam(); if (wyswietlanaWartosc != poprzedniaWartosc) { wyczysc_wyswietlacz_i_wyswietl_wartosc(); poprzedniaWartosc = wyswietlanaWartosc; }
  19. No coś takiego. Działa? Jeśli tak to chciałbym wiedzieć, można jechać dalej; jeśli nie to też chciałbym wiedzieć, popróbujemy z innymi narzędziami. Jeden drobiazg: tablica incomingPacket musi mieć rozmiar o jeden większy niż podajesz w Udp.read() - po prostu musi tam się zmieścić kończące zero.
  20. Jakbyś dokładnie poczytał co w tym kodzie nawyczyniałeś to byś wiedział. Po prostu Twój program robi coś takiego: robi jakieś odczyty (co trwa jakiś ułamek sekundy) czyści wyświetlacz (co trwa jakiś tam ułamek sekundy) wyświetla coś na wyświetlaczu (co też trwa) sprawdza, czy coś trzeba zrobić; dochodzi do wniosku że nie (co trwa bardzo krótko) , w związku z tym przechodzi do punktu 1 Wskutek tego tekst jest widoczny na wyświetlaczu tylko przez krótką chwilę, a z uwagi na bezwładność wzroku masz wrażenie, że obraz jest nieprawidłowy. Czy da się tego uniknąć nie wprowadzając delaya? Oczywiście - wystarczy że będziesz operował wyświetlaczem tylko wtedy, gdy wyświetlana wartość się zmieniła.
  21. Zostaw ten czujnik, wrzuć tam jakiś random() bo nie wolno zajmować się dwiema rzeczami na raz. Możesz wstawiać większe fragmenty kodu? Na przykład nie wiem, jakiego typu jest "temp". Inna sprawa, że jakiego by nie była to jest źle... ale chyba chciałbyś wiedzieć na czym polega błąd? Zamiast ściubać fafnaście write po kolei możesz użyć sprintf - akurat na esp8266 działa bardzo dobrze. Mniej pisania będzie. I błędów. Poza tym prosiłem: Uwierz mi, po coś o to prosiłem... i powtarzam: jeśli tego nie zrobisz dalej nie ma sensu iść. Cała procedura komunikacji z termik4temp musi być napisana inaczej (bo w tej konfiguracji jaką masz nie ma żadnego sensu), ale nie możemy tego zrobić dopóki nie będziesz miał działających (w tej kolejności): przesyłania danych o temperaturze dekodowania tych danych na serwerze i zapamiętywania w jakiś sensowny sposób wyświetlania danych na wyświetlaczu (poprzedzonego oglądaniem ich na wyjściu serial). Co do komunikacji między dwoma ESP: co powiesz na przeczytanie sobie https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html#udp ze szczególnym uwzględnieniem przykładów oraz listy funkcji? Bo na razie wtykasz tam jakieś funkcje na czuja (tak mi się wydaje, bo owo wtykanie jest ewidentnie błędne) ale do dokumentacji nie sięgniesz... piszesz że na stare lata nabrałeś chęci do nauki - no to się ucz, ale weź do ręki ten nieszczęsny elementarz! Czekam na rozwiązanie - bo temat bardzo fajny, roboty niewiele, kod prosty jak precelek a jak to skończysz i opiszesz to akurat się załapiesz na promocję w Botlandzie!
  22. No to spróbuj uporać się z tym co pisałem... ja tu sobie specjalnie termika na telefonie zainstalowałem, doceń moje poświęcenie
×
×
  • Utwórz nowe...