Inteligentne oświetlenie w łazience (Podsumowanie)

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…:slight_smile:
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… :slight_smile:

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 :slight_smile:

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:

  1. 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.
  2. Utworzenie poprawnego JSON. ( MQTT Binary Sensor - Home Assistant (home-assistant.io)). Chciałbym aby zachowanie było tak jak w przypadku czujników ruchu
    czujnik

… a propos czujek ruchu
Kupiłem ostatnio takie coś, zamierzam sprawdzić jak to działa

Kod obejrzę jutro - w pracy mam więcej czasu :slight_smile:

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 :slight_smile:

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;
      }
 
}
1 polubienie

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 :shushing_face:
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ę:

  1. Czujnik na pewno z wyjściem UART (są dwie wersje)?
    Czy udało Ci się czymkolwiek odczytać coś z tego czujnika?
  2. Czujnik zasilony z 5V?
  3. 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.