Skip to content

Instantly share code, notes, and snippets.

@jalexandre0
Last active March 24, 2016 18:01
Show Gist options
  • Save jalexandre0/d87f032899ce8379e761 to your computer and use it in GitHub Desktop.
Save jalexandre0/d87f032899ce8379e761 to your computer and use it in GitHub Desktop.
// 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