Skocz do zawartości
jaro44

Połączenie dwóch esp8266 do pomiaru temperatur

Pomocna odpowiedź

ok, dane z ds18b20 zastąpiły już stałą "22"

teraz zabieram się za walkę z odbiornikiem

 

Udostępnij ten post


Link to post
Share on other sites

czy int może pokazywać temperaturę z czujnika po przecinku?

Udostępnij ten post


Link to post
Share on other sites

Bezpośrednio nie... no bo jak? Liczba całkowita to liczba całkowita, i żadnych kawałków mieć nie może.

Ale... z jaką dokładnością chcesz mieć temperaturę? Bo wszystko da się zrobić.

Przykładowo: jeśli potrzebujesz dokładności do pół stopnia, to operujesz jednostką "pół stopnia" (czyli temperatura razy dwa), a przed wyświetlaniem zamieniasz ją na coś strawnego dla wywietlacza.

 

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

potrzebuję aby wyświetlało skoki temperatury z dokładnością jednego miejsca po przecinku

dlatego zastanawiam się dlaczego nie float?

Edytowano przez jaro44

Udostępnij ten post


Link to post
Share on other sites

No to trochę nie bardzo... ten termometr nie pracuje z dokładnością jednego miejsca po przecinku - masz do wyboru albo 1/8 stopnia, albo 1/16 stopnia.

Pomijając ten drobiazg... mnożysz w nadajniku temperaturę przez 10 i masz wymaganą dokładność (pod warunkiem ustawienia termometru na 1/16 stopnia). Cały czas operujesz takim "decystopniem", a dopiero przy wyświetlaniu zamieniasz to na stopnie. Ponieważ wyświetlaniem zajmiesz się później (kiedy będzie co wyświetlać), na razie się nim nie przejmuj.

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

ok, dzięki za "łopatologiczne" wytłumaczenie.

Wracam, więc do prób zapisania tego w tablicy int

Udostępnij ten post


Link to post
Share on other sites
2 godziny temu, ethanak napisał:
  • stwierdzić czy jest to sygnał od termometru?
  • jeśli tak to od którego?
  • jeśli dane się zgadzają, wpisać aktualną temperaturę do jakiejś tablicy?

wydaje mi się, że dane zapisuje do tablicy termometr[3], ale nie wiem jak sprawdzić 2 pierwsze punkty,

i czy te dane są poprawnie zapisane.

Chyba muszę się przewietrzyć, bo czym więcej czytam, tym mniej wiem 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Punkt pierwszy: czy pierwszym znakiem jest 'T'? Jeśli nie, nie jest to sygnał od termometru.

Punkt drugi: czy drugim znakiem jest cyfra określająca numer czujnika (czyli od '1' do 'ilość czujników')? Jeśli nie, to nie jest sygnał od termometru.

Indeks tablicy to (drugi_znak - '1') + ilość_termometrów_podłączonych_bezpośrednio;

Wartość wpisywana to fragment od trzeciego znaku przekształcony na int.

Pamiętaj, że pozycje w napisach liczą się od zera! Indeksy w tablicach też!

 

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites

Chyba jednak będę musiał odpuścić, ponieważ stwierdzam, że mój umysł nie jest w stanie tego ogarnąć.

Udostępnij ten post


Link to post
Share on other sites

E tam - poddajesz się? A taki fajny pomysł... i już do końca blisko...

Dla dwóch czujników na przykład:

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

                                                                          

Czego tu nie rozumiesz?

Odpocznij, wyjdź na spacer (do drugiego pokoju), wypij kawę, obejrzyj film (koniecznie familijny), prześpij się i wróć.

Udostępnij ten post


Link to post
Share on other sites

Zbyt wieli rzeczy nie rozumiem skąd i dlaczego, stąd moje zniechęcenie,

ale pewnie masz rację, że po chwili relaksu wróci mi zapał do dalszej walki.

Udostępnij ten post


Link to post
Share on other sites

Dobra, cofnąłem się i robię po kolei tak jak zaleciłeś.

Więc chciałbym potwierdzenia, że na tym etapie nie mam żadnych błędów.

//ESP8266 client

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

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

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

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

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  WiFi.config(IPAddress(192, 168, 1, 103), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0));

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

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

}

void loop() {
  DS18B20.requestTemperatures();
  delay(5000);
  char bufor[16];
  int temp = DS18B20.getTempCByIndex(0)*100;
  int numer = 1;
  int len=sprintf(bufor,"T%d%d", numer, temp);
  Udp.beginPacket("192.168.1.102", 12345);
  Udp.write(bufor, len);
  Udp.endPacket();

  delay(5000);
}
//ESP8266 server

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

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

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

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)
  {
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(packetBuffer, 255);
    if (len > 0)
    {
      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);
  }
}
Received 6 bytes from 192.168.1.103, port 53260
UDP packet contents: T12106
Received 6 bytes from 192.168.1.103, port 53260
UDP packet contents: T12106
Received 6 bytes from 192.168.1.103, port 53260
UDP packet contents: T12106
Received 6 bytes from 192.168.1.103, port 53260
UDP packet contents: T12112
Received 6 bytes from 192.168.1.103, port 53260
UDP packet contents: T12112

 

Udostępnij ten post


Link to post
Share on other sites

Drobiazg - ale błąd był w przykładzie

Masz tam:

if (len > 0)
    {
      packetBuffer[len] = 0;
    }
    

Jeśli długość pakietu jest 0 to i tak trzeba to zero wstawić, a więc po prostu:

      packetBuffer[len] = 0;
    

Teraz przydałoby się zabrać za wyświetlanie... może najpierw kontrolnie będziemy co jakiś czas wypisywać na Serial zawartość tablicy termometr (powiedzmy co 2 sekundy, żeby za dużo nie migało):

static uint32_t ostatnio = millis();
if (millis() - ostatnio > 2000) {
  ostatnio = millis();
  printf("%d %d %d %d\n", termometr[0], termometr[1], termometr[2], termometr[3]);
}

Wstaw ten kod na samym końcu funkcji loop() - w efekcie powinieneś zobaczyć, że termometr[2] ma wartość taką, jaką przesłał mu nadajnik. Gdybyś teraz zrobił drugi nadajnik zmieniając tylko numerek z 1 na 2 - miałbyś obie temperatury na pozycjach 2 i 3...

Masz pomysł na to, aby termometry które są podłączone bezpośrednio do serwera wrzucały wyniki swoich pomiarów do tablicy termometry na dwa pierwsze miejsca?

 

 

Udostępnij ten post


Link to post
Share on other sites

odczytać seriale DS18B20 i zgodnie z nimi wysłać do tablicy?

Udostępnij ten post


Link to post
Share on other sites

Zrób to. Nie przejmuj się że będzie kulawo działać - za chwilę to odkulawimy 🙂

Udostępnij ten post


Link to post
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!

Gość
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...