{"id":9491,"date":"2023-01-04T18:32:28","date_gmt":"2023-01-04T17:32:28","guid":{"rendered":"https:\/\/fablab21.fr\/?page_id=4712"},"modified":"2026-10-19T19:00:52","modified_gmt":"2026-10-19T17:00:52","slug":"station-meteo","status":"publish","type":"page","link":"https:\/\/www.association-ore.fr\/fr\/tutos\/jardin-connecte\/station-meteo\/","title":{"rendered":"Station m\u00e9t\u00e9o"},"content":{"rendered":"<h3>Station m\u00e9t\u00e9o arduino<\/h3>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.association-ore.fr\/fr\/wp-content\/uploads\/2023\/05\/Capture-decran-2023-05-24-175204.png\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Code<\/h3>\n\n\n<div>#define uint \u00a0unsigned int<\/div><div>#define ulong unsigned long<\/div><div>#define PIN_ANEMOMETER \u00a02\u00a0\u00a0<\/div><div>#define PIN_RAINGAUGE \u00a03\u00a0 \u00a0 \u00a0<\/div><div>#define PIN_VANE\u00a0 5\u00a0<\/div><div>\u00a0<\/div><div>#define MSECS_CALC_WIND_SPEED 5000<\/div><div>#define MSECS_CALC_WIND_DIR \u00a0 5000<\/div><div>#define MSECS_CALC_RAIN_FALL \u00a030000<\/div><div>volatile int numRevsAnemometer = 0;<\/div><div>volatile int numDropsRainGauge = 0;\u00a0<\/div><div>ulong nextCalcSpeed;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/div><div>ulong nextCalcDir;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/div><div>ulong nextCalcRain;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/div><div>ulong time;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/div><div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/div><div>#define NUMDIRS 8<\/div><div>ulong \u00a0 adc[NUMDIRS] = {26, 45, 77, 118, 161, 196, 220, 256};<\/div><div>\u00a0<\/div><div>char *strVals[NUMDIRS] = {\u00ab\u00a0W\u00a0\u00bb,\u00a0\u00bbNW\u00a0\u00bb,\u00a0\u00bbN\u00a0\u00bb,\u00a0\u00bbSW\u00a0\u00bb,\u00a0\u00bbNE\u00a0\u00bb,\u00a0\u00bbS\u00a0\u00bb,\u00a0\u00bbSE\u00a0\u00bb,\u00a0\u00bbE\u00a0\u00bb};<\/div><div>byte dirOffset=0;<\/div><div>\u00a0<\/div><div>void setup() {<\/div><div>\u00a0 \u00a0Serial.begin(9600);<\/div><div>\u00a0 \u00a0pinMode(PIN_ANEMOMETER, INPUT);<\/div><div>\u00a0 \u00a0digitalWrite(PIN_ANEMOMETER, HIGH);<\/div><div>\u00a0 \u00a0digitalWrite(PIN_RAINGAUGE, HIGH);<\/div><div>\u00a0 \u00a0attachInterrupt(0, countAnemometer, FALLING);<\/div><div>\u00a0 \u00a0attachInterrupt(1, countRainGauge, FALLING);<\/div><div>\u00a0 \u00a0nextCalcRain = millis() + MSECS_CALC_RAIN_FALL;<\/div><div>\u00a0 \u00a0nextCalcSpeed = millis() + MSECS_CALC_WIND_SPEED;<\/div><div>\u00a0 \u00a0nextCalcDir \u00a0 = millis() + MSECS_CALC_WIND_DIR;<\/div><div>}<\/div><div>\u00a0<\/div><div>void loop() {<\/div><div>\u00a0 \u00a0time = millis();<\/div><div>\u00a0 \u00a0if (time &gt;= nextCalcSpeed) {<\/div><div>\u00a0 \u00a0 \u00a0 calcWindSpeed();<\/div><div>\u00a0 \u00a0 \u00a0 nextCalcSpeed = time + MSECS_CALC_WIND_SPEED;<\/div><div>\u00a0 \u00a0}<\/div><div>\u00a0 \u00a0if (time &gt;= nextCalcDir) {<\/div><div>\u00a0 \u00a0 \u00a0 calcWindDir();<\/div><div>\u00a0 \u00a0 \u00a0 nextCalcDir = time + MSECS_CALC_WIND_DIR;<\/div><div>\u00a0 \u00a0}<\/div><div>\u00a0 \u00a0if (time &gt;= nextCalcRain) {<\/div><div>\u00a0 \u00a0 \u00a0 calcRainFall();<\/div><div>\u00a0 \u00a0 \u00a0 nextCalcRain = time + MSECS_CALC_RAIN_FALL;<\/div><div>\u00a0 \u00a0}<\/div><div>}<\/div><div>\u00a0<\/div><div>void countAnemometer() {<\/div><div>\u00a0 \u00a0numRevsAnemometer++;<\/div><div>}<\/div><div>\u00a0<\/div><div>void countRainGauge() {<\/div><div>\u00a0 \u00a0numDropsRainGauge++;<\/div><div>}<\/div><div>\u00a0<\/div><div>void calcWindDir() {<\/div><div>\u00a0 \u00a0int val;<\/div><div>\u00a0 \u00a0byte x, reading;<\/div><div>\u00a0 \u00a0val = analogRead(PIN_VANE);<\/div><div>\u00a0 \u00a0val &gt;&gt;=2; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Shift to 255 range<\/div><div>\u00a0 \u00a0reading = val;<\/div><div>\u00a0<\/div><div>\u00a0 \u00a0for (x=0; x&lt;NUMDIRS; x++) {<\/div><div>\u00a0 \u00a0 \u00a0 if (adc[x] &gt;= reading)<\/div><div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0break;<\/div><div>\u00a0 \u00a0}<\/div><div>\u00a0<\/div><div>\u00a0 \u00a0x = (x + dirOffset) % 8;\u00a0 \u00a0<\/div><div>\u00a0 \u00a0Serial.print(\u00a0\u00bb \u00a0Dir: \u00ab\u00a0);<\/div><div>\u00a0 \u00a0Serial.println(strVals[x]);<\/div><div>}<\/div><div>\u00a0<\/div><div>void calcWindSpeed() {<\/div><div>\u00a0 \u00a0int x, iSpeed;<\/div><div>\u00a0 \u00a0long speed = 24011;<\/div><div>\u00a0 \u00a0speed *= numRevsAnemometer;<\/div><div>\u00a0 \u00a0speed \/= MSECS_CALC_WIND_SPEED;<\/div><div>\u00a0 \u00a0iSpeed = speed;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/div><div>\u00a0 \u00a0Serial.print(\u00ab\u00a0Wind speed: \u00ab\u00a0);<\/div><div>\u00a0 \u00a0x = iSpeed \/ 10;<\/div><div>\u00a0 \u00a0Serial.print(x);<\/div><div>\u00a0 \u00a0Serial.print(&lsquo;.&rsquo;);<\/div><div>\u00a0 \u00a0x = iSpeed % 10;<\/div><div>\u00a0 \u00a0Serial.print(x);<\/div><div>\u00a0 \u00a0numRevsAnemometer = 0;\u00a0 \u00a0 \u00a0 \u00a0<\/div><div>}<\/div><div>\u00a0<\/div><div>void calcRainFall() {<\/div><div>\u00a0 \u00a0int x, iVol;<\/div><div>\u00a0 \u00a0long vol = 2794; \/\/ 0.2794 mm<\/div><div>\u00a0 \u00a0vol *= numDropsRainGauge;<\/div><div>\u00a0 \u00a0vol \/= MSECS_CALC_RAIN_FALL;<\/div><div>\u00a0 \u00a0iVol = vol;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/div><div>\u00a0 \u00a0Serial.print(\u00ab\u00a0Rain fall: \u00ab\u00a0);<\/div><div>\u00a0 \u00a0x = iVol \/ 10000;<\/div><div>\u00a0 \u00a0Serial.print(x);<\/div><div>\u00a0 \u00a0Serial.print(&lsquo;.&rsquo;);<\/div><div>\u00a0 \u00a0x = iVol % 10000;<\/div><div>\u00a0 \u00a0Serial.print(x);<\/div><div>\u00a0 \u00a0Serial.println();<\/div><div>\u00a0 \u00a0<\/div><div>\u00a0 \u00a0numDropsRainGauge = 0;\u00a0 \u00a0 \u00a0 \u00a0<\/div><div>}<\/div>\n\n<p><strong>Remarque<\/strong><\/p><p>Les num\u00e9ros des broches sont \u00e0 adapter au microcontr\u00f4leur utilis\u00e9<\/p>","protected":false},"excerpt":{"rendered":"<p>Station m\u00e9t\u00e9o arduino Code #define uint \u00a0unsigned int #define ulong unsigned long #define PIN_ANEMOMETER \u00a02\u00a0\u00a0 #define PIN_RAINGAUGE \u00a03\u00a0 \u00a0 \u00a0 #define PIN_VANE\u00a0 5\u00a0 \u00a0 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":9472,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-tutoriel","meta":{"footnotes":""},"class_list":["post-9491","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/pages\/9491","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/comments?post=9491"}],"version-history":[{"count":1,"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/pages\/9491\/revisions"}],"predecessor-version":[{"id":11532,"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/pages\/9491\/revisions\/11532"}],"up":[{"embeddable":true,"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/pages\/9472"}],"wp:attachment":[{"href":"https:\/\/www.association-ore.fr\/fr\/wp-json\/wp\/v2\/media?parent=9491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}