Skocz do zawartości
jaro44

Połączenie dwóch esp8266 do pomiaru temperatur

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

Udostępnij ten post


Link to post
Share on other sites

No to spróbuj uporać się z tym co pisałem... ja tu sobie specjalnie termika na telefonie zainstalowałem, doceń moje poświęcenie 🙂

Udostępnij ten post


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

 

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
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);
  }
}

 

Udostępnij ten post


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

 

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

 

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

Napisałeś:

int len=sprintf(bufor,"T%d%d", temp);

A gdzie numerek czujnika? 🙂

Masz w formacie dwa razy %d - czyli za formatem mają być dwa inty. A ile masz?

Udostępnij ten post


Link to post
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ć?

 

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