Skocz do zawartości

Połączenie dwóch esp8266 do pomiaru temperatur


jaro44

Pomocna odpowiedź

(edytowany)

Trzy dni temu nie wiedziałem nic na temat pisania kodu, więc proszę wybacz mi.

I muszę przyznać, że wciąż nie rozumiem tego porównania:

18 minut temu, ethanak napisał:

Jeśli masz cztery szklanki wódki, to indeksem będzie mililitr czy int?

wrzucam cały kod  na tę chwilę

//ESP8266 server

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

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

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define TESTY 1

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

  Adafruit_SSD1306 display;

  IPAddress ip(192, 168, 1, 102);
  IPAddress gateway(192, 168, 1, 1);
  IPAddress subnet(255, 255, 255, 0);

  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

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

  WiFiUDP Udp;
  unsigned int localUdpPort = 12345;

  char packetBuffer[255];

  int termometr[4]={12700,12700,12700,12700};
  int termometr_kopia[4];

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

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);

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

  Udp.begin(localUdpPort);
  DS18B20.begin();
  DS18B20.requestTemperatures();
  display.begin(SSD1306_SWITCHCAPVCC);
  display.display();
}

void loop()
{
  static uint32_t czas_przyjscia_pakietu[4];
  
  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);
    czas_przyjscia_pakietu[indeks] = millis();
  }
  }

  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();
           zlecenie = true;
           ostatnio = millis();
        }
      }

  if (millis() - czas_przyjscia_pakietu[2] > 11000)
  {
     termometr[2] = -12700;
  }
  if (millis() - czas_przyjscia_pakietu[3] > 11000)
  {
     termometr[3] = -12700;
  }

  int i;
  for (i=0; i<4; i++)
  {
    if (termometr[i] != termometr_kopia[i]) break;
  }

  if (i < 4)
  {
    printf("%d %d %d %d\n", termometr[0], termometr[1], termometr[2], termometr[3]);
    for (i=0; i<4; i++) termometr_kopia[i] = termometr[i]; 
  }

}

 

Edytowano przez jaro44
Link do komentarza
Share on other sites

6 minut temu, jaro44 napisał:

Trzy dni temu nie wiedziałem nic na temat pisania kodu, więc proszę wybacz mi.

I muszę przyznać, że wciąż nie rozumiem tego porównania:

21 minut temu, ethanak napisał:

Jeśli masz cztery szklanki wódki, to indeksem będzie mililitr czy int?

No więc spróbujmy.

Na stole stoi N szklanek, każda o pojemności 200 ml (czyli takie szklankowe uintcośtam_t);

W każdej szklance może być różna ilość wódki, określona w mililitrach (czyli wartość typu uintcośtam_t);

Jeśli zapytasz, ile wódki jest w trzeciej szklance, to numerem szklanki nie będzie mililitr (czyli wartość typu uintcośtam_t), ale abstrakcyjna liczba naturalna (czyli po naszemu int).

A co do trzech dni... i tak się baaaardzo szybko uczysz 🙂

Co do kodu... co tam nie działa? Nie widzę nic co by miało nie działać, ale ja trochę przyślepawy jestem i mogę nie zauważyć a nie bardzo mam jak to wrzucić na ESP...

Link do komentarza
Share on other sites

nie no teraz działa, więc wkleiłem do ewentualnej "obróbki termicznej"

2 minuty temu, ethanak napisał:

A co do trzech dni... i tak się baaaardzo szybko uczysz 🙂

pewnie pomaga trochę znajomość podstaw linux, bo od lat tylko tego systemu używam - domowy server NAS i laptop

PS.

A z tą wódka to mi tylko smaka narobiłeś, muszę jakąś videoimprezę zorganizować  🙂

Link do komentarza
Share on other sites

coś szwankuje odbiór pakietów udp

2243 -12700 2350 1950
Received 6 bytes from 192.168.1.104, port 61249
UDP packet contents: T21950
Received 6 bytes from 192.168.1.104, port 61249
UDP packet contents: T21950
2237 -12700 2350 1950
2243 -12700 2350 1950
2243 -12700 -12700 1950
2250 -12700 -12700 1950
2256 -12700 -12700 1950
2256 -12700 -12700 -12700
2262 -12700 -12700 -12700
2256 -12700 -12700 -12700
2262 -12700 -12700 -12700
2268 -12700 -12700 -12700
2275 -12700 -12700 -12700
2281 -12700 -12700 -12700
2275 -12700 -12700 -12700
2268 -12700 -12700 -12700
Received 6 bytes from 192.168.1.104, port 61249
UDP packet contents: T21950
2268 -12700 -12700 1950
2275 -12700 -12700 1950
Received 6 bytes from 192.168.1.104, port 61249
UDP packet contents: T21950
2268 -12700 -12700 1950
Received 6 bytes from 192.168.1.103, port 61346
UDP packet contents: T12381
2268 -12700 2381 1950
2275 -12700 2381 1950
Received 6 bytes from 192.168.1.104, port 61249
UDP packet contents: T21950
2268 -12700 2381 1950
Received 6 bytes from 192.168.1.103, port 61346
UDP packet contents: T12381

możliwe żeby tak często i tak wiele pakietów nie dochodziło?

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

No to jak do "obróbki" to jeden drobiazg:

masz na razie dwa zewnętrzne termometry. A co by było, gdybyś miał ich dwadzieścia? Pisałbyś dwadzieścia razy ten sam fragment kodu

if (millis() - czas_przyjscia_pakietu[2] > 11000)
  {
     termometr[2] = -12700;
  }
  

zmieniając tylko dwójkę na kolejne numerki?

 

A może po prostu raz a dobrze, niech procek się tym zajmuje?

for (i = 2; i < 4; i++) {
  if (millis() - czas_przyjscia_pakietu[i] > 11000)
    {
      termometr[i] = -12700;
    }
  }
  

po to ludzie pętle wymyślili, żeby z nich korzystać. Szczególnie, że już w programie  takie są...

Przenieś tylko deklarację "int i" przed tę pętle, żeby kompilator wiedział co to jest.

Co powiesz na to, żeby sobie teraz napisać wyświetlanie? Możesz zrobić coś takiego:
 

char bufor[16]; // tak żeby się napis zmieścił
sprintf(bufor,"%6.2f", termometr[i] / 100.0);
display.print(bufor);

 

1 minutę temu, jaro44 napisał:

możliwe żeby tak często i tak wiele pakietów nie dochodziło?

Wypisuj czas przyjścia pakietu , czyli coś w rodzaju:

    czas_przyjscia_pakietu[indeks] = millis();
    printf("Pakiet dla %d milisekunda %u\n", indeks, czas_przyjscia_pakietu[indeks] );

Bez tego nie będziesz wiedział co się dzieje.

Link do komentarza
Share on other sites

(edytowany)

Już chyba wiem to prawdopodobnie termik niewyłączony w smartfonie zakłócał,

miałem tam kiedyś ustawiony ten sam port i adres.

Włączyłem go na chwilę, żeby coś sprawdzić i zaczął się problem,

po całkowitym wyłączeniu termika już chyba jest ok

EDIT:

To jednak  nie to, ponieważ po kilku minutach problem wrócił 😞

2293 -12700 12700 12700
Received 6 bytes from 192.168.1.104, port 61249
UDP packet contents: T21950
Pakiet dla 3 milisekunda 13806
2293 -12700 12700 1950
2287 -12700 12700 1950
2293 -12700 12700 1950
2287 -12700 12700 1950
2300 -12700 12700 1950
2300 -12700 -12700 1950
2293 -12700 -12700 1950
2287 -12700 -12700 1950
2287 -12700 -12700 -12700
2281 -12700 -12700 -12700
2275 -12700 -12700 -12700
2281 -12700 -12700 -12700
2275 -12700 -12700 -12700
2268 -12700 -12700 -12700
2275 -12700 -12700 -12700
2268 -12700 -12700 -12700
2275 -12700 -12700 -12700
2268 -12700 -12700 -12700
2262 -12700 -12700 -12700
Received 6 bytes from 192.168.1.103, port 64131
UDP packet contents: T12075
Pakiet dla 2 milisekunda 211137
2262 -12700 2075 -12700
2243 -12700 2075 -12700
Received 6 bytes from 192.168.1.104, port 61249
UDP packet contents: T21950
Pakiet dla 3 milisekunda 216303
2243 -12700 2075 1950
2250 -12700 2075 1950
Received 6 bytes from 192.168.1.103, port 64131
UDP packet contents: T12075
Pakiet dla 2 milisekunda 221296
2237 -12700 2075 1950
Received 6 bytes from 192.168.1.104, port 61249
UDP packet contents: T21950
Pakiet dla 3 milisekunda 226518
2225 -12700 2075 1950
Received 6 bytes from 192.168.1.103, port 64131
UDP packet contents: T12068
Pakiet dla 2 milisekunda 231433
2225 -12700 2068 1950

 

Edytowano przez jaro44
Link do komentarza
Share on other sites

Udp ma to do siebie, że czasem nie dochodzi... ale trochę tego dużo. Termik na pewno nie będzie zakłócać nawet na tym samym porcie.

Te satelity ESP nie stoją gdzieś przypadkiem na granicy zasięgu? U mnie czasami potrafi się zgubić na drugim końcu mieszkania...

 

Link do komentarza
Share on other sites

No to może być pięćset różnych powodów (zapchany kanał WiFi na przykład).

Masz w nadajniku coś takiego:
 

Udp.beginPacket(cośtam);
Udp.cośtam()
Udp.endPacket()

Zamień to na:

for (int i=0; i<5; i++) {
  Udp.beginPacket(cośtam);
  Udp.cośtam()
  Udp.endPacket()
  delay(1000);
}

i wywal delay(5000) na razie.

Zobaczymy ile pakietów zgubi w ten sposób.

PS. Ja też mam jazdę - od dwóch godzin szukam błędu w programie, a okazało się że mam uszkodzony port w Pro Mini 🙂

 

Link do komentarza
Share on other sites

(edytowany)

na razie leci wszystko, więc zajmę się tym jak problem wróci,

ustawię tylko czas przyjscia pakietu > 10 minut (bo to nie piekarnik i zmiany temperatur nie są tak gwałtowne, więc jak zgubi nawet na 10 min to nie powód zgłaszania awarii)

teraz zajmę się wyświetlaniem na oled i przez termik

Edytowano przez jaro44
Link do komentarza
Share on other sites

Jedna linijka to raczej nie wiem, ale tak "na piechotę" to bym pewnie coś wymyślił na podstawie kodu autora termika.

Poczekam więc na sugestie profesjonalnego rozwiązania, a tymczasem zajmę się samym oled

Link do komentarza
Share on other sites

3 minuty temu, jaro44 napisał:

Jedna linijka to raczej nie wiem, ale tak "na piechotę" to bym pewnie coś wymyślił na podstawie kodu autora termika.

No właśnie... na podstawie tego kodu lepiej nic nie wymyślać 🙂

 

Link do komentarza
Share on other sites

  char bufor[16];
  display.clearDisplay();
  sprintf(bufor,"%6.2f", termometr[i] / 100.0);
  display.print(bufor);
  display.display();

Czy to powinno coś wyświetlać?

Bo tylko mi wygasza logo Adafruit i zostaje czarny ekran.

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.