{"id":165,"date":"2013-12-10T08:43:15","date_gmt":"2013-12-10T08:43:15","guid":{"rendered":"http:\/\/paulsarduino.co.uk\/?page_id=165"},"modified":"2016-10-04T12:48:58","modified_gmt":"2016-10-04T12:48:58","slug":"low-power-plant-watering","status":"publish","type":"page","link":"https:\/\/paulsarduino.co.uk\/?page_id=165","title":{"rendered":"Low Power Plant Watering"},"content":{"rendered":"<pre>#include \r\n#include \r\n\r\n\/\/ set up analog pins 4 and 5 as powers supply for sensor\r\n\/\/ so we can plug it straight in\r\n#define  VCC_PIN      A5\r\n#define  GND_PIN      A4\r\n#define  DLEVEL_PIN    A3\r\n#define  ALEVEL_PIN    A2\r\n\r\n#define  PUMP_CTRL    13\r\n\r\n#define  WATER_MILLISECONDS  3000\r\n#define  SOAK_SECONDS  32\r\n#define  SLEEP_SECONDS  640\r\n\r\nvolatile int sleep_count = 0; \/\/ Keep track of how many sleep cycles have been completed.\r\n\r\n#define    BAUD_RATE    9600\r\n\r\nvoid setup(void)\r\n{\r\n    pinMode(VCC_PIN, OUTPUT);\r\n    digitalWrite(VCC_PIN, HIGH);\r\n\r\n    pinMode(GND_PIN, OUTPUT);\r\n    digitalWrite(GND_PIN, LOW);\r\n\r\n    pinMode(DLEVEL_PIN, INPUT);\r\n\r\n    pinMode(PUMP_CTRL, OUTPUT);\r\n    digitalWrite(PUMP_CTRL, LOW);    \/\/PUMP OFF\r\n\r\n    Serial.begin(BAUD_RATE);\r\n    setup_watchdog(9);\r\n}\r\n\r\nvoid loop(void)\r\n{\r\n    int  iReading = analogRead(ALEVEL_PIN) ;\r\n    Serial.print(\"Soil reading \");\r\n    Serial.print(iReading);\r\n    if (iReading &gt; 1000)\r\n    {\r\n      Serial.println(\"  : too dry\");\r\n      waterPlant();\r\n    }\r\n    else if (iReading &gt; 600)\r\n    {\r\n      Serial.println(\"  : very good\");\r\n    }\r\n    else\r\n    {\r\n      Serial.println(\"  : too wet!\");\r\n    }\r\n\r\n    Serial.println(\"About to sleep\");\r\n    goToSleep(SLEEP_SECONDS);\r\n    Serial.println(\"Awake\");\r\n}\r\n\r\nvoid waterPlant()\r\n{\r\n  \/\/ turn on the motor for 5 seconds to water plant and then\r\n  \/\/ wait 30 seconds for water to filter into soil.\r\n\r\n  Serial.print(\"Watering \");\r\n  digitalWrite(PUMP_CTRL, HIGH);\r\n  delay(WATER_MILLISECONDS);\r\n  Serial.println(\"\");\r\n  digitalWrite(PUMP_CTRL, LOW);\r\n\r\n  Serial.println(\"Waiting \");\r\n  goToSleep(SOAK_SECONDS);\r\n  Serial.println(\"Finished watering\");\r\n}\r\n\r\nvoid goToSleep(int iSecs)\r\n{\r\n    int sleep_total = iSecs \/ 8;      \/\/ can't sleep for less than minimum \r\n\r\n    Serial.flush();  \/\/ ensure all serial data has gone\r\n    set_sleep_mode(SLEEP_MODE_PWR_DOWN); \/\/ Set sleep mode.\r\n    sleep_enable(); \/\/ Enable sleep mode.\r\n    Serial.end();\r\n    while(sleep_total &gt; 0)\r\n    {\r\n      sleep_mode(); \/\/ Enter sleep mode.\r\n      \/\/ ZZZZZZZZZZZzzzzzzzzzzzzzz.........\r\n      sleep_disable(); \/\/ Disable sleep mode after waking.\r\n      sleep_total--;\r\n    }\r\n    delay(100);\r\n    \/* Re-enable the peripherals. *\/\r\n    power_all_enable();\r\n    Serial.begin(BAUD_RATE);\r\n}\r\n\r\n\/\/****************************************************************\r\n\/\/ 0 = 16ms\r\n\/\/ 1 = 32ms\r\n\/\/ 2 = 64ms\r\n\/\/ 3 = 128ms\r\n\/\/ 4 = 250ms\r\n\/\/ 5 = 500ms\r\n\/\/ 6 = 1 sec\r\n\/\/ 7 = 2 sec\r\n\/\/ 8 = 4 sec\r\n\/\/ 9 = 8 sec\r\nvoid setup_watchdog(int ii)\r\n{\r\n    byte bb;\r\n\r\n    if (ii &gt; 9)\r\n    {\r\n        ii = 9;\r\n    }\r\n\r\n    bb = ii &amp; 7;\r\n    if (ii &gt; 7)\r\n    {\r\n        bb |= B00100000;\r\n    }\r\n    bb |= (1&lt;&lt;WDCE);\r\n\r\n    \/\/ Clear the reset flag, the WDRF bit (bit 3) of MCUSR.\r\n    MCUSR &amp;= ~(1&lt;&lt;WDRF);\r\n\r\n    \/\/ Set the WDCE bit (bit 4) and the WDE bit (bit 3)\r\n    \/\/ of WDTCSR. The WDCE bit must be set in order to\r\n    \/\/ change WDE or the watchdog prescalers. Setting the\r\n    \/\/ WDCE bit will allow updtaes to the prescalers and\r\n    \/\/ WDE for 4 clock cycles then it will be reset by\r\n    \/\/ hardware.\r\n    WDTCSR |= (1&lt;&lt;WDCE) | (1&lt;&lt;WDE);\r\n\r\n    \/\/ set new watchdog timeout value\r\n    WDTCSR = bb;\r\n    WDTCSR |= _BV(WDIE);\r\n    MCUSR = MCUSR &amp; B11110111;\r\n}\r\n\r\nISR(WDT_vect)\r\n{\r\n    sleep_count ++; \/\/ keep track of how many sleep cycles have been completed.\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#include #include \/\/ set up analog pins 4 and 5 as powers supply for sensor \/\/ so we can plug it straight in #define VCC_PIN A5 #define GND_PIN A4 #define DLEVEL_PIN A3 #define ALEVEL_PIN A2 #define PUMP_CTRL 13 #define WATER_MILLISECONDS 3000 #define SOAK_SECONDS 32 #define SLEEP_SECONDS 640 volatile int sleep_count = 0; \/\/ Keep track [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":16,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-165","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/165","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=165"}],"version-history":[{"count":14,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/165\/revisions"}],"predecessor-version":[{"id":184,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/165\/revisions\/184"}],"up":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/16"}],"wp:attachment":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}