Din varukorg är för närvarande tom!
Projekt regnsensor
I mitt projekt med att automatisera trädgården insåg jag att en regnsensor behövdes. Bestämde mig därför för att bygga en egen från grunden upp. Den största orsaken till det var för att lära mig mer om 3D utskrifter och CAD. Jag kommer återge utvecklingen av vattenmätaren och de fallgropar jag upptäckt på vägen. All info för att du sedan ska kunna bygga en kommer finns här. Förhoppningsvis kommer sensorn att utvecklas under en bra tid framöver och delar uppgraderas. Är du enbart intresserad av att se det färdiga resultatet så kan du gå till den här sidan (Summering av regnsensorn ). Vill du däremot se hur mycket arbete det är bakom en så pass enkel sak som en regnmätare så fortsätt läsa.
Jag valde att använda CAD programmet Fusion 360 eftersom den har en fördelaktig licensform. Jag delar med mig av all kod och STL filerna (filtypen som 3D skrivaren förstår). Kom gärna med tips på vad som går att göra bättre eller idéer på vad mer som borde ändras. Har som planerat på att göra en smart regnmätaren och att den ska gå att ladda hem och bygga själv.
Min modell går att vrida och vända på live i webbläsaren under följande länk: Fusion360
Det är mycket bilder och förklaring om varför respektive steg gick som det gick 🙂
Nuvarande version av regnmätaren är 2.0 (2018-08-10)
Logg: 1.0 ( 2018-07-30)
Det finns flera sätt att mäta regn, jag bestämde mig dock för tekniken med en vippbräda och två kärl som tippar när nog mycket vatten fyllt en sida. Det var en rolig teknik att lösa med 3d Skrivaren. Som bilden en bit ner (”Första delen Fusion 360”) visar så valde jag att göra det så simpelt som möjligt eftersom mina kunskaper inom Fusion 360 är mycket begränsade vid projektstarten. Jag skrev ut delarna separat till en början. Modellen av skrivare jag använder är en FlashForge Finder, vilket ger helt ok utskrifter för priset. Den nyttjar en en sorts plast som kallas PLA och ska vara biologiskt nerbrytbar. Det kan vara ett problem långsiktigt för min regnmätare, men det får tiden visa.
Konstruktionen av delar
Eftersom detta är mitt första projekt i Fusion 360 tog jag fram delarna stegvis. Blev en hel del Googlande och letande efter guider för respektive steg. Måtten för vippbrädan valde jag att göra 10 cm lång, skrivaren jag har klarar 14 cm max. Min tanke var att detta var nog stort för att testa skrivaren samtidigt som det var lätt att skriva ut (trodde jag…). Att börja med den här delen var riktigt utmanande eftersom jag inte hade någon som helst tidigare erfarenhet av CAD… Men skam den som ger sig, efter någon kvälls läsande och trial and error så fick jag till en fungerande modell.
När jag skickade utskriften till skrivaren gick det över förväntan, fast jag hade missat att sätta en ”brim” och skapa stödstrukturer. Delen blev robust med väggar på 2mm.
Jag gick nu vidare och färdigställde hållaren under vippbrädan, där testade jag att skriva ut med stödstruktur inne i själva öglorna, vilket gjorde att utskriften blev helt ok.
Efter att ha lyckats med de två bitarna och monterat ihop dom insåg jag att fästet under inte kan vara fristående, insåg även att mellanrummet mellan ringarna var lite för stort, vilket gjorde att vågskålen kunde åka ur fästet… Tillbaka till ritbordet igen och klura… Nästa design valde jag att göra med en vägg för att skydda min kommande elektronik från eventuellt vattenstänk.
Utskrifter i 3D skrivaren kan inte hänga i luften, det krävs en extra stödstruktur (tree) i mitt fall för att lösa detta. Jag valde även att lägga något som heter ”BRIM” under utskriften. Detta för att undvika att utskriften släpper från utskriftsplattformen.
Den nya delen kom ut ok från skrivaren, jag flyttade in fästena på sidan om vippbrädan ca 2mm på var sida i Fusion360. Fördelen nu är att vippbrädan nu satt väldigt bra mellan ringarna och riskerade inte att släppa längre. Det var lite jobb att plocka bort all stödstruktur.
Med den nya modellen behövde jag inte fundera över hur jag skulle få vippan centrerad under tratten. Vilket var välbehövligt eftersom tratten är designad för att vara öppen precis över mitten på vippan.
Nu blev det ett test under vattenkranen bara för att se att den inte hängde sig eller att den missade att tippa.
Nu var det dags att göra tratten och kanterna runt om min vågskål. Min Flashforge Finder klarade max 14x14x14cm. Jag valde att göra ”tratten” precis så stor som skrivaren klarade bara för att se hur en sådan utskrift beter sig. Modellen nedan är den jag ännu kör i regnmätaren.
Tyvärr krävdes det 3 utskrifter för att få den lyckad (3 utskrifter och 12 timmars väntan mellan varje…). Den första misslyckades på grund av att jag valt att skriva ut delen i orienteringen den skulle stå. Det slutade med att mitten tippade och tratten aldrig byggdes… Själva modellen var det inte något fel på. Orsaken till att den tippade var att för lite yta som fästes i plattan under och för lite stödstruktur. När skrivaren sedan rörde sig fram och tillbaka blev det nog för mycket tyngd och mitten tippade….
Nästa utskrift placerade jag med tratten nedåt, dvs jag vände utskriften 180 grader i FlashPrint. Flashprint är det program som importerar STL filer och gör om dom till GKod. Det var det som följde med min skrivare. Tyvärr gick det åt skogen även nu, skrivaren hängde sig efter 5 timmar. Kan ha berott på att jag hade FlashPrint igång på datorn och att den via wifi kopplingen till skrivaren störde något. Sedan den utskriften har jag för vana att stänga FlashPrint så fort jag gör en längre utskrift.
Testade sedan igen och då lyckades jag få en prefekt utskrift.
Elektroniken
Elektroniken består av en ”Reed switch”, dvs en liten brytare som reagerar på magnetism för att öppna eller stänga sig. Det är det lilla glasröret till höger på bilden. För att undvika störningar använder jag en 10kOhm resistor mellan porten på arduinon och jord, detta leder bort eventuella störningar. Mer avancerat än så är inte själva elektroniken som läser om vågskålen bytt läge.
Nu var delarna som behövdes för att mäta regn klart och det var dags att fundera över elektroniken. Jag insåg rätt snabbt att jag behövde fästa en magnet på vippbrädan. För att få träna mer i Fusion360 valde jag att göra delar som skulle passa på befintlig utskrift.
Nu kunde jag montera ihop delarna. Dom passade perfekt! Det fungerade direkt och magneten fick sensorn att reagera. Nu kunde jag börja fokusera på att koppla upp regnmätaren med mina befintliga hemautomation. Jag började bygga med en Arduino Unu eftersom det är en stabil plattform att utgå ifrån. Allt den behöver göra är att läsa om en port är 1 eller 0, beroende på vippans orientering. Jag har valt att magnetsensorn är sluten när regnmätaren är tippad till höger, och att den är öppen när den tippar till vänster.
Nu upptäckte jag att underredet var lite väl rangligt och att insekter och annat lätt kan krypa upp under tratten och riskera att störa mätningarna…. För att få lite mer utmaning och lära mig ännu mer i Fusion 360 så bestämde jag mig för att göra ett underrede som direkt skulle jacka ihop med den tidigare utskrivna delen ovan. Jag har även insett att 3D skrivare inte ger 100% passform, därför har jag minskat vissa delar och ökat andra strax under 1 mm. Detta gör att delarna direkt passar i varandra och att den eventuella slipning som behövs göras hålls minimal.
Jag passade på att göra små väggar vid vågskålarnas slut för att undvika att vatten följer ringarna till höger / vänster. Lite för att skydda elektroniken som kommer sitta bakom plattan. Nu kunde jag fortsätta att koppla upp sensorn på WIFI. Jag gick vidare till en NodeMCU, vilket är en ESP8266 12 med alla de komponenter som behövs för att kopplas direkt in till datorn. Fick till kod som konsekvent rapporterar varje tippning via wifi. För att bli klar med projektet så valde jag att skicka via HTTP till min loggservern.
Koden fungerade bra och det är inte det här som är det komplexa i projektet (Tyckte jag då!). Jag skickar i den här versionen antal tippningar samt om det är åt höger eller vänster den tippat (0 eller 1), Fick till all kod och resultatet visades på följande sätt
Koden
Koden hastade jag ihop för att bli färdig med sensorn, jag tänkte att nästa version av koden kommer att hamna på vår GITHUB..
Rapporterar nu följande värden:
- Firmware version
- Sensor namn
- Batteristatus (raw)
- Antal tippningar sensorn gjort.
- 1 / 0 på nuvarande tippning.
// Version 1.0 av koden #include <Arduino.h> #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <ESP8266HTTPClient.h> #define USE_SERIAL Serial const char* WIFISSID = "xxxxx"; // SSID namn const char* WIFIPASS = "xxxxx"; // Lösenordet. int maxStartDelay = 4; // Anger hur många försök man ska avvakta med i startup innan den går till loopen. bool firstLoop = true; // Anger att detta är första loopen int regnPinnen = 5; // Pinnen som läser om den tippat. int antalggr = 0; // en simpel räknare som adderar hur många tippningar den gjort sedan start. bool lastState = false; // Anger vilket läge som var förra gången. bool currentState = false; // Anger vilket läge loopen har nu bool currentWifiState = false; // Används för att säga om enheten har wifi igång eller inte. // Webb saker String serverAddress = "xxx.xxx.xxx.xxx"; // Ip Adress till server int serverport = xxx; // Port till servern. String sensorInfo = "ESP826612E/HTTP/Regnsensor/1/"; // ettan står för att det är API version 1.0 som kommer användas. // Här Finns början av det som kommer postas till servern. String sensorPostData = "http://" + serverAddress + ":" + String(serverport) + "/" + sensorInfo; // Färdig del av huvddata till servern. // Mäta Batteriets spänning float batteryLevel = 0; // variabel som sätts till noll vid varje uppstart. // Läs av batterispäningen på enheten (OBS Resistorerna måste beräknas! Jag har baserat detta på 470K Ohm (R1) och 100K Ohm (R2)) float batteryPower = 3.7; // Ange hur många volt du matar enheten med ( detta kommer sedan att nyttjas i omräkningen från 1V till korrekt volt) int voltDivdierVoltage = 658; // Agne vilket spänning din spänningsbrygga lämnade vid "full effetkt" dvs i mitt fall 6V blev ca 1V med 470K ohm och 100k Ohm,dvs värdet att dela med då blir 1024 ESP8266WiFiMulti WiFiMulti; float getBatteryStatus(){ // V1.2 --- testar att räkna batteristatus. int tmpBatteri = analogRead(A0); batteryLevel = tmpBatteri; USE_SERIAL.print("Raw batteri status: "); USE_SERIAL.println(String(batteryLevel)); batteryLevel = (batteryLevel * batteryPower) / voltDivdierVoltage; // värdet 978 baseras på det värdet jag fick fram när jag matade 6V genom spänningsdelaren och mätte fram 0.978v USE_SERIAL.print("riktigt batterivarde: "); USE_SERIAL.println(String(batteryLevel)); return tmpBatteri; } void setup() { pinMode(regnPinnen, INPUT); // Väljer pinnen som regnmätaren sitter på. USE_SERIAL.begin(115200); // USE_SERIAL.setDebugOutput(true); Serial.println("Nu Startar enheten - Automatiserar.se"); Serial.println("Data kommer skickas till: " + sensorPostData); Serial.println(getBatteryStatus()); WiFi.mode(WIFI_STA); WiFiMulti.addAP(WIFISSID, WIFIPASS); uint8_t snurr = 0; // räknaren i loopen nedan. while(WiFiMulti.run() != WL_CONNECTED || snurr <= maxStartDelay){ Serial.println("Avvaktar wifi - " + String(snurr)); snurr++; // adderar en till snurren delay(500); } ShowWifiStatus(); if((WiFiMulti.run() == WL_CONNECTED)) { Serial.println("Skicka Info till loggservern"); ShowWifiStatus(); /////////////////////// HTTPClient http; USE_SERIAL.print("[HTTP] begin...\n"); http.begin((sensorPostData + String(getBatteryStatus()) + "/" + "StartarTipparen" + "/" + String(WiFi.RSSI()))); USE_SERIAL.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET(); // httpCode will be negative on error if(httpCode > 0) { // HTTP header has been send and Server response header has been handled USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); // file found at server if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); USE_SERIAL.println(payload); } } else { USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); currentWifiState = true; // sätter att den haft wifi första uppstarten. } } // Debug för att se vilken status wifi har. void ShowWifiStatus(){ Serial.print("WIFI - status:"); Serial.println(WiFi.status()); } // Används för att stänga wifi när det inte behövs skicka något. void WifiOnOff(bool toDo){ if (toDo){ WiFi.mode( WIFI_OFF ); // Stänger WIFI Serial.println("Stängde WIFI"); ShowWifiStatus(); } else{ WiFi.mode( WIFI_STA ); // Stänger WIFI //WiFiMulti.addAP(WIFISSID, WIFIPASS); Serial.println("Startar WIFI"); } currentWifiState = toDo; // Sätter global info om att wifi är av / på. } void SkickaHttp(int antalggr,int statusMode){ if((WiFiMulti.run() == WL_CONNECTED)) { Serial.println("Startar HTTP Klient med data:" + String(antalggr) + " : " + String(statusMode)); HTTPClient http; http.begin((sensorPostData + String(WiFi.RSSI()) + "/" + String(getBatteryStatus()) + "/" + String(antalggr) + "/" + String(statusMode))); USE_SERIAL.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET(); // httpCode will be negative on error if(httpCode > 0) { // HTTP header has been send and Server response header has been handled USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); // file found at server if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); USE_SERIAL.println(payload); } } else { USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); ShowWifiStatus(); Serial.println("Klar, data skickat"); } // END - if((WiFiMulti.run() == WL_CONNECTED)) else{ Serial.println("KUNDE INTE KOPPLA UPP?!?! ingen data skickades."); } } // - END SkickaHttp void loop() { int currentState = digitalRead(regnPinnen); if (firstLoop){ lastState = currentState; firstLoop = false; // Sätter att den nu kört uppstarten . }; // Om det är första uppstarten så ska den inte skicka en tippning // Kontrollerar om värdet på pinnen, översätter det till ett bool värde. if (currentState == 1){currentState = true;} else {currentState = false;} // Kontrollerar om förra loopen har samma som nuvarande loop. Kommer inte gå in här första loopen. if (lastState != currentState){ lastState = currentState; antalggr++; SkickaHttp(antalggr,currentState); // Skickar status till loggservern. Serial.print("Antal ggr:"); Serial.println(antalggr); } else{ /* if (currentWifiState){ WifiOnOff(true); // Stänger - wifi currentWifiState = false; // Sätter att wifi stängts. Serial.println("Stängde WIFI"); } else{ } */ } delay(150); // liten delay för att undvika falska avläsningar. }
Nästa steg var att göra detta energieffektivt och montera elektroniken, tidigare har jag byggt en ESP8266-12E som klarat att köra på wifi i flera år. Valet att fortsätta med den kändes självklart, började löda och ordna en ESP8266 12.
Nu insåg jag problemet med mitt val av en ESP8266-12E! Om jag adderade deep sleep i koden så har jag tidigare satt en intervall för när den ska vakna igen. Min tanke var då att interrupts skulle fungera även när sensorn låg i Deep Sleep. Vilket den inte gör tyvärr, kommer därför behöva göra en krets innan som läser om vågskålen tippar och sedan väcker ESP:n. Nu tyckte jag dock att projektet hade dragit ut på tiden så mycket så jag valde att fortsätta med sensorn utan deep sleep.
För att kunna montera två batterier och esp8266 snyggt så gjorde jag ännu fäste som skulle monteras på skyddsväggen.
Nu hade jag alla komponenter som behövdes så det enda förutom att mäta batterispänningen var att löda ESP:n på ett kretskort och ställa sensorn i regnet.
Nu började jag göra ett simpelt kretskort med en spänningsdelare och kablarna från vågskålen. Tyvärr blev det en lödning på baksidan fel samt spänningsdelaren vänd åt fel håll. Orkade inte börja löda och korrigera allt för att åtgärda detta. Så den här ligger på hyllan med misslyckade kort…
När jag insåg att kretskortet jag gjorde på bilden ovan inte skulle rymmas mellan de två batteripacken som jag ursprungligen tänkte tog jag till en snabb och effektiv lösning…. Kommer göra en ny utskrift och layout på kretskortet så fort jag beslutat mig för nästa steg.
Nu har jag haft sensorn ute två nätter och registrerade regn. Redan första natten klockan 04:16 såg jag att det regnat och att min sensor registrerat det.
Nu ansåg jag att projektet kommit nog långt för att publiceras på bloggen, kommer lägga upp stl filerna koden på github så fort jag är helt nöjd med underredet.
Fortsatt arbete på Version 2.0
Efter att ha sett brister i min nuvarande design bestämde jag mig för att uppdatera vissa delar och helt skapa nya. Detta för att göra själva höljet stabilare och mer lättmonterat. En av orsakerna var att vinden lyckades tippa min första version… Jag valde därför att addera ett system för att enkelt kunna lägga till och ta bort modulen, detta hjälpte även till när det var dags att montera ihop och isär den.
Under mina försök att göra monteringspunkter mellan de olika lagren så insåg jag att skrivaren inte är på millimetern exakt, det kan skilja 0.3mm mellan det jag designat och det jag får ut i skrivaren, detta ledde till att min första version av fästen gick att få ihop med lite våld, men vid demontering gick dom av (röd ring på bilden längre ner)… Jag gjorde därför en ny tapp för att limma där den gamla suttit.
När jag såg skillnaden mellan en ”normal” utskrift kontra den med lägre fart och tätare lager insåg jag att tapparna skulle skrivas ut separat och inte sitta i modulerna..
Jag valde även att helt frångå min första design med en bas för tippen, nu skrivs allt som behövs för vågskålen ut tillsammans, vilket minskade mängden plast och gjorde delen mer robust. Detta gjorde att jag inte längre kunde skriva ut vågskålen i samma utskrift, därav fick jag göra öppningar i ringarna som håller vågskålen.
Jag hade nu börjat fundera en del över hur kalibrering av delen skulle göras, jag bestämde mig för att göra en bas som går att montera unders. Den går även att använda direkt med den del som samlar vatten ”tratten”. Vilket gör att man inte behöver ha någon hemautomationskontroller eller elektronik om man manuellt vill läsa av mängden vatten. Detta görs då genom att med fasta intervall tömma kärlet och mäta mängden vatten.
Nu hade jag två regnsensorer men inte all elektronik jag behövde för att göra ännu en ESP8266 sensor.
Eftersom ett av målet med den här regnsensorn är att lära mig mer om 3D skrivare och Fusion 360 så klurade jag lite på fler alternativ att skicka data. Gick igenom lådorna över gammal hemautomation om hittade en ringklocka från Nexa, den kommunicerar på 433Mhz, nu kommer jag självklart inte koppla in enheten som säger pling plong! Utan jag kommer istället hämta in datat till min VeraSecure via min RFXTRX. Jag har sedan tidigare kollat upp ett flöde via Node-Red vilket gjorde att jag kunde få in all data direkt i min http loggserver med.
Fördelen med att ändra lite funktionalitet i dörrklockan är att jag får en uppkopplad enhet som inte drar energi i väntan på regn! Den röda markeringen är det som behöver kopplas samman för att ringklockan skall skicka signalen till RFXTRX. Jag valde att behålla den röda dioden på ringklockan för att få en visuell info om data skickas från den med.
För att göra detta så enkelt som möjligt valde jag att skrapa bort lite av lacken på båda sidorna och löda två kablar. Dessa kopplas sedan till en reed switch, vilket är ett glasrör med två kontakter som sluter sig när en magnet kommer nära.
När jag sedan testade passformen så fungerade det riktigt bra, dörrklockan kan utan problem stå på samma yta som min ESP8266 annars nyttjar. Nu kände jag att dörrklockan gärna tippade och inte stod kvar om jag rörde enheten… Beslutade mig därför för att göra addons till regnsensorn! Skapade några komponenter för att supporta Nexa.
Jag började med att göra ett nytt fäste för en neodynmanget på 3mm X 8mm. Fästet gjordes nu med högsta upplösning och med 0.3 mm tolerans direkt på delen. Kunde nu fortsätta att göra ett uppdaterat fäste för dörrklockan och reed switchen.
Det nya fästet tillät mig att placera en reed switch så att magnetfältet endast triggade när tippen stod i mittenläge, vilket den inte är lång tid innan den tippar över.
Nu gick allt bra och reed switchen skulle lödas in. Men den är gjord av GLAS som jag tidigare skrev. Vilket fick den att gå sönder när jag försökte vrida switchen för att hamna optimalt
Jag passade även på att göra fästet för ringklockan, Den passade även vid första försöket.
Passformen blev riktig bra och kablarna kunde jag dra genom hålen jag gjort i skyddet mellan tippen och elektroniken.
Nu fanns tappar, reed switch och magneter på plats. allt passade bra och kändes robust.
Så här blev just lösningen med Nexa, jag väntar på en del för att kunna uppgradera min Esp8266 och fortsätta köra en på WIFI med.
Jag kommer lägga upp alla STL filer på Thingiverse eftersom det är en mycket bra plattform att dela 3D filer på.
Adressen är: https://www.thingiverse.com/thing:3039882
Kvar att göra / eventuella korrigeringar:
- API mot Vera
- Alternativ med MQTT
- Testa andra tekniker, funderar på 433Mhz genom att öppna en vanlig ”Nexa fjärr” och göra en simpel krets som skickar 1 / 0 när vågen tippar.
- Presentation och grafning.
- Beräkning mängd vatten / tippning utifrån storleken på tratten.
- Dela koden på Github *** Blev Thingiverse istället.
- Klart – Dela STL filerna på Github eller bloggen.
- Göra en mindre variant av hela designen.
Nu tar jag gärna emot tips på vad som går att göra bättre eller om det finns andra sätt att göra motsvarade på. Hoppas att all denna text och alla bilder gav dig lite tips och förståelse för jobbet bakom en så simpel sak som att mäta regn 🙂
Dela gärna projektet så fler kan komma med tips och jag själv ser att det är ett värde att fortsätta med sensorn.
// Ispep