Skocz do zawartości

Połączenie dwóch esp8266 do pomiaru temperatur


jaro44

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
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 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
Link do komentarza
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 🙂

Link do komentarza
Share on other sites

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
Link do komentarza
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óć.

Link do komentarza
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

 

Link do komentarza
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?

 

 

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.