Initial commit
This commit is contained in:
parent
45163ca080
commit
4cd23c4667
BIN
Cockstar Cap.stl
Normal file
BIN
Cockstar Cap.stl
Normal file
Binary file not shown.
BIN
Cockstar Halter Kappe.stl
Normal file
BIN
Cockstar Halter Kappe.stl
Normal file
Binary file not shown.
BIN
Cockstar Halter Taster.stl
Normal file
BIN
Cockstar Halter Taster.stl
Normal file
Binary file not shown.
BIN
Cockstar LCD Holder Converter.stl
Normal file
BIN
Cockstar LCD Holder Converter.stl
Normal file
Binary file not shown.
BIN
Cockstar LCD.stl
Normal file
BIN
Cockstar LCD.stl
Normal file
Binary file not shown.
BIN
Cockstar Poti.stl
Normal file
BIN
Cockstar Poti.stl
Normal file
Binary file not shown.
BIN
Cockstar Pumpenhalterung Rahmen.stl
Normal file
BIN
Cockstar Pumpenhalterung Rahmen.stl
Normal file
Binary file not shown.
BIN
Cockstar Schlauchhalter.stl
Normal file
BIN
Cockstar Schlauchhalter.stl
Normal file
Binary file not shown.
BIN
Cockstar Stromversorgung.stl
Normal file
BIN
Cockstar Stromversorgung.stl
Normal file
Binary file not shown.
49
README.md
49
README.md
@ -1,3 +1,48 @@
|
||||
# Cockstara
|
||||
# Cockstar
|
||||
|
||||
Cocktail robot to automatically dose rum for Tschunk.
|
||||
Cocktail robot to automatically dose rum for Tschunk.
|
||||
|
||||
|
||||
## Hardware Configuration
|
||||
|
||||
### Functionality:
|
||||
* 0 off
|
||||
* 1-99 amount in ml
|
||||
* 100 permanent on
|
||||
|
||||
|
||||
LED-Ring has 12 LEDs
|
||||
|
||||
Pumpe has 22 LEDs.
|
||||
|
||||
|
||||
### Connect LCD:
|
||||
* LCD Arduino
|
||||
* VCC 5V
|
||||
* GND GND
|
||||
* SDA A4
|
||||
* SCL A5
|
||||
|
||||
|
||||
### Connect Poti:
|
||||
* Red A0
|
||||
* Gray 5v
|
||||
* Blue GND
|
||||
|
||||
|
||||
### Connect Switch:
|
||||
* White/Red D12
|
||||
* Black (LED) D11
|
||||
|
||||
### Bottle
|
||||
* White (D IN) D10
|
||||
|
||||
### Connect Relay
|
||||
* Input D13
|
||||
|
||||
### Connect Pump
|
||||
* LED Output D9 or D11
|
||||
|
||||
|
||||
## Software
|
||||
Cockstar uses new LiquidCrystal https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
|
||||
|
309
cockstar.ino
Executable file
309
cockstar.ino
Executable file
@ -0,0 +1,309 @@
|
||||
#include <Wire.h>
|
||||
#include <LiquidCrystal_I2C.h>
|
||||
#include <LcdBarGraphX.h>
|
||||
#include <FastLED.h>
|
||||
|
||||
|
||||
// --- LEDS ---
|
||||
#define LED_TYPE WS2811
|
||||
#define COLOR_ORDER RGB
|
||||
#define MASTER_BRIGHTNESS 200
|
||||
|
||||
#define DATA_PIN_A 11 // update pin numbers for data lines as needed
|
||||
#define DATA_PIN_B 10
|
||||
#define DATA_PIN_C 8
|
||||
#define DATA_PIN_D 9
|
||||
|
||||
#define NUM_LEDS_A 22 // adjust number of pixels as needed
|
||||
#define NUM_LEDS_B 12
|
||||
#define NUM_LEDS_C 12
|
||||
#define NUM_LEDS_D 22
|
||||
|
||||
CRGB ledsA[NUM_LEDS_A];
|
||||
CRGB ledsB[NUM_LEDS_B];
|
||||
CRGB ledsC[NUM_LEDS_C];
|
||||
CRGB ledsD[NUM_LEDS_D];
|
||||
|
||||
static uint8_t hueA=123;
|
||||
|
||||
|
||||
|
||||
// --- Robot Functionality ---
|
||||
|
||||
// Initialize LCD
|
||||
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
|
||||
|
||||
LcdBarGraphX bar(&lcd, 20, 0, 3); // -- Second line at column 0
|
||||
|
||||
// Define ports
|
||||
int poti_port=A0;
|
||||
int poti_value=0;
|
||||
int amount=0;
|
||||
int poti_last_value;
|
||||
int poti_read;
|
||||
int poti_new_value;
|
||||
|
||||
int button_port=12;
|
||||
int button_pressed=0;
|
||||
|
||||
int relay_port=13;
|
||||
bool relay_status=false;
|
||||
|
||||
bool pump_running=false;
|
||||
char state='i';
|
||||
|
||||
int led_bottle = 1;
|
||||
int led_pump = 2;
|
||||
int led_glass= 3;
|
||||
|
||||
unsigned long previousMillis=0;
|
||||
unsigned long currentMillis=0;
|
||||
|
||||
// 500ml/min mean 120ms per ml
|
||||
int ms_per_ml=132;
|
||||
int ml_pumped=0;
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
// --- Robot Functionality ---
|
||||
|
||||
pinMode(button_port, INPUT);
|
||||
pinMode(relay_port, OUTPUT);
|
||||
|
||||
//Initialize lcd
|
||||
lcd.begin(20,4);
|
||||
|
||||
// Standard Set text
|
||||
lcd.setCursor ( 0, 0 );
|
||||
lcd.print(" * * Cockstar * * ");
|
||||
lcd.setCursor ( 0, 1 );
|
||||
lcd.print("Starting... ");
|
||||
|
||||
Serial.begin(9600);
|
||||
|
||||
// --- LEDS ---
|
||||
delay(2500); //power up delay
|
||||
FastLED.addLeds<LED_TYPE, DATA_PIN_A, COLOR_ORDER>(ledsA, NUM_LEDS_A);
|
||||
FastLED.addLeds<LED_TYPE, DATA_PIN_B, COLOR_ORDER>(ledsB, NUM_LEDS_B);
|
||||
FastLED.addLeds<LED_TYPE, DATA_PIN_C, COLOR_ORDER>(ledsC, NUM_LEDS_C);
|
||||
FastLED.addLeds<LED_TYPE, DATA_PIN_D, COLOR_ORDER>(ledsD, NUM_LEDS_D);
|
||||
FastLED.setBrightness(MASTER_BRIGHTNESS);
|
||||
FastLED.clear();
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// --- Robot Functionality ---
|
||||
|
||||
// Read status of poti
|
||||
poti_read =analogRead(A0);
|
||||
//
|
||||
poti_new_value=map(poti_read,0,1023,0,101);
|
||||
if(poti_value != poti_new_value && poti_last_value != poti_new_value) {
|
||||
poti_last_value=poti_value;
|
||||
poti_value=poti_new_value;
|
||||
}
|
||||
|
||||
|
||||
// Read status of button
|
||||
int button_pressed=digitalRead(button_port);
|
||||
Serial.println(button_pressed);
|
||||
|
||||
// Reset title
|
||||
lcd.setCursor ( 0, 0 );
|
||||
lcd.print(" * * Cockstar * * ");
|
||||
|
||||
// States:
|
||||
// i: idle
|
||||
// w: waiting
|
||||
// r: Running
|
||||
// f: Finished
|
||||
|
||||
// lcd.print(" ");
|
||||
|
||||
switch(state){
|
||||
case 'i':
|
||||
// Idle
|
||||
lcd.setCursor ( 0, 1 );
|
||||
lcd.print("Ready. Place glass. ");
|
||||
pump_running=false;
|
||||
previousMillis=millis();
|
||||
|
||||
// Print bar graph only if pump running
|
||||
if(poti_value>0){
|
||||
bar.drawValue(ml_pumped,poti_value);
|
||||
} else {
|
||||
lcd.print(" ");
|
||||
}
|
||||
|
||||
if(button_pressed){
|
||||
state='w';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
// Waiting until glass is finally placed
|
||||
lcd.setCursor ( 0, 1 );
|
||||
lcd.print("Wait... ");
|
||||
lcd.print(" ");
|
||||
|
||||
if(!button_pressed){
|
||||
state='i';
|
||||
}
|
||||
|
||||
// wait 500ms
|
||||
if(millis()-previousMillis>500) {
|
||||
state='r';
|
||||
previousMillis=millis();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
// Pump is running
|
||||
pump_running=true;
|
||||
|
||||
if(!button_pressed){
|
||||
state='i';
|
||||
}
|
||||
|
||||
// Run pump only when poti at least 1ml
|
||||
if(poti_value > 0){
|
||||
|
||||
// If poti is over 100ml, run forever
|
||||
if(poti_value > 100) {
|
||||
lcd.setCursor ( 0, 1 );
|
||||
lcd.print("Pump running. ");
|
||||
} else {
|
||||
|
||||
// Else, normal mode limited by poti_value
|
||||
lcd.setCursor ( 0, 1 );
|
||||
lcd.print("Filling glass. ");
|
||||
|
||||
ml_pumped=int((millis()-previousMillis)/ms_per_ml);
|
||||
|
||||
if(ml_pumped >= poti_value) {
|
||||
pump_running=false;
|
||||
state='f';
|
||||
previousMillis=millis();
|
||||
}
|
||||
|
||||
lcd.setCursor ( 0, 3 );
|
||||
|
||||
// Print bar graph only if pump running
|
||||
if(poti_value>0){
|
||||
bar.drawValue(ml_pumped,poti_value);
|
||||
} else {
|
||||
lcd.print(" ");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
lcd.setCursor ( 0, 1 );
|
||||
lcd.print("Pump deactivated. ");
|
||||
pump_running=false;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
// Glass filled
|
||||
lcd.setCursor ( 0, 1 );
|
||||
lcd.print("Ready, remove glass.");
|
||||
|
||||
if(!button_pressed){
|
||||
state='i';
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Update pump status
|
||||
if(pump_running) {
|
||||
digitalWrite(relay_port, 1);
|
||||
} else {
|
||||
digitalWrite(relay_port, 0);
|
||||
}
|
||||
|
||||
// Update fluid amount
|
||||
//lcd.setCursor ( 0, 2 );
|
||||
//lcd.print(" ");
|
||||
lcd.setCursor ( 0, 2 );
|
||||
|
||||
if(poti_value==0) {
|
||||
lcd.print("Amount: None ");
|
||||
} else {
|
||||
if(poti_value>100) {
|
||||
lcd.print("Amount: Infinite ");
|
||||
} else {
|
||||
lcd.print(String("Amount: ") + poti_value + "ml ");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// --- LEDS ---
|
||||
EVERY_N_MILLISECONDS(50) {
|
||||
//static uint8_t hueA;
|
||||
fill_solid(ledsA, NUM_LEDS_A, CHSV(hueA, 255, 255));
|
||||
hueA++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//------code for the second strip, ledsB here------
|
||||
// Putting the ledsB pattern inside this EVERY_N section allows
|
||||
// the speed for just this strip to be individually adjusted.
|
||||
// This will run every 500 milliseconds.
|
||||
// Use ledsB in this section, such as ledsB[i], and NUM_LEDS_B
|
||||
// with for loops so it uses the correct length of strip B.
|
||||
// For example:
|
||||
|
||||
// EVERY_N_MILLISECONDS(20) {
|
||||
|
||||
// }
|
||||
|
||||
|
||||
|
||||
//------code for ledsC pattern------
|
||||
// This strip can run a similar or different pattern, and have
|
||||
// it's own timing. This will run every 35 milliseconds.
|
||||
// Use ledsC[i] and NUM_LEDS_C in this section.
|
||||
|
||||
EVERY_N_MILLISECONDS(20) {
|
||||
static uint8_t hueC;
|
||||
static uint8_t brightnessC;
|
||||
static uint8_t countC;
|
||||
//fill_solid(ledsC, NUM_LEDS_B, CHSV(hueB, 255, 255));
|
||||
//hueB++;
|
||||
|
||||
if(state=='f'){
|
||||
fill_solid(ledsC, NUM_LEDS_C, CHSV(255, 0, brightnessC));
|
||||
countC++;
|
||||
if(countC==10){
|
||||
countC=0;
|
||||
if(brightnessC<10){
|
||||
brightnessC=255;
|
||||
} else {
|
||||
brightnessC=0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fill_solid(ledsC, NUM_LEDS_C, CHSV(hueC, 255, 255));
|
||||
}
|
||||
hueC++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//------code for ledsLogo pattern------
|
||||
// This strip can also do it's own individual thing.
|
||||
// Use ledsD and NUM_LEDS_D in this section.
|
||||
|
||||
EVERY_N_MILLISECONDS(20) {
|
||||
fill_rainbow( ledsD, NUM_LEDS_D, millis()/5, 12);
|
||||
}
|
||||
|
||||
|
||||
// Update the display for all strips.
|
||||
FastLED.show();
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user