#include <SoftwareSerial.h>
SoftwareSerial EEBlue(0, 1); // RX | TX
int step = 0;
long state = 0;
int interval = 500;
bool notified = false;
bool cleaning = false;
unsigned long runTime = 0;
int Vodka = 2;
int Cointreau = 3;
int CranberryJuice = 4;
int GrapeJuice = 5;
int LimeJuice = 6;
int CleaningWater = 7;
int Blender = 8;
int Discharge = 9;
bool doneVodka;
bool doneCointreau;
bool doneCranberryJuice;
bool doneGrapeJuice;
bool doneLimeJuice;
bool doneCleaningWater;
bool doneBlender;
bool doneDischarge;
unsigned long startTimeVodka = 0;
unsigned long startTimeCointreau = 0;
unsigned long startTimeCranberryJuice = 0;
unsigned long startTimeGrapeJuice = 0;
unsigned long startTimeLimeJuice = 0;
unsigned long startTimeCleaningWater = 0;
unsigned long startTimeBlender = 0;
unsigned long startTimeDischarge = 0;
void Reset(unsigned long currTime, bool sleeping = false);
void setup()
{
Serial.begin(9600);
Serial.println("The bluetooth gates are open. Connect to HC-05 from any other bluetooth device with 1234 as pairing key!");
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
void loop()
{
String cmd;
if (Serial.available() > 0)
{
cmd = Serial.readString();
state = cmd.toInt();
}
handleCommand(state);
if (!state && runTime)
{
Reset(millis(), true);
}
}
void handleCommand(long command)
{
if (command == 48)
{
if (!notified) Serial.println("Cosmopolitan in the making");
Mixer(13636, 13636, 6818, 0, 6818, 0, 5000);
}
if (command == 24)
{
if (!notified) Serial.println("Vodka- cranberry in the making");
Mixer(13636, 0, 40909, 0, 0, 0, 5000);
}
if (command == 122)
{
if (!notified) Serial.println("Vodka- Sidecar in the making");
Mixer(27272, 13636, 0, 0, 13636, 0, 5000);
}
if (command == 16)
{
if (!notified) Serial.println("Seabreeze in the making");
Mixer(13636, 0, 40909, 13636, 0, 0, 5000);
}
if (command == 56)
{
if (!notified) Serial.println("GreyHound in the making");
Mixer(22272, 0, 0, 90909, 0, 0,5000);
}
if (command == 90)
{
if (!notified) Serial.println("Cape codder in the making");
Mixer(27272, 0, 40909, 0, 0, 0, 5000);
}
if (command == 176)
{
if (!notified) Serial.println("Perform Cleaning");
cleaning = true;
Mixer(0, 0, 0, 0, 0, 68182, 5000);
}
if (command == 104)
{
if (!notified) Serial.println("Set-up All, Press again to start up");
doneBlender = true;
doneDischarge = true;
Mixer(5000, 5000, 5000, 5000, 5000, 5000, 0);
}
}
void Reset(unsigned long currTime, bool sleeping = false) {
startTimeVodka = currTime;
startTimeCointreau = currTime;
startTimeCranberryJuice = currTime;
startTimeGrapeJuice = currTime;
startTimeLimeJuice = currTime;
startTimeCleaningWater = currTime;
startTimeBlender = currTime;
startTimeDischarge = currTime;
runTime = currTime;
step = 0;
notified = false;
if (sleeping == false) {
doneVodka = false;
doneCointreau = false;
doneCranberryJuice = false;
doneGrapeJuice = false;
doneLimeJuice = false;
doneCleaningWater = false;
doneBlender = false;
doneDischarge = false;
}
}
unsigned long DelayTimeVodka;
unsigned long DelayTimeCointreau;
unsigned long DelayTimeCranberryJuice;
unsigned long DelayTimeGrapeJuice;
unsigned long DelayTimeLimeJuice;
unsigned long DelayTimeCleaningWater;
unsigned long DelayTimeBlender;
unsigned long DelayTimeDischarge;
void Mixer(
unsigned long vodka,
unsigned long cointreau,
unsigned long cranberryJuice,
unsigned long grapeJuice,
unsigned long limeJuice,
unsigned long cleaningWater,
unsigned long blender)
{
DelayTimeVodka = vodka;
DelayTimeCointreau = cointreau;
DelayTimeCranberryJuice = cranberryJuice;
DelayTimeGrapeJuice = grapeJuice;
DelayTimeLimeJuice = limeJuice;
DelayTimeCleaningWater = cleaningWater;
DelayTimeBlender = blender;
DelayTimeDischarge = 1;
Mix();
}
void Mix()
{
unsigned long currTime = millis();
if (runTime == 0) {
runTime = currTime;
}
int totalSteps = CalculateTotalSteps(
DelayTimeVodka,
DelayTimeCointreau,
DelayTimeCranberryJuice,
DelayTimeGrapeJuice,
DelayTimeLimeJuice,
DelayTimeCleaningWater,
DelayTimeBlender,
DelayTimeDischarge
);
unsigned long totalDuration = CalculateDuration(
DelayTimeVodka,
DelayTimeCointreau,
DelayTimeCranberryJuice,
DelayTimeGrapeJuice,
DelayTimeLimeJuice,
DelayTimeCleaningWater
);
delay(800);
if (DelayTimeCleaningWater <= 0 || cleaning != true) {
if (DelayTimeVodka > 0 && !doneVodka) {
if ((unsigned long)(currTime - startTimeVodka) >= DelayTimeVodka) {
digitalWrite(Vodka, HIGH);
startTimeVodka = currTime;
DelayTimeVodka = 0;
doneVodka = true;
step++;
} else {
digitalWrite(Vodka, LOW);
}
} else if (DelayTimeVodka < 1) {
doneVodka = true;
}
if (DelayTimeCointreau > 0 && !doneCointreau) {
if ((unsigned long)(currTime - startTimeCointreau) >= DelayTimeCointreau) {
digitalWrite(Cointreau, HIGH);
startTimeCointreau = currTime;
DelayTimeCointreau = 0;
doneCointreau = true;
step++;
} else {
digitalWrite(Cointreau, LOW);
}
} else if (DelayTimeCointreau < 1) {
doneCointreau = true;
}
if (DelayTimeCranberryJuice > 0 && !doneCranberryJuice) {
if ((unsigned long)(currTime - startTimeCranberryJuice) >= DelayTimeCranberryJuice) {
digitalWrite(CranberryJuice, HIGH);
startTimeCranberryJuice = currTime;
DelayTimeCranberryJuice = 0;
doneCranberryJuice = true;
step++;
} else {
digitalWrite(CranberryJuice,LOW);
}
} else if (DelayTimeCranberryJuice < 1) {
doneCranberryJuice = true;
}
if (DelayTimeGrapeJuice > 0 && !doneGrapeJuice) {
if ((unsigned long)(currTime - startTimeGrapeJuice) >= DelayTimeGrapeJuice) {
digitalWrite(GrapeJuice, HIGH);
startTimeGrapeJuice = currTime;
DelayTimeGrapeJuice = 0;
doneGrapeJuice = true;
step++;
} else {
digitalWrite(GrapeJuice, LOW);
}
} else if (DelayTimeGrapeJuice < 1) {
doneGrapeJuice = true;
}
if (DelayTimeLimeJuice > 0 && !doneLimeJuice) {
if ((unsigned long)(currTime - startTimeLimeJuice) >= DelayTimeLimeJuice) {
digitalWrite(LimeJuice, HIGH);
startTimeLimeJuice = currTime;
DelayTimeLimeJuice = 0;
doneLimeJuice = true;
step++;
} else {
digitalWrite(LimeJuice, LOW);
}
} else if (DelayTimeLimeJuice < 1) {
doneLimeJuice = true;
}
doneCleaningWater = true;
} else {
startTimeVodka = currTime;
DelayTimeVodka = 0;
doneVodka = true;
startTimeCointreau = currTime;
DelayTimeCointreau = 0;
doneCointreau = true;
startTimeCranberryJuice = currTime;
DelayTimeCranberryJuice = 0;
doneCranberryJuice = true;
startTimeGrapeJuice = currTime;
DelayTimeGrapeJuice = 0;
doneGrapeJuice = true;
startTimeLimeJuice = currTime;
DelayTimeLimeJuice = 0;
doneLimeJuice = true;
step += 5;
if (!doneCleaningWater) {
if ((unsigned long)(currTime - startTimeCleaningWater) >= DelayTimeCleaningWater) {
digitalWrite(CleaningWater, HIGH);
startTimeCleaningWater = currTime;
DelayTimeCleaningWater = 0;
doneCleaningWater = true;
step++;
} else {
digitalWrite(CleaningWater, LOW);
}
} else if (DelayTimeCleaningWater < 1) {
doneCleaningWater = true;
}
}
if (step > 0 && totalSteps == step || (
doneVodka &&
doneCointreau &&
doneCranberryJuice &&
doneGrapeJuice &&
doneLimeJuice &&
doneCleaningWater)
) {
if (DelayTimeBlender > 0 && !doneBlender) {
startTimeBlender = currTime;
digitalWrite(Blender, LOW);
delay(DelayTimeBlender);
digitalWrite(Blender, HIGH);
DelayTimeBlender = 0;
doneBlender = true;
step++;
} else {
doneBlender = true;
digitalWrite(Blender, HIGH);
}
if (DelayTimeDischarge > 0 && totalDuration > 0 && !doneDischarge) {
startTimeDischarge = currTime;
digitalWrite(Discharge, LOW);
delay(totalDuration);
digitalWrite(Discharge, HIGH);
DelayTimeDischarge = 0;
totalDuration = 0;
doneDischarge = true;
step++;
} else {
doneDischarge = true;
digitalWrite(Discharge, HIGH);
}
}
if (step > 0 && totalSteps == step || (doneVodka &&
doneCointreau &&
doneCranberryJuice &&
doneGrapeJuice &&
doneLimeJuice &&
doneCleaningWater &&
doneBlender &&
doneDischarge)
) {
state = 0;
Serial.println("Drink is done!");
Serial.println(currTime);
Reset(currTime);
}
}
int CalculateTotalSteps(
int vodka,
int cointreau,
int cranberryJuice,
int grapeJuice,
int limeJuice,
int cleaningWater,
int blender,
int discharge)
{
int count = 0;
if (vodka > 0) count++;
if (cointreau > 0) count++;
if (cranberryJuice > 0) count++;
if (grapeJuice > 0) count++;
if (limeJuice > 0) count++;
if (cleaningWater > 0) count++;
if (blender > 0) count++;
if (discharge > 0) count++;
return count;
}
unsigned long CalculateDuration(
unsigned long a,
unsigned long b,
unsigned long c,
unsigned long d,
unsigned long e,
unsigned long f)
{
unsigned long sum = 0;
if (a > 0) sum += a;
if (b > 0) sum += b;
if (c > 0) sum += c;
if (d > 0) sum += d;
if (e > 0) sum += e;
if (f > 0) sum += f;
notified = false;
char durationStr[20];
sprintf(durationStr, "%lu", sum);
if (!notified) {
Serial.write("duration:");Serial.write(durationStr);Serial.write("\n");
}
notified = true;
return sum;
}