Innehållsförteckning:

Tvättmaskinmeddelandesensor: 6 steg (med bilder)
Tvättmaskinmeddelandesensor: 6 steg (med bilder)

Video: Tvättmaskinmeddelandesensor: 6 steg (med bilder)

Video: Tvättmaskinmeddelandesensor: 6 steg (med bilder)
Video: Hur man rengör värmeelementet i tvättmaskinen 2024, Juli
Anonim
Image
Image
Prototyp
Prototyp

Denna tvättmaskinsensor sitter ovanpå min tvättmaskin och använder en accelerometer för att upptäcka vibrationer från maskinen. När den känner att tvättcykeln är klar skickar den ett meddelande till mig på min telefon. Jag byggde detta eftersom själva maskinen inte längre piper när den är klar och jag var trött på att glömma att ta ut tvätten.

Koden finns här:

Hela listan över delar:

  • WEMOS LOLIN32
  • Halvstor brödbräda (för prototyper)
  • ABS -projektlåda med matrisskiva 59x88x30mm
  • Sparkfun LIS3DH - Triple Axis Accelerometer Breakout
  • 1x ZVP3306A P-kanal MOSFET, 160 mA, 60 V, 3-pins E-Line
  • 1x BC549B TO92 30V NPN -transistor
  • 5mm LED Blå 68 mcd
  • 1x 100k 0.125W CF -motstånd
  • 1x 330k 0.125W CF -motstånd
  • 2x 10k 0.250W CF motstånd
  • 1x 100 0.250W CF -motstånd
  • 2-stifts kvinnlig JST PH-stilkabel (14cm)
  • 4x M1219-8 Neodymiumskivmagnet 6x4mm

Steg 1: Prototyp

Prototyp
Prototyp

Enheten använder en ESP32 -mikrokontroller. I det här fallet använder jag Lolin32 utvecklingskort från Wemos som du kan köpa på AliExpress för cirka $ 7. Acceleratorn är Sparkfun LIS3DH - det är viktigt att accelerometern är digital snarare än analog som du kommer att se senare. Batteriet tog jag från en gammal uppsättning bluetooth -högtalare.

ESP32 ansluter till accelerometern via I2C. Den första versionen av koden undersökte helt enkelt de tre accelerationsaxlarna (x, y och z) för det uppmätta accelerationsvärdet var 20: e ms. När jag placerade brödbräda -prototypen på tvättmaskinen och tog jag fram grafen ovan som visar accelerationstoppar under olika faser av tvättcykeln. De toppar där den absoluta accelerationen var större än 125 mg (125 tusendelar av normal tyngdkraft) visas i orange. Vi vill upptäcka dessa perioder och använda dem för att bestämma tvättmaskinens status.

Hur bestämmer jag om maskinen är på eller av?

Ett av målen med att bygga denna enhet var att den skulle vara helt passiv. D.v.s. inga knappar ska behöva tryckas in; det skulle bara fungera. Det borde också vara mycket låg effekt eftersom det inte riktigt var möjligt att förlänga strömkablar till tvättmaskinen i mitt fall.

Lyckligtvis har LIS3DH-accelerometern en funktion där den kan utlösa ett avbrott när accelerationen överstiger ett givet tröskelvärde (observera att detta kräver användning av accelerometerns inbyggda högpassfilter-se koden på Github för detaljer) och ESP32 kan väckas upp från sitt djupa viloläge via ett avbrott. Vi kan använda denna kombination av funktioner för att skapa ett viloläge med mycket låg effekt som utlöses av rörelse.

Pseudokoden skulle se ut ungefär så här:

# Enhet vaknar

meddelande_tröskel = 240 räknare = 10 accelerometer.set_tröskel (96) # 96mg medan räknare> 0: om accelerometer.över_gräns (): räknare ++ annat: räknare-- om räknare> meddelande_gräns: # sista centrifugeringscykel upptäckt sömn (1 sekund) accelerometer.set_tröskel_avbrott () esp32.set_wakeup_trigger_on_interrupt () esp32.deep_sleep ()

Du kan se här att vi använder en räknare för att upptäcka hur många sekunder av acceleration vi har upptäckt under den aktuella vakningsperioden. Om räknaren sjunker till noll kan vi sätta enheten i viloläge. Om räknaren når 240 (aviseringströskeln) betyder det att vi har upptäckt 4 minuters vibration. Vi kan justera värdena för dessa trösklar för att se till att enheten korrekt detekterar den sista centrifugeringscykeln. När tillräckligt med vibrationer upptäcks kan vi helt enkelt sova i ytterligare 5 minuter (i mitt fall är det hur lång tid det tar innan tvätten faktiskt är klar) innan vi skickar ett meddelande.

Steg 2: Skicka ett meddelande via Blynk

Skicka ett meddelande via Blynk
Skicka ett meddelande via Blynk

Blynk är en tjänst som är utformad för att möjliggöra interaktion med IoT -enheter med en app på din telefon. I det här fallet använder jag push -anmälnings -API: et som utlöses av ett enkelt HTTP POST till Blynk API.

Steg 3: Mätning av strömförbrukning och uppskattning av batteriets livslängd

Mätning av strömförbrukning och uppskattning av batteriets livslängd
Mätning av strömförbrukning och uppskattning av batteriets livslängd

ESP32 -chipet annonseras för att ha mycket låg strömförbrukning i djup sömn (så lågt som 5uA). Tyvärr ger kretsarna på de många olika utvecklingsbrädorna mycket olika strömförbrukningsegenskaper - inte alla ESP32 dev -kort är skapade lika. Till exempel, när jag först startade det här projektet, använde jag Sparkfun ESP32 Thing som skulle förbruka cirka 1 mA ström i djupt viloläge (även efter att strömlampan stängts av). Sedan dess har jag använt Lolin32 (inte Lite -versionen) där jag mätte en ström på 144,5uA i djupt viloläge. För att göra denna mätning kopplade jag helt enkelt en multimeter i serie med batteriet och enheten. Detta är verkligen lättare att göra när du prototyper med en brödbräda. Jag mätte också den aktuella användningen när enheten är vaken:

  • Djupt sömn: 144,5uA
  • Vaken: 45mA
  • WiFi aktiverat: 150mA

Förutsatt att jag använder maskinen två gånger i veckan uppskattade jag följande tider för den tid sensorn tillbringar i varje tillstånd:

  • Djupt sömn: 604090 sekunder (~ 1 vecka)
  • Vakna: 720 sekunder (12 minuter)
  • WiFi aktiverat: 10 sekunder

Från dessa siffror kan vi uppskatta hur länge batteriet kommer att hålla. Jag använde denna praktiska miniräknare för att få en genomsnittlig strömförbrukning på 0,2 mA. Uppskattad batteritid är 201 dagar eller cirka 6 månader! I verkligheten har jag upptäckt att enheten kommer att sluta fungera efter cirka 2 månader så det kan uppstå fel i mätningarna eller batteriets kapacitet.

Steg 4: Mät batterinivå

Mäter batterinivå
Mäter batterinivå
Mäter batterinivå
Mäter batterinivå

Jag tyckte att det skulle vara trevligt om enheten kunde berätta när batteriet börjar ta slut så jag vet när jag ska ladda det. För att mäta detta måste vi mäta batteriets spänning. Batteriet har ett spänningsintervall på 4,3V - 2,2V (den lägsta driftspänningen för ESP32). Tyvärr är spänningsområdet för ADC-stiften i ESP32 0-3.3V. Det betyder att vi måste minska batteriets spänning från max 4,3 till 3,3 för att undvika överbelastning av ADC. Detta är möjligt att göra med en spänningsdelare. Anslut bara två motstånd med lämpliga värden från batteriet till jord och mät spänningen i mitten.

Tyvärr kommer en enkel spänningsdelarkrets att tömma ström från batteriet även när spänningen inte mäts. Du kan mildra detta genom att använda högvärdesmotstånd men den negativa sidan är att ADC kanske inte kan dra tillräckligt med ström för att göra en noggrann mätning. Jag bestämde mig för att använda motstånd med värdena 100kΩ och 330kΩ som kommer att sjunka 4,3V till 3,3V enligt denna spänningsdelarformel. Med tanke på ett totalt motstånd på 430 kΩ skulle vi förvänta oss en strömförbrukning på 11,6uA (med hjälp av Ohms lag). Med tanke på att vår djupa sömn nuvarande användning är 144uA, är det en ganska betydande ökning.

Eftersom vi bara vill mäta batterispänningen en gång precis innan vi skickar ett meddelande, är det vettigt att stänga av spänningsdelaren under den tid då vi inte mäter någonting. Lyckligtvis kan vi göra detta med ett par transistorer anslutna till en av GPIO -stiften. Jag använde kretsen som ges i detta stackexchange -svar. Du kan se mig testa kretsen med en Arduino och ett brödbräda på bilden ovan (observera att det finns ett fel i kretsen vilket är anledningen till att jag mäter en högre spänning än förväntat).

Med kretsen ovan på plats använder jag följande pseudokod för att få ett batteriprocenttal:

batteri procent():

# aktivera batterispänningskrets gpio_set_level (BATTERY_EN_PIN, HIGH) # Batterinivå returneras som ett heltal mellan 0 och 4095 adc_value = adc1_get_value (ADC_PIN) # aktivera batterispänningskrets gpio_set_level (BATTERY_EN_PIN, LOW) float adc_95 divider använder 100k/330k ohm motstånd # 4.3V -> 3.223, 2.4 -> 1.842 förväntad_max = 4.3*330/(100+330) förväntad_min = 2.4*330/(100+330) batteri_nivå = (adc_spänning -förväntad_min)/(förväntad_max) -förväntad_min) returbatterinivå * 100,0

Steg 5: Gör det vackrare

Gör det vackrare
Gör det vackrare
Gör det vackrare
Gör det vackrare
Gör det vackrare
Gör det vackrare

Även om brödbrädversionen fungerar bra, ville jag lägga den i ett paket som skulle vara snyggare och mer tillförlitligt (inga ledningar som kan lossna eller kortas ut). Jag lyckades hitta den perfekta projektlådan för mina behov som hade rätt storlek, inkluderade en stiftbräda, monteringshållare och skruvar för att sätta ihop allt. Det var också dött billigt på mindre än £ 2. Efter att ha fått lådan var det bara att löda komponenterna på stiftskivan.

Den kanske svåraste delen av detta var att montera alla batterispänningskretskomponenter på det lilla utrymmet bredvid Lolin32. Lyckligtvis med lite jiggery pokery och lämpliga anslutningar med lödning passar kretsen snyggt in. Eftersom Wemos Lolin32 inte har en stift för att avslöja den positiva batteripolen, var jag tvungen att löd en kabel från batterikontakten till stiftkortet.

Jag lade också till en lysdiod som blinkar när enheten har upptäckt rörelse.

Steg 6: Finisher

Image
Image
Finputsning
Finputsning
Finputsning
Finputsning

Jag superlimmade 4 6 mm x 4 mm neodymmagneter till lådans botten vilket gör att den kan klibba fast vid tvättmaskinens metallöverdel.

Projektboxen har redan ett litet hål för åtkomst till kablar. Lyckligtvis kunde jag placera ESP32 -kortet nära det här hålet för att ge tillgång till mikro -USB -kontakten. Efter att ha förstorat hålet med en hantverkskniv passar kabeln perfekt för att enkelt ladda batteriet.

Om du är intresserad av någon av detaljerna i detta projekt är du välkommen att lämna en kommentar. Om du vill se koden kan du kolla in den på Github:

github.com/alexspurling/washingmachine

Rekommenderad: