#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]);
}


NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module