LyMet – vnější jednotka meteostanice, část I. – elektronika

IMG_8463_webUž několikrát jsem se zmínil o tajuplném „větším projektu“, na kterém ve volném čase pracuji a myslím, že nastal čas se rozepsat o jeho další části – vnější jednotce meteostanice. Jde o desku senzorů a bezdrátové komunikace, řízenou procesorem se zavaděčem Arduina, napájenou z baterie, která je dobíjená ze solárního článku. Vlastnosti jednotky jsou:

  • Měření teploty a relativní vlhkosti čidlem SHT11, nebo levnějším (a také méně přesným) DHT22.
  • Měření atmosférického tlaku čidlem BMP-180.
  • Měření rychlosti a směru větru čidly k meteostanici WH1080.
  • Měření srážek čidlem k meteostanici WH1080.
  • Detektor blesků s AS3935.
  • Bezdrátová komunikace pomocí modulu s NRF24L01.
  • Správa baterie a její dobíjení s obvody BQ27210 a BQ24072.

Celkové schéma zapojení vypadá takto:

Scchematics_web

Většinou se jedná o téměř katalogové zapojení jednotlivých komponent, za zmínku však stojí využití BQ24072 LiPol nabíječe. Zde jsem se inspiroval konstrukcí z Adafruit, kde vtipně použili PWM nabíječ LiPol baterií tak, že dosáhli (téměř) shodného výsledku, jako při použití MPPT měniče. Vzhledem k tomu, že čip  MCP73871 nebyl u Farnella v té době skladem, jsem byl nucen hledat alternativu. Našel jsem BQ24072, který je svou vnitřní strukturou velmi podobný a byl skladem.

Pro jednoduchost konstrukce jsem plošný spoj navrhl jako jednostranný s několika málo propojkami a součástkami SMT.

IMG_8464_web

Schéma a plošný spoj byly nakresleny v mém oblíbeném Kicadu a kompletní projekt je možné stáhnout na konci tohoto příspěvku.

Současný stav je takový, že všechny senzory mám oživené a funkční – je možné měřit aktuální hodnoty, pouze nemám ověřené měření, poskytované detektorem blesků (v tomto ročním období moc blesků není). Nabíjení baterie ze solárního článku funguje; průměrná spotřeba elektroniky se pohybuje kolem 6-7mA (předpokládám, že se dostanu ještě níž po vypnutí ladících výpisů na sériovém portu a podobně). Včera jsem rozhýbal základní bezdrátovou komunikaci, takže můžu přistoupit k zalakování desky a napsání finální verze firmware – o tom ale bude zase další článek 🙂 . Ještě jedna poznámka na konec – celková sestava vnější jednotky s čidly a vytištěnými chybějícími díly bez namontovaného krytu elektroniky by měla vypadat nějak takto:

IMG_8760_web IMG_8761_web

LyMet Version-02
LyMet Version-02
version-02.zip
1.2 MiB
786 Downloads
Details

121 thoughts on “LyMet – vnější jednotka meteostanice, část I. – elektronika”

  1. Zdravim, vcelku ma zaujal Vas projekt meteostanice, tiez pracujem na niecom podobnom a prave mi prisla externa cast WH1090 bez elektroniky do ktorej planujem osadit arduino + ethernet modul a komunikovat pomocou MQTT. Chcem sa spytat, mate niekde k dispozicii mdel drziaka elektroniky? Rad by som si ho vytlacil na mojej 3d tlaciarni.
    Dakujem

      1. Dobrý den. Chtěl bych si také nechat vytisknout na 3D tiskárně díly, ke kterým jste udělal 3D modely. Chtěl bych se zeptat, zda máte modely i ve formátu „STEP“. Naše 3D tiskárna umí jen tyto modely..
        Děkuji za odpověď.
        S pozdravem
        Jiří Kocián

    1. Ještě jedna poznámka – na základě současných zkušeností bych ten projekt ale teď už pojal jinak – vzhledem k tomu, že všechny čidla jsou na I2C, tak bych se na celé Arduino vykašlal a postavil to na ESP8266. MQTT klienta má, I2C rozhraní také, takže ba mělo stačit jen posílit baterii a napájecí zdroj… 🙂

      1. Zdravim,

        Vdaka za rady a odkaz na 3d model. Prave som ho uspesne vytlacil, takze uz zostava len zbastlit elektroniku. Co sa tyka esp8266, ten som kupil pred par mesiacmi, ale vtedy som z toho dostal maximalne teplomer s dallas cidlom, ale vidim ze behom tohto casu sa mqtt plne integrovalo, ale nakolko mam iba esp-01, tak to spojim s arduinom a malo by to fungovat. Este som premyslal nad rfm69hw, ktorych mam tiez zopar kuskov, ale pri pouziti tohto modulu je potrebne prerusenie, ktorych je na arduino nano zalostne malo, takze som si lamal hlavu jak to cele vymysliet, ale vidim ze esp8266 je ta spravna volba. Vdaka za tip, ked budem hotovy, urcite ukazem fotky.

        1. Není zač – co se týče přerušení v Arduinu Nano, tak zase tak málo jich není 🙂 – pokud nestačí standardní INT0 a INT1, tak se zkuste podívat po PinChangeInterrupt knihovně. Využívá pinchange přerušovacího vektoru a umožňuje nastavit prakticky kterýkoliv pin jako zdroj přerušení s vlastním vektorem…

  2. mám dotaz když jse byl schopen vyrobit vnejsí část k meteostanici nemáte tušení kde by se dala ke stanici WH 1080 sehnat vnějsí jednotka kde jsou sva konemtory pro připojení anemometru se smerovkou a druhý na srážkoměr a vnejsí část meří vlhkost teplotu a vysílá data na 868,3 MHz do hlasní jednotky . zřejmě se mi podařilo vložit opačne baterie a vnějsí jednotka odkráče . nemáte náhodou tušení zda v nio není nejaká ochrana proti přepolovaní např zenerka dioda nebpo nejaká pojistka . zklrátka po vložení baterií napodruhé již správně se mi nespojí vnejsí část d vnitříé ani nepřenásí data a ani nepřicjímá DCF . zajsiomave bylo že ačkoli nemá vnejsí jšenotka solární nabiječ a baterky jsme tam nechal vic jak 2 roky přesto to ukazovalo vnejsi teplotu i když byterie mely 0,00 voltu po zmeření a přesto to teplotu ukazovalo to mne mate ů,Díky za Vaši odpove%d popřípde radu zda by jednotka šla zprovoznit
    Jarda Svoboda . Pd radeji emailem děkuji

    1. No já komponenty kupoval u Deramaxu (http://www.deramax.cz/nahradni-vysilac-vnejsi-jednotky-pro-meteostanice-wh1080-a-wh1090), nebo Hadexu (http://www.hadex.cz/t118-vysilac-vnejsi-jednotky-k-meteo-wh1080-a-wh1090/), ale oba obchody mají vysílače vyprodány, takže jim zkuste napsat, kdy budou zase skladem. Co se týče opravy, tak zkuste jednotku rozebrat a projít třeba podle http://www.timetec.freeserve.co.uk/DCF/dcf.htm … Pokud budete potřebovat víc rad, tak sem napište a pošlu Vám mail.

  3. Zdravím,
    rozhoduji se, jestli taky zkusit použít ESP 8266. Našel jsem možnosti řízení spotřeby :
    wifi_set_sleep_type
    NONE_SLEEP_T
    LIGHT_SLEEP_T
    MODEM_SLEEP_T
    Bohužel nemůžu přijít na to, jak to rozběhnout v ARDUINO IDE s ESP8266 podporou. Vyhodí to chybu při kompilaci.
    Pak je tu :
    ESP.deepSleep(microseconds, mode) WAKE_RF_DEFAULT , WAKE_RFCAL , WAKE_NO_RFCAL , WAKE_RF_DISABLED
    Tyto zkompilovat jdou.
    Nevím, jestli ty deepSleep jsou vhodné. Vítr musím měřit pořád.
    Nemáte prosím zkušenosti s řízením spotřeby ESP8266?
    Děkuji.

    1. Dobrý den,
      přeložit to nejde nejspíš proto, protože je třeba includovat user_interface.h, který je součástí původního SDK v C, takže do C++ ehm Arduina je třeba napsat
      extern „C“{
      #include „user_interface.h“
      }
      pak překlad proběhne (sám to tak používám).
      K té spotřebě – věc se má tak, že elektronika, která je zde uveřejněná bere 4-6mA z baterie se všemi čidly aktivovanými. Když jsem dělal pokusy s ESP8266 namísto Atmegy a NRF modulu, tak jsem se nebyl schopen dostat pod 30mA při LIGHT_SLEEP_T režimu. Podle mého názoru se vítr stále měřit nemusí, tedy pokud mě nezajímají nárazy větru. Co mě ale odardilo od použití ESP bylo měření srážkoměru, které bohužel musí měřit průběžně. Pokoušel jsem se to vyřešit uložením aktuální hodnoty do RTC oblasti, ale nezvládl jsem probuzení ESP ze spánku pomocí přerušení…

      1. Dobry Den
        Mel jsem stejny problem se srazkomerem, nakonec jsem to vyresil tak, ze jsem posunul snimaci cidlo vic na stranu a tim padem se magnet spina ne pri preklapeni ale na jedne strane je cidlo seple a kdyz je vanicka na druhe tak je cidlo rozeple.
        Pak staci arduino nechat spat treba 2 sekundu a pak se podivat jestli se hodnota na srazkomeru nezmenila. Casteji se to asi vylevat nebude.

  4. Díky moc za vysvětlení. Vyzkouším to.
    Minulou zimu jsem dělal meteo stanici pomocí Raspberry. Funguje docela dobře. Teď to chci ale na baterie, a tak to udělám dle vaší koncepce.
    K tomu větru. Chtěl jsem měřit okamžitou rychlost, náraz a pak průměr. CHMI říká, že pokud jde o rychlost, tak se jedná o 10 minutový průměr. O nárazu pak, že musí trvat min 1s a max 20s a taky by měl být o 5m/s nad průměrnou rychlostí a větší než 12m/s, aby se bral do úvahy. (http://www.chmi.cz/files/portal/docs/meteo/om/sivs/vitr.html)Takže já jsem počítal pulsy jako přerušení od anemometru a co 1s a pak 10 minut počítal a ukládal do databáze.
    Při srovnání s meteo stanici Vantage mi to ukazuje stejně.

    1. Dobrý den,
      klíčem k dosahu u těchto modulů je použitá přenosová rychlost. V projektu Lymet jsem použil tu nejnižší, která je u NRF24L01+ dostupná (250kb), kanál používám číslo 10, výkon na maximum a mám vypnutou automatickou retransmisi a potvrzování. V této konfiguraci mívám dosah kolem 20-30-ti metrů. Potíže dělají zdi – obecně platí, že čím nižší kmitočet, tím lepší penetrace pevnými překážkami, takže ano – na 433MHz by určitě byla lepší pronikavost, ale na úkor přenosové rychlosti (i když zrovna v aplikaci meteo senzorů to nejspíš moc nevadí…).

    1. Ta verze, kterou odkazujete má výkonový zesilovač – ten dosah bude mnohem větší, ale odběr bohužel taky… Ještě zkuste jednu věc – pořádně odfiltrujte napájecí napětí pro moduly. Zablokujte je kondenzátory (paralelně vždy jeden s vysokou kapacitou a jeden s malou), případně ještě nějakou indukčnost do série. Taky můžete zkusit jen komunikaci mezi dvěma Arduiny, ať detekujete případné rušení ze strany RPi.

  5. Tak jsem to vyzkoušel. Dal jsem tam 1000uF a 100n kondíky a Raspberry vyměnil za Arduino. Zdá se, že se to trochu zlepšilo.
    Já ten výkonnější nRF24 plánuji použít jako interní část, tak uvidím.
    Uvažujete o nějakém „přenosovém protokolu“, o potvrzení příjmu hodnot ?

  6. Zdravím. Zkouším udělat to napájení, ale narazil jsem na mé „pájecí“ schopnosti. Místo BQ24072 jsem našel MCP 73831, který je ve větším pouzdru. Nemůžu ale najít něco za TPS63001, které by bylo ve větším pouzdru. Nemáte prosím nějaký tip?
    Děkuju.

    1. Dobrý den,
      zkuste TPS55065 ( http://cz.farnell.com/texas-instruments/tps55065qpwprq1/dc-dc-conv-buck-boost-440khz-htssop20/dp/2492676 ), ale pracuje na nižším kmitočtu, takže bude chtít větší tlumivku ( bacha – má 5V výstup, takže za něj ještě 3V3LDO pokud bud třeba…), taky bude třeba překontrolovat všechny parametry, jestli vyhoví… V nejhorším pak LM3578 (ale ten se mi moc neosvědčil – nízká účinnost, velké rušení do výstupu).

  7. Díky. Zkusím se ještě poptat kamaráda, jestli by nepřipájel i tu vaši verzi.
    Jenom pro info. Já mám meteostanici Vantage a ve venkovní části je baterie CR123A a solární panýlek 8×5 cm a vydrží to cca rok provozu. Myslíte, že se dostanete na takové hodnoty?
    Si říkám, jestli nemám koupit nějaké levnou hotovou meteostanici a udělat pouze přijímací část.

    1. No já si dělal jakousi malou energetickou bilanci – celá Lymet elektronika bere do 8mA, akumulátor jsem použil 2400mAh (ale čínských, na modelářském testeru to mělo 1400mAh) a panel mám o rozměrech 18x13cm – dává 6V/300mA. Zatím je baterie odpoledne stále nabitá na 100 procent, ale uvidím v zimě… Nápad s levnou stanicí není špatný, ale já chtěl varování před bouřkou a to žádná tehdy neuměla.

        1. Taktéž bych chtěl zapojit anemometr WH1080 přímo do Arduina a zde následně získávat gust a average rychlost větru. Poradí někdo? Hledal jsem na internetu, ale nic moc jsem nenašel 🙁

          Ozvěte se, budu hrozně rád.

  8. Zdravím. Opět dělám s nRF24L01. Omylem jsem je připojil na 5V. Zařízení pracuje, ale když měřím spotřebu :
    #include „LowPower.h“

    void setup() {
    // put your setup code here, to run once:

    }

    void loop() {
    delay(5000);
    // put your main code here, to run repeatedly:
    for (int i=0; i<1; i++) //112
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //SLEEP_8S
    }

    Tak v uspání je celkový odběr 0,2 mA.
    Ale některé, asi ty co jsem připojil na 5V, mají v uspání odběr 4mA.
    Myslíte, že to jde zničit takovým způsobem, že to pracuje, ale má vyšší odběr?
    Děkuji

    1. Dobrý večer,
      jsou to ty moduly se zesilovačem, nebo ty obyčejné? Ty s výkonovým koncovým zesilovačem na tom jsou o něco hůř, ale zase ne tak strašně. Nicméně tady NRF24L01 mají přímo červeně napsané upozornění na možnost poškození modulu… Možná jen odešel PA, nebo LNA, takže to nějak funguje ale s mizerným dosahem.

  9. Koupil jsme na vysílání jenom takové obyčejné s anténou na plošňáku. Přijímač mám s tou externí anténou, takže dosah je uspokojivý (ten je na Raspberry 3,3V). Jenom ten odběr je velký. Někde doporučují použít dělič 10k+15K. To ale nemůže utáhnout ten vysílač?
    Ještě mám http://www.ebay.com/itm/271873956073?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
    To by si šlo použít? Jaké by ale bylo nejlevnější řešení? Napájím to nabíjecími články NiMh 3*1.3V cca 4V.

    1. Dělič je k ničemu. Pokud to napájíte 3xNiMh, tak – vzhledem k tomu, že napětí prázdného článku je 0.8V – potřebujete Buck-Boost měnič na 3V3 (někdy je třeba napětí snížit a jindy zase zvýšit dle aktuálního napětí článků), což by dle číňana ten zdroj z eBay mohl být, ale moc tomu z těch fotek nevěřím. Neviděl jsem Buck-Boost bez indukčností, tedy pokud to není nábojová pumpa, ale ta by asi zase nedala těch psaných 150mA… Á, tak podle popisu v textu dál je to skutečně nábojová pumpa – odhaduji, že by mohla dát tak do 50-100mA, takže to zkuste a napište, jak jste dopadl (o tom, že by tohle napájelo ESP8266, jak píše číňan si ale můžeme nechat jen zdát).

  10. Díky. Tak se zdá, že to pracuje – aspoň na krátkou vzdálenost.
    Odběry ale jsou :
    – bez pumpy a bez nRF24 – 0,28 mA
    – s pumpou 0,69mA
    – pumpa i nRrF24 0,74 mA
    Ten odběr bez ničeho je ale stejně moc?? Je to ATMEGA328 zapojená samostatně (krystal, kapacity 22pF,odpor a 100n kondík na reset, 100n na napájení a 820 Ohmu na Dalas čidlo. Ta pumpa tomu taky dává zabrat.
    Šlo by to ještě nějak snížit? Používám knihovnu TMRH20 a i s tím networkem a sleep funkcí.
    #include „nRF24L01.h“
    #include „RF24.h“
    radio.stopListening();
    network.sleepNode(20,255)

  11. No ale teď o tom uvažuji dále. To ATMEGA328P nemůžu napájet 3.3V. Ono jede tak od 3.6V. To bych musel asi změnit fuses a frekvenci. V tom se moc nevyznám.

    1. Ono by se toho muselo změnit víc – pokud si vzpomínám, tak při napájení 3V3 má Atmega maximální kmitočet 12MHz, takže se běžně používá 8MHz krystal. To ale taky znamená jiný Arduino zavaděč (a taky jiné nastavení brownout detektoru v pojistkách, jak jste psal). Já si myslím, že nejlepší je koupit na Ali/ebay Arduino Pro Mini ve variantě 3.3V s 8MHz krystalem – všechno budete mít už připravené a není tam USB čip, takže to bude žrát míň. na druhou stranu zase budete potřebovat převodník pro programování…

  12. Jo, díky. Zatím jsem zkusil přepsat brown-out detection na 1.8V a arduino standalone 16MhZ crystal jede až do 2.2V. Tak to jdu zkusit nasadit do provozu.

    1. To určitě nejede – v datasheetu k 328P je napsaný tohle:
      Speed Grade:
      0 - 4MHz@1.8 - 5.5V, 0 - 10MHz@2.7 - 5.5.V, 0 - 20MHz @ 4.5 - 5.5V

      Proto se taky do desek na 3V3 dává 8MHz krystal. Ono to možná pojede i na těch 16MHz, ale nestabilně v celém teplotním rozsahu.

  13. Aha. Tak to nechám jenom zkušebně a objednám si i ty 3.3V Pro mini a 8MHz krystaly.
    Ale chci to pak napájet Li-Ion a ta má taky až 4.2V.
    Tak zase bude ten problém s nRF24 (3.6V).

  14. Než mi dorazí ProMini na 8Mhz, tak jsem zkusil Pro Mini 16Mhz přenastavit na interní oscilátor 8MHz. Samotné funguje, aspoň LEDka bliká na 8MHz. Ale vznikl problém s nRF24 – někdy nic neodešle, jindy max. jednu zprávu a zamrzne.
    Když se dívám na netu, tak ostatním to funguje. Přitom s tím 16MHz nebyl problém. Tak nevím, co se děje.

      1. Já používám https://github.com/TMRh20. Libí se mi, že jde vystavit siť. Zavaděč jsem taky snad opravil – nakonec jsem postupoval podle http://forum.mysensors.org/topic/2484/running-atmega328p-on-internal-8mhz-clock/2 Akorát E-fuses jsem dal 7 – vypnout brown-detection. V IDE pak používám MiniPro a podvolbu 8MHz. Programoval jsem to přes Arduino UNO as ISP. Akorát mi není jasné, jaký vliv mají v IDE boards.txt hodnoty pojistek. Ten 8MHz Pro mini tam předpokládá externí 8MHz krystal. Ale jak jsem říkal – ledky blikají tak, jak použiji v delay()

          1. atmega 328 na 3,3V obvykle na 16Mhz funguje při pokojové teplotě, a to asi u venkovní jednotky nebude.
            Testoval jsem mini 8Mhz 3,3V v mražáku, a při -18 st.
            v pohodě (teda jenom základní prográmek s blikáním)
            Ani nevím odkud, ale v board manageru mám pro mini několikrát, jednou bez možnosti změny 5V 16Mhz, a pak znovu s více možnostmi napájení a kmitočtů.

  15. Chyba jako obvykle byla mezi stoličkou a arduinem 🙂
    Arduino na 8MHz jede jak má (studený spoj).
    Napsal jste už nějaký kod pro anemometr? Myslel jsem, že to bude jednoduché, ale nějak se z toho nemůžu vymotat. Chci měřit i okamžitou rychlost, asi co 1s, ale mezitím spát a když bude bezvětří, tak spát třeba 10 min a pak odeslat data.
    Zkouším teda anemometr na pin 2 jako interrupt, aby probudil arduino a připočetl pulsy. Ale se spaním se nabourají časy (knihovna interval.h pracuje při spaní?) a nějak nemůžu vyřešit časování.

    1. Tak to mám radost, že to funguje. Já mám zatím napsaný jen předběžný kód – přiznám se, že jsem projekt mírně odložil, protože to baterie, kterou mám nezvládá (levná Čína 🙁 ). Časování není velký problém, ale nesmíte zastavit timer0 (běží podle něho millis(), takže moje definice pro usnutí je tahle:
      #define GOLOWPOWER() LowPower.idle(SLEEP_30MS, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_ON, SPI_OFF, USART0_ON, TWI_OFF)
      takže se procesor budí každých 30ms a nebo timerem 0. Ten USART by taky mohl být vypnutý, ale já na něj posílám diagnostiku.
      Abych udržel spotřebu na rozumné výši, tak jsem použil tohle:
      system.set(950);
      while (!system.expired())
      GOLOWPOWER();
      BIT_H(PORTB, LED);
      system.set(50);
      while (!system.expired())
      GOLOWPOWER();
      BIT_L(PORTB, LED);
      kde „system“ je obyčejný interval. Funguje to tak, že procesor prakticky sekundu spí, akorát poblikává LEDkou.

  16. Paráda. Děkuji.
    Takže důležité je použít LoPower funkci Idle. Tento čas SLEEP_30MS bych mohl asi zvolit i vyšší, tím by asi byla menší spotřeba, ale menší přesnost časování. Kdybych nechtěl měřit co 5 sekund, tak bych mohl použít SLEEP_8S.
    Zkusil jsem to udělat takto : http://pastebin.com/xKgcv4e1
    Snad tam není nějaká zásadní chyba?

    1. No právě, že spotřeba nižší nebude – běžící Timer 0, který řeší millis() stejně procesor vzbudí cca po 1ms (přesně si to z hlavy nepamatuju…). Chybu při zběžném pohledu sice ve Vašem kódu nevidím, ale takhle to bude měřit jen průměrnou rychlost za daný časový úsek a nebudete schopen detekovat špičky a nárazy větru. Co takhle místo měření počtu pulzů za určitý interval měřit vzdálenost mezi pulzy? … Tak jo – po druhém čtení tam drobnou chybku vidím – v loop(), když měníte obsahy pulse1 a pulse2 je třeba na ten okamžik zakázat přerušení, protože se jedná o dva byty a kdyby náhodou došlo k přerušení během ukládání té nuly, tak se obsah proměnné poškodí.

  17. Díky moc za kontrolu. O tom měření času mezi pulsy jsem trochu uvažoval. Mám to čidlo z Hadexu – 2 pulsy na otáčku. Kalibroval jsem to v autě – 20 km/hod – 9 pulsů/s, 40 km -18 pulsů/s, 60 km/hod -27 pulsů/s. Zdá se to lineární. Je fakt, že to jenom násobím počet pulsů x 2.2. Pod 2.2 km/hod vlastně nezměřím nic. To by měření času mezi pulsy odstranilo.
    Jak jsem již vzpomínal, tak CHMI říká, že pokud jde o rychlost, tak se jedná o 10 minutový průměr. O nárazu pak, že musí trvat min 1s a max 20s a taky by měl být o 5m/s nad průměrnou rychlostí a větší než 12m/s, aby se bral do úvahy.

    Ještě jsem teď o víkendu chtěl meteo stanici doplnit o měření výšky sněhu s ultrazvukovým čidlem HC-SR04. Nezkoušel jste to někdy? Bohužel opakovatelnost měření je nějak špatná. Zkusil jsem použít i nějakou lepší verzi, která vrací 10 měření, ale liší se to o v průběhu dne i o 10 cm.
    Nevím, jestli je to čidlem (zkusit třeba parkovací senzor z auta?), výpočtem…. Teď nad tím bádám. http://pastebin.com/8XTwct28

    1. HC-SR04 pár kusů mám a největší problém s tím čidlem je v tom, že rychlost zvuku závisí na teplotě vzduchu – vidím, že tam kompenzaci na teplotu máte (nekontroloval jsem matematiku), takže tím by to být nemělo. Co mě napadá je, abyste zkusil dát více času na rozběh SR04 (je v něm PIC) po zapnutí napájení – těch 10ms se mi zdá dost málo…

  18. No, změním čas a nepracuje vůbec. Proč? Protože má být napájení na 5V (ale TRIG je zase vtipně na 3.3V). Já mám samozřejmě skrz nRF24 použití 2 ks tužkovek. Kdoví, co to vůbec zase měřilo. Ty rozdílné napájení to je hrůza.

    1. Díky za odkaz – zajímavé to je, ale fungovat to, bohužel, nejspíš nebude – alespoň ne s tak malým kondenzátorem kapacitorem. Ta sada senzorů, co máme bude sama něco žrát – směr větru tvoří odporový dělič a anemometr a srážkoměr potřebují „popotahováky“. Zkusil jsem kdysi ty odpory dát hodně velký, ale anemometr a srážkoměr detekovaly falešné impulzy. Já mám spotřebu 4-8mA (tedy průměrnou, hlášenou každou minutu). Šla by určitě ještě snížit vypnutím sériového portu a vypínáním napájení nepoužívaných senzorů (tlak, Sensirion/DHT), ale na to jsem zase nenavrhl HW…

    2. Tady to jeden dokonce prodává :
      http://www.ebay.com/itm/Thermal-Energy-Harvesting-power-supply-w-LTC3108-and-supercapacitor-storage-/331654685113?hash=item4d3828e1b9:g:iYAAAOSwgQ9VpQji

      Zajímavé je i řešení zvýšeného odběru při vysílání.

      Já mám od něho jinou destičku:
      http://www.ebay.com/itm/ATmega328p-board-w-ESP8266-and-NRF24l01-socket-LTC4067-lithium-battery-charger-/331641400414?

      Teď už dělá vylepšenou verzi s lepším LDO regulátorem. Musím zjistit, jestli by šel regulátor vyměnit.

  19. Zdravím. Zkouším ke stanici použit profi pojítko LORA rn2483. Komunikuje po seriové lince.
    Když zadám :
    radio rx 0, tak by to mělo vrátit řetězec „OK“ a pak řetězec „radio_rx data“.
    Předpokládal jsem, že můj program se defacto zastaví a bude čekat na příchod dat. Pak je přečte a když je řetězec OK, tak
    bude opět čekat na vlastní hodnoty (data). Program ale neustále běží. Pořád se zobrazuje string Zacatek.
    Nevíte prosím, kde je zakopaný pes?
    void loop() {
    Serial.println(„Zacatek“);
    mySerial.println(„radio rx 0“);
    while(!mySerial.available())
    {
    ;
    }

    while(mySerial.available())
    {
    receivedData = mySerial.readStringUntil(‚\n‘);
    }
    if(receivedData.startsWith(„ok“))
    {
    while(!mySerial.available())
    {
    ;
    }
    while(mySerial.available())
    {
    String receivedData = mySerial.readStringUntil(‚\n‘);
    }
    Serial.println(receivedData);
    }
    }

    1. Zkuste poslat někam na výstup, co Vám vrací mySerial.available() – aby to náhodou nebylo třeba tím, že to rádio echuje data zpátky… Mimochodem kde a za kolik jste koupil moduly? Já mám nějaké LoRa, které přišly minulý týden a jsou přes SPI. Koupil jsem dva za necelých 10 dolarů.

      1. Jaké to máte ty moduly LORA? Už jste je zprovoznil? Marně hledám pro rn2483 něco tak jednoduchého pro vybudování sítě, jak je pro nr24L01. Když tak je to pro RFM92W.

  20. Já jsem koupil na Farnellu, jsou dost drahé – 330 Kč + DPH. Po dlouhé doby něco, co není z Číny 🙂
    Jdu koumat. Už se s tím trápím druhý den. Asi ta sériová linka je náročná na „synchronizaci“ s vysílačem.

  21. Komunikace jakž takž jede. Nevíte prosím jak převést String 313233 do Int?
    To 313233 je vlastně dekadicky 123.
    Už jsme vyzkoušel strtol,strtoul a nevím co a stále se s tím trápím. Vždycky narazím na problémy String versus char.

      1. Tomu nr2483 se musí předávat hodnoty v HEX. Takže když chci vyslat číslo 123, tak ho musím převést na 313233.
        Níže už to mám nějak vyřešené.

          1. No nevím. Ale v manuálu píší :radio tx :hexadecimal value representing the data to be transmitted.
            V knihovně sodaq to taky tak posílá.
            Jinak parametry se nastavuji normálně dec soustavě.

  22. Po velkém boji :
    String sub1;
    for(int i=0;i<str.length();i=i+2)
    {
    String s2= str.substring(i,i+2);
    int val = (int)strtol(s2.c_str(),NULL,16);
    String pom = String((char)val);
    sub1 = sub1+ pom;
    }

    Serial.println(sub1);

  23. Tak dosah bude daleko lepší. To není jak ty modulky 433MHz anebo i nrf24L01. Od stolu s počítačem a druhý modul venku cca 150m a šlape to. Zítra snad zkusím dosah s oběma moduly venku. Jenom dopilovat komunikaci. Občas se to sekne.

  24. Zajímavé je, že jeden modul, aby fungoval, musím připojit přes převodník úrovní i když je napájen 3.3V. Na co by to mohlo být citlivé?

    1. A chcete digitální, nebo analogový? Pokud stačí analogový, tak mám na prodej Tektronix 2235 100MHz dva kanály. Posledních 5 let nebyl ani zapnutý, ale teď jsem ho zkusil a jede. Cena je 1500,-Kč včetně dvou sond.

  25. Díky za nabídku. Uvažuji, že do toho investuji cca 5-10 000 Kč. Chtěl jsem ho použít i na autodiagnostiku. Dá se v té ceně sehnat digitální anebo ten analog je lepší?

    Zkoušel jsem dosah nr2483 – z kopce na kopec 4.3 km. Musím najít vzdálenější kopce 🙂

    Nemohl jsem zprovoznit displej. Překladač psal málo paměti , cca 445B, nr2483 se nedal inicializovat. Mohlo být neočekávané chování způsobeno tím? Používám:
    #include // grafická knihovna
    #include // ovladač displeje

    1. Bojím se, že digitální osciloskop do 10.000,- nepořídíte. Já mám Hantek DSO5102B a stál před dvěma lety 18.000,- Pro příruční měření mám DSO Nano, ale to je z doby, kdy byl dolar za 15Kč a taky není zrovna nejrychlejší.
      Těžko říct, jestli na to mohl mít vliv nedostatek paměti. Nejspíš by se to sekalo – tedy pokud nepoužíváte Watchdog…

    2. na autodiagnostiku jsou úplně jiný požadavky než na klasickou radioelektroniku – do auta je potřeba aspoň 8 vstupů, záznam 10minut, ale stačí nižší kmitočty…

  26. Zkouším tedy dodělat WDT. Mělo by to být jednoduché, ale opět není. Arduino Pro Mini:
    #include

    #define LED_PIN 13

    void setup() {
    // Blink LED to signal reset
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH);
    delay(1000);
    digitalWrite(LED_PIN, LOW);
    }

    void loop() {
    wdt_enable(WDTO_8S);

    // Infinite loop to simulate a crash
    while (1);
    }
    Po 8s ledka neustále rychle bliká. Na UNO funguje dle předpokladu. Dočetl jsem se, že je to špatný bootloader. Připojím USBasp, nahraji prográmek, ale žádná změna. Snad USBasp přepíše celou paměť a mělo by to fungovat?

    1. Já myslím, že to máte špatně použité – wdt_enable() použijte jen v setup(). V loop() pak používejte jen wdt_reset(). To enable nastavuje a povoluje práci watchdogu a ten reset pak jen restartuje vlastní časovač…
      Edit: Zase píšu rychleji, než myslím – ten Váš příklad by skutečně měl spadnout…

  27. potrebuju pomoct s timto bezdratovim modulem NRF24L01
    nevim jak to zapojit ani jak to vubec funguje. na netu nemuzu najit nic co bych mohl rozchodit. potrebuju vedet jak poslat paklik dat a jak ho na druhy strane prijmout. nema nekdo zkusenost? poslete mi prosim na mejla nakej postup nebo odkaz. slejmar@seznam.cz moc vam vsem dekuju

  28. Zdravím. Vrátil jsem se ke své zakoupené desce. Koupil jsem ji proto, že slibovala mít vyřešené napájení baterie ze solárního modulu.
    Když připojím modul pouze na voltmetr, tak ukazuje cca 6V.
    Když ho „zatížím“ pouze ampérmetrem, tak ukazuje proud cca 50mA.
    Když ho ale připojím do zařízení, tak na straně solaru naměřím proud 0,5mA a na straně baterie 4.5mA. Ale to je vlastně asi odběr zařízení z baterie. Myslíte prosím, že by to principiálně mělo fungovat? Schema je na http://www.petrsi.cz/docasne/Schema.PNG
    Děkuji

    1. Dobrý den,
      úplně do detailu LTC4067 neznám – podle datasheetu by to asi fungovat mělo, ale podle toho odkazu na schéma to zařízení obsahuje pár věcí, které podle mě nejsou vyřešeny zrovna nejlíp. Například:
      1. nevím, jestli LTC4067 obsahuje ochrannou diodu oproti zpětnému proudu do panelu (ve vnitřním schématu je pouze namalovaný current limiter), takže mi tam chybí dioda mezi panelem a LTC
      2. zapojení, LTC, které je použité, je běžný lineární nabíječ, takže nedokáže dostat ze slunce maximum – nejoptimálnější solární nabíječ je s využitím MPPT, nebo aspoň PWM režim (ten používám já)
      3. schéma obsahuje dva napěťové děliče, trvale připojené k panelu/baterii (R13,R14 a R15,R19). Tyto děliče mají trvalý odběr, který možná u panelu nevadí, ale u baterie je rozhodně zbytečný
      4. osvědčilo se mi, dát paralelně k panelu velký elektrolyt (>2G)

  29. Děkuji za odpověď – zkusím tam tu diodu a kondík dát. Ale nemáte prosím nějaký tip na něco hotového, co by šlo zakoupit? Už jsem zkoušel nějaké čínské nabíječe a buď něco dělám špatně, ale neosvědčily se mi (i když ostatní je používají). Už se s tím trápím nějak dlouho.

    1. No fuj – víte jádrem celého nabíječe je MCP73871, který u Farnella stojí 50kč bez DPH v kusovce, takže to je hodně předražené… Kdyby byla dotažená do finálního stavu ta moje laboratoř, tak Vám nabídnu ji, protože za cca stejné peníze obsahuje jak solární nabíječ, tak attiny1634 a ještě ESP… Bohužel to asi levněji nepořídíte.

  30. Zdravím. Bavili jsme se to o modulech SI4432. Dnes jsem je konečně zkusil zapájet a vyzkoušet. Použil jsem knihovnu RH_RF22.h
    Výsledky opět rozpačité. Zapojení funguje, ale dosah cca 7m.
    Zkusil jsem nastavit i maximální výkon, ale nic se nezměnilo.
    Byla tam jenom anténka ve formě pružiny. Tu jsem zapájel. Jak by se měla prakticky zapojit ta zem vedle antény? Přečetl jsem spousty teoretických rad. Zná někdo praktickou?

    Pozn. zatím stále jako jediný je funkční je modul RN2483 (uvnitř Semtech SX1276) – tam to nějaký kilometr zvládne.

    1. Dobrý večer,
      zkuste na tu zem připojit cca 30cm drátu jako protiváhu antény, ale 7 metrů je hrozně málo (pokud vím, tak tenhle čip se používá/l v 3DR rádiích, takže dosah cca 0.5km se slušnou spolehlivostí by neměl být problém i bez protiváhy). Prověřte napájecí zdroj a jeho filtraci, stáhněte přenosovou rychlost na minimum, prověřte pásmo na výskyt rušení (buď přehledovým přijímačem, nebo si ho dočasně udělejte z prakticky jakéhokoliv SDR donglu a odpovídajícího SW).

    1. Tak něco tam je – tmavě modrá u 433,4MHz to zrovna není. Zkuste si pohrát s vysílacím kanálem (na chvíli ho dát i mimo povolené pásmo a změřit dosah), zkuste také změřit RSSI (pozor – je třeba měřit ve správný okamžik, tedy ihned po detekci preambule – viz. http://community.silabs.com/t5/Bluetooth-Wi-Fi/Si4432-and-RSSI-reading/td-p/114747 ) při různých vzdálenostech. Zatím to ale ukazuje na kvalitu napájení, nebo vlastní rušení ve velmi blízkém okolí.

  31. Zdravím,
    děkuji. Zkusil jsem nahrát do obou zařízení jenom jednoduché vysílání. Monitoruji to zblízka. Vždy napájené z baterie a pak z usb počítače. U toho Arduinona 8MHZ, je nějaký postranní kanál. Nevím, co to znamená.

    V knihovně je a i v příkladu je funkce Serial.println(rf22.lastRssi(), DEC); Ta mi i nablízko dá -73. Když to odnesu cca 3-4m pak -87 až -92 a příjem se prakticky zastaví.
    Napájení je 3ks AA se MCP1700-3,3V. Ten by měl dávat 250mA. Ale je použitý pouze filtrační kondík (ve větší kapacita na vykrývání).
    Ten Si4432 je ve verzi bez stínění, možná i proto to blbne.

    http://www.petrsi.cz/docasne/vysilac_arduino_16MHz_baterie.jpg
    http://www.petrsi.cz/docasne/vysilac_arduino_16MHz_USB.jpg

    http://www.petrsi.cz/docasne/vysilac_arduino_8MHz_baterie.jpg

    http://www.petrsi.cz/docasne/vysilac_arduino_8MHz_USB.jpg

    1. Ten MCP1700 by na tento odběr měl být ok. Divné ale jsou výsledky monitorování pro to 8MHz Arduino – jako kdyby tam něco rušilo. Projděte prosím rf22 knihovnu, kterou používáte a zjistěte, kde se čte/vyhodnocuje lastRssi – ten SI44.. by měl mít odstup signál-šum tuším cca -100dBm a rozhodně by nemělo být na 4m už -92dBm. Ještě zkuste prověřit vysílací výkon a správnost jeho nastavení.

  32. Tak práci s modulem jsem vzdal. Příště jedině LORA.
    Už jsme se bavili o sleep modu.
    void loop() {
    Serial.print(„start:“);
    delay(200); //aby se stacil vypsat vystup
    digitalWrite(LED_PIN, HIGH);
    delay(100);
    digitalWrite(LED_PIN, LOW);
    for (int i=0; i<5; i++)
    {
    LowPower.idle(SLEEP_2S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
    //LowPower.idle(SLEEP_2S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_ON, SPI_OFF, USART0_ON, TWI_OFF);
    }
    Serial.println("konec");
    }

    Když je TIMER1_OFF – tak to spí 10s
    Když je TIMER1_ON – tak to nespí

    To tak má fungovat? Jsem myslel, že to bude mít jenom větší spotřebu.

    1. Potíž je v tom, že jeden běžící timer (z hlavy teď nevím který) je používaný vnitřně pro měření millis() – ten tedy Vaše zařízení probudí protože má interval tuším 1ms. Pokud nepotřebujete průběžně běžící millis(), tak také vypínejte odpovídající časovač. Pokud millis() potřebujete, tak celý režim spánku přemostěte např. pomocí Intervalu – bude to fungovat, jen spotřeba bude o něco větší, protože se to bude každou ms budit.

  33. Zdravím. Jak jsem vzpomínal výše. Měl by se vítr měřit jednak co 1s – náraz větru a pak jako 10min průměr. Zatím to zkouším zase s počítáním pulsů (s měřením času mezi pulsy zápasím).
    Mohlo by to fungovat správně? (zatím s tím točím jenom doma a něco počítá). Počitadla jsou inkrementována v přerušení číslo 0 (déšť pak v přerušení 1).
    while (!interval_10min.expired())
    {
    GOLOWPOWER(); //spime
    if(interval_1s.expired())
    {
    if(vitr_pulsy_1s > vitr_pulsy_1s_max)
    {
    vitr_pulsy_1s_max=vitr_pulsy_1s;
    vitr_pulsy_1s=0;
    }
    interval_1s.set(cas_1s);
    }
    }
    interval_10min.set(cas_10min);
    //tady se zpracuji údaje větru
    // srážkoměr
    // teplota, tlak
    // a znovu dokola

    1. Jeste bych potreboval vedet datove typy vitr_pulsy… Pokud jsou vetsi, nez 1 byte, tak je tam nebezpeci race condition a je treba pri jejich modifikaci mimo preruseni zakazovat preruseni. Podivam se na to jeste podrobneji, ale az zitra.

      1. Děkuji. Datové typy jsou:
        volatile byte vitr=0;
        volatile unsigned int vitr_pulsy=0;
        volatile byte vitr_pulsy_1s=0;
        byte vitr_pulsy_1s_max=0;

        To zpracování pokračuje:
        interval_10min.set(cas_10min); // po probuzeni zacneme ihned odpocitavat cas, at je dalsi zpracovani presne po 10 minutach
        delay(100); // asi chvilku pockat po probuzeni

        //Vypocet rychlosti vetru 10min interval
        detachInterrupt(0); // pred ctenim musime zakazat preruseni
        unsigned int vitr_pulsy_posledni =vitr_pulsy;
        vitr_pulsy=0;
        attachInterrupt(0, preruseni_vitr, RISING); // po cteni a vynulovani ho opet povolime
        float rychlost10 = vitr_pulsy_posledni * 2.22 / 60; //2.22 je konstanta mého plastoveho anemometru
        float naraz_max = vitr_pulsy_1s_max * 2.22; //2.22 je konstanta mého plastoveho anemometru
        dprint(vitr_pulsy_posledni);
        dprint(rychlost10);
        dprint(naraz_max);
        //vypocet srazek

        Nevím, jak přesné bude to časování pomocí intervalu kombinované s režimem spánku.

  34. Místo 60 tam má být 600 (10minut)
    float rychlost10 = vitr_pulsy_posledni * 2.22 / 600/; //2.22 je konstanta mého plastoveho anemometru 9pulsů/1 s odpovídá rychlosti 20km/hod (měřeno autem)

  35. Dobrý den,

    zvažuji stavbu meteostanice a potřeboval bych poradit abych nešel do slepé uličky
    1) použít ceou vnější jednotku čidel WH5029 (WH1080) s tím, že bych použil procesor STM32FxxxL (s arduinem nemám zkušenosti).
    Mohl by jste poradit zda se dají sehnat k čidlům datasheet a případně doporučené zapojení a ukázky kódů pro čtení ??
    Interní jednotku bych řešil vlastní konstrukcí.
    2) Pokud bych zakoupil celou meteostanici WH5029, nevíte, zda by šlo „odposlechnout“ a dekódovat komunikaci vnější jednotky tak, abych mohl data zpracovat a poslat třeba na web ??

    Děkuji předem za nasměrování správné cesty

    Miran

      1. Dobrý den,
        mapoval jsem si některé údaje na internetu a jako nejlepší řešení mě zatím vychází koupě Meteostanice WH1090 a pomocí raspberry pi zero wifi a programu pywws přenášet data na web.
        Nemáte někdo realizovaný podobný projekt ?
        Můžete se podělit o informace ??

        Miran

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *