#include <ArduinoJson.h>
// JSON document to hold the drink data
StaticJsonDocument<1024> doc;
// Flow rate in ml per second (adjust this based on the actual flow rate of the pumps)
float flowRate = 50.0; // 50 ml per second
// Hardcoded JSON string
const char* jsonData = R"(
{
"drinks": [
{
"name": "Spezi",
"ingredients": [
{ "name": "Cola", "quantity": 100.0 },
{ "name": "Fanta", "quantity": 100.0 }
]
},
{
"name": "ColaMix",
"ingredients": [
{ "name": "Cola", "quantity": 150.0 },
{ "name": "Ice Tea", "quantity": 50.0 }
]
}
],
"drankFlessen": [
{ "name": "Cola", "pin": 3 },
{ "name": "Fanta", "pin": 4 },
{ "name": "Seven Up", "pin": 5 },
{ "name": "Water", "pin": 6 },
{ "name": "Spa Rood", "pin": 7 },
{ "name": "Ice Tea", "pin": 8 }
]
})";
// Function to search for a drink and activate pumps
void activateDrinkPumps(const char* drinkName) {
// Find the drink in the JSON document
JsonArray drinks = doc["drinks"];
JsonObject drinkToMake = JsonObject();
for (JsonObject drink : drinks) {
if (strcmp(drink["name"], drinkName) == 0) {
drinkToMake = drink;
break;
}
}
// If drink is not found
if (drinkToMake.isNull()) {
Serial.println("Drink not found.");
return;
}
// Activate the pins for each ingredient in the drink
JsonArray ingredients = drinkToMake["ingredients"];
for (JsonObject ingredient : ingredients) {
const char* ingredientName = ingredient["name"];
float quantity = ingredient["quantity"];
// Find the corresponding pin for this ingredient
JsonArray drankFlessen = doc["drankFlessen"];
int pin = -1;
for (JsonObject fles : drankFlessen) {
if (strcmp(fles["name"], ingredientName) == 0) {
pin = fles["pin"];
break;
}
}
// If no pin is found, skip this ingredient
if (pin == -1) {
Serial.print("Pin not found for ingredient: ");
Serial.println(ingredientName);
continue;
}
// Calculate the time to activate the pump (quantity / flowRate)
float pumpTime = quantity / flowRate; // Time in seconds
unsigned long pumpTimeMs = (unsigned long)(pumpTime * 1000); // Convert to milliseconds
// Activate the pump (non-blocking)
Serial.print("Activating pump for ");
Serial.print(ingredientName);
Serial.print(" on pin ");
Serial.print(pin);
Serial.print(" for ");
Serial.print(pumpTimeMs);
Serial.println(" ms");
// Turn on the pump (pin)
digitalWrite(pin, HIGH);
// Schedule turning off the pump after the specified time
delay(pumpTimeMs); // Here you could use a non-blocking technique with millis()
// Turn off the pump after time has passed
digitalWrite(pin, LOW);
}
}
void setup() {
Serial.begin(9600);
// Set pin modes for the pumps
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
// Deserialize the JSON data
DeserializationError error = deserializeJson(doc, jsonData);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
// Example: Activate pumps for "Spezi"
activateDrinkPumps("Spezi");
}
unsigned long pumpStartTime[10] = {0}; // Array to store start times for each pump
bool pumpActive[10] = {false}; // Array to store active state of each pump
void activateDrinkPumps(const char* drinkName) {
JsonArray drinks = doc["drinks"];
JsonObject drinkToMake = JsonObject();
for (JsonObject drink : drinks) {
if (strcmp(drink["name"], drinkName) == 0) {
drinkToMake = drink;
break;
}
}
if (drinkToMake.isNull()) {
Serial.println("Drink not found.");
return;
}
JsonArray ingredients = drinkToMake["ingredients"];
for (JsonObject ingredient : ingredients) {
const char* ingredientName = ingredient["name"];
float quantity = ingredient["quantity"];
JsonArray drankFlessen = doc["drankFlessen"];
int pin = -1;
for (JsonObject fles : drankFlessen) {
if (strcmp(fles["name"], ingredientName) == 0) {
pin = fles["pin"];
break;
}
}
if (pin == -1) continue;
float pumpTime = quantity / flowRate;
unsigned long pumpTimeMs = (unsigned long)(pumpTime * 1000);
// Activate pump and store state
digitalWrite(pin, HIGH);
pumpStartTime[pin] = millis();
pumpActive[pin] = true;
Serial.print("Pump on for ");
Serial.println(ingredientName);
}
}
void checkPumps() {
for (int pin = 3; pin <= 8; pin++) {
if (pumpActive[pin] && (millis() - pumpStartTime[pin] >= pumpTimeMs)) {
digitalWrite(pin, LOW);
pumpActive[pin] = false;
Serial.print("Pump off for pin ");
Serial.println(pin);
}
}
}
void loop() {
checkPumps();
}