Last active
February 4, 2018 21:48
-
-
Save simonas-dev/46e338695a82a218b5652035930b3bf2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <LiquidCrystal.h> | |
#include <OneWire.h> | |
#include <DallasTemperature.h> | |
/** | |
* Trigger Button | |
*/ | |
const int buttonPin = 7; | |
/** | |
* Mode Button | |
*/ | |
const int modePin = 13; | |
/** | |
* Trigger Output | |
*/ | |
const int triggerPin = 9; | |
/** | |
* | |
*/ | |
const int ledPin = 1; | |
const int tempPin = 10; | |
#define ONE_WIRE_BUS 10 | |
OneWire oneWire(ONE_WIRE_BUS); | |
DallasTemperature sensors(&oneWire); | |
// initialize the library by associating any needed LCD interface pin | |
// with the arduino pin number it is connected to | |
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; | |
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); | |
const float shotCooldown = 40; // wait after shooting in millisecond | |
const unsigned long calculateStuff = 1000 * 60; // wait after shooting in millisecond | |
int shootCnt = 0; | |
float currentTemp = -420; | |
unsigned long lastRenderTime = millis(); | |
unsigned long lastEtcRenderTime = millis(); | |
/** | |
* SAFE 0 | |
* SEMI 1 | |
* FULL 2 | |
*/ | |
int mode = 0; | |
void setup() { | |
pinMode(buttonPin, INPUT); | |
pinMode(triggerPin, OUTPUT); | |
pinMode(ledPin, OUTPUT); | |
pinMode(modePin, INPUT); | |
pinMode(tempPin, INPUT); | |
sensors.begin(); | |
lcd.begin(16, 2); | |
lcd.clear(); | |
lcd.setCursor(5, 0); | |
lcd.print("Yetti:"); | |
lcd.setCursor(0, 1); | |
lcd.print("Snowstorm v4.20"); | |
calculateEtc(); | |
Serial.begin(9600); | |
} | |
void loop() { | |
int modeButton = digitalRead(modePin) == HIGH; | |
if (modeButton == 1) { | |
mode++; | |
if (mode == 3) { | |
mode = 0; | |
} | |
Serial.println("Mode"); | |
Serial.println(mode); | |
while (digitalRead(modePin) == HIGH) {} | |
renderUI(true); | |
} | |
switch (mode) { | |
case 0: | |
break; | |
case 1: | |
semi(); | |
break; | |
case 2: | |
full(); | |
break; | |
} | |
calculateEtc(); | |
renderUI(false); | |
} | |
void semi() { | |
if (mode != 1) { | |
return; | |
} | |
if (digitalRead(buttonPin) == HIGH) { | |
digitalWrite(triggerPin, HIGH); | |
digitalWrite(ledPin, HIGH); | |
delay (20); | |
digitalWrite(triggerPin, LOW); | |
digitalWrite(ledPin, LOW); | |
shootCnt++; | |
renderUI(true); | |
while (digitalRead(buttonPin) == HIGH) { | |
Serial.println("wait"); | |
} | |
} else { | |
digitalWrite(triggerPin, LOW); | |
digitalWrite(ledPin, LOW); | |
} | |
} | |
void full() { | |
if (mode != 2) { | |
return; | |
} | |
if (digitalRead(buttonPin) == HIGH) { | |
digitalWrite(triggerPin, HIGH); | |
digitalWrite(ledPin, HIGH); | |
delay (20); | |
digitalWrite(triggerPin, LOW); | |
digitalWrite(ledPin, LOW); | |
if (mode != 1) { | |
delay (shotCooldown); | |
} | |
shootCnt++; | |
renderUI(true); | |
} else { | |
digitalWrite(triggerPin, LOW); | |
digitalWrite(ledPin, LOW); | |
} | |
} | |
void renderUI(boolean isForce) { | |
float currentTime = millis(); | |
if (currentTime - lastRenderTime < 1500 && !isForce) { | |
return; | |
} | |
lastRenderTime = millis(); | |
lcd.clear(); | |
lcd.setCursor(0, 0); | |
lcd.print("Shots "); | |
lcd.setCursor(6, 0); | |
lcd.print(shootCnt); | |
lcd.setCursor(10, 0); | |
lcd.print(String(currentTemp, 1) + " C"); | |
lcd.setCursor(0, 1); | |
switch (mode) { | |
case 0: | |
lcd.print("Safe"); | |
break; | |
case 1: | |
lcd.print("Semi"); | |
break; | |
case 2: | |
lcd.print("Auto"); | |
break; | |
} | |
Serial.println(shootCnt); | |
} | |
void calculateEtc() { | |
float currentTime = millis(); | |
boolean isCacheInvalid = currentTime - lastEtcRenderTime > calculateStuff || currentTemp == -420; | |
boolean isButtonPinTriggered = digitalRead(buttonPin) == HIGH; | |
if (isCacheInvalid && !isButtonPinTriggered) { | |
currentTemp = calcTemp(); | |
lastEtcRenderTime = millis(); | |
} | |
} | |
float calcTemp() { | |
sensors.requestTemperatures(); | |
return sensors.getTempCByIndex(0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment