Innehållsförteckning:

Batteridriven vattenuppsamlarenivåsensor: 7 steg (med bilder)
Batteridriven vattenuppsamlarenivåsensor: 7 steg (med bilder)

Video: Batteridriven vattenuppsamlarenivåsensor: 7 steg (med bilder)

Video: Batteridriven vattenuppsamlarenivåsensor: 7 steg (med bilder)
Video: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, December
Anonim
Batteridriven vattenuppsamlare nivå sensor
Batteridriven vattenuppsamlare nivå sensor
Batteridriven vattenuppsamlare nivå sensor
Batteridriven vattenuppsamlare nivå sensor

Vårt hus har en vattentank som matas från regnet som faller på taket, och används för toaletten, tvättmaskinen och vattna växter i trädgården. Under de senaste tre åren var somrarna väldigt torra, så vi höll koll på vattennivån i tanken. Hittills använde vi en träpinne, som vi satte i tanken och markerade nivån. Men visst måste det vara möjligt att förbättra detta!

Det är här detta projekt kommer in. Tanken är att fästa en ultraljudsavståndssensor högst upp i tanken. Denna sensor fungerar som ett ekolod som avger ljudvågor, som sedan reflekteras av vattenytan. Från den tid det tar för vågorna att komma tillbaka och ljudets hastighet kan du beräkna avståndet till vattenytan och bestämma hur full tanken är.

Eftersom jag inte har någon nätanslutning nära tanken är det viktigt att hela enheten fungerar på batterier. Det betyder att jag var tvungen att vara medveten om strömförbrukningen för alla delar. För att skicka tillbaka data bestämde jag mig för att använda den inbyggda Wifi för ett ESP8266 mikrochip. Även om Wifi är ganska strömhungrig, har det en fördel jämfört med en annan typ av radioanslutning: du kan direkt ansluta till ditt hem trådlösa router utan att behöva bygga en annan enhet som fungerar som ett relä.

För att spara ström lägger jag ESP8266 i djup sömn för det mesta och tar en mätning varje timme. För mitt syfte att följa upp vattennivån är detta mer än tillräckligt. Data skickas till ThingSpeak och kan sedan läsas av på en smartphone via en app.

En detalj till! Ljudets hastighet, avgörande för avståndsmätningen, beror på temperaturen och i mindre utsträckning på luftfuktigheten. För en exakt yttre mätning under årstiderna kommer vi att slänga in en BME280 -sensor, som mäter temperatur, luftfuktighet och tryck. Som en bonus gör detta från vår vattennivåsensor också en miniväderstation.

Delar:

  • 1x ESP8266 ESP-12F.
  • 1x ESP-12F adapterplatta.
  • 1x FT232RL FTDI: USB till seriell adapter.
  • 1x HC-SR04-P: ultraljudsmätningsmodul. Observera att P är viktigt, eftersom detta är den version som har en låg lägsta driftspänning på 3V.
  • 1x BME280 3.3V version: temperatur-, tryck- och fuktsensor.
  • 1x IRL2203N: n-kanal MOSFET-transistor.
  • 1x MCP1700-3302E 3.3V version: spänningsregulator.
  • 3x uppladdningsbart AA -batteri, t.ex. 2600mAh.
  • 1x batterihållare för 3 batterier.
  • 1x brödbräda.
  • Motstånd: 1x 470K, 1x 100K, 4x 10K.
  • Kondensatorer: 2x keramik 1uF.
  • 3x omkopplare.
  • U-formade brödbrädetrådar.
  • Bygelkablar.
  • Plastsoppbehållare 1l.
  • Fästring för behållaren.

Jag gjorde koden tillgänglig på GitHub.

Steg 1: Lär känna ultraljudsavståndssensorn

Lär känna ultraljudsavståndssensorn
Lär känna ultraljudsavståndssensorn
Lär känna ultraljudsavståndssensorn
Lär känna ultraljudsavståndssensorn

Vi mäter avståndet till vattenytan med en ultraljudssensor, HC-SR04-P. Precis som en fladdermus använder denna sensor ekolod: den skickar en ljudpuls med en frekvens för hög för det mänskliga örat, därav ultraljud, och väntar på att den ska träffa ett föremål, reflektera och komma tillbaka. Avståndet kan sedan beräknas från den tid det tar att ta emot ekot och ljudets hastighet.

Konkret, om Trig -stiftet dras högt i minst 10 μs skickar sensorn en skur på 8 pulser med en frekvens på 40 Hz. Svaret erhålls sedan på Echo -stiftet i form av en puls med varaktighet lika med tiden mellan sändning och mottagning av ultraljudspulsen. Sedan måste vi dividera med 2, eftersom ultraljudspulsen går fram och tillbaka och vi behöver envägstiden och multiplicera med ljudets hastighet, som är cirka 340 m/s.

Men vänta lite! Faktum är att ljudets hastighet beror på temperaturen och i mindre utsträckning på luftfuktigheten. Kniprar jag eller är detta relevant? Med hjälp av ett beräkningsverktyg finner vi att vi på vintern (med -5 ° C) kan ha 328,5 m/s och på sommaren (med 25 ° C) 347,1 m/s. Så antar att vi hittar en enkelriktad restid på 3 ms. På vintern skulle detta betyda 98,55 cm och på sommaren 104,13 cm. Det är ganska skillnad! Så för att få tillräcklig noggrannhet under årstiderna och till och med dag och natt måste vi lägga till en termometer i vår installation. Jag bestämde mig för att inkludera BME280, som mäter temperatur, luftfuktighet och tryck. I koden som jag använde i funktionen speedOfSound en formel som beräknar ljudets hastighet i termer av alla tre parametrarna, även om temperaturen verkligen är den viktigaste faktorn. Luftfuktigheten har fortfarande en mindre effekt, men trycket är försumbart. Vi skulle kunna använda en enklare formel med endast hänsyn till temperaturen som jag implementerade i speedOfSoundSimple.

Det finns ytterligare en viktig punkt om HC-SR04. Det finns två versioner tillgängliga: standardversionen fungerar vid 5V, medan HC-SR04-P kan fungera vid ett spänningsintervall från 3V till 5V. Eftersom de tre laddningsbara AA-batterierna ger cirka 3x1.25V = 3.75V är det viktigt att få P-versionen. Vissa säljare kan skicka fel. Så ta en titt på bilderna om du köper en. De två versionerna ser olika ut både på baksidan och framsidan som förklaras på denna sida. På baksidan av P-versionen är alla tre marker horisontella medan på standardversionen ett är vertikalt. På framsidan har standardversionen en extra silverkomponent.

I den elektroniska kretsen använder vi en transistor som en omkopplare för att stänga av strömmen till ultraljudssensorn när vår inställning går till djup sömn för att spara batterilivslängd. Annars skulle det fortfarande konsumera cirka 2mA. BME280 å andra sidan förbrukar bara cirka 5 μ när den är inaktiv, så det är inte nödvändigt att stänga av den med transistorn.

Steg 2: Val av ESP8266 -kort

Val av styrelsen ESP8266
Val av styrelsen ESP8266

För att använda sensorn så länge som möjligt på ett batteri måste vi spara på strömförbrukningen. Även om wifi på ESP8266 ger ett mycket bekvämt sätt att ansluta vår sensor till molnet, är den också ganska energisugen. Vid drift förbrukar ESP8266 cirka 80mA. Så med batterier på 2600 mAh skulle vi bara kunna köra vår enhet i högst 32 timmar innan de är tomma. I praktiken blir det mindre eftersom vi inte kommer att kunna använda hela 2600 mAh -kapaciteten innan spänningen sjunker till en för låg nivå.

Lyckligtvis har ESP8266 också ett djupt sömnläge, där nästan allt är avstängt. Så planen är att lägga ESP8266 i djup sömn för det mesta och väcka det så ofta för att göra en mätning och skicka data över Wifi till ThingSpeak. Enligt denna sida brukade den maximala djup-sömntiden vara cirka 71 minuter, men sedan ESP8266 Arduino-kärnan 2.4.1 har den ökat till cirka 3,5 timmar. I min kod bestämde jag mig för en timme.

Jag försökte först den praktiska NodeMCU-utvecklingsbrädan, men bummer, i djup sömn förbrukade den fortfarande cirka 9 mA, vilket ger oss högst 12 dagars ren djup sömn utan att ens tänka på väckningsintervallen. En viktig synder är spänningsregulatorn AMS1117, som använder ström även om du försöker kringgå det genom att ansluta batteriet direkt till 3,3V -stiftet. Den här sidan förklarar hur du tar bort spänningsregulatorn och USB UART. Men jag lyckades aldrig göra det utan att förstöra min bräda. När du har tagit bort USB UART kan du inte längre ansluta till ESP8266 för att ta reda på vad som gick fel.

De flesta ESP8266 utvecklingskort verkar använda den slösaktiga AMS1117 spänningsregulatorn. Ett undantag är WEMOS D1 mini (bilden till vänster) som följer med den mer ekonomiska ME6211. Jag fann faktiskt att WEMOS D1 mini använder cirka 150 μA i djup sömn, vilket är mer likt det. Det mesta beror förmodligen på USB UART. Med denna bräda måste du dock löda rubrikerna för stiften själv.

Vi kan dock göra mycket bättre med ett bräda ben som ESP-12F (bilden till höger), som inte har en USB UART eller en spänningsregulator. När jag matade 3,3V-stiftet hittade jag en konsumtion på endast 22 μA!

Men för att få ESP-12F att fungera förbered dig för lite lödning och lite mer krångel att programmera det! Om inte batterierna direkt levererar rätt spänning, som är mellan 3V och 3,6V, måste vi tillhandahålla vår egen spänningsregulator. I praktiken visar det sig vara svårt att hitta ett batterisystem som ger en spänning i detta område över hela urladdningscykeln. Kom ihåg att vi också måste driva HC-SR04-P-sensorn, som teoretiskt sett kan fungera med en spänning så låg som 3V, men fungerar mer exakt om spänningen är högre. Dessutom i mitt diagram slås HC-SR04-P på av en transistor, vilket inducerar ett litet extra spänningsfall. Vi kommer att använda spänningsregulatorn MCP1700-3302E. Den maximala ingångsspänningen är 6V så vi matar den med upp till 4 AA -batterier. Jag bestämde mig för att använda 3 AA -batterier.

Steg 3: Skapa en ThingSpeak -kanal

Vi kommer att använda ThingSpeak, en IoT -molntjänst, för att lagra vår data. Gå till https://thingspeak.com/ och skapa ett konto. När du är inloggad klickar du på knappen Ny kanal för att skapa en kanal. Fyll i namn och beskrivning som du vill i kanalinställningarna. Därefter namnger vi kanalfälten och aktiverar dem genom att klicka i kryssrutorna till höger. Om du använder min kod oförändrad är fälten följande:

  • Fält 1: vattennivå (cm)
  • Fält 2: batterinivå (V)
  • Fält 3: temperatur (° C)
  • Fält 4: luftfuktighet (%)
  • Fält 5: tryck (Pa)

För framtida referens, skriv ner kanal -ID, Read API Key och Write API Key, som finns i menyn API -nycklar.

Du kan läsa av ThingSpeak -data på din smartphone med en app. På min Android -telefon använder jag widgeten IoT ThingSpeak Monitor. Du måste konfigurera det med kanal -ID och Read API -nyckeln.

Steg 4: Hur man programmerar ESP-12F

Hur man programmerar ESP-12F
Hur man programmerar ESP-12F
Hur man programmerar ESP-12F
Hur man programmerar ESP-12F

Vi behöver en kretskort för att spara på batteriets livslängd, men nackdelen är att det är lite svårare att programmera än ett utvecklingsbord med inbyggd USB UART.

Vi använder Arduino IDE. Det finns andra instruktioner som förklarar hur man använder det så jag ska vara kort här. Stegen för att göra den klar för ESP8266 är:

  • Ladda ner Arduino IDE.
  • Installera stöd för ESP8266 -kortet. I menyn Arkiv - Inställningar - Inställningar lägger du till URL: en https://arduino.esp8266.com/stable/package_esp8266com_index.json till Ytterligare Board Manager -webbadresser. Nästa i menyn Tools - Board - Boards Manager installera esp8266 av esp8266 community.
  • Välj som styrelse: Generisk ESP8266 -modul.

För att hantera ESP-12F använde jag en adapterplatta, som vanligtvis finns i onlinebutiker. Jag lödde chipet till plattan och lodde sedan rubrikerna till plattan. Först då upptäckte jag att adapterplattan är för bred för en vanlig brödbräda! Det lämnar inga fria stift på sidan för att göra dina anslutningar.

Lösningen jag gick på är att använda U-formade trådar och ansluta dem som på bilden till höger innan du sätter ESP8266 med adapterplattan på brödbrädet. Så GND och VCC är anslutna till skivorna på brödbrädet och de återstående stiften görs tillgängliga längre ner på brödbrädet. Nackdelen är att din brödbräda kommer att bli ganska trång med trådar när du är klar med hela kretsen. En annan lösning är att passa ihop två brödbrädor som visas i den här videon.

För att sedan programmera ESP-12F via USB-porten på din dator behöver vi en USB till seriell adapter. Jag använde FT232RL FTDI programmeraren. Programmeraren har en bygel för att välja mellan 3,3V eller 5V. Den bör sättas till 3,3V för ESP8266. Glöm inte det eftersom 5V kan steka ditt chip! Installationen av drivrutinerna ska ske automatiskt, men om programmeringen inte fungerar kan du försöka installera dem manuellt från den här sidan.

ESP8266 har ett programmeringsläge för att ladda upp ny firmware till blixten och ett blixtläge för att köra aktuell firmware från flashminnet. För att välja mellan dessa lägen måste vissa stift ta ett visst värde vid starttiden:

  • Programmering: GPIO0: låg, CH-PD: hög, GPIO2: hög, GPIO15: låg
  • Blixt: GPIO0: hög, CH-PD: hög, GPIO2: hög, GPIO15: låg

Adapterplattan tar redan hand om att dra upp CH-PD och dra ner GPIO15 med 10K-motstånd.

Så i vår elektroniska krets behöver vi fortfarande dra upp GPIO2. Vi tillhandahåller också en switch för att sätta ESP8266 i programmering eller i blixtläge och en switch för att återställa den, vilket görs genom att ansluta RST till jord. Se till att du ansluter TX-stiftet på FT232RL till RXD-stiftet på ESP8266 och vice versa.

Programmeringssekvensen är följande:

  • Ställ in GPIO2 på låg genom att stänga programmeringsomkopplaren.
  • Återställ ESP8266 genom att stänga och sedan öppna återställningsomkopplaren. ESP8266 startar nu i programmeringsläge.
  • Sätt tillbaka GPIO2 på hög genom att öppna programmeringsomkopplaren.
  • Ladda upp den nya firmware från Arduino IDE.
  • Återställ ESP8266 igen genom att stänga och öppna återställningsomkopplaren. ESP8266 startar nu i blixtläge och kör den nya firmware.

Nu kan du testa om programmeringen fungerar genom att ladda upp den berömda Blink -skissen.

Om allt detta fungerar är GND-, VCC-, GPIO2-, RST-, TXD- och RXD -stiften korrekt lödda och anslutna. Vilken lättnad! Men innan du fortsätter skulle jag rekommendera att också testa de andra stiften med din multimeter. Jag hade själv problem med en av stiften. Du kan använda den här skissen, som sätter alla stiften högt en efter en i 5 sekunder och därefter ESP8266 i djup sömn i 20 sekunder. För att ESP8266 ska kunna vakna efter djup sömn måste du ansluta RST till GPIO16, vilket ger väckningssignalen.

Steg 5: Ladda upp skissen

Jag har gjort koden tillgänglig på GitHub, det är bara en fil: Level-Sensor-Deepsleep.ino. Ladda bara ner den och öppna den i Arduino IDE. Eller så kan du välja Arkiv - Ny och bara kopiera/klistra in koden.

Det finns viss information du måste fylla i i början av filen: namnet och lösenordet för WLAN som ska användas, statiska IP -detaljer och kanal -ID och skriv -API -nyckel för ThingSpeak -kanalen.

Efter tipset på den här bloggen, istället för DHCP där routern dynamiskt tilldelar en IP, använder vi statisk IP, där vi själva ställer in IP -adressen för ESP8266. Detta visar sig vara mycket snabbare, så vi sparar på aktiv tid och därmed på batterienergi. Så vi måste tillhandahålla en tillgänglig statisk IP -adress samt routerns (gateway), IP -nätmask och en DNS -server. Om du är osäker på vad du ska fylla i kan du läsa om hur du ställer in en statisk IP i routerns manual. På en Windows-dator ansluten via Wifi till din router, starta ett skal (Windows-knapp-r, cmd) och ange ipconfig /all. Du hittar det mesta av informationen du behöver under avsnittet Wi-Fi.

När du undersöker koden ser du att till skillnad från andra Arduino -koder sker det mesta av åtgärden i installationsfunktionen istället för loopfunktionen. Detta beror på att ESP8266 går i djup sömn efter att den avslutat installationsfunktionen (om vi inte startade i OTA -läge). När det vaknar är det som en ny omstart och installationen körs igen.

Här är de viktigaste funktionerna i koden:

  • Efter väckningen sätter koden switchPin (standard GPIO15) till hög. Detta startar transistorn, som i sin tur slår på HC-SR04-P-sensorn. Innan du går i djup sömn sätter den tillbaka pinnen till lågt, stänger av transistorn och HC-SR04-P, så att den inte förbrukar mer värdefull batterikraft.
  • Om modePIN (standard GPIO14) är låg går koden i OTA -läge istället för mätningsläge. Med OTA (over-the-air update) kan vi uppdatera firmware via Wifi istället för serieporten. I vårt fall är det ganska bekvämt eftersom vi inte behöver ansluta serien till USB -adaptern längre för ytterligare uppdateringar. Ställ bara in GPIO14 på låg (med OTA -omkopplaren i den elektroniska kretsen), återställ ESP8266 (med återställningsomkopplaren) så ska den bli tillgänglig i Arduino IDE för uppladdning.
  • På den analoga PIN -koden (A0) mäter vi batteriets spänning. Detta gör att vi kan stänga av vår enhet, aka permanent djup sömn, om spänningen blir för låg, under min spänning, för att skydda batterierna från överladdning. Den analoga mätningen är inte särskilt exakt, vi gör numMeasuresBattery (standard 10) mätningar och tar genomsnittet för att förbättra noggrannheten.
  • Avståndsmätningen av HC-SR04-P-sensorn görs i funktionsdistansmätningen. För att förbättra noggrannheten upprepas mätningen numMeasuresDistance (standard 3) gånger.
  • Det finns en funktion för att beräkna speedOfSound från temperatur-, fukt- och tryckmätningen med BME280 -sensorn. Standard I2C -adressen för BME280 är 0x76, men om det inte fungerar kan du behöva ändra det till 0x77: bool bme280Started = bme280.begin (0x77);
  • Vi använder BME280 i tvångsläge, vilket innebär att den tar en mätning och somnar om för att spara ström.
  • Om du ställer in kapacitet (l), fullDistance (cm) och area (m2), beräknar koden den återstående volymen av vattentanken från avståndsmätningen: dubbel leftVolume = kapacitet+10,0*(fullDistance-distance)*area; och ladda upp detta till ThingSpeak. Om du behåller standardvärdena laddar det upp avståndet till vattenytan i cm.

Steg 6: Bygga den elektroniska kretsen

Bygga den elektroniska kretsen
Bygga den elektroniska kretsen

Ovan är diagrammet över den elektroniska kretsen. Det är ganska stort för en brödbräda, särskilt med den överdimensionerade adapterplattan och tricket med de U-formade trådarna. Vid något tillfälle önskade jag verkligen att jag hade använt alternativet att ansluta två brödbrädor, men till slut lyckades jag.

Här är kretsens viktiga funktioner:

  • Det finns två spänningar som spelar en roll: ingångsspänningen från batteriet (cirka 3,75 V) och 3,3 V som matar ESP8266 och BME280. Jag satte 3,3V på vänster skena på brytbordet och 3,75V på höger skena. Spänningsregulatorn omvandlar 3,75V till 3,3V. Efter instruktionerna i databladet lade jag till 1 μF kondensatorer till spänningsregulatorns ingång och utgång för att öka stabiliteten.
  • GPIO15 i ESP8266 är ansluten till transistorns port. Detta gör att ESP8266 kan slå på transistorn och därmed ultraljudssensorn när den är aktiv och stänga av den när den går i djup sömn.
  • GPIO14 är ansluten till en switch, OTA -switch. Genom att stänga omkopplaren ges signalen till ESP8266 som vi vill starta i OTA-läge nästa, dvs. efter att vi har tryckt (stäng och öppnat) RESET-omkopplaren och laddat upp en ny skiss över luften.
  • RST- och GPIO2 -stiften är anslutna som i programmeringsschemat. RST -stiftet är nu också anslutet till GPIO16 för att ESP8266 ska vakna av djup sömn.
  • Stiften TRIG och ECHO i ultraljudssensorn är anslutna till GPIO12 och GPIO13, medan stiften SCL och SDA på BME280 är anslutna till GPIO5 och GPIO4.
  • Slutligen är den analoga stiftet ADC via en spänningsdelare ansluten till ingångsspänningen. Detta gör det möjligt att mäta ingångsspänningen för att kontrollera batteriets laddning. ADC -stiftet kan mäta spänningar mellan 0V och 1V. För spänningsdelaren valde vi motstånd på 100K och 470K. Detta betyder att spänningen vid ADC -stiftet ges av: V_ADC = 100K/(100K+470K) V_in. Att ta V_ADC = 1V betyder att vi kan mäta ingångsspänningar upp till V_in = 570/100 V_ADC = 5,7V. När det gäller strömförbrukning läcker det också en del ström genom spänningsdelaren. Med V_in = 3.75V från batterierna hittar vi I_leak = 3.75V/570K = 6.6 μA.

Även när kretsen går från batterier är det möjligt att ansluta USB till seriell adapter. Se bara till att koppla bort adapterns VCC och anslut GND, RX och TX som i programmeringsschemat. Detta gör det möjligt att öppna Serial Monitor i Arduino IDE för att läsa felsökningsmeddelanden och se till att allt fungerar som förväntat.

För hela kretsen mätte jag en strömförbrukning på 50 μA i djup sömn när jag körde från batterier. Detta inkluderar ESP8266, BME280, ultraljudssensorn (avstängd av transistorn) och läckage genom spänningsdelaren och kanske andra läckage. Så det är inte så illa!

Jag fann att den totala aktiva tiden är cirka 7 sekunder, varav 4,25 sekunder för att ansluta till Wifi och 1,25 sekunder för att skicka data till ThingSpeak. Så med en aktiv ström på 80mA hittade jag 160 μAh per timme för den aktiva tiden. Lägga till 50 μAh per timme för djupt sömn tillståndet vi har totalt 210 μAh per timme. Detta innebär att 2600 mAh batterier teoretiskt räcker 12400 timmar = 515 dagar. Detta är det absoluta maxvärdet om vi kunde använda batteriernas fulla kapacitet (vilket inte är fallet) och det finns inga läckor som jag inte hittade med mina nuvarande mätningar. Så jag har ännu inte sett om detta verkligen löser sig.

Steg 7: Avsluta sensorn

Avsluta sensorn
Avsluta sensorn
Avsluta sensorn
Avsluta sensorn
Avsluta sensorn
Avsluta sensorn

Jag lade sensorn i en plastbehållare på 1 liter, som brukade innehålla soppa. I botten gjorde jag två hål för att passa "ögonen" på HC-SR04-P-sensorn. Förutom hålen ska behållaren vara vattentät. Den fästs sedan på vattentankens vägg med en cirkelring som normalt används för ett avloppsrör för regnvatten.

Ha kul med projektet!

Rekommenderad: