#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#include <HX711.h>
//alles voor de weegschaal
const int doutPin = A0; // Pin waar de DOUT-pin van de HX711 is aangesloten
const int sckPin = A1; // Pin waar de SCK-pin van de HX711 is aangesloten
const int relayPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46}; // Pinnen voor de 15 mosfets
int encoderValue;
long int gewichtInGrammen;
HX711 schaal;
int desired_weight = 1000; // bijvoorbeeld, gewenst gewicht in gram of ml
//1ml =+-1gr 1cl=+-100gr
float kalibratiefactor =432.2465753424658 ;//moet eerst eens kalibaratie programma uitvoeren is verschillend
// oude 431.747474747
float gewichtGlas = 100.0; // Gewicht van het glas in grammen
//lcd en encoder
LiquidCrystal_I2C lcd(0x27, 20, 4); // Adres van het LCD-scherm: 0x27, aantal kolommen: 16, aantal rijen: 2
Encoder myEncoder(24, 23); // Aansluitingen van de rotary encoder: CLK = 24, DT = 23
const int buttonPin = 22; // Pin voor de knop op de rotary encoder
int selectedOption = 1;
// Definieer de namen van elke optie
String optionNames[] = {"vb_alles", "cola", "vodka-redbull", "water", "fanta","optie 1","optie 2","optie 3","optie 4","optie 5","optie 6","optie 7"};//aanvullen met opties
//vergeet verder in de code niet aan te passen hoeveel er zijn
void setup() {
Serial.begin(9600);
//weegschaal opstarten
schaal.begin(doutPin, sckPin);
for (int i = 0; i < 15; i++) {//relais uitzetten
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // Zet alle relais uit bij het opstarten
}
//lcd begin
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
lcd.begin(20, 4);
lcd.print("kies drankje:");
lcd.setCursor(0, 1);
pinMode(buttonPin, INPUT_PULLUP); // Interne pull-up voor de knop
lcd.setCursor(0, 3);
lcd.print("plaats uw glas");
lcd.setCursor(0, 1);
}
void weeg(){
if (schaal.is_ready()) {
long rawValue = schaal.read();
float gewicht = (rawValue / kalibratiefactor) - gewichtGlas;
Serial.print("Gewicht: ");
Serial.print(gewicht);
Serial.println(" gram");
// Relais logica met switch case
gewichtInGrammen = int(gewicht);
} else {
Serial.println("HX711 niet klaar");
}
}
void alles_uit(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank1_mosfet(){
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank2_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank3_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank4_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank5_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank6_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank7_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank8_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank9_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank10_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank11_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank12_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank13_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, HIGH);
digitalWrite(45, LOW);
digitalWrite(46, LOW);
}
void drank14_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, HIGH);
digitalWrite(46, LOW);
}
void drank15_mosfet(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(44, LOW);
digitalWrite(45, LOW);
digitalWrite(46, HIGH);//254
}
void loop() {
encoderValue = myEncoder.read() / 4;
encoderValue = constrain(encoderValue, 1, 12); // Aantal opties laatste getal ALLEEN aanpassen
if (encoderValue != selectedOption) {
lcd.setCursor(0, 1);
lcd.print(" "); // Zet spaties om de bestaande tekst te wissen
selectedOption = encoderValue;
lcd.setCursor(0, 1);
lcd.print(optionNames[selectedOption - 1]); // Aangezien arrays bij 0 beginnen
//lcd.setCursor(0, 2);
//lcd.print(" ");
//lcd.setCursor(0, 2);
//lcd.print(ingredienten[selectedOption - 1]); // Aangezien arrays bij 0 beginnen
}
if (digitalRead(buttonPin) == LOW) { // Lees de knopstatus met pull-up
executeAction(selectedOption);
delay(500); // Voorkom meerdere kliks
}
}
void executeAction(int option) {
weeg();
long rawValue = schaal.read();
gewichtGlas = (rawValue/kalibratiefactor);
Serial.println(gewichtGlas);
delay(160); // Wacht 1 seconde voordat de volgende meting wordt uitgevoerd aanpassen per 80ms(aanpassen indien nodig)
lcd.clear();
lcd.print(optionNames[option - 1]);
lcd.setCursor(0,1);
lcd.print("wordt uitgevoerd");
while (gewichtInGrammen < desired_weight) {
weeg();
delay(160);//delay kun je aanpassen per 80ms best
switch (option) {
case 1: //te lang mms loopt mis bij hoger geiwht
desired_weight = 1500; //gewenste gewicht van de mix
switch (gewichtInGrammen) {// code voor drank te vullen met 100gr van elk soort
case 0 ... 99: //tot welk gewicht moet hij vullen
drank1_mosfet();//zet de 1 pomp voor drank aan
break;
case 100 ... 199:
drank2_mosfet();
break;
case 200 ... 299:
drank3_mosfet();
break;
case 300 ... 399:
drank4_mosfet();
break;
case 400 ... 499:
drank5_mosfet();
break;
case 500 ... 599:
drank6_mosfet();
break;
case 600 ... 699:
drank7_mosfet();
break;
case 700 ... 799:
drank8_mosfet();
break;
case 800 ... 899:
drank9_mosfet();
break;
case 900 ... 999:
drank10_mosfet();
break;
case 1000 ... 1099:
drank11_mosfet();
break;
case 1100 ... 1199:
drank12_mosfet();
break;
case 1200 ... 1299:
drank13_mosfet();
break;
case 1300 ... 1399:
drank14_mosfet();
break;
case 1400 ... 1499:
drank15_mosfet();
break;
default:
digitalWrite(relayPins[0], LOW); // Schakel relais 1 uit als het gewicht minder dan 100 gram is
alles_uit();
break;
}
break;
case 2:
desired_weight = 300; //gewenste gewicht van de mix (gr)
switch (gewichtInGrammen) {// code voor drank te vullen met 100gr van elk soort
case 0 ... 60: //tot welk gewicht moet hij vullen
drank1_mosfet();//zet de 1 pomp voor drank aan
break;
case 61 ... 300:
drank2_mosfet();
break;
default:
digitalWrite(relayPins[0], LOW); // Schakel relais 1 uit als het gewicht minder dan 100 gram is
alles_uit();
break;
}
break;
// Voeg hier extra cases toe voor elke optie
case 3:
desired_weight = 281; //gewenste gewicht van de mix
switch (gewichtInGrammen) {// code voor drank te vullen met 100gr van elk soort
case 0 ... 60: //tot welk gewicht moet hij vullen
drank1_mosfet();//zet de 1 pomp voor drank aan
break;
case 61 ... 281:
drank2_mosfet();
break;
default:
digitalWrite(relayPins[0], LOW); // Schakel relais 1 uit als het gewicht minder dan 100 gram is
alles_uit();
break;
}
break;
case 4: //te lang mms loopt mis bij hoger geiwht
desired_weight = 1500; //gewenste gewicht van de mix
switch (gewichtInGrammen) {// code voor drank te vullen met 100gr van elk soort
case 0 ... 99: //tot welk gewicht moet hij vullen
drank1_mosfet();//zet de 1 pomp voor drank aan
break;
case 100 ... 199:
drank2_mosfet();
break;
case 200 ... 299:
drank3_mosfet();
break;
case 300 ... 399:
drank4_mosfet();
break;
case 400 ... 499:
drank5_mosfet();
break;
case 500 ... 599:
drank6_mosfet();
break;
case 600 ... 699:
drank7_mosfet();
break;
case 700 ... 799:
drank8_mosfet();
break;
case 800 ... 899:
drank9_mosfet();
break;
case 900 ... 999:
drank10_mosfet();
break;
case 1000 ... 1099:
drank11_mosfet();
break;
case 1100 ... 1199:
drank12_mosfet();
break;
case 1200 ... 1299:
drank13_mosfet();
break;
case 1300 ... 1399:
drank14_mosfet();
break;
case 1400 ... 1499:
drank15_mosfet();
break;
default:
digitalWrite(relayPins[0], LOW); // Schakel relais 1 uit als het gewicht minder dan 100 gram is
alles_uit();
break;
}
break;
default:
alles_uit();
}
}
delay(100);
alles_uit();
lcd.clear();
lcd.print("drankje is klaar");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("kies drankje:");
lcd.setCursor(0, 3);
lcd.print("plaats nieuw glas");
lcd.setCursor(0, 1);
lcd.print(optionNames[selectedOption - 1]);
}