Advertisement
Guest User

WaterPlants

a guest
Jul 26th, 2024
450
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <avr/sleep.h>
  2. #include "customFunctions.h"
  3. #include <avr/interrupt.h>
  4.  
  5. #define sensor1Power 9
  6. #define sensor2Power 8
  7. #define sensor1analog A0
  8. #define sensor2analog A1
  9. #define relay1 12
  10. #define relay2 11
  11. #define button 2
  12.  
  13. int minMoist = 25;
  14. int moistVal1;
  15. int moistVal2;
  16.  
  17. int sleepCounter = 75;
  18. int sleepCounterMultiplier = 12;
  19.  
  20. //test ints
  21. int wokeCounter = 0;
  22.  
  23. char buffer1[100];
  24. char buffer2[100];
  25.  
  26. volatile bool buttonPressed = false;
  27.  
  28.  
  29. // code for activating the real time counter, for sleep mode
  30. // works only for arduino nano every (source: https://forum.arduino.cc/t/help-needed-sleeping-the-atmega4809-arduino-nano-every/914000/11)
  31.  
  32. void RTC_init(void)
  33. {
  34.   while (RTC.STATUS > 0) ;    /* Wait for all register to be synchronized */
  35.  
  36.   RTC.CLKSEL = RTC_CLKSEL_INT1K_gc;        // Run low power oscillator (OSCULP32K) at 1024Hz for long term sleep
  37.   RTC.PITINTCTRL = RTC_PI_bm;              // PIT Interrupt: enabled */
  38.   RTC.PITCTRLA = RTC_PERIOD_CYC8192_gc | RTC_PITEN_bm;     // Set period 8 seconds (see data sheet) and enable PIC                      
  39. }
  40.  
  41. ISR(RTC_PIT_vect) {
  42.   RTC.PITINTFLAGS = RTC_PI_bm;          // Clear interrupt flag by writing '1' (required)
  43. }
  44.  
  45. void setup() {
  46.  
  47.   //run the real time counter function
  48.   RTC_init();
  49.  
  50.   Serial.begin(9600);
  51.  
  52.   // define pins
  53.   pinMode(sensor1Power, OUTPUT);
  54.   pinMode(sensor2Power, OUTPUT);
  55.   pinMode(relay1, OUTPUT);
  56.   pinMode(relay2, OUTPUT);
  57.   pinMode(LED_BUILTIN, OUTPUT);
  58.   pinMode(button, INPUT_PULLUP);
  59.  
  60.   // write pins
  61.   digitalWrite(sensor1Power, LOW);
  62.   digitalWrite(sensor2Power, LOW);
  63.   digitalWrite(relay1, HIGH);
  64.   digitalWrite(relay2, HIGH);
  65.  
  66.   // sleep mode stuff
  67.   attachInterrupt(digitalPinToInterrupt(button), wakeUp, LOW);
  68.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);  
  69.   sleep_enable();    
  70. }
  71.  
  72. void wakeUp() {
  73.   // this executes if the button is pressed, and creates a flag for the pump
  74.   buttonPressed = true;
  75. }
  76.  
  77. void loop() {
  78.  
  79.   for (int m = 0; m < sleepCounter; m++){
  80.     sleep_cpu();
  81.   }
  82.  
  83.   // set sleepCounter back to normal
  84.   sleepCounter = 75;
  85.  
  86.  
  87.   // if buttom was pressed, start the pumps for one sec
  88.   if (buttonPressed == true) {
  89.     Serial.print(millis());
  90.     digitalWrite(relay1, LOW);
  91.     digitalWrite(relay2, LOW);
  92.     delay(1000);
  93.     digitalWrite(relay1, HIGH);
  94.     digitalWrite(relay2, HIGH);
  95.     buttonPressed = false; // set flag back to false so the if clause is no longer true
  96.     sleepCounter = 75;
  97.   }
  98.   // sign for wake up
  99.   digitalWrite(LED_BUILTIN, HIGH);
  100.   delay(200);
  101.   digitalWrite(LED_BUILTIN, LOW);
  102.  
  103.   // measure each sensor once to save power
  104.   moistVal1 = getMoistVal(sensor1Power, sensor1analog, 1);
  105.   moistVal2 = getMoistVal(sensor2Power, sensor2analog, 1);
  106.  
  107.   // serial print the values, flushing so the output gets clean printed
  108.   /*
  109.   sprintf(buffer1, "Sensor 1 Value: %d %% moisture // Current millis: %lu", moistVal1, millis());
  110.   Serial.println(buffer1);
  111.   Serial.flush();
  112.   sprintf(buffer2, "Sensor 2 Value: %d %% moisture", moistVal2);
  113.   Serial.println(buffer2);
  114.   Serial.flush();
  115.   */
  116.  
  117. // if the first measurement was dry, measure again to confirm
  118. if (moistVal1 < minMoist || moistVal2 < minMoist) {
  119.  
  120.     // measure multiple times to get accurate reading
  121.     moistVal1 = getMoistVal(sensor1Power, sensor1analog, 3);
  122.     moistVal2 = getMoistVal(sensor2Power, sensor2analog, 3);
  123.  
  124.     // used later for watering
  125.     bool is1moist = moistVal1 >= minMoist;
  126.     bool is2moist = moistVal2 >= minMoist;
  127.  
  128.     // if either value is not true, than the sleep counter gets multiplies (the next measurment will take one hour)
  129.     if(!is1moist || is2moist) {
  130.       sleepCounter = sleepCounter * sleepCounterMultiplier;
  131.     }
  132.  
  133.     // if the soil is dry, activiate the first pump
  134.     if(!is1moist) {
  135.       digitalWrite(relay1, LOW);
  136.       delay(4500);
  137.       digitalWrite(relay1, HIGH);
  138.     }
  139.     // if the soil is dry, activiate the first pump
  140.     if(!is2moist) {
  141.       digitalWrite(relay2, LOW);
  142.       delay(4500);
  143.       digitalWrite(relay2, HIGH);
  144.     }
  145.   }
  146. }
  147.  
  148.  
  149. //ADDITIONAL CODE FOR THE TEST SENSOR FUNCTION ("customFunctions.h" file)
  150. // function for getting the moist percentage value:
  151. int getMoistVal(uint8_t powerPin, uint8_t valuePin, int measureCounter) {
  152.  
  153.   // used for keeping time
  154.   unsigned long startTime = 0;
  155.   unsigned long measureInterval = 50;
  156.  
  157.   int count = 0;
  158.   int newVal = 0;
  159.  
  160.   int moistAbsolute = 0;
  161.   int moistRelative = 0;
  162.   int moistSum = 0;
  163.  
  164.   // measure multiple times depending on counter
  165.   while (count < measureCounter) {
  166.    
  167.     if (millis() - startTime >= measureInterval) {
  168.       startTime = millis();
  169.       digitalWrite(powerPin, HIGH);
  170.       delay(10);
  171.       newVal = analogRead(valuePin);
  172.       digitalWrite(powerPin, LOW);
  173.       moistSum += newVal;
  174.       count++;
  175.  
  176.     }
  177.   }
  178.  
  179.   // calculate the average of the measurments, and convert into 0-100% scale
  180.   moistAbsolute = moistSum / measureCounter;
  181.   moistRelative = map(moistAbsolute, 0, 1024, 0, 100);
  182.   moistRelative = 100 - moistRelative;
  183.  
  184.   return moistRelative;
  185. }
  186.  
  187.  
  188.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement