#include <Adafruit_SSD1306.h> // Uključivanje nove OLED biblioteke
#include <Servo.h>
#include "Adafruit_NeoPixel.h"
// OLED ekran
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Definicija servo motora i NeoPixel-a
Servo servo;
const int PIN_SERVO = 9;
const int PIN_LED = 5;
const int LED_COUNT = 5;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800);
// Deklaracije funkcija
void ServoParking();
void ServoNaliv(byte rumka);
void pump_enable();
void pump_disable();
void oled_menu(int Menu);
void oled_auto(int Drink);
void oled_manual(int DrinkCount, int Drink);
void oled_naliv(int MenuFlag);
void oled_nalito(int MenuFlag, int Nalito);
void Tost();
void CvetoMuzik();
// Pinovi za enkoder
const int pin_A = 2;
const int pin_B = 3;
const int pin_SW = 4;
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
unsigned char encoder_sw_prew = 1;
// Opis ostalih promenljivih
const byte Optics[] = {0, 1, 2, 3, 6};
const unsigned int Optics_porog[] = {1000, 1000, 1000, 1000, 1000};
const byte Rumka_pos[] = {0, 40, 75, 105, 140};
const byte min_Drink = 2;
const byte max_Drink = 50;
const unsigned int min_Drink_delay = 300;
const unsigned int max_Drink_delay = 4000;
const byte max_DrinkCount = 5;
const byte PIN_PUMP = 12;
unsigned long currentTime;
unsigned long loopTime;
unsigned long ledTime;
byte Menu = 0;
byte MenuFlag = 0;
byte Drink = 25;
byte DrinkCount = 1;
void setup() {
pinMode(pin_SW, INPUT);
digitalWrite(pin_SW, HIGH); // PULLUP za dugme
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
pinMode(PIN_PUMP, OUTPUT);
digitalWrite(PIN_PUMP, 0);
currentTime = millis();
loopTime = currentTime;
// OLED inicijalizacija
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED inicijalizacija neuspešna!"));
for(;;);
}
display.display();
delay(1000);
display.clearDisplay();
// NeoPixel setup
strip.begin();
strip.show();
for (int i = 0; i < 5; i++) {
pinMode(Optics[i], INPUT);
}
ServoParking();
}
void loop() {
currentTime = millis();
// Ostala logika za enkoder i navigaciju kroz meni...
if (currentTime >= (ledTime + 300)) {
for (int i = 0; i < max_DrinkCount; i++) {
int val = analogRead(Optics[i]);
if (val > Optics_porog[i]) {
strip.setPixelColor(i, strip.Color(0, 0, 255));
} else {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
}
strip.show();
ledTime = currentTime;
}
}
// Funkcije
void ServoParking() {
servo.attach(PIN_SERVO);
for (int pos = servo.read(); pos >= 0; pos -= 1) {
servo.write(pos);
delay(10);
}
servo.detach();
}
void ServoNaliv(byte rumka) {
servo.attach(PIN_SERVO);
for (int pos = servo.read(); pos <= Rumka_pos[rumka]; pos += 1) {
servo.write(pos);
delay(10);
}
servo.detach();
}
void pump_enable() {
digitalWrite(PIN_PUMP, 1);
}
void pump_disable() {
digitalWrite(PIN_PUMP, 0);
}
void oled_menu(int Menu) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(F("N A L I V A T O R"));
display.setCursor(0, 10);
display.print(F("AUTOMATSKI"));
display.setCursor(0, 20);
display.print(F("RUCNO"));
display.setCursor(0, 30);
display.print(F("ISPIRANJE"));
display.display();
}
void oled_auto(int Drink) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print(F("AUTOMATSKI"));
display.setCursor(0, 10);
display.print(String(Drink) + " ml");
display.display();
}
void oled_manual(int DrinkCount, int Drink) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print(F("RUCNO"));
display.setCursor(0, 10);
display.print(String(DrinkCount) + " cups, " + String(Drink) + " ml");
display.display();
}
void oled_naliv(int MenuFlag) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print((MenuFlag == 1) ? F("AUTOMATSKI") : F("RUCNO"));
display.setCursor(0, 10);
display.print(F("SIPAM..."));
display.display();
}
void oled_nalito(int MenuFlag, int Nalito) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print((MenuFlag == 1) ? F("AUTOMATSKI") : F("RUCNO"));
display.setCursor(0, 10);
display.print(F("SIPANO ZA: "));
display.print(Nalito); // Ispis broja Nalito bez sabiranja sa F() makroom
display.display();
}
void Tost() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print(F("NAZDRAVIMO!"));
display.display();
delay(2000);
}
void CvetoMuzik() {
for (int i = 0; i <= 7; i++) {
for (int y = 0; y < max_DrinkCount; y++) {
strip.setPixelColor(y, strip.Color(255, 0, 0));
strip.show();
delay(30);
}
for (int y = 0; y < max_DrinkCount; y++) {
strip.setPixelColor(y, strip.Color(0, 255, 0));
strip.show();
delay(30);
}
for (int y = 0; y < max_DrinkCount; y++) {
strip.setPixelColor(y, strip.Color(0, 0, 255));
strip.show();
delay(30);
}
}
}