Skip to content

Instantly share code, notes, and snippets.

@simonas-dev
Last active February 4, 2018 21:48
Show Gist options
  • Save simonas-dev/46e338695a82a218b5652035930b3bf2 to your computer and use it in GitHub Desktop.
Save simonas-dev/46e338695a82a218b5652035930b3bf2 to your computer and use it in GitHub Desktop.
#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