Skocz do zawartości

Połączenie dwóch esp8266 do pomiaru temperatur


jaro44

Pomocna odpowiedź

1 minutę temu, jaro44 napisał:

chodzi o rozmiar 255 pobieranego pakietu?

Nie - 255 jest w porządku o ile rozmiar tablicy jest 256 (o tym było wcześniej).

Jak to ma działać?

Czy tak:

Czy odebraliśmy pakiet:
   jeśli tak:
      wypisujemy informację o odebraniu pakietu
      obrabiamy pakiet

Czy tak:

Czy odebraliśmy pakiet?
  jeśli tak:
      wypisujemy informację o odebraniu pakietu
Niezależnie od tego czy pakiet odebraliśmy czy nie i tak go obrabiamy
        

Którą masz wersję i dlaczego?

 

Link do komentarza
Share on other sites

może niezbyt to jednak dobrze zrozumiałem, bo wg mnie tablice mam właśnie 255

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

 

4 minuty temu, ethanak napisał:

Czy odebraliśmy pakiet? jeśli tak: wypisujemy informację o odebraniu pakietu Niezależnie od tego czy pakiet odebraliśmy czy nie i tak go obrabiamy

czyli ma być jeśli liczba bajtów odebranego pakietu > 0 to obrabiam?

Link do komentarza
Share on other sites

4 minuty temu, jaro44 napisał:

może niezbyt to jednak dobrze zrozumiałem, bo wg mnie tablice mam właśnie 255

No to nie czytasz wszystkiego co Ci piszę. W read() ma być o jeden mniej niż wielkość tablicy. Dlaczego?

No a pomyśl sobie: tablica ma pojemność 255 bajtów. Odbierasz 255 (czyli cała tablica jest pełna) i na pozycji 255 dopisujesz do tego znak zero. Gdzie on się zapisze, bo przecież tablica się skończyła?

6 minut temu, jaro44 napisał:

czyli ma być jeśli liczba bajtów odebranego pakietu > 0 to obrabiam?

Dokładnie tak.

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

if (packetSize>0)
  {
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(packetBuffer, 254);
    packetBuffer[len] = 0;
    Serial.printf("UDP packet contents: %s\n", packetBuffer);
  }
  
  if (packetBuffer[0] == 'T' && packetBuffer[0] >='1' && packetBuffer[1] <= '2') {
	int indeks = packetBuffer[1] - '1' + 2;
    termometr[indeks] = atoi(packetBuffer+2);
  }

 

Link do komentarza
Share on other sites

(edytowany)

aa, czyli niżej ta sama sytuacja

ps.

i przy okazji jeszcze, czy wyświetlanie danych po serialu jest potrzebne poza testami,

jeśli nie to czy je potem usunąć, czy to nie przeszkadza?

tak będzie ok?

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

    if (packetBuffer[0] == 'T' && packetBuffer[0] >='1' && packetBuffer[1] <= '2') {
  	int indeks = packetBuffer[1] - '1' + 2;
      termometr[indeks] = atoi(packetBuffer+2);
    }
  }
Edytowano przez jaro44
Link do komentarza
Share on other sites

Teraz jest OK pomijając nadmiarowe nawiasy. Czyli w skrócie:

  int packetSize = Udp.parsePacket();
  if (packetSize>0)
  {
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(packetBuffer, packetSize);
    packetBuffer[len] = 0;
    Serial.printf("UDP packet contents: %s\n", packetBuffer);
    if (packetBuffer[0] == 'T' && packetBuffer[0] >='1' && packetBuffer[1] <= '2') {
  	int indeks = packetBuffer[1] - '1' + 2;
    termometr[indeks] = atoi(packetBuffer+2);
  }

 

19 minut temu, jaro44 napisał:

i przy okazji jeszcze, czy wyświetlanie danych po serialu jest potrzebne poza testami,

Na razie zostawmy - dobrze jest wiedzieć co się dzieje.

Można zrobić trochę inaczej (tak powiedzmy "profesjonalniej")

Na początku zaraz po wszystkich include <> wstawiamy coś takiego:

#define TESTY 1

A potem w kodzie programu:

#ifdef TESTY
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
#endif

W gotowym programie wystarczy usunąć tę linijkę z #define i kompilator nie będzie brał pod uwagę tego co jest w bloku ifdef..endif.

Jeśli chcesz, możesz program w ten sposób przerobić. W każdym razie pokaż teraz cały kod programu - bo zanim zajmiemy się wyświetlaczem musimy coś zrobić, żeby sensownie wyświetlał (np. nie co dwie sekundy bo to dobre do kontroli, a wtedy kiedy trzeba).

A może masz pomysł na to, jak wypisywać na serialu temperatury nie co dwie sekundy a wtedy, kiedy się zmieniły?

 

 

Link do komentarza
Share on other sites

//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; // zaczynany od indeksu 2 bo 0 i 1 to termometry bezpośrednie
    termometr[indeks] = atoi(packetBuffer+2);
  }

  static uint32_t ostatnio = millis();
  if (millis() - ostatnio > 2000) {
    ostatnio = millis();
    DS18B20.requestTemperatures();
  }

  termometr[0] = DS18B20.getTempC(t1)*100;
  termometr[1] = DS18B20.getTempC(t2)*100;
  
  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]);
  }
}

sorki, piesek 🙂

38 minut temu, ethanak napisał:

A może masz pomysł na to, jak wypisywać na serialu temperatury nie co dwie sekundy a wtedy, kiedy się zmieniły?

tak na szybko to nie, ale już zaczynam szukać rozwiązania

Link do komentarza
Share on other sites

coś takiego?:
 

if (zmienna1 != zmienna2)
{
prinf ()
}

zmienna1 to aktualne dane z czujnika

zmienna2 to ta zapisana w tablicy

 

Już widzę, że tak nie da rady, bo:

  termometr[0] = DS18B20.getTempC(t1)*100;
  termometr[1] = DS18B20.getTempC(t2)*100;

 

szukam innego rozwiązania

Link do komentarza
Share on other sites

Zaraz zaraz... to jest kod przed poprawkami, zdaje się że coś tam się zmieniło, prawda? np. dwuetapowe czytanie termometrów...

Co do zmienna1 i zmienna2 - fajnie, a jak to zrobisz dla trzech termometrów?

Link do komentarza
Share on other sites

2 minuty temu, ethanak napisał:

Zaraz zaraz... to jest kod przed poprawkami, zdaje się że coś tam się zmieniło, prawda? np. dwuetapowe czytanie termometrów...

aa tak jeden nawiasik trochę niżej

//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 uint32_t ostatnio = millis();
  if (millis() - ostatnio > 2000) {
    ostatnio = millis();
    DS18B20.requestTemperatures();
  }

  termometr[0] = DS18B20.getTempC(t1)*100;
  termometr[1] = DS18B20.getTempC(t2)*100;
  
  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]);
  }
}

 

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.