Spisu treści:

Czujnik powiadomień pralki: 6 kroków (ze zdjęciami)
Czujnik powiadomień pralki: 6 kroków (ze zdjęciami)

Wideo: Czujnik powiadomień pralki: 6 kroków (ze zdjęciami)

Wideo: Czujnik powiadomień pralki: 6 kroków (ze zdjęciami)
Wideo: Ale jak z gumką czy bez ? 🤔 #shorts 2024, Lipiec
Anonim
Image
Image
Prototyp
Prototyp

Ten czujnik pralki znajduje się na górze mojej pralki i używa akcelerometru do wykrywania wibracji pralki. Gdy wykryje, że cykl prania się zakończył, wysyła mi powiadomienie na mój telefon. Zbudowałem to, ponieważ sama maszyna nie wydaje już sygnałów dźwiękowych, gdy jest skończona, a ja byłem zmęczony zapominaniem o wyjęciu prania.

Kod można znaleźć tutaj:

Pełna lista części:

  • WEMOS LOLIN32
  • Półwymiarowa płyta chlebowa (do prototypowania)
  • Pudełko projektowe ABS z płytą Matrix 59x88x30mm
  • Sparkfun LIS3DH - trójosiowy akcelerometr Breakout
  • 1x ZVP3306A MOSFET z kanałem P, 160 mA, 60 V, 3-Pin E-Line
  • 1x BC549B TO92 30V tranzystor NPN
  • Dioda LED 5mm Niebieska 68 mcd
  • Rezystor CF 1x100 k 0.125 W
  • 1x Rezystor CF 330 k 0.125 W
  • Rezystor 2x 10k 0.250W CF
  • Rezystor 1x100 0.250 W CF
  • Kabel 2-stykowy żeński JST PH (14 cm)
  • 4x M1219-8 Neodymowy magnes dyskowy 6x4mm

Krok 1: Prototyp

Prototyp
Prototyp

Urządzenie wykorzystuje mikrokontroler ESP32. W tym przypadku używam płytki rozwojowej Lolin32 firmy Wemos, którą można kupić na AliExpress za około 7 USD. Akcelerometr to Sparkfun LIS3DH - ważne jest, aby akcelerometr był cyfrowy, a nie analogowy, jak zobaczysz później. Bateria, którą wyjąłem ze starego zestawu głośników bluetooth.

ESP32 łączy się z akcelerometrem przez I2C. Pierwsza wersja kodu po prostu odpytywała trzy osie przyspieszenia (x, y i z) o zmierzoną wartość przyspieszenia co 20 ms. Umieszczając prototyp płytki stykowej na pralce, stworzyłem powyższy wykres, który pokazuje piki przyspieszenia w różnych fazach cyklu prania. Te piki, w których przyspieszenie bezwzględne było większe niż 125 mg (125 tysięcznych normalnej grawitacji) są pokazane na pomarańczowo. Chcemy wykryć te okresy i wykorzystać je do określenia stanu pralki.

Jak ustalić, czy maszyna jest włączona, czy wyłączona?

Jednym z celów budowy tego urządzenia było to, aby było całkowicie pasywne. Tj. nie trzeba naciskać żadnych przycisków; to po prostu zadziała. Powinno to być również bardzo niskie, ponieważ w moim przypadku nie było możliwe doprowadzenie kabli zasilających do pralki.

Na szczęście akcelerometr LIS3DH ma funkcję, dzięki której może wywołać przerwanie, gdy przyspieszenie przekroczy określony próg (uwaga, wymaga to użycia wbudowanego filtra górnoprzepustowego akcelerometru - zobacz kod na Github) i ESP32 może zostać wybudzony z trybu głębokiego uśpienia poprzez przerwanie. Możemy wykorzystać tę kombinację funkcji do stworzenia trybu uśpienia o bardzo niskim poborze mocy, który jest wyzwalany ruchem.

Pseudokod wyglądałby mniej więcej tak:

# Urządzenie budzi się

notification_threshold = 240 counter = 10 accelerometer.set_threshold(96) #96mg while counter > 0: if accelerometer.above_threshold(): counter++ else: counter-- if counter > notification_threshold: # wykryto ostatni cykl wirowania sleep (1 sekunda) accelerometer.set_threshold_interrupt () esp32.set_wakeup_trigger_on_interrupt() esp32.deep_sleep()

Widać tutaj, że używamy licznika do wykrywania, ile sekund przyspieszenia wykryliśmy w bieżącym okresie budzenia. Jeśli licznik spadnie do zera, możemy ponownie uśpić urządzenie. Jeśli licznik osiągnie 240 (próg powiadomienia), oznacza to, że wykryliśmy 4 minuty wibracji. Możemy dostosować wartości tych progów, aby upewnić się, że urządzenie prawidłowo wykrywa ostatni cykl wirowania. Po wykryciu wystarczających wibracji możemy po prostu spać przez kolejne 5 minut (w moim przypadku tyle czasu zajmuje faktyczne zakończenie prania) przed wysłaniem powiadomienia.

Krok 2: Wysyłanie powiadomienia przez Blynk

Wysyłanie powiadomienia przez Blynk
Wysyłanie powiadomienia przez Blynk

Blynk to usługa zaprojektowana, aby umożliwić interakcję z urządzeniami IoT za pomocą aplikacji na telefonie. W tym przypadku korzystam z API powiadomień push, które jest wyzwalane przez prosty HTTP POST do API Blynk.

Krok 3: Pomiar zużycia energii i szacowanie żywotności baterii

Pomiar zużycia energii i szacowanie żywotności baterii
Pomiar zużycia energii i szacowanie żywotności baterii

Układ ESP32 jest reklamowany jako mający bardzo niski pobór mocy w głębokim śnie (nawet 5uA). Niestety, obwody na wielu różnych płytkach rozwojowych zapewniają bardzo różne charakterystyki zużycia energii - nie wszystkie płytki deweloperskie ESP32 są sobie równe. Na przykład, kiedy zaczynałem ten projekt, użyłem Sparkfun ESP32 Thing, który zużywał około 1mA mocy w trybie głębokiego uśpienia (nawet po wyłączeniu diody LED zasilania). Od tego czasu korzystam z Lolin32 (nie w wersji Lite), na którym w trybie głębokiego uśpienia zmierzyłem prąd 144,5uA. Aby wykonać ten pomiar, po prostu podłączyłem multimetr szeregowo z baterią i urządzeniem. Jest to z pewnością łatwiejsze podczas prototypowania z płytką prototypową. Zmierzyłem również bieżące zużycie, gdy urządzenie jest wybudzone:

  • Głęboki sen: 144,5uA
  • Obudzony: 45mA
  • Wifi włączone: 150mA

Zakładając, że używam urządzenia dwa razy w tygodniu, oszacowałem następujące czasy dla czasu, jaki czujnik spędza w każdym stanie:

  • Głęboki sen: 604090 sekund (~1 tydzień)
  • Przebudzenie: 720 sekund (12 minut)
  • Wifi włączone: 10 sekund

Na podstawie tych liczb możemy oszacować, jak długo wytrzyma bateria. Użyłem tego poręcznego kalkulatora, aby uzyskać średni pobór mocy 0,2 mA. Szacunkowa żywotność baterii to 201 dni lub około 6 miesięcy! W rzeczywistości stwierdziłem, że urządzenie przestanie działać po około 2 miesiącach, więc mogą wystąpić błędy w pomiarach lub pojemności baterii.

Krok 4: Pomiar poziomu baterii

Pomiar poziomu baterii
Pomiar poziomu baterii
Pomiar poziomu baterii
Pomiar poziomu baterii

Pomyślałem, że byłoby miło, gdyby urządzenie powiedziało mi, kiedy bateria się wyczerpuje, więc wiem, kiedy ją naładować. Aby to zmierzyć, musimy zmierzyć napięcie baterii. Akumulator posiada zakres napięć 4,3V - 2,2V (minimalne napięcie pracy ESP32). Niestety zakres napięcia na pinach ADC ESP32 wynosi 0-3,3V. Oznacza to, że musimy obniżyć napięcie akumulatora z maksimum 4,3 do 3,3, aby uniknąć przeciążenia ADC. Można to zrobić za pomocą dzielnika napięcia. Wystarczy podłączyć dwa rezystory o odpowiednich wartościach z akumulatora do masy i zmierzyć napięcie w środku.

Niestety, prosty obwód dzielnika napięcia wyczerpuje energię z akumulatora, nawet jeśli napięcie nie jest mierzone. Możesz to złagodzić, stosując rezystory o wysokiej wartości, ale wadą jest to, że ADC może nie być w stanie pobrać wystarczającego prądu, aby dokonać dokładnego pomiaru. Zdecydowałem się zastosować rezystory o wartościach 100kΩ i 330kΩ, które zgodnie z tym wzorem na dzielnik napięcia spadną z 4,3V do 3,3V. Przy całkowitej rezystancji 430 kΩ oczekiwalibyśmy poboru prądu 11,6 uA (przy użyciu prawa Ohma). Biorąc pod uwagę, że nasze zużycie prądu w głębokim śnie wynosi 144uA, jest to dość znaczny wzrost.

Ponieważ chcemy zmierzyć napięcie baterii tylko raz, tuż przed wysłaniem powiadomienia, warto wyłączyć obwód dzielnika napięcia na czas, gdy nic nie mierzymy. Na szczęście możemy to zrobić za pomocą kilku tranzystorów podłączonych do jednego z pinów GPIO. Użyłem obwodu podanego w tej odpowiedzi stackexchange. Możesz zobaczyć, jak testuję obwód za pomocą Arduino i płytki stykowej na powyższym zdjęciu (zauważ, że w obwodzie występuje błąd, który jest powodem, dla którego mierzę wyższe napięcie niż oczekiwano).

Mając powyższy obwód, używam następującego pseudokodu, aby uzyskać wartość procentową baterii:

procent baterii():

# włącz obwód napięcia akumulatora gpio_set_level(BATTERY_EN_PIN, HIGH) # Poziom naładowania akumulatora jest zwracany jako liczba całkowita z zakresu od 0 do 4095 aDC_value = adc1_get_value(ADC_PIN) # włącz obwód napięcia akumulatora gpio_set_level(BATTERY_EN_PIN, LOW) float ac_napięcie = /4095 # napięcie *3,3 dzielnik wykorzystuje rezystory 100k / 330k omów # 4,3V -> 3,223, 2,4 -> 1,842 oczekiwany_maks = 4,3*330/(100+330) oczekiwany_min = 2,4*330/(100+330) poziom_akumulatora = (przewidywane_napięcie_adc_min)/(oczekiwane_maks) -expected_min) powrót poziomu baterii * 100,0

Krok 5: Uczynienie go ładniejszym

Czyniąc to ładniejszym
Czyniąc to ładniejszym
Robiąc to ładniejsze
Robiąc to ładniejsze
Robiąc to ładniejsze
Robiąc to ładniejsze

Chociaż wersja z płytką stykową działa dobrze, chciałem umieścić ją w paczce, która byłaby schludniejsza i bardziej niezawodna (bez przewodów, które mogą się poluzować lub zwierać). Udało mi się znaleźć idealne pudełko projektowe do moich potrzeb, które miało odpowiedni rozmiar, zawierało tabliczkę do przypinania, uchwyty montażowe i śruby do złożenia wszystkiego w całość. Poza tym było śmiertelnie tanie za mniej niż 2 funty. Po otrzymaniu pudełka wystarczyło przylutować elementy do płytki pinowej.

Być może najtrudniejszą częścią tego było umieszczenie wszystkich elementów obwodu napięcia akumulatora na małej przestrzeni obok Lolin32. Na szczęście przy nieco jiggery pokery i odpowiednich połączeniach wykonanych lutem obwód idealnie pasuje. Ponadto, ponieważ Wemos Lolin32 nie ma szpilki, aby odsłonić dodatni zacisk akumulatora, musiałem przylutować przewód od złącza akumulatora do płytki pinowej.

Dodałem również diodę LED, która miga, gdy urządzenie wykryje ruch.

Krok 6: Wykończenie szlifów

Image
Image
Ostatnie poprawki
Ostatnie poprawki
Ostatnie poprawki
Ostatnie poprawki

Super przykleiłem 4 magnesy neodymowe 6mm x 4mm do podstawy pudełka, co pozwala na pewne przyklejenie go do metalowego blatu pralki.

Pudełko projektowe jest już wyposażone w mały otwór zapewniający dostęp do kabli. Na szczęście udało mi się umieścić płytkę ESP32 blisko tego otworu, aby uzyskać dostęp do złącza micro USB. Po powiększeniu otworu nożem rzemieślniczym kabel idealnie pasuje, aby umożliwić łatwe ładowanie akumulatora.

Jeśli interesuje Cię którykolwiek ze szczegółów tego projektu, śmiało zostaw komentarz. Jeśli chcesz zobaczyć kod, sprawdź go na Github:

github.com/alexspurling/washingmachine

Zalecana: