larryd:
Made some cosmetic changes.
However, I tried it here, things work with using simple button switches to change the cases as I don't have a Bluetooth module right now.Try this again, make sure you upload it to the Arduino.
#include <SoftwareSerial.h>// import the serial library
SoftwareSerial bluetooth(3, 4); // RX, TX
const int relayPin = 13;
unsigned long currentMillis;
unsigned long myRelayMillis;
unsigned long waitTime = 0;
char bluetoothData; // the data given from mobile app
boolean newData = false;
//***************************************************
void setup()
{
bluetooth.begin(9600);
pinMode(relayPin, OUTPUT);
Serial.begin (9600); //uncomment for debugging
}
//***************************************************
void loop()
{
currentMillis = millis(); //for milli second timing
recvOneChar();
controlWater();
}
//***************************************************
void recvOneChar()
{
if (bluetooth.available() > 0)
{
bluetoothData = bluetooth.read();
newData = true;
}
}
//***************************************************
void controlWater()
{
if (newData == true)
{
//cancel the timer as a new command has come in
waitTime = 0;
newData = false;
myRelayMillis = millis();
}
//is it time to process the next state code?
if (currentMillis - myRelayMillis < waitTime)
{
//No, it is not time
return;
}
switch (bluetoothData)
{
//*************
case '1':
{
//Start watering
digitalWrite(13, HIGH); // turn the water on
Serial.println("Start watering");
myRelayMillis = millis();
waitTime = 5000;
}
break;
//*************
case '2':
{
//Stop watering when timing is over
Serial.println("Stop watering");
digitalWrite(13, LOW); // turn the water off
myRelayMillis = millis();
waitTime = 5000;
}
break;
//*************
case '3':
{
//Water for 1 hour
Serial.println("Water for 1 hour");
myRelayMillis = millis();
waitTime = 5000ul; //testing
//waitTime = 1 * 60 * 60 * 1000ul;
digitalWrite(13, HIGH); // turn the water on
//Stop watering when timing is over
bluetoothData = '2';
}
break;
//*************
case '4':
{
//Water for 2 hours
Serial.println("Water for 2 hours");
myRelayMillis = millis();
//waitTime = 10000; //testing
waitTime = 2 * 60 * 60 * 1000ul;
digitalWrite(13, HIGH); // turn the water on
//Stop watering when timing is over
bluetoothData = '2';
}
break;
//*************
case '5':
{
//Water for 3hours
Serial.println("Water for 3 hours");
digitalWrite(13, HIGH); // turn the water on
myRelayMillis = millis();
//waitTime = 15000; //testing
waitTime = 3 * 60 * 60 * 1000ul;
//Stop watering when timing is over
bluetoothData = '2';
}
break;
} //END of switch/case
} //END of function
//***************************************************
Just tried this code now, and still wont turn relay off when set time is passed.