Last active
March 24, 2016 18:01
-
-
Save jalexandre0/d87f032899ce8379e761 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
// I´m arduino user, not a former programmer. If you have a better approach for brewery, do it!! | |
// If you found bugs, fix it and ping me. :) | |
//Libraries | |
#include <OneWire.h> | |
#include <DallasTemperature.h> | |
#include <PID_v1.h> | |
//Pin 2 for OneWire | |
//Pin 6 for Heat Element | |
//Pin 7 for Pump | |
#define sensorPin 2 | |
#define kettlePin 6 | |
#define pumpPin 7 | |
//PID Variables | |
double setpoint=25, input, output ; | |
int windowSize = 5000, kp=573.85, ki=1.13, kd=0 ; | |
boolean heat, pump, boil, status; | |
String blockMessage, inString; | |
unsigned long windowStartTime, now; | |
PID myPID(&input, &output, &setpoint, kp, ki, kd, DIRECT) ; | |
//OneWire | |
OneWire oneWire(sensorPin); | |
DallasTemperature sensors(&oneWire); | |
//Debug (set true of false) | |
int debug = true ; | |
void setup(void) { | |
Serial.begin(9600); | |
sensors.begin(); | |
myPID.SetOutputLimits(0, windowSize); | |
myPID.SetMode(AUTOMATIC) ; | |
pinMode(kettlePin, OUTPUT); | |
pinMode(pumpPin, OUTPUT); | |
} | |
void loop() { | |
serialReceive(); | |
evaluate(); | |
serialOutput(); | |
} | |
void serialReceive() { | |
//todo | |
//s == ajuste de setpoint | |
if(Serial.available()) { | |
char inChar = Serial.read(); | |
Serial.flush(); | |
switch (inChar) { | |
case 'p': | |
if(pump) { | |
digitalWrite(pumpPin,LOW); | |
pump = false; | |
} | |
else { | |
digitalWrite(pumpPin,HIGH); | |
pump = true; | |
} | |
break; | |
case '+': | |
setpoint = setpoint + 0.5 ; | |
break; | |
case '-': | |
setpoint = setpoint - 0.5; | |
break; | |
case 'h': | |
if (boil) { | |
boil = false; | |
} | |
else { | |
boil = true; | |
} | |
break; | |
case 'd': | |
if (debug) { | |
debug = false ; | |
} | |
else { | |
debug = true; | |
} | |
break; | |
case 'o': | |
if(status) { | |
status = false; | |
} | |
else { | |
status = true; | |
} | |
break; | |
case 's': | |
newSetPoint(); | |
break; | |
default: | |
break; | |
} | |
} | |
} | |
void evaluate() { | |
now = millis(); | |
sensors.requestTemperatures(); | |
input = sensors.getTempCByIndex(0); | |
myPID.Compute(); | |
if(now - windowStartTime>windowSize) { | |
windowStartTime += windowSize; | |
} | |
if(output > now - windowStartTime){ | |
if(!status) { | |
digitalWrite(kettlePin,LOW); | |
heat = 0; | |
} | |
else{ | |
digitalWrite(kettlePin,HIGH); | |
heat = 1; | |
} | |
} | |
else { | |
if(boil && status) { | |
digitalWrite(kettlePin,HIGH); | |
heat = 1; | |
} | |
else { | |
digitalWrite(kettlePin,LOW); | |
heat = 0; | |
} | |
} | |
} | |
void serialOutput() { | |
Serial.print("Input: "); | |
Serial.print(input); | |
Serial.print(" SP: "); | |
Serial.print(setpoint); | |
Serial.print(" Heat: "); | |
Serial.print(heat); | |
Serial.print(" Pump: "); | |
Serial.print(pump); | |
Serial.print(" Boil: "); | |
Serial.print(boil); | |
Serial.print(" Status: "); | |
Serial.print(status); | |
// For tuning and debug | |
if(debug) { | |
Serial.print( " Output: ") ; | |
Serial.print(output) ; | |
Serial.print(" Now: "); | |
Serial.print(now - windowStartTime); | |
} | |
Serial.println(); | |
} | |
void newSetPoint() { | |
while (Serial.available() > 0) { | |
int inChar = Serial.read(); | |
if (isDigit(inChar)) { | |
inString += (char)inChar; | |
} | |
if (inChar == 'z') { | |
Serial.flush(); | |
setpoint = (inString.toInt()); | |
output = 0 ; | |
inString = " "; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment