Vattenmätning med Raspberry Pi och webkamera

finkman förbarmar sig över oss med ännu ett intressant hembygge af rang! 😀
Gästbloggare
Det är inte mycket som står utan övervakning hemma längre, så för att mätta mätbegäret så fick vattenmätaren ställa upp denna gång! 2015-10-27 20.11.04

En kollega pratade på jobbet om denna artikel i Ny Teknik. När jag till slut slaktade det förra projektet (bilspegel…) så hade jag helt plötsligt all nödvändig hårdvara över. Basen till mjukvaran hade Göran Lundquist vänligt nog delat med sig av på mysensors.org, och på Görans Youtube-klipp såg vi ut att ha likadana vattenmätare! Vad väntar jag på? 🙂

Dags att snickra lite hårdvara..

För att kameran ska få lite ljus så behövs dioder. Jag hittade en påse med vita 3mm-dioder hemma, jag tror det var såna här. Jag anslöt dem 2015-10-24 19.58.45iallafall efter den specen, 3,3v, 20mA, och de såg ut att må rätt bra. Nu behöver jag ju inte maxa dioderna, och det lyste skapligt trots att jag tog lite högre motstånd och anslöt bägge dioder genom bara ett motstånd.. På bilden använder jag ett 10 Ohm-motstånd. Dioderna är parallellkopplade för att få ut samma spänning till de båda, men båda två är kopplade i serie med motståndet för att begränsa strömen till båda dioderna. Man måste hålla reda på polariteten här också, katoden, det korta benet på lysdioderna, ska anslutas till minus. Här har jag båda korta ben lödda till den vita kabeln.

Så, hur ska jag spänningsmata dioderna i drift då? Visst finns det väl en 3,3v-pinne på Raspberryns GPIO? Jepp! Pinne nummer ett! Max 50mA last får anslutas till 3,3v-pinnen, men mina dioder mätte in på bara 22mA tillsammans.

Snyggast här hade varit att använda typ sånahär kablar med fin-kontakt , en lite mindre GPIO-ribbon eller liknande, men jag hade ingen sån. Jag bröt ur några hylsor ur en lite bredare breadboarding-sladd med fyra parallella sladdar i kontakten, och satte krympslang runt de enskilda metallhylsorna.

Därefter så  löd-skarvade jag på de gråa kablarna på den partvinnade brun-vita och 2015-10-24 20.15.18kopplade i. Långa benen på dioderna till +3,3v på pinne 1, korta benen på dioderna till jord på pinne 5 på GPIO-pinheadern. Varde ljus!!

Raspberryn är helt i standard-setup. Ni får kolla på mina tidigare blogginlägg eller så om ni vill ha detaljer på hur installera Raspbian, konfigurera WLAN och sånt. Inget annat krävs egentligen, bara en grundinstallation, koppla upp med trådbundet nätverk eller WLAN, och koppla i en webcam i USBn. Jag använder denna, som funkar utmärkt för ändamålet. Det gick till och med att ställa skärpan på kameran genom att vrida på linsen, vilket var mycket bra eftersom kameran kommer sitta bara ett par centimeter från mätartavlan. Ta det dock försiktigt när ni ställer fokus på kameran! Jag tror jag lyckades knäcka min när jag satte i kameran i hållaren, men efter en stund av pillande så verkade den ta gäng igen och jag fick skärpa.

Kamerahållaren.. Det här tog ett par prototyper. Göran i Ny Teknik-artikeln använde sig av avloppsrör och konstruerade en hållare, vilket ser väldigt snyggt ut. Jag hade inget avloppsrör i rätt storlek, så mitt första test blev att såga av en PET-flaska. Det funkade iofs bra, men jag fick inte till passformen helt rätt, vilket gjorde att flaskan kunde röra sig några millimeter mot glaset. Inget större problem kan tyckas, men det blev uppenbart sen när jag började prova mjukvaran att kameran måste stå still. Att flytta kameran någon millimeter gjorde nämligen att mätarnålen som kameran kikar på hamnade på fel ställe i bilden, nog för att stoppa mätningen.. Tillbaka till Ritbordet.

2015-10-24 20.58.56
Första prototypen, PET-flaska.
2015-10-26 22.33.37
Mycket mer stabilt!

Drömen att ha en 3d-skrivare infann sig här. Man hade kunnat skriva ut en måttanpassad hållare till kameran som styrde upp situationen direkt.

 

Istället så började jag söka runt i huset efter saker som kunde passa i denna 56mm-mässingscylinder. Efter någon timmes mätande så hittade jag en sprayflaska med startgas från OK, vars lock passade perfekt i mätaren. Jag sågade av locket så den blev c:a 2,5-3cm hög, och borrade sedan ett 16mm hål med en stegborr vid den ena kanten på locket. Stegborr är grymt till sånthär eftersom det blir så fina snitt i plast, hålet hamnar på rätt plats direkt utan att man behöver förborra ett mindre hål, och man kan prova sig fram till vilken storlek på hålet som blir perfekt, ett steg i taget.

I PET-prototypen så hade jag liksom Göran borrat hål i plasten och tryckt igenom dioderna. På det vita locket så tyckte jag att det blev jättebra ljus när jag satte dioderna på utsidan, så jag tog fram limpistolen och limmade fast dem mot kanten, riktade innåt-uppåt. Det visade sig senare vara lite flimmer på dioderna som störde bilden, men det löste sig genom att rikta upp dioderna lite mer så de inte lyste så direkt rakt in genom plasten. En annan tänkbar lösning skulle kunna vara en kondensator parallellt med dioderna, men kan det verkligen vara så mycket rippel på 3,3v-pinnen?

Nåja. På med ljuset och igång med mjukvaran!    2015-10-26 22.33.02. 2015-10-24 21.52.32

Mjukvaran

För att förklara konceptet så har jag lagt upp en film här: https://www.youtube.com/watch?v=eY8Oq6jhPGk

Dags att borsta av gymnasie-kunskaperna i C-kod.. Bleh, det var ett tag sen. Men det är ändå mycket, mycket lättare att förstå och ändra befintlig kod än att skriva hela från grunden själv, det hade jag nog inte klarat. Åter igen ett stort tack till Göran som la upp sin programvara! Det primära som behövde göras var att ta bort beroendet till Mosqitto-message brokern som Göran använder, eftersom jag inte har en sån själv. Jag slog till med några andra små ändringar också, däribland stöd för att logga den uppmätta liter-siffran till en rrd-databas.

För att få igång programvaran för vattenmätningen så krävs en förberedelse, installera detta paket på Raspberryn:

Vidare så laddade jag hem och installerade det senaste RRDtool under /opt/rrdtool-1.5.4 , för att kunna använda den nya datatypen DCOUNTER i databasen, som COUNTER, fast man kan använda decimaler. RRDtool-paketet som följer med i Raspbian är ganska gammalt, och mycket nya funktioner finns i senare versioner.

Kort för att ladda hem och installera RRDtool:

Medans vi ändå håller på, passa på att skapa biblioteket ”water” i pis hemkatalog:

Ladda sedan hem och kompilera min modifierade avläsningsmjukvara här: water-meter1.1.tar.gz

Om jag inte har glömt något nu, så borde koden kompilera snällt och en binär bör dyka upp, ”water-meter”, utan något suffix.

För att kalibrera träffpunkterna och testa mjukvaran så har Göran lagt in ett läge där man kan se bilderna och träffpunkterna från kameran i mjukvaran. Denna når man genom att köra:

För att göra detta så behöver du antingen köra i grafiskt läge i Raspberryn, eller göra som jag och använda Putty och VcxSrv för att få upp Raspberryns putty x settingsgrafiska appar på min Windows-dator. I grova drag, installera VcxSrv på Windowsdatorn (gärna en laptop, underlättar att kunna vara nära kameran för att göra kalibreringen), starta VccSrv på Windowsdatorn och koppla sedan upp till Raspberryn via ssh med Putty, med dessa iställningar ifyllda:

Därefter bör det gå att få upp det water-meters grafiska läge på Windows-PCn!

Om du inte har någon X-server till förfogande, varken Raspberryns grafiska läge, VcxSrv eller liknande, så gör applikationen en ”segmentation fault” och dör direkt när du försöker starta ./water-meter -di.

Iallafall… När du har fått igång det grafiska läget, så bör det se ut ungefär som i början på denna video (texterna ”Running..” och ”Got camera!” visas inte längre, de tog jag bort efter inital debugging).

Den enda skillnaden på din bild är att de gröna rutorna säkert inte kommer att matcha den röda mätaren på bilden, om du inte har lyckats positionera kameran preciiiis som jag. Att flytta de gröna rutorna åtgärdas genom att editera i REGION-blocket i water-meter.c. Enklast tyckte jag var att göra en printscreen, klistra in bilden i Microsoft Paint, zooma in, flytta bilden så webkamerans bild hamnade precis i det övre vänstra hörnet, sen föra muspekaren över bilden och kolla på pixel-siffrorna nere i vänstra hörnet på Paint. Därefter mata in positionerna i water-meter.c , kompilera om med ”make”, starta ”./water-meter -di” igen, göra samma sak och finjustera. Justja, för att döda water-meter, tryck ctrl+z för att få tillbaka skalet, kör ”ps” i skalet, kör sedan kill -9 <processnumret för water-meter>.

Mätaren vi siktar in oss på är 0,0001-snurran, dvs ett varv motsvarar en liter. Åtta punkter runt den mätaren ger alltså en upplösning på 0,125l, rätt bra tycker jag! Om man är äventyrslysten och lyckas placera kameran riktigt nära mätaren så kanske det går att klämma in fler punkter, vilket det verkar finnas stöd för i koden (ändra konstanten NUM_REGIONS). Om kameran hamnar långt ifrån mätaren och mätaren blir pytteliten i bild så kanske det är läge att minska till fyra punkter.

Hu, nu blev det mycket text. Vi tar en paus till bilden som visar hur jag limmade fast kameran i hållaren när allt började kännas bra. Ett par spritpenna-streck mellan fästet och mätaren också för att kunna få tillbaka locket i rätt position om man vill kolla till mätaren manuellt nån gång ibland:

2015-10-26 22.34.14

Sådärja, nu är vi nästan där! Om allt känns bra, och mätaren träffar de röda prickarna i rätt följd när den snurrar, så är det dags att gå vidare med loggningen. Förresten så tyckte jag det var bra att spola vattnet sakta för att prova in träffpunkternas positioner, då var det mycket lättare att se studsar mellan träffpunkter och sånt. Om det strular, prova att flytta isär punkterna ett par pixlar och försök igen.

När allt är intrimmat med kameran, starta ”./water-meter” utan ”-di” för att skippa det grafiska läget. Då kan man koppla ner från Raspberryn och mätningen fortsätter. Om man vill ha den exakta litersiffran i loggen så kan man starta ./water-meter med argumentet -start_value, ”./water-meter -start_value 610595” i mitt fall, baserat på mätarställningen på mätaren längst upp till höger i detta blogginlägg. Startvärdet läggs därefter till totalen i loggfilen, /home/pi/water/water-meter-total.log , som uppdateras och läses in automatiskt vid nästa start, så vid nästa start ska man alltså inte ange -start_value igen.

Som en sista grej på mjukvaran kan nämnas att det ligger lite startscript och grejor med i tar-filen ovan. T.ex. så finns Görans (lätt modifierade) water-meter.sh i mappen, som kör water-meter i en loop utifall den skulle krascha, med en reset av usb-webbkameran inklämd innan den startar water-meter igen. Det har inte hänt så ofta, men ibland när jag startat water-meter så har det bara kommit upp brus på bilden, något som tydligen Göran också hade problem med eftersom han skrev verktyget ”usbreset”. Init-scriptet (water-meter.init.d) har jag inte testat, det lär behöva lite handpåläggning för att funka.

Att skapa rrd-filen

Här kan man alltså tänka sig att skippa decimalerna om man inte är så noga, och då byta ut DCOUNTER mot COUNTER, och därigenom slippa installera RRDtool manuellt som beskrivet ovan.

Detta bör ge en water.rrd i /home/pi/water/ , vilket lämpligt nog är sökvägen som står förifylld i konstanten WATER_LOG_RRD_FILE längst upp i water-meter.c

När water-meter sedan kör, så kommer programmet att anropa rrdtool update en gång i minuten med det senaste total-litervärdet. Om du vill verifiera att allt kör, kolla t.ex. med ls -al att timestampen på filen water.rrd uppdateras varje minut, eller gör en rrdtool dump för att kolla att värdena kommer in i databasen.

Graferna då?

Här är det inte lika självklart som annars var man vill ha, det beror nog lite på vad mätningen är tänkt till. Jag var lite nyfiken på att se hur mycket olika saker i hemmet gör av med, och för det mesta så har vi noll vattenflöde. Därför så är min primära graf en halvtimme lång (för att få hög upplösning på förbrukningen) och graderad i liter per minut. Noggrannheten i min setup står ännu oprövad efter bara ett par timmar helt igång, men det lär väl ge sig efter en stund hur bra det blir, hittills så ser det ut att träffa inom ett par procent iaf.

water_usage_30minHär ser man tex. på de högra staplarna att jag spolade vatten i tre minuter, första minuten i ~1,5l/minut, andra minuten i ~0.4l/minut och sen ökade jag upp till 2,6l/minut. Totalt 4,5l på den omgången alltså.Den här grafen är skapad såhär:

Graferna lägger jag direkt i webb-roten /var/www/ , så kommer de direkt ut på Raspberryns webserver (sudo apt-get install apache2) Vidare så skulle man kunna tänka sig en graf över ett dygns förbrukning på samma sätt, fast denna gång utan CDEF-räkningen i mitten, så i det här fallet så blir graderingen liter per sekund:

I RRDtool är det bara fantasin och tiden man orkar lägga på manualläsning och Reverse Polish Notation som sätter gränserna. Man kan tänka sig att grafa kubikmeter i timmen eller vad som helst, det är bara köra en uträkning med CDEF och grafa. Min fantasi tog stopp ungefär här, så om någon provar detta och kommer på en bra graf, säg gärna till! Mina (mycket tråkiga, vi använder tydligen jättelite vatten) grafer finns på http://vatten.nykil.net. Jag önskar att jag hade haft denna lösning i somras när jag glömde droppslangen till en nyplanterad buske igång över natten, och spolade ut förmodligen några kubik över grannskapet.. Där är en grej som man skulle kunna spinna vidare på, Göran Lundquist nämnde i artikeln med Ny Teknik, han hade precis det som jag hade behövt då, ett larm som varnade om hög vattenförbrukning hemma.

Men det får bli en annan dag det!

Hälsningar,
Jim

 

 

30 svar till Vattenmätning med Raspberry Pi och webkamera

  • Jag har tänkt att använda en webbkamera ansluten med USB-förlängningskabel till en vanlig dator.
    Problemet är hur jag bäst ordnar en ljuskälla då?
    Vad kan rekommenderas? Något som drar lite strö, inte riskerar att bli för varmt osv. Kan jag hämta ström från USB? Från ett vanligt vägguttag? från ett spänningsmatat 1wire-nät?
    Förslag?

    • Hej!

      Lysdioder är nog bästa ljuskällan oavsett, då det uppfyller alla kriterier du skriver. Alla alternativ du nämner lär funka då dioderna drar så lite ström. Spänningsmatat 1-wire, en gammal mobiltelefonladdare av valfri sort, eller tjuva från USB. Jag hade nog tagit ström ur kamerans usb-kabel. Om det fanns skruvar på kameran så hade jag skruvat upp kameran och lött på lysdiodernas kabel precis där kamerans usb-kabel ansluter till kamerans kretskort. Om kameran var ihoplimmad så skulle jag istället för att knäcka upp kameran försökt att försiktigt skala bort kanterna på kamerans usb-kabel med kniv och lött på diodernas kabel direkt där.

      Kameran från m.nu som jag använde (länkad ovan) har en liten flatkabel mellan usb-kontakten och kameran, vilket säkert underlättar för att tjuva ström genom att skala kablarna, då det säkert går att dra isär kablarna lite innan du börjar. Det är de två yttre pinnarna i usb-kontakten som är +5v och gnd, och det är nog ganska troligt att det även är de två yttre sladdarna som du behöver göra åverkan på, om de nu inte av någon outgrundlig anledning skulle ha korsat sladdarna i usb-kontakten. Kontrollmät polariteten med multimeter. Osså skaffa dioder som klarar 5v!

      Vad ska du köra för OS på datorn? Jag provade att kompilera koden på Ubuntu häromdagen, vilket gick bra. Jag var dock tvungen att göra en ändring, att lägga till en extra -SDL flagga sist på rad 14 i Makefile, så raden blir ”$(CC) $(LDFLAGS) $(OBJECTS) -o $@ -SDL” utan fnuttarna. Nyare gcc är tydligen kinkig på var i kommandoraden som vissa flaggor finns. Skumt.

      /Jim

  • Hej Jim!
    Kul att du inspirerats av min vattenavläsare och att du lyckats anpassa den efter dina önskemål.
    För mig har möjligheten till läckageövervakning varit allra viktigast. Så förutom att logga förbrukning, så håller jag koll på att att det inte är någon ”smygförbrukning”. Vid misstänkt läcka får jag en pushnotis till min mobil. Fick nytta av det i somras när en vattenslang sprack.

    I mitt fall så flyttade jag över innehållet från en gammal webbkamera till en ny låda och monterade två vita lysdioder som jag strömförsörjer från kamerans USB-anslutning. Eftersom jag inte ville ha min RPi monterad i tvättstugan, där vattenmätaren är, så har jag förlängt USB-kabeln med 10 meter med en vanlig USB-förlängare.

    Har nu kört vattenavläsaren i snart ett år. Enda problemet är att USB-bussen ibland hänger sig. Om det beror på min RPi eller på USB-drivrutinen har jag inte lyckats röna ut. Som en workaround la jag in en usb-reset när jag detekterar fel. Oftast är dock inte detta tillräckligt utan det krävs en omboot av RPi:en (som naturligtvis kan göras automatiskt)

    Håller faktiskt på med en ny version av vattenavläsaren. Den kommer att, istället för RPi, baseras på en liten Dragino (http://www.dragino.com) som är en liten fantastisk linuxburk med OpenWrt. I den nya versionen kommer intrimningen av detekteringszonerna bli betydligt enklare eftersom de kan flyttas direkt med musen. För enkel integration med andra system så kommer det finnas både REST, Websockets och MQTT API:er.

    //Göran Lundquist

    • Hej!

      Ännu en gång stort tack för att du delade med dig av koncept och kod!

      Läckagedetektering står på min attgöra-lista, det är som du skriver en viktig funktion. Såsom jag tänker mig utforma den, ett larm om jag inte kommer ner på noll-förbrukning över en tidsperiod på två timmar (jag tror inte att jag har något användarfall som spolar vatten konstant i två timmar) så kommer den även bli en bra påminnelse när jag glömmer trädgårdsbevattningen igång.

      USB-reseten har jag också behövt, ibland blir bilden bara skräp. (jag använder ditt skalscript där water-meter körs i loop om den stannar, med usbreset innan nästa start), däremot så har jag aldrig behövt starta om RPin (Rpi2-B tror jag att det är jag kör?). Jag funderar på att göra som du och spu ovanför och dra in en usb-kabel till ”serverrummet”, gamla pannrummet. Min mätare sitter liksom din i tvättstugan, ~10m bort.

      Just för stunden så har jag ett problem med att mätningen av förbrukningen drar iväg lite självmant, när jag kollar på bilden så ser jag att jag får studsar mellan ett par punkter. Jag tror att jag måste flytta belysningen lite för att få bättre ljus på mätaren.

      Coolt med ny version på gång! Jag ser med spänning fram emot att se resultatet! 🙂

      En fråga angående kod och licens, jag ser att biblioteken från Cambridge U har licensen CC BY-SA 3.0 , är det OK att fortsätta med den licensen i mitt derivat av din kod? http://creativecommons.org/licenses/by-sa/3.0/deed.en_GB

      Hälsningar,
      Jim

    • Jag har läckageövervakningen ganska snävt ställd. För blir det en läcka så kan det gå snabbt. När slangen sprack så försvann 20 liter i minuten! Men samtidigt som jag vill kunna detektera för stora uttag så vill jag även kunna detektera riktigt små ”smygläckor”. Jag har därför gjort såhär:
      Jag har tre olika övervakningsmoder:
      1) Någon hemma
      2) Alla borta
      3) Natt
      Mode 2 och 3 hanterar jag än så länge lika. I dessa moder tillåter jag ingen som helst förbrukning som pågår längre än 10 minuter. 10 minuter är satt så att man ska kunna spola och tvätta sig utan att det larmar.
      I mode 1, när någon är hemma, måste systemet vara mer förlåtande. Då larmar det när man har haft en kontinuerlig förbrukning längre än 20 minuter (Jo, det händer att jag får larm när dottern duschar)

      Vad det gäller licensen så ser jag inga som helst problem, så länge du erbjuder den ändrade källkoden under samma licens.

  • Hej.

    Vill tacka er båda för att ni delat med er av detta projekt. Logga vattenförbrukning och kunna bli varnad vid läckage har varit på min dagordning länge nu, men eftersom jag inte kan koda själv så är man beroende av folk som er som kan detta med programmering.

    Jag har i alla fall fått avläsningen att fungera, dock med ett litet problem.

    Rai:n verkar inte orka processa bilden snabbt nog. Vid flöden över 7-8l/min så smiter nålen förbi mätpunkten med följden att den inte registreras. Detta trots att jag minskat till fyra mätområden som är 20x20px stora.

    Är det så att jag har för hög upplösning på webbkameran? (Microsoft Studio Cam)

    • Hej!

      Om jag minns rätt från koden så går den ut på att kolla antalet mörka (icke-vita? Kollade inte så noga) pixlar i mätområdet. Jag skulle nog dels minska mätområdet så att den röda pilen täcker hela mätområdet när den passerar. Kika också över belysningen så att det inte är för starkt eller ger reflektioner i glaset.

      Experimentera är nog grejen framförallt, men jag hoppas att det här kan ge ett par saker att börja prova iaf!

      Hälsningar,
      Jim

    • Hej igen.

      Har fått ljusförhållandena perfekta. Nålen registreras varje gång den träffar detekteringszonerna. Men som sagt, bilden laggar så till den milda grad att nålen ”hoppar över” zonen när flödet åker och nålen rör sej för fort.

      Ska prova med en webbkamera med lägre upplösning så kanske det ordnar sej.

    • Ah, då förstår jag. Du är nog inne på rätt väg. Vilken Pi-variant kör du? Min pi2 ligger runt 15fps på pytteupplösningen 176*144. Ett annat alternativ är att koppla till en mer kraftfull dator.

    • Kör Rpi mod B.

      Tror nedskalningen från 720p strömmen tar för mkt processorkraft. Får 3-5fps. Har en lågupplöst kamera på ingång, så jag får se om det hjälper. Annars får jag också skaffa mej en pi2:a.

      För övrigt så byggde jag min ”kamerahållare” av ett ”rörstopp” för 75mm avloppsrör från biltema. Det är ganska tjockt gods i rördelarna, så det blir stabilt och bra.

  • Kan nu bekräfta att det var kamerans höga upplösning som var problemet. En lågupplöst billig kamera fungerar perfekt. Får en framerate på 15fps så nu reggas alla detekteringszoner oavsett hur stort vattenflöde jag har.

  • Verkligen älskar projektet.
    Ska försöka ge mig på något i samma fattning dock med windows som bas då jag kör en homeseer server tillsammans med fristående macro.

    Några tankar och idéer om vart man startar?:)

    • Åh, det var en bra fråga! 🙂 Du borde kunna få tag på alla bibliotek som behövs samt gcc och make genom att installera Cygwin på Windows. Däremot så skulle jag tro att sättet att adressera webbkameran måste ändras i koden för att det ska funka. RRDTool finns också för Windows genom Cygwin och bör funka med en uppdaterad sökväg i koden. Minns inte om det kan finnas något mer Unix-specifikt i koden, men det upptäcker man ju ganska snabbt iaf.

      Prova gärna och skriv dina erfarenheter här! I värsta fall så finns ju alltid utvägen att tejpa fast en Raspberry Pi på baksidan av din Homeseer 🙂

  • Jag försöker att få igång detta på en vanlig dator med Ubuntu.
    Jag fastnar när jag ska kompilera… får nedanstående fel. Vad har jag missat?

    # make
    gcc -lSDLmain -lSDL water-meter.o camera.o util.o viewer.o image.o -o water-meter
    util.o: I funktionen ”init_imgproc”:
    util.c:(.text+0xa): undefined reference to SDL_Init'
    util.o: I funktionen "waitTime":
    util.c:(.text+0x23): undefined reference to
    SDL_Delay’
    util.o: I funktionen ”quit_imgproc”:
    util.c:(.text+0x2e): undefined reference to SDL_Quit'
    viewer.o: I funktionen "viewOpen":
    viewer.c:(.text+0x5f): undefined reference to
    SDL_SetVideoMode’
    viewer.c:(.text+0xb0): undefined reference to SDL_WM_SetCaption'
    viewer.o: I funktionen "viewClose":
    viewer.c:(.text+0xd2): undefined reference to
    SDL_FreeSurface’
    viewer.o: I funktionen ”viewDisplayImage”:
    viewer.c:(.text+0x112): undefined reference to SDL_UpperBlit'
    viewer.c:(.text+0x122): undefined reference to
    SDL_Flip’
    image.o: I funktionen ”imgNew”:
    image.c:(.text+0x160): undefined reference to SDL_CreateRGBSurfaceFrom'
    image.c:(.text+0x1a3): undefined reference to
    SDL_FreeSurface’
    image.o: I funktionen ”imgFromBitmap”:
    image.c:(.text+0x1e9): undefined reference to SDL_RWFromFile'
    image.c:(.text+0x1f6): undefined reference to
    SDL_LoadBMP_RW’
    image.o: I funktionen ”imgDestroy”:
    image.c:(.text+0x3da): undefined reference to `SDL_FreeSurface’
    collect2: error: ld returned 1 exit status
    make: *** [water-meter] Fel 1

    • Make på Ubuntu verkar bete sig lite konstigt vad beträffar argument, och kräver att de står sist istället för först som är specificerat i Makefile.

      Ändra rad 14 i filen Makefile så det står såhär istället, så funkar det!

      $(CC) $(LDFLAGS) $(OBJECTS) -o $@ -lSDLmain -lSDL

    • Tack!
      Nu gick det bra att kompilera. Men sedan när jag ska starta ”water-meter -di” (via VcXsrv) får jag ”Segmenteringsfel (minnesutskrift skapad)”.

      Jag har nu även testat på en Raspberry Pi och får även då ”Segmenteringsfel” (Raspbian med X).
      Vad kan vara tokigt? hur felsöker jag?

    • Det enda sätt som jag minns att jag har lyckats att få segmentation fault är är just avsaknad av X-server. Har du provat att öppna någon annan X-applikation, tlll exempel ”xclock” ? Eventuellt så måste du köra ”sudo apt-get install x11-apps” innan du kan prova med xclock.

    • Ska testa. Det jag tycker är konstigast är att det inte går på Pi:en, där kör jag ju grafiskt direkt på enheten…

    • Finns det inga loggfiler eller så som jag kan leta i för att få ledtrådar?

    • Testade nu på min testmaskin, även den Ubuntu. Samma sak där, ”Segmenteringsfel (minnesutskrift skapad)”.
      Jag kör via VcSsrv. Där fungerade xclock bra

    • Mycket klurigt. Jag provade precis att tanka hem koden ovan på en nyinstallerad RPi 3 med Raspbian 8 och det funkade direkt. Det är Raspberry Pi 2 som jag har i drift och även där fungerar instruktionen ovan fortfarande.

      Ett sätt att testa ytterligare om det är X-fönsterhanteraren som ger problem är att starta ./water-meter utan argument. Applikationen är rättså robust, och borde starta då bara det finns en kamera kopplad till USB (och tillgänglig på /dev/video0 , verifiera med ”ls -al /dev/video0” ).

      Prova sedan att köra ”gdb water-meter”, och skriv ”run -di” i (gdb)-prompten följt av ett enter, och skicka output.

      Det finns inga loggfiler annat än för vattenförbrukningen, men om ovanstående inte skulle ge något, prova att köra ”make clean”, editera water-meter.c och lägg till lite ”fprintf(stdout, ”testutskrift”); fflush(stderr);” på väl valda ställen i main-funktionen, t.ex. precis i början på funktionen, säg rad 223, därefter ”make” igen, kör ./water-meter och kika om din testutskrift kommer fram. Sen kan du antingen flytta testutskriften och kompilera om, eller lägga till flera testutskrifter eller skriva ett snyggare debug-läge 🙂 Debugutskrifter på rad 268 och 278 är intressant eftersom X-fönstret öppnar däremellan. Jag har provat att pina på alla möjliga sätt här precis, och fortfarande så är det enda sättet som jag lyckas att få segfault att sabba X-miljön på något sätt, t.ex. att sätta DISPLAY-miljövariabeln felaktigt. Men funkar xclock i samma terminal så ska det inte kunna vara det. Nåja, att skapa egna loggar till terminalen (eller fil) med fprintf är nog det enklaste sättet efter gdb, annars kan du prova t.ex. ”strace ./water-meter -di” &> loggfil.txt” och posta loggfilen på t.ex. pastebin.com och skicka länken här.

  • Tack för att du försöker hjälpa till!

    gdb water-meter

    (gdb) run -di
    Starting program: /home/pi/water-meter/water-meter -di
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library ”/lib/x86_64-linux-gnu/libthread_db.so.1”.

    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000402587 in camGrabImage ()
    (gdb)

  • Hej!

    Har varit lite mycket på senaste. Funktionen som programmet stannar på är den som läser in en bild från webbkameran. Den funktionen kommer från standardbiblioteket imgproc.h

    Ett par frågor,

    Vad använder du för webbkamera?
    Har du ställt in en upplösning i water-meter.c som kameran klarar av?
    Fungerar webbkameran i andra applikationer på Raspberryn?

    • Börjar också misstänka att kameran är problemet.
      Vilken upplösning rekommenderar du?
      Jag har testat 640×480 och 320×240 nu, samma resultat.

      Har inte provat video, men fswebcam klarar att spara en bild från /dev/video0
      Det är en gammal biltema-kamera…

  • Biblioteket som används verkar vara den senaste/enda? versionen vad jag kan se, så där har vi inget att hämta.

    Om du kikar lite i kommentarstråden så minns jag en person som provade högre upplösning och fick problem eftersom Raspberryn inte orkade med. Nu tänkte väl du iofs köra på vanlig större dator, men jag skulle iallafall rekommendera väldigt låg upplösning, det behövs inte mer på den lilla närbild man kikar på.

    Jag skulle rekommendera att prova 176×144 till en början, möjligen 352×288. Det är dessutom en annan aspect ratio än de upplösningar som du har provat. Skulle det kunna vara problemet tro, att kameran inte vill lira 4:3, utan håller sig till CIF-upplösningar (1,2222…:1)? Värt ett försök. Jag provade precis att kompilera med 320×240 här nu för att se om jag kunde reproducera samma segfault, men det fungerade. Men det kan ju bero på kameran.

    Prova gärna 176×144, annars prova att låna/köpa en annan kamera, den lilla kameran som jag använder ovan är fett billig!

  • Kommentera