Igår köpte jag en regnmätare hos Clas i sjön, en modell "gungbräda" som visar ~0.5 mm per "gungning". Kopplade in den mot min AVR enligt följande. Från 5V ett motstånd på 10k till ena benet på "classe mätaren". Andra benet på "mätaren" till jord. PINC2 till mötet mellan motsåndet och "mätaren". Initierade interrupt enligt följande.
Först trodde jag att allt fungerade jag vippade på "brädan" och programmet räknade upp. Sen gick jag i väg och gjorde annat och kom tillbaka och enligt mitt program hade det regnat mer än hundra millimeter fast det var uppehåll. Då kopplade jag en konding mellan mätpunkten och AVR:en men den fortsätter att räkna regn trots uppehåll.
Har du pull-up på PC2? Har du inte det så har pinnen ingen definierad nivå. Du behöver inte skriva cli() och sei() i ISR eftersom I-flaggan automatiskt nollställs och ettställs av hårdvaran.
Jag har en "etta" tills den passerar mitten, det är alltså ingen kontakt i normal läget och kortslutet mitt på. Frågan är om det helt enkelt är störningar som fångas upp av den 10 meter långa kabeln. Antalet falska "regn-ticks" blev färre när jag parallel kopplade 3 motstånd på 1k, det var de minsta jag hade. Jag funderar på att parallell koppla en konding över sensorn, vad tror ni om det?
Jag läser det som att den ger en puls när den vippar och kör förbi mittläget, om denna kontakt är mekanisk kommer det att vara en del stutsande som måste stoppas.
Detta kan göras programmässigt eller hårdvarumässigt, hårdvaran är det första att kolla så att den inte ger en massa "intressanta" störningar.
Jag hade undvikit att dämpa med kondensator, jag hade istället räknat under ISR'n och satt en timer (variabel) till ett visst värde. I main-loop ville jag då räkna ner detta värde till det blir noll. Räkning av "vattenpulser" sätts då till att vara beroende av denna variabel: det kan bara räknas pulser om variabeln är noll.
Nu har jag kört med "thepirateboys filter" och en angivelse av ~3,5 mm under natten. Det har regnat men jag läste inte av den andra mätaren innan sängläge intogs så jag vet inte om det stämmer.
Varför ska jag kolla med (PINC & (1 << PC2)), jag har inte lyckats få ett riktigt fullständigt grepp om hårdvaran i AVR:en?