Przyznaję się bez bicia - nie zagłębiałem się w dokumentację (nie mam takiego czujnika, a z ultradźwiękowych używałem tylko HC-SR04, które działają z radykalnie innym interfejsem) - faktycznie tu nie ma komunikacji 2-kierunkowej, więc można to oblecieć po najmniejszej linii oporu.
… ja też, ale mam mało ortodoksyjne podejście do elektroniki i przeważnie najpierw klecę na tym co mam.
Po prostu temat mnie zaciekawił.
Też dopiero raczkuję.
Staram się klecić z tego co mam, a że raczkuję w elektronice podpowiedz jakie mają być rezystory żeby było dobrze (rozumiem że w przypadku dzielnika chodzi o to: Dzielnik napięcia – Wikipedia, wolna encyklopedia)
Dokładnie…![]()
Odwołując się do rys. wiki (tak będzie łatwiej):
Uwej - podłączasz Tx-GND czujnika.
Uwyj - podłączasz Rx-GND ESP.
Wartości rezystorów nie są krytyczne i mogą np. wynosić:
R1= 3.3kOhm
R = 1.8kOhm
Możesz użyć innych, ważne aby zachować proporcje, a suma R+R1 zawierała się między 4-10kOhm
Teoretycznie (wartość graniczna) powinno działać przy R=R1.
Więc jak R będzie trochę mniejsze do R1 będzie git… ![]()
Kurka wodna przez dzielnik też nie działa.
Wrzuć oba programy, ten działający na arduino i ten na ESP.
Zrób fotkę jak to podłączyłeś. W wolnej chwili rzucę okiem.
Jeśli zostawiłeś ten nie zmieniony fragment dla ESP
// pin assignments. TX on the arduino connects to RX on the sensor, RX to TX.
#define TX_PIN D3
#define RX_PIN D4
SoftwareSerial DYPSensor = SoftwareSerial(RX_PIN, TX_PIN);
to jest źle
Na pewno nie zmieniałem. Jest tak jak udostępniłeś.
Muszę wiedzieć dokładnie którą masz płytkę ESP. Zrób fotkę to zrobię poprawki.
Generalnie dla ESP trzeba użyć drugi uart i go dobrze skonfigurować, pierwszy zajęty jest przez monitor.
Jeśli chcesz się pobawić sam to szukaj pod hasłem “esp8266 second uart”
Mam taką
Na tę chwilę wykorzystam czujnik HC-SR0R bo działa a chcę testować automatyzację w łazience. Jak napisałeś o “second uart” to mnie olśniło. Czytałem kiedyś o tym i z głowy wypadło. Zamówie sobie nowe SEP8266 i wtedy będę testował z ME007YS. Wolałbym ME007YS bo napewno będzie lepiej wyglądał zamontowany w suficie (płyta GK). Na razie w puszce zanim podziurawię sufit
Jutro może podrzucę jakiś kod. Czy używasz MQTT? bo można pomiary z tego czujnika w nim udostępniać.
Tak używam MQTT. Właśnie to ogarniam.
Edit: w zasadzie mam ogarnięte. Zrobiłem z tego binary_sensor (jeśli odległość mniejsza od X to ON jeśli większa to OFF). Stworzyłem grupę z dwoma czujnikami ruchu plus czujnik odległości (ON/OFF) żeby sterować światłem w łazience.
Edit2: @RobinI30 w sumie to przyda się pomoc. Obecnie mój kod wygląda tak:
Czujnik.json (4,3 KB) (zmieniłem rozszerzenie na JSON bo TXT nie przechodzi)
Mam dwa problemy:
- Warunek w pętli loop “if (newstate != laststate)” nie wiem dlaczego warunek zawsze jest spełniony. Trochę programuję i powinno według mnie działać to poprawnie, a tak nie jest. ZMiana stanu wysyłana jest za każdym przebiegiem pętli.
- Utworzenie poprawnego JSON. ( MQTT Binary Sensor - Home Assistant (home-assistant.io)). Chciałbym aby zachowanie było tak jak w przypadku czujników ruchu
… a propos czujek ruchu
Kupiłem ostatnio takie coś, zamierzam sprawdzić jak to działa
Kod obejrzę jutro - w pracy mam więcej czasu ![]()
Spoko nie ma presji. Co do czujek mikrofalowych gdzieś mi przemknęło że, może wyłapywać też przez ściany. Ja zastanawiam się nad tym czujnikiem Przedstawiono Aqara Lumi Human Sensor: Wysoce precyzyjny czujnik ruchu z 6-letnią autonomią (xiaomitoday.it)
No i wypuścili jeszcze nowy: Aqara ma w ofercie nowy czujnik obecności (oiot.pl)
Ten fragment:
}
}
laststate = newstate;
delay(5000);
}
powinien wyglądać tak:
}
laststate = newstate;
}
delay(5000);
}
…inaczej w każdym obiegu pętli będziesz miał laststate = newstate - a musisz zapamiętać tylko raz w momencie zmiany stanu
…ale na ten delay dostałem wysypki.
Czasami wysypka nie szkodzi narazie jest w wersji testowej. Każda sugestia wskazana 
Ja stosuje harmonogram zadań, nic się nie blokuje loop się kręci z pełną prędkością.
Wywołuje tylko taski co określony czas. Oczywiście zadbać trzeba aby taski były też nieblokujące.
//*****scheduler*************************************
unsigned long previousMillis = 0;
const long sec = 1000;
const uint8_t timeout1 = 1; //time proces1 [sec]
const uint8_t timeout2 = 250; //time proces2 [sec]
boolean proces1 = false;
boolean proces2 = false;
uint8_t time1 = 0;
uint8_t time2 = 0;
void Scheduler() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis < sec) {
return;
}
previousMillis = currentMillis;
if (time1 < timeout1) {
time1 += 1;
}
else {
proces1 = true;
}
if (time2 < timeout2) {
time2 += 1;
}
else {
proces2 = true;
}
}
//************************************************
void loop()
{
Scheduler();
if (proces2 == true) {
// tu dopisujesz to co ma się wykonać co okres timeout2
time2 = 0;
proces2 = false;
}
if (proces1 == true) {
// tu dopisujesz to coma wykonać co okres timeout1
time1 = 0;
proces1 = false;
}
}
Fajne rozwiązanie zastosuję u siebie.
Rozglądałem się trochę pod kątem tego zastosowania.
Problem jest taki, że z drugim serialem w przypadku odczytu nie jest tak różowo.
Ponieważ we wszystkich płytkach w USB jest on trwale zajęty przez konwerter USB<>UART, a “golas”
wymaga dodatkowego “programatora”.
Znalazłem jeden zestaw co by mógł to pogodzić
Małe wymiary, konwerter jest na osobnej płytce i po zaprogramowaniu kanapkę można rozpiąć i podłączyć ME007YS.
Na czas uruchamiania ( gdy potrzebujesz debug) można te dwie płytki połączyć kabelkami w taki sposób aby mieć debug i odczyt czujnika na jednym sprzętowym UART.
Tx jako debug, a Rx odczyt z czujnika.
Konwerter pozostanie jako gratis dla innych zastosowań, jeśli się tym bawisz to wiesz jak się nieraz przydaje.
Na spokojnie przejrzałem również program i powiem … nie widzę tam błędu ![]()
Może powodem takiego zachowania jest “pływanie” pomiarów? … nie jestem w stanie w głowie przeprowadzić symulacji.
Jednak na pomiary wprowadzi bym histerezę
// !!!!!!!!!!!!!!!!!!!!!!!newstate = 0;
if (distanceCm > 100)
{
newstate = 0;
}
if (distanceCm < 80)
{
newstate = 1;
}
Masz rację nie ma błędu. Wczoraj to było już chyba zmęczenie materiału. Serial.print mam przed IFem i to mnie zmyliło
Serial.println(newstate);
Serial.println(laststate);
if (newstate != laststate)
{
//kod
}
Co do histerezy może zastosuję ale nie z takim dużym przedziałem. “Płwanie” jest mniej więcej w zakresie +/- 1cm
Edit:
Fajna ta płytka ale w Polsce problem z dostępnością. Znalazłem na Ali ESP8266 ESP 12F ESP12F CH340 WIFI i chyba sobie zamówię klik.
Analizowałem schemat Twojej płytki NodeMCU V3 i to powinno kurczę działać nawet dokładnie z tym projektem.
Napisałem wcześniej, że to niewłaściwe podłączenie z powodu tego, że D3(GPIO0) jest już zajęte przez konwerter USB na płytce… ale tego nie podłączamy?
Popytam trochę:
- Czujnik na pewno z wyjściem UART (są dwie wersje)?
Czy udało Ci się czymkolwiek odczytać coś z tego czujnika? - Czujnik zasilony z 5V?
- Skrzyżowane Tx<>Rx… tzn ESP Rx(D4) > dzielnik > Tx Czujnika?
Można spróbować ten softwarowy serial uruchomić na innych pinach. Ze schematu wynika, że D1 D2 są czyste.

