Skocz do zawartości
jaro44

Połączenie dwóch esp8266 do pomiaru temperatur

Pomocna odpowiedź

Coś ja pisałem ostatnio o requestTemperature(), czekaniu najpierw na konwersję, odczycie, odczekaniu do następnego odczytu... po co ja to wszystko piszę? Ja naprawdę mam co robić, to że siedzę przy kompie nie oznacza że się nudzę (taką mam pracę).

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Przepraszam, naprawdę doceniam Twój ogromny wkład w moją edukację.

Musiałem zrobić porządki, bo mi się przez ich nawał troszkę pomieszało:

//ESP8266 server

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define TESTY 1

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

const char* ssid = "xxx";
const char* password = "yyy";

WiFiUDP Udp;
  unsigned int localUdpPort = 12345;
  char packetBuffer[255];
  int termometr[4];

  DeviceAddress t1 = { 0x28, 0xfb, 0x50, 0x79, 0xA2, 0x00, 0x03, 0x61 }; // - adres DS18B20 - 1
  DeviceAddress t2 = { 0x28, 0x44, 0x2B, 0x79, 0xA2, 0x00, 0x03, 0x5F }; // - adres DS18B20 - 2

void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
    WiFi.config(IPAddress(192, 168, 1, 102), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0));

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("connected");

  Udp.begin(localUdpPort);
}
void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize>0)
  {
    #ifdef TESTY
      Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    #endif
    int len = Udp.read(packetBuffer, packetSize);
    packetBuffer[len] = 0;
    #ifdef TESTY
    Serial.printf("UDP packet contents: %s\n", packetBuffer);
    #endif

  
    if (packetBuffer[0] == 'T' && packetBuffer[0] >='1' && packetBuffer[1] <= '2')
    {
      int indeks = packetBuffer[1] - '1' + 2;
      termometr[indeks] = atoi(packetBuffer+2);
    }
  }

  static bool zlecenie = true;
  static uint32_t ostatnio = millis();

  if (zlecenie)
  {
    if (millis() - ostatnio > 750)
    {
      termometr[0] = DS18B20.getTempC(t1)*100;
      termometr[1] = DS18B20.getTempC(t2)*100;
      zlecenie = false;
    }
      else
      {
        if (millis() - ostatnio > 5000)
        {
           DS18B20.requestTemperatures();
           ostatnio = millis();
        }
      }
  }
  
  static uint32_t ostatnio2 = millis();
  if (millis() - ostatnio2 > 2000)
  {
    ostatnio2 = millis();
    printf("%d %d %d %d\n", termometr[0], termometr[1], termometr[2], termometr[3]);
  }
}

 

Edytowano przez jaro44

Udostępnij ten post


Link to post
Share on other sites

Przepraszam - mój błąd (chociaż mogłeś go zauważyć).

if (zlecenie) {
  if (millis() - ostatnio > 750) { // tyle trzeba czekać przy najwyższej rozdzielczości
    termometr[0] = DS18B20.getTempC(t1)*100;
    termometr[1] = DS18B20.getTempC(t2)*100;
    zlecenie = False; // unieważniamy zlecenie, ale jeszcze nie kasujemy stopera
  }
} else {
    if (millis() - ostatnio > 5000) {
       DS18B20.requestTemperatures();
       ostatnio = millis();
    }
}

gdzieś mi uciekł jeden nawias...

Tak przy okazji, na końcu setup() powinno być DS18B20.requestTemperatures().

A co do wyświetlania tylko nowych wyników - co powiesz na porównanie dwóch tablic?

Udostępnij ten post


Link to post
Share on other sites

błędy zauważyłem (bo to nie był jedyny błąd) i poprawiłem co widać wyżej

Udostępnij ten post


Link to post
Share on other sites
20 minut temu, ethanak napisał:

Tak przy okazji, na końcu setup() powinno być DS18B20.requestTemperatures().

a nie wystarczy DS18B20.begin()

Udostępnij ten post


Link to post
Share on other sites
36 minut temu, jaro44 napisał:

poprawiłem co widać wyżej

Gdzie?

19 minut temu, jaro44 napisał:

a nie wystarczy DS18B20.begin()

Nie - begin() tylko przygotowuje sobie swoje tajne zmienne, ale nie rozpoczyna pomiaru.

 

Udostępnij ten post


Link to post
Share on other sites
2 minuty temu, ethanak napisał:

Gdzie?

Tutaj

3 minuty temu, ethanak napisał:

Nie - begin() tylko przygotowuje sobie swoje tajne zmienne, ale nie rozpoczyna pomiaru.

ale begin() tez powinno być?

Udostępnij ten post


Link to post
Share on other sites
1 minutę temu, jaro44 napisał:
5 minut temu, ethanak napisał:

Gdzie?

Tutaj

Nieprawda - w dalszym ciągu masz nieprawidłowe nawiasy.

1 minutę temu, jaro44 napisał:

ale begin() tez powinno być?

Oczywiście. To dwie różne funkcje i robią różne rzeczy - obie są potrzebne.

 

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, ethanak napisał:

Nieprawda - w dalszym ciągu masz nieprawidłowe nawiasy.

A ja wciąż uważam, że są poprawione, ale może się mylę, więc proszę pokaż mi.

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, jaro44 napisał:

A ja wciąż uważam, że są poprawione, ale może się mylę, więc proszę pokaż mi.

Masz:

    if (millis() - ostatnio > 750)
    {
      termometr[0] = DS18B20.getTempC(t1)*100;
      termometr[1] = DS18B20.getTempC(t2)*100;
      zlecenie = false;
    }
      else
      

Powinno być:

 if (millis() - ostatnio > 750) {
    termometr[0] = DS18B20.getTempC(t1)*100;
    termometr[1] = DS18B20.getTempC(t2)*100;
    zlecenie = false;
  }
} else
    

...i konsekwentnie poprawić nawiasy zamykające.

Widzisz różnicę? Wiesz jaki jest efekt?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

No, to w takim razie poprawiłem nie tak jak trzeba.

Brakowało jednego zamykającego, a ja to zamknąłem w złym momencie.

Edytowano przez jaro44

Udostępnij ten post


Link to post
Share on other sites
1 minutę temu, jaro44 napisał:

Brakowało jednego zamykającego, a ja to zamknąłem w złym momencie.

To proponuję ćwiczenie: co by się stało, gdyby uruchomić program bez tej poprawki? Bez podglądania proszę! 🙂

Jeśli ktoś to czyta - to naprawdę może być dobre ćwiczenie!

@jaro44To Ty sobie poćwicz, a ja muszę coś w domu zrobić (podobno ważnego).

Udostępnij ten post


Link to post
Share on other sites

dobra, chyba rozumiem

bez względu czy będzie true czy false, else i tak się wykona.

Mam nadzieję, że zdałem.

Udostępnij ten post


Link to post
Share on other sites

Ktoś jeszcze chętny? Ja muszę się zabawić w operatora filmowego 😞

Udostępnij ten post


Link to post
Share on other sites
5 godzin temu, ethanak napisał:

Czyli mamy coś takiego:


czy zleciliśmy odczyt?
jeśli tak:
   czy minęło 750 milisekund?
   jeśli tak:
        odczyt z termometru
jeśli nie:
   czy minęło 5000 milisekund?
   jeśli tak:
	   zlecamy odczyt
	   zerujemy stoper

 

musiałem podejrzeć

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...