/*******************************************************************************
 * Program..: xmastree.ino monitor Christmas Tree water
 * Author...: Jan-marie Newton
 * Date.....: 2024-12-04
 * History..: 
 * Notes....: version 1.1
 *******************************************************************************/

// Module connection pins (Digital Pins)
// Constants - set relay pin numbers:
//------------------------------------------------------------------------------
#define RESERVE 2
#define TREELVL 3
#define LIGHT   4
#define PUMP    5


// Initialize Variables
//------------------------------------------------------------------------------
char data[6];
int treeState;
int tankState;
int pump;
int lite;
unsigned long run_time          = 0;
const unsigned long extra_water = 6000;

//------------------------------------------------------------------------------
void setup() {
   // init serial monitor
   Serial.begin(115200);
   data[4] = '\n';
   data[5] = 0;

   // initialize pins
   pinMode(RESERVE, INPUT_PULLUP);
   pinMode(TREELVL, INPUT_PULLUP);
   pinMode(LIGHT, OUTPUT);
   pinMode(PUMP, OUTPUT);
   digitalWrite(LIGHT, LOW);
   digitalWrite(PUMP, LOW);
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
void loop() {
   // read the state of water float switches
   treeState = 1 - digitalRead(TREELVL);
   tankState = 1 - digitalRead(RESERVE);
   pump      = digitalRead(PUMP);
   lite      = digitalRead(LIGHT);
   if (treeState) {    // tree wants water
      if (!lite) {
         lite = 1;
         digitalWrite(LIGHT, HIGH);
      }
      if (tankState) { // we have water
         if (!pump) {
            digitalWrite(PUMP, HIGH);
            pump     = 1;
            run_time = millis();
         }
      } else {         // the reserve tank is dry
         if (pump) {
            pump     = 0;
            run_time = 0;
            digitalWrite(PUMP, LOW);
            digitalWrite(LED_BUILTIN, LOW);   // turn the LED off
         }
      }

   } else if (tankState and (millis() - run_time) < extra_water) {
      //Serial.println(" tree gets xtra water");

   } else {            // tree does not need water
      if (lite) {
         lite = 0;
         digitalWrite(LIGHT, LOW);
      }
      if (pump) {
         pump     = 0;
         run_time = 0;
         digitalWrite(PUMP, LOW);
      }
   }
   if (data[0] != tankState + 48) data[0] = tankState + 48;
   if (data[1] != treeState + 48) data[1] = treeState + 48;
   if (data[2] != lite + 48)      data[2] = lite + 48;
   if (data[3] != pump + 48)      data[3] = pump + 48;

   if (Serial.available() > 0) {
      char msg = Serial.read();
      if (msg == 'r')
         Serial.write(data,5);
   }

   //Serial.print(millis());
   //Serial.print(" ");
   //Serial.write(data,5);
   delay(5);
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//normal chirpsNumber 3, normal intensity 5  set chirp=0 for tweet
void highChirp(int intensity, int chirpsNumber, int chirp=20) {

	for(int veces=0; veces<=chirpsNumber; veces++) {
		for (int i=80+chirp; i>0; i--) {
			for (int x=0; x<intensity;  x++) {
				digitalWrite (piezopin,HIGH);
				delayMicroseconds (i);
				digitalWrite (piezopin,LOW);
				delayMicroseconds (i);
			}
		}
	}
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
void lowChirp(int intensity, int chirpsNumber) {

	for(int veces=0; veces<=chirpsNumber; veces++) {
		for (int i=0; i<200; i++) {
			digitalWrite (piezopin,HIGH);
			delayMicroseconds(i);
			digitalWrite(piezopin,LOW);
			delayMicroseconds(i);
		}
		for (int i=90; i>80; i--) {
			for  (int x=0; x<5; x++) {
				digitalWrite (piezopin,HIGH);
				delayMicroseconds (i);
				digitalWrite (piezopin,LOW);
				delayMicroseconds (i);
			}
		}
	}
}
//------------------------------------------------------------------------------
