Skocz do zawartości

Połączenie dwóch esp8266 do pomiaru temperatur


Pomocna odpowiedź

(edytowany)

Napisałem, bo to już miałem opanowane, wyświetlacz wersji autora termika dodałem i działał jak chciałem.

Pewnie tradycyjnie znów jakąś pierdółką przeoczyłem, zaraz to sprawdzam i poprawiam.

delay mogę użyć, czy też kombinować z millis?

Edytowano przez jaro44

Chodzi o to, że kod autora termika będzie działał... ale nie do końca. Tymczasem my tu mamy wszystko przygotowane i wystarczy w odpowiedzi na pakiet wysłać mu dane które mamy w tablicy termometr. Zero opóźnień, jakichś obliczeń, noże działać na tym samym porcie co termometry zdalne.

Zrobiłem tak u siebie (tyle że nie ESP a RPi, ale to żadna różnica, pakiet to pakiet).

(edytowany)

Działa

  display.clearDisplay();
  char bufor[16];
  sprintf(bufor,"%6.2f", termometr[0] / 100.0);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Temperatura w salonie");
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(10,12);
  display.print(bufor);
  display.println(" C");
  display.display();
  display.clearDisplay();

Na razie tylko salon, dopasuje jeszcze zewnętrzną, aby się wyświetlała naprzemiennie

ale docelowo muszę pomyśleć o większym wyświetlaczu (może nawet dotykowym jesli to mozliwe).

Na chwilę obecną ten wystarczy.

Mam nadzieję, że to tak miało w zamierzeniu wyglądać.

A soją drogą to jeden DS18b20 mam chyba uszkodzony, mierzy temperatury tylko co 0,5 C

1950 2000 2050 2100 itd.

Edytowano przez jaro44
  • Lubię! 1
35 minut temu, jaro44 napisał:

A soją drogą to jeden DS18b20 mam chyba uszkodzony, mierzy temperatury tylko co 0,5 C

A ustawiłeś rozdzielczość?

w setup():
 

DS18B20.setResolution(12); // 12 bitów czyli 1/16 stopnia
DS18B20.waitForConversion(false); // request nie ma czekać na koniec konwersji

(czy jakoś tak)

 

(edytowany)

A kto powiedział, że DS ma startować od razu z rozdzielczością 12 bitów? Po to są te funkcje żeby z nich korzystać, a nie po to żeby miejsce we flashu zajmowały...

Termik jest prosty:

Dopisujesz kawałeczek:

if (packetBuffer[0] == 'T' && packetBuffer[0] >='1' && packetBuffer[1] <= '2')
  {
    int indeks = packetBuffer[1] - '1' + 2;
    termometr[indeks] = atoi(packetBuffer+2);
    czas_przyjscia_pakietu[indeks] = millis();
  }
  // i tutaj:
  else // jak to nie termometr, to pewnie pakiet od termika
  {
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    int len=sprintf(packetBuffer,"n1%.2fxn2%.2fxn3%.2fxn4%.2fx",
            termometr[0] / 100.0,
            termometr[1] / 100.0,
            termometr[2] / 100.0,
            termometr[3] / 100.0);
    Udp.write(packetBuffer, len);
    Udp.endPacket();
  }
  // koniec dopisanego fragmentu


    

 

W sumie ważna jest ta jedna linijka ze sprintfem 🙂

Daj znać czy działa (u mnie na RPi działa).

Edytowano przez ethanak
  • Lubię! 1

Przepraszam, mój błąd - tak to jest jak się próbuje robić trzy rzeczy na raz (swoją drogą nieprawidłowy pakiet nie powinien wywalać aplikacji, ale pewnie autor tak chciał).

"n1=%.2fxn2=%.2fxn3=%.2fxn4=%.2fx"

To powinno zadziałać - podmień string formatujcy w sprintf.

 

właśnie przeglądałem float  z oryginału i też mi się wydawało że brakuje tego "=",

ale nie do końca rozumiałem tę konstrukcję:

3 minuty temu, ethanak napisał:

 


"n1=%.2fxn2=%.2fxn3=%.2fxn4=%.2fx"

 

muszę się tego douczyć 😉

niestety dalej go wywala

12 minut temu, jaro44 napisał:

niestety dalej go wywala

Sprawdzę później - teraz mam zajętego kompa.

13 minut temu, jaro44 napisał:

muszę się tego douczyć 😉

Jeśli siedzisz na linuksie wpisz w konsolę "man printf", jeśli nie to wpisz to w google.

Poza tym podawałem taki ładny łink do wikibooks...

 

1 minutę temu, ethanak napisał:

Jeśli siedzisz na linuksie wpisz w konsolę "man printf"

Wszystko ładnie, pięknie, ale ja pochodzę z czasów kiedy jedyny słuszny język obcy to był rosyjski,

więc takie manuale po angielsku to dla mnie męczarnia i nie zawsze zrozumiałe, ale jakoś to strawię.

 

Hm... właśnie wrzuciłem ten program na ESP - działa (termometry mam niepodłączone, ale -127.00 pokazuje bardzo ładnie), nie wywala termika.

Krytyczny fragment:

if (packetBuffer[0] == 'T' && packetBuffer[0] >='1' && packetBuffer[1] <= '2')
  {
    int indeks = packetBuffer[1] - '1' + 2;
    termometr[indeks] = atoi(packetBuffer+2);
    czas_przyjscia_pakietu[indeks] = millis();
  }
  else // jak to nie termometr, to pewnie pakiet od termika
  {
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    int len=sprintf(packetBuffer,"n1=%.2fxn2=%.2fxn3=%.2fxn4=%.2fx",
            termometr[0] / 100.0,
            termometr[1] / 100.0,
            termometr[2] / 100.0,
            termometr[3] / 100.0);
    Udp.write(packetBuffer, len);
    Udp.endPacket();
  }

 

Tak, tak  wszystko działa jak należy. brakowało mi udp.write (nie wiem czy Ty zapomniałeś na początku dodać, czy ja gdzieś zgubiłem).

Najważniejsze, że wszystko pięknie działa, ogromnie dziękuję za cierpliwość i nieocenioną pomoc.

Przetestuje dokładnie i wrzucę tutaj ostateczną wersję.

A tak coś mi się źle wkleiło ale myślałem że zdążę poprawić 🙂

No to teraz masz bojowe zadanie - zrobić porządne wyświetlanie 🙂 Aha, i wrzuć to do DIY z jakimś zdjęciem...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...