#include <HX711.h> // Biblioteka do obsługi przetwornika HX711 (waga).
#include <Wire.h> // Biblioteka do obsługi komunikacji I2C.
#include <LiquidCrystal_I2C.h> // Biblioteka do obsługi wyświetlacza LCD przez I2C.
#include <AFMotor.h> // Biblioteka do obsługi silników z Adafruit Motor Shield.
#define I2C_ADDR 0x3F // Adres I2C dla wyświetlacza LCD.
// Definicje pinów dla przycisków i diod LED.
#define start 52
#define manpom1 50
#define manpom2 46
#define manpom3 44
#define tara 48
#define redl 24
#define bluel 22
#define greenl 26
#define redr 30
#define bluer 28
#define greenr 32
HX711 waga; // Tworzenie obiektu dla HX711.
LiquidCrystal_I2C lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7); // Konfiguracja wyświetlacza LCD.
int led = 13; // Pin dla diody LED.
float ciezar; // Zmienna do przechowywania odczytu wagi.
int ml1 = 0; // Ilość płynu 1.
int ml2 = 0; // Ilość płynu 2.
int ml3 = 0; // Ilość płynu 3.
int czasMigania = 250; // Czas migania diod LED.
int predkoscNalewania = 200; // Prędkość nalewania.
char odczyt[8]; // Tablica do przechowywania odczytu wagi jako string.
AF_DCMotor pompa1 (3); // Tworzenie obiektów dla pomp.
AF_DCMotor pompa2 (2);
AF_DCMotor pompa3 (1);
void setup() {
Serial.begin(9600); // Uruchomienie komunikacji szeregowej.
pinMode(start, INPUT_PULLUP); // Konfiguracja pinów przycisków jako wejścia z podciąganiem.
pinMode(manpom1, INPUT_PULLUP);
pinMode(manpom2, INPUT_PULLUP);
pinMode(manpom3, INPUT_PULLUP);
pinMode(tara, INPUT_PULLUP);
pinMode(redl, OUTPUT); // Konfiguracja pinów diod LED jako wyjścia.
pinMode(bluel, OUTPUT);
pinMode(greenl, OUTPUT);
pinMode(redr, OUTPUT);
pinMode(bluer, OUTPUT);
pinMode(greenr, OUTPUT);
lcd.begin(20, 4); // Inicjalizacja wyświetlacza LCD.
lcd.setBacklightPin(3, POSITIVE); // Ustawienie pinu do sterowania podświetleniem.
digitalWrite(led, HIGH); // Włączenie diody LED.
lcd.setBacklight(HIGH); // Włączenie podświetlenia LCD.
lcd.clear(); // Wyczyść ekran LCD.
lcd.setCursor(0, 0);
lcd.print("Witaj!"); // Wyświetlenie powitania na LCD.
lcd.setCursor(0, 1);
lcd.print("Chlapnij sobie!");
lcd.setCursor(13, 3);
lcd.print("Kasztan");
delay(1000);
pinMode(led, OUTPUT); // Ponowna konfiguracja pinu dla diody LED.
waga.begin(A1, A2); // Inicjalizacja HX711 z podanymi pinami.
waga.set_scale(419341.0 / 200.0); // Ustawienie skali przetwornika.
waga.tare(5); // Taryfikacja wagi.
pompa1.setSpeed(predkoscNalewania); // Ustawienie prędkości dla pomp.
pompa2.setSpeed(predkoscNalewania);
pompa3.setSpeed(predkoscNalewania);
}
void loop() {
pomiar(); // Wykonanie pomiaru.
ekran(); // Aktualizacja wyświetlacza LCD.
if ((ml1 + ml2 + ml3) > 250) // Sprawdzenie czy suma płynów przekracza 250 ml.
{
czerwona(); // Włączenie czerwonych diod LED.
delay(500);
ciemno(); // Wyłączenie wszystkich diod LED.
}
else
{
ciemno(); // Wyłączenie wszystkich diod LED.
}
if (digitalRead(start) == LOW) // Sprawdzenie czy przycisk start jest wciśnięty.
{
waga.tare(); // Taryfikacja wagi.
ekran(); // Aktualizacja wyświetlacza LCD.
Serial.println("zeruje"); // Wysłanie komunikatu do serial monitor.
if (ml1 >= 0) // Sprawdzenie czy płyn 1 jest większy lub równy 0.
{
waga.tare(10); // Taryfikacja wagi.
pomiar(); // Wykonanie pomiaru.
ekran(); // Aktualizacja wyświetlacza LCD.
Serial.println("nalewam promile"); // Wysłanie komunikatu do serial monitor.
while (ciezar <= ml1) // Nalewanie płynu 1 dopóki jego waga jest mniejsza niż ml1.
{
pomiar(); // Wykonanie pomiaru.
ekran(); // Aktualizacja wyświetlacza LCD.
pompa1.run(FORWARD); // Włączenie pompy 1.
led1(); // Włączenie diod LED dla pompy 1.
}
pompa1.run(RELEASE); // Wyłączenie pompy 1.
Serial.println("promile przerwa"); // Wysłanie komunikatu do serial monitor.
delay(100);
if (ml2 >= 0) // Sprawdzenie czy płyn 2 jest większy lub równy 0.
{
waga.tare(10); // Taryfikacja wagi.
pomiar(); // Wykonanie pomiaru.
ekran(); // Aktualizacja wyświetlacza LCD.
Serial.println("nalewam rozcienczacz"); // Wysłanie komunikatu do serial monitor.
while (ciezar <= ml2) // Nalewanie płynu 2 dopóki jego waga jest mniejsza niż ml2.
{
pomiar(); // Wykonanie pomiaru.
ekran(); // Aktualizacja wyświetlacza LCD.
pompa2.run(FORWARD); // Włączenie pompy 2.
led2(); // Włączenie diod LED dla pompy 2.
}
pompa2.run(RELEASE); // Wyłączenie pompy 2.
Serial.println("rozcienczacz przerwa"); // Wysłanie komunikatu do serial monitor.
delay(100);
if (ml3 >= 0) // Sprawdzenie czy płyn 3 jest większy lub równy 0.
{
waga.tare(10); // Taryfikacja wagi.
pomiar(); // Wykonanie pomiaru.
ekran(); // Aktualizacja wyświetlacza LCD.
Serial.println("nalewam kwas"); // Wysłanie komunikatu do serial monitor.
while (ciezar <= ml3) // Nalewanie płynu 3 dopóki jego waga jest mniejsza niż ml3.
{
pomiar(); // Wykonanie pomiaru.
ekran(); // Aktualizacja wyświetlacza LCD.
pompa3.run(FORWARD); // Włączenie pompy 3.
led3(); // Włączenie diod LED dla pompy 3.
}
pompa3.run(RELEASE); // Wyłączenie pompy 3.
Serial.println("kwaas przerwa"); // Wysłanie komunikatu do serial monitor.
delay(100);
}
}
}
waga.tare(); // Taryfikacja wagi.
pomiar(); // Wykonanie pomiaru.
kolorowo(); // Włączenie sekwencji migania diod LED.
ciemno(); // Wyłączenie wszystkich diod LED.
}
if (digitalRead(manpom1) == LOW) // Sprawdzenie czy przycisk dla pompy 1 jest wciśnięty.
{
pompa1.run(FORWARD); // Włączenie pompy 1.
led1(); // Włączenie diod LED dla pompy 1.
}
else
{
pompa1.run(RELEASE); // Wyłączenie pompy 1.
}
if (digitalRead(manpom2) == LOW) // Sprawdzenie czy przycisk dla pompy 2 jest wciśnięty.
{
pompa2.run(FORWARD); // Włączenie pompy 2.
led2(); // Włączenie diod LED dla pompy 2.
}
else
{
pompa2.run(RELEASE); // Wyłączenie pompy 2.
}