//Water dispenser v1
#include <SoftwareSerial.h>
SoftwareSerial BT(6, 7); //RX, TX
#include <EEPROM.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
String leido = "";
byte litros = 20;
byte percent = 0;
byte creditos = 0;
byte costo, confi, surtir;
unsigned long tiempo_surtido, startTime, elapsedTime;
void setup() {
creditos = EEPROM.read(0);
tiempo_surtido = EEPROM.read(1);
costo = EEPROM.read(2);
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC))
{
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
BT.begin(9600);
display.display();
display.clearDisplay();
pinMode(2, OUTPUT);
}
void loop() {
display.display();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
if (BT.available())
{
leido = BT.readString();
creditos = leido.toInt();
BT.println(creditos);
leido.remove(0, 3);
tiempo_surtido = leido.toInt();
BT.println(tiempo_surtido);
leido.remove(0, 3);
costo = leido.toInt();
BT.println(costo);
leido.remove(0, 3);
confi = leido.toInt();
BT.println(confi);
leido.remove(0, 2);
surtir = leido.toInt();
BT.println(surtir);
EEPROM.write(0, creditos);
EEPROM.write(1, tiempo_surtido);
EEPROM.write(2, costo);
}
//Creditos
display.setCursor(25,10);
display.print("Credito: $");
display.println(creditos);
//Rectangulo
display.drawRoundRect((64 - 86/2), 30, 86, 13, 3, WHITE);
//Litros
display.setCursor(5,55);
display.print("Litros: ");
display.println(litros);
if (confi == 1)
{
confi = 0;
display.clearDisplay();
//Tiempo
display.setCursor(15,5);
display.println("Ajuste de tiempo");
display.setCursor(15, 15);
display.println("de surtido:");
display.setCursor(15, 25);
display.print(tiempo_surtido);
display.println("seg");
//Costo
display.setCursor(15, 35);
display.println("Ajuste de costo:");
display.setCursor(15, 45);
display.print(costo);
display.println("mxn");
display.display();
delay(3000);
}
if (surtir == 1 && creditos >= costo)
{
surtir = 0;
startTime = millis();
digitalWrite(2, HIGH);
while (elapsedTime < (tiempo_surtido*1000))
{
elapsedTime = (millis() - startTime);
display.clearDisplay();
//Serial.println(elapsedTime);
percent = (elapsedTime*100)/(tiempo_surtido*1000);
//percent = map(elapsedTime, 0, (tiempo_surtido*1000), 0, 100);
//Rectangulo rellenado
display.fillRoundRect((64 - 86/2), 30, (percent*86/100), 13, 3, WHITE);
//Porcentaje
display.setCursor(100,55);
display.print(percent);
display.println("%");
//Creditos
display.setCursor(25,10);
display.print("Credito: $");
display.println(creditos);
//Rectangulo
display.drawRoundRect((64 - 86/2), 30, 86, 13, 3, WHITE);
//Litros
display.setCursor(5,55);
display.print("Litros: ");
display.println(litros);
display.display();
}
digitalWrite(2, LOW);
display.setCursor(23, 20);
display.println("Vuelva pronto!");
display.display();
delay(1000);
creditos = 0;
EEPROM.write(0, creditos);
elapsedTime = 0;
}
else if (surtir == 1 && creditos < costo)
{
surtir = 0;
display.setCursor(10, 20);
display.println("Inserte + creditos!");
display.display();
delay(1000);
}
}