Initial commit

This commit is contained in:
Sebastian 2021-06-06 16:37:05 +02:00
parent 45163ca080
commit 4cd23c4667
11 changed files with 356 additions and 2 deletions

BIN
Cockstar Cap.stl Normal file

Binary file not shown.

BIN
Cockstar Halter Kappe.stl Normal file

Binary file not shown.

BIN
Cockstar Halter Taster.stl Normal file

Binary file not shown.

Binary file not shown.

BIN
Cockstar LCD.stl Normal file

Binary file not shown.

BIN
Cockstar Poti.stl Normal file

Binary file not shown.

Binary file not shown.

BIN
Cockstar Schlauchhalter.stl Normal file

Binary file not shown.

Binary file not shown.

View File

@ -1,3 +1,48 @@
# Cockstara
# Cockstar
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
View 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();
}