Skocz do zawartości

Połączenie dwóch esp8266 do pomiaru temperatur


jaro44

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ę).

Link do komentarza
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
Link do komentarza
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?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

 

Link do komentarza
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.

 

Link do komentarza
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?

Link do komentarza
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).

Link do komentarza
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ć

Link do komentarza
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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.