Skocz do zawartości

Połączenie dwóch esp8266 do pomiaru temperatur


Pomocna odpowiedź

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

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

(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

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

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.

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

 

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?

 

 

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