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.