Skocz do zawartości

Połączenie dwóch esp8266 do pomiaru temperatur


jaro44

Pomocna odpowiedź

(edytowany)

Nie no walczę, bo akurat chęci, cierpliwości i czasu mi nie brakuje.

void loop() {
  Serial.println(DS18B20.getTempCByIndex(0));

  Udp.beginPacket("192.168.1.102", 12345);
  DS18B20.requestTemperatures();
  temp = DS18B20.getTempCByIndex(0);
  Udp.write("SENSOR1 = ");
  Udp.write(temp);
  Udp.write("C");
  Udp.endPacket();

    delay(5000);

temperaturę z czujnika serial odczytuje, ale drugi esp nic nie dostaje 😞

Edytowano przez jaro44
Link do komentarza
Share on other sites

Zostaw ten czujnik, wrzuć tam jakiś random() bo nie wolno zajmować się dwiema rzeczami na raz.

Możesz wstawiać większe fragmenty kodu? Na przykład nie wiem, jakiego typu jest "temp". Inna sprawa, że jakiego by nie była to jest źle... ale chyba chciałbyś wiedzieć na czym polega błąd?

Zamiast ściubać fafnaście write po kolei możesz użyć sprintf - akurat na esp8266 działa bardzo dobrze. Mniej pisania będzie. I błędów.

Poza tym prosiłem:
 

Cytat

 

Niech drugi (a potem trzeci, czwarty i tak dalej) wysyła mu na ten port jakiś string, np:

  • litera 'T' (czyli temperatura)
  • numer czujnika (od 1 do ile ich tych ESP tam masz)
  • odczytana temperatura (na razie zastąp to jakąś wartością losową)

Czyli wysłany napis będzie czymś w rodzaju "T123" (temperatura na czujniku pierwszym 23 stopnie).

 

Uwierz mi, po coś o to prosiłem... i powtarzam: jeśli tego nie zrobisz dalej nie ma sensu iść. Cała procedura komunikacji z termik4temp musi być napisana inaczej (bo w tej konfiguracji jaką masz nie ma żadnego sensu), ale nie możemy tego zrobić dopóki nie będziesz miał działających (w tej kolejności):

  1. przesyłania danych o temperaturze
  2. dekodowania tych danych na serwerze i zapamiętywania w jakiś sensowny sposób
  3. wyświetlania danych na wyświetlaczu (poprzedzonego oglądaniem ich na wyjściu serial).

Co do komunikacji między dwoma ESP: co powiesz na przeczytanie sobie https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html#udp ze szczególnym uwzględnieniem przykładów oraz listy funkcji? Bo na razie wtykasz tam jakieś funkcje na czuja (tak mi się wydaje, bo owo wtykanie jest ewidentnie błędne) ale do dokumentacji nie sięgniesz... piszesz że na stare lata nabrałeś chęci do nauki - no to się ucz, ale weź do ręki ten nieszczęsny elementarz!

Czekam na rozwiązanie - bo temat bardzo fajny, roboty niewiele, kod prosty jak precelek a jak to skończysz i opiszesz to akurat się załapiesz na promocję w Botlandzie!

 

Link do komentarza
Share on other sites

ok, na razie dużo czytam na ten temat, bo wychodzi na to, że zbyt wielu rzeczy nie pojmuję.

Ale małymi kroczkami zaczynam coraz więcej "łapać" pomimo braków lingwistycznych.

Dzięki za dodatkowe informacje i link do przestudiowania.

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

nie wiem co jest nie tak, ale robię dokładnie TEN test i niestety nic nie przechodzi

po serial esp tylko to:

Connecting to home . connected
Now listening at IP 192.168.1.102, UDP port 12345

w pocket sender wpisane poprawne dane jw.

Link do komentarza
Share on other sites

Nie wiem, czy to tak ma wygladać:

client:

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

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() {
  Udp.beginPacket("192.168.1.102", 12345);
  Udp.write("T123");
  Udp.endPacket();

    delay(5000);
}

sewrver:

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

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

WiFiUDP Udp;
unsigned int localUdpPort = 12345;
char incomingPacket[255];

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(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
  }
}

 

Link do komentarza
Share on other sites

No coś takiego. Działa? Jeśli tak to chciałbym wiedzieć, można jechać dalej; jeśli nie to też chciałbym wiedzieć, popróbujemy z innymi narzędziami.

Jeden drobiazg: tablica incomingPacket musi mieć rozmiar o jeden większy niż podajesz w Udp.read() - po prostu musi tam się zmieścić kończące zero.

 

Link do komentarza
Share on other sites

(edytowany)

chyba działa:

Received 4 bytes from 192.168.10.103, port 54675
UDP packet contents: T123
Received 4 bytes from 192.168.10.103, port 54675
UDP packet contents: T123
Received 4 bytes from 192.168.10.103, port 54675
UDP packet contents: T123
Received 4 bytes from 192.168.10.103, port 54675
UDP packet contents: T123
Received 4 bytes from 192.168.10.103, port 54675
UDP packet contents: T123
Received 4 bytes from 192.168.10.103, port 54675
UDP packet contents: T123

oczywiście, że działamy dalej

jaki nastepny etap?

Edytowano przez jaro44
Link do komentarza
Share on other sites

42 minuty temu, jaro44 napisał:

jaki nastepny etap?

A tam zaraz następny... jeszcze wciąż ten sam. Bo na razie przesyłasz jakąś stałą wartość "T123". A teraz wyobraź sobie, że:

  1. cyferka za 'T' to numer czujnika, zdeklarowany gdzieś wyżej i zdefiniowany np. jako stała lub jako zmienna odczytywana skądkolwiek (z preferencji, zwarcia jakiegoś pinu do masy czy skądkolwiek - nieważne co)
  2. napis za cyferką to temperatura. Do wyboru:
  • int = temperatura (czyli z dokładnością do stopnia)
  • float = temperatura (czyli z maksymalną ustaloną dokładnością, max. 1/16 stopnia, w sumie najgorsza możliwość)
  • int = 2 * temperatura (czyli z dokładnością do 0.5 stopnia) lub 4 * temperatura (czyli z dokładnością do 0.25 stopnia)

Wybierz jedną z nich (będziemy się tego konsekwentnie trzymać), załóż że temperatura siedzi w zmiennej o nazwie "temp" i odpowiednim typie (możesz do niej podstawić na razie stałą wartość albo skorzystać z generatora losowego), zrób tak, aby nadający ESP  przekazywał tak skonstruowany napis, pochwal się,  odpocznij chwilkę bo dalej będzie trochę trudniej.

Link do komentarza
Share on other sites

(edytowany)

coś mi ewidentnie nie idzie,

temp dałem typu float, ale  już widzę, że tak się nie da wysłać

a convert to String odradzaleś więc widzę, że bez głębszego kursu raczej nic z tego nie będzie

Edytowano przez jaro44
Link do komentarza
Share on other sites

7 minut temu, jaro44 napisał:

temp dałem typu float, ale  już widzę, że tak się nie da wysłać

Da się tylko po co sobie życie komplikować? Wybierz którąś z wersji na int.

7 minut temu, jaro44 napisał:

widzę, że bez głębszego kursu raczej nic z tego nie będzie

Wspominałem o funkcji sprintf. Tu masz opis: https://pl.wikibooks.org/wiki/C/printf

A na razie zanim poczytasz to coś na szybko:


char bufor[16]; // tak na przykład
int len=sprintf(bufor,"T%d%d", numer, temp);
Udp.beginPacket(....cośtam);
Udp.write(bufor, len);
Udp.endPacket();

Przeanalizuj sobie jak to działa - sprintf będzie później potrzebny do komunikacji z termikiem!

 

Link do komentarza
Share on other sites

(edytowany)

nie wiem, czy to dobrze zrozumiałem podstawiając przykładową stałą "22" dla temp

EDIT:

ahh mój błąd zamiast char trzeb dać int i wtedy jest ok

gdy dam tak:

  char bufor[16];
  int temp = 22, numer = 1;
  int len=sprintf(bufor,"T%d%d", numer, temp);
  Udp.beginPacket("192.168.10.102", 12345);
  Udp.write(bufor, len);
  Udp.endPacket();

to wtedy dostaję to:

Received 4 bytes from 192.168.10.103, port 62002
UDP packet contents: T122
Received 4 bytes from 192.168.10.103, port 62002
UDP packet contents: T122
Received 4 bytes from 192.168.10.103, port 62002
UDP packet contents: T122
Received 4 bytes from 192.168.10.103, port 62002
UDP packet contents: T122
Received 4 bytes from 192.168.10.103, port 62002
UDP packet contents: T122

 

Edytowano przez jaro44
Link do komentarza
Share on other sites

OK - czyli sprawę "nadajnika" mamy rozwiązaną - podłączenie termometru nie powinno być trudne (szczególnie, że przy jednym nie musisz bawić się w ręczne szukanie adresów).

To teraz pytanie: czy po stronie odbierającej możesz:

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

Załóżmy że mamy globalną tablicę:

int termometr[4]; // no bo mamy cztery termometry.

Niech pozycje 0 i 1 zajmują termometry bezpośrednio podłączone do ESP, a 3 i 4 to odebrane od nadajników...

Wiesz jak to zrobić?

 

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.