#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}; // Pinnen voor de 8 relais
int encoderValue;
int gewichtInGrammen;
HX711 schaal;
int desired_weight = 1000; // bijvoorbeeld, gewenst gewicht in gram
float kalibratiefactor = 0.42;
float gewichtGlas = 100.0; // Gewicht van het glas in grammen
//lcd en encoder
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adres van het LCD-scherm: 0x27, aantal kolommen: 16, aantal rijen: 2
Encoder myEncoder(11, 12); // Aansluitingen van de rotary encoder: CLK = 11, DT = 12
const int buttonPin = 13; // Pin voor de knop op de rotary encoder
int selectedOption = 1;
// Definieer de namen van elke optie
String optionNames[] = {"vodka-redull", "cola", "Optie C", "Optie D", "Optie E"};//maak dat hij elke keer 16 char heeft als naam te kort zet spatie achter
void setup() {
//weegschaal opstarten
Serial.begin(9600);
schaal.begin(doutPin, sckPin);
for (int i = 0; i < 8; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // Zet alle relais uit bij het opstarten
}
//lcd begin
lcd.begin(16, 2);
lcd.print("kies drankje:");
lcd.setCursor(0, 1);
pinMode(buttonPin, INPUT_PULLUP); // Interne pull-up voor de knop
}
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 drank1_relais(){
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void drank2_relais(){
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void drank3_relais(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void drank4_relais(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void drank5_relais(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void drank6_relais(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void drank7_relais(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
}
void drank8_relais(){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
}
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);
}
void loop() {
encoderValue = myEncoder.read() / 4;
encoderValue = constrain(encoderValue, 1, 5); // Aantal opties
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
}
if (digitalRead(buttonPin) == LOW) { // Lees de knopstatus met pull-up
executeAction(selectedOption);
delay(500); // Voorkom meerdere kliks
}
}
void executeAction(int option) {
weeg();
delay(500); // Wacht 1 seconde voordat de volgende meting wordt uitgevoerd (aanpassen indien nodig)
lcd.clear();
lcd.print(optionNames[option - 1]);
lcd.setCursor(0,1);
lcd.print("word uitgevoerd");
while (gewichtInGrammen < desired_weight) {
weeg();
delay(250);
switch (option) {
case 1:
desired_weight = 800; //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_relais();//zet de 1 pomp voor drank aan
break;
case 100 ... 199:
drank2_relais();
break;
case 200 ... 299:
drank3_relais();
break;
case 300 ... 399:
drank4_relais();
break;
case 400 ... 499:
drank5_relais();
break;
case 500 ... 599:
drank6_relais();
break;
case 600 ... 699:
drank7_relais();
break;
case 700 ... 799:
drank8_relais();
break;
default:
digitalWrite(relayPins[0], LOW); // Schakel relais 1 uit als het gewicht minder dan 100 gram is
alles_uit();
break;
}
break;
case 2:
// Voer hier de code uit voor optie 2
// Bijvoorbeeld: digitalWrite(LED_PIN, LOW);
break;
// Voeg hier extra cases toe voor elke optie
}
}
lcd.clear();
lcd.print("drankje is klaar");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("kies drankje:");
lcd.setCursor(0, 1);
lcd.print(optionNames[selectedOption - 1]);
}