Skocz do zawartości

Połączenie dwóch esp8266 do pomiaru temperatur


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?

 

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?

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.

(edytowany)

dlatego napisałem że te 255 to błąd wg mnie, ale Tobie nie o ten błąd chodziło

czyli w char muszę zmienić na 256 lub w read na 254, czy tak?

Edytowano przez jaro44
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);
  }

 

(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

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?

 

 

//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

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

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?

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]);
  }
}

 

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