Skocz do zawartości

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

(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

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?

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.

 

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ć?

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.

 

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.

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?

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

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ć

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