#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define PIN_RECEIVER A0
IRrecv receiver(PIN_RECEIVER);
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 isProcessing = false;
bool isDone = false;
#define SETUP_COMMAND 100
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
void ConcurrentMix(
int DelayTimeVodka, int DelayTimeCointreau, int DelayTimeCranberryJuice,
int DelayTimeGrapeJuice, int DelayTimeLimeJuice, int DelayTimeCleaningWater,
int DelayTimeBlender, int DelayTimeDischarge, bool includeCleaningWater);
void handleIRCommand(long command);
void setup()
{
receiver.enableIRIn();
Serial.begin(9600);
// LCD initialization
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Cocktail Mixer");
pinMode(Vodka, OUTPUT);
pinMode(Cointreau, OUTPUT);
pinMode(CranberryJuice, OUTPUT);
pinMode(GrapeJuice, OUTPUT);
pinMode(LimeJuice, OUTPUT);
pinMode(CleaningWater, OUTPUT);
pinMode(Blender, OUTPUT);
pinMode(Discharge, OUTPUT);
}
void loop()
{
if (Serial.available() > 0)
{
char state = Serial.read();
Serial.println(state);
// handleBluetoothCommand(state);
}
if (receiver.decode())
{
long command = receiver.decodedIRData.command;
handleIRCommand(command);
receiver.resume();
}
}
void handleIRCommand(long command)
{
lcd.clear();
lcd.setCursor(0, 0);
if (command == 48)
{
lcd.print("Cosmopolitan");
ConcurrentMix(4000, 2000, 3000, 0, 3000, 0, 1000, 1000, false);
}
else if (command == 24)
{
lcd.print("Vodka-Cranberry");
ConcurrentMix(3000, 0, 2000, 0, 0, 0, 2000, 1500, false);
}
else if (command == 122)
{
lcd.print("Vodka-Sidecar");
ConcurrentMix(8000, 8000, 0, 0, 8000, 0, 3000, 800, false);
}
else if (command == 16)
{
lcd.print("Seabreeze");
ConcurrentMix(800, 0, 800, 800, 0, 0, 800, 800, false);
}
else if (command == 56)
{
lcd.print("GreyHound");
ConcurrentMix(800, 0, 0, 800, 0, 0, 800, 800, false);
}
else if (command == 90)
{
lcd.print("Cape Codder");
ConcurrentMix(800, 0, 800, 0, 0, 0, 800, 800, false);
}
else if (command == 176)
{
lcd.print("Perform Cleaning");
ConcurrentMix(0, 0, 0, 0, 0, 1000, 4000, 3000, true);
}
else if (command == 104)
{
lcd.print("Set-up All");
ConcurrentMix(800, 800, 800, 800, 800, 0, 0, 0, false);
}
}
void ConcurrentMix(
int DelayTimeVodka, int DelayTimeCointreau, int DelayTimeCranberryJuice,
int DelayTimeGrapeJuice, int DelayTimeLimeJuice, int DelayTimeCleaningWater,
int DelayTimeBlender, int DelayTimeDischarge, bool includeCleaningWater)
{
isProcessing = true;
delay(2000);
// Activate only the LEDs for which a delay time is assigned
if (DelayTimeVodka > 0)
digitalWrite(Vodka, HIGH);
if (DelayTimeCointreau > 0)
digitalWrite(Cointreau, HIGH);
if (DelayTimeCranberryJuice > 0)
digitalWrite(CranberryJuice, HIGH);
if (DelayTimeGrapeJuice > 0)
digitalWrite(GrapeJuice, HIGH);
if (DelayTimeLimeJuice > 0)
digitalWrite(LimeJuice, HIGH);
if (includeCleaningWater && DelayTimeCleaningWater > 0)
{
digitalWrite(CleaningWater, HIGH);
}
// Concurrent dispensing of ingredients
delay(DelayTimeVodka);
digitalWrite(Vodka, LOW);
delay(DelayTimeCointreau);
digitalWrite(Cointreau, LOW);
delay(DelayTimeCranberryJuice);
digitalWrite(CranberryJuice, LOW);
delay(DelayTimeGrapeJuice);
digitalWrite(GrapeJuice, LOW);
delay(DelayTimeLimeJuice);
digitalWrite(LimeJuice, LOW);
// Turn off CleaningWater if included and has a delay time
if (includeCleaningWater && DelayTimeCleaningWater > 0)
{
digitalWrite(CleaningWater, LOW);
lcd.setCursor(0, 1);
lcd.print("Cleaning Complete");
lcd.setCursor(0, 0);
lcd.print("Order Drink");
}
delay(2000);
// Turn off Blender and Discharge initially
digitalWrite(Blender, LOW);
digitalWrite(Discharge, LOW);
// Perform cleaning if specified
if (includeCleaningWater && DelayTimeCleaningWater > 0)
{
digitalWrite(CleaningWater, HIGH);
digitalWrite(CleaningWater, LOW);
}
// Activate Blender if it has a delay time
if (DelayTimeBlender > 0)
{
digitalWrite(Blender, HIGH);
delay(DelayTimeBlender);
digitalWrite(Blender, LOW);
}
// Activate Discharge if it has a delay time
if (DelayTimeDischarge > 0)
{
digitalWrite(Discharge, HIGH);
delay(DelayTimeDischarge);
digitalWrite(Discharge, LOW);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Drink is done!");
isProcessing = false;
isDone = true;
lcd.setCursor(0, 1);
lcd.print("Ready for new order");
Serial.println("Done");
isDone = false;
}