Commit 75fe2262 authored by João Lino's avatar João Lino

added a termocouple driver to measur fermentation temperature.

parent 35574b82
#include <MAX6675.h>
#include <dht.h> #include <dht.h>
dht DHT; dht DHT;
#define __debug //#define __debug
#define __info
#define PROGRAM_VERSION "0.4.0" #define PROGRAM_VERSION "0.4.0"
...@@ -18,6 +19,22 @@ dht DHT; ...@@ -18,6 +19,22 @@ dht DHT;
#define LED6Pin 9 #define LED6Pin 9
#define ButtonPin 13 #define ButtonPin 13
#define TEMPERATURE_SAMPLES 10 #define TEMPERATURE_SAMPLES 10
#define TEMPERATURE_SAMPLES_TC 30
#define MINIMUM_TIME_OFF 480000 // 8 min
#define TC_TEMP_OFFSET 0.0
// ##############
int thermoDO = A2;
int thermoCS = A1;
int thermoCLK = A0;
int thermoUnits = 1;
MAX6675 thermocouple(thermoCS, thermoDO, thermoCLK, thermoUnits);
//MAX6675 thermocouple(thermoCS,thermoDO,thermoCLK,units);
double temperaturaQueAchavaTC;
double temperaturaMediaTC[TEMPERATURE_SAMPLES_TC];
int temperaturaMediaIndexTC;
// ##############
int leds[LEDCount]; int leds[LEDCount];
double Setpoint; double Setpoint;
...@@ -29,6 +46,11 @@ int temperaturaMediaIndex; ...@@ -29,6 +46,11 @@ int temperaturaMediaIndex;
boolean tempSensorOK; boolean tempSensorOK;
//unsigned long elapsed; //unsigned long elapsed;
unsigned long currentTime;
unsigned long tcReadTime;
unsigned long dhtReadTime;
unsigned long lastTurnOff;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
...@@ -39,6 +61,10 @@ void setup() ...@@ -39,6 +61,10 @@ void setup()
Serial.println(DHT_LIB_VERSION); Serial.println(DHT_LIB_VERSION);
Serial.println(); Serial.println();
Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)"); Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)");
// ##############
temperaturaQueAchavaTC = 200.0;
// ##############
leds[0] = LED1Pin; leds[0] = LED1Pin;
leds[1] = LED2Pin; leds[1] = LED2Pin;
...@@ -46,9 +72,15 @@ void setup() ...@@ -46,9 +72,15 @@ void setup()
leds[3] = LED4Pin; leds[3] = LED4Pin;
leds[4] = LED5Pin; leds[4] = LED5Pin;
leds[5] = LED6Pin; leds[5] = LED6Pin;
Setpoint = 18.0; Setpoint = 0.0;
SetpointMode = 18; SetpointMode = 0;
temperaturaQueAchava = 200.0; temperaturaQueAchava = 200.0;
// Read Timmers
currentTime = millis();
tcReadTime = millis();
dhtReadTime = millis();
lastTurnOff = 0;
// Relay // Relay
relayState = false; relayState = false;
...@@ -75,6 +107,9 @@ void setup() ...@@ -75,6 +107,9 @@ void setup()
for( temperaturaMediaIndex = 0; temperaturaMediaIndex < TEMPERATURE_SAMPLES; temperaturaMediaIndex++ ) { for( temperaturaMediaIndex = 0; temperaturaMediaIndex < TEMPERATURE_SAMPLES; temperaturaMediaIndex++ ) {
temperaturaMedia[temperaturaMediaIndex] = Setpoint; temperaturaMedia[temperaturaMediaIndex] = Setpoint;
} }
for( temperaturaMediaIndexTC = 0; temperaturaMediaIndexTC < TEMPERATURE_SAMPLES_TC; temperaturaMediaIndexTC++ ) {
temperaturaMediaTC[temperaturaMediaIndexTC] = Setpoint;
}
setLEDs(SetpointMode); setLEDs(SetpointMode);
...@@ -84,49 +119,96 @@ void setup() ...@@ -84,49 +119,96 @@ void setup()
void loop() void loop()
{ {
/*if ( millis() - 4000 > elapsed ) { processBtnPress();
Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)");
elapsed = millis();
}*/
if ( hasBtnPressed() ) { double temperaturaQueDizTC = 0;
currentTime = millis();
if (currentTime > (tcReadTime + 50)) {
tcReadTime = millis();
temperaturaQueDizTC = thermocouple.read_temp() + TC_TEMP_OFFSET;
}
if(temperaturaQueDizTC != 0) {
// increase mode if (temperaturaQueAchavaTC == 200.0) {
SetpointMode++; temperaturaQueAchavaTC = temperaturaQueDizTC;
// reset mode back to 0 if(millis() < 1000) {
if ( SetpointMode > 63 ) { for( temperaturaMediaIndexTC = 0; temperaturaMediaIndexTC < TEMPERATURE_SAMPLES_TC; temperaturaMediaIndexTC++ ) {
SetpointMode = 0; temperaturaMediaTC[temperaturaMediaIndexTC] = temperaturaQueAchavaTC;
}
}
}
// Calcular a temperatura de processamento
temperaturaMediaIndexTC++;
if ( temperaturaMediaIndexTC >= TEMPERATURE_SAMPLES_TC ) {
temperaturaMediaIndexTC = 0;
} }
// change leds if (temperaturaQueDizTC > (temperaturaQueAchavaTC + 0)) {
setLEDs(SetpointMode); //Serial.print("+0.1, ");
temperaturaMediaTC[temperaturaMediaIndexTC] = (temperaturaQueAchavaTC + 0.2);
if ( SetpointMode > 31 ) {
///TODO set automatic fermentation temperatures
Setpoint = SetpointMode - 32 + 0.5;
} }
else { else {
if (temperaturaQueDizTC < (temperaturaQueAchavaTC - 0.1)) {
//Serial.print("-0.1, ");
temperaturaMediaTC[temperaturaMediaIndexTC] = (temperaturaQueAchavaTC - 1.0);
}
else {
//Serial.print(", ");
temperaturaMediaTC[temperaturaMediaIndexTC] = temperaturaQueDizTC;
}
}
// set manual temperatures // Calcula a média
Setpoint = SetpointMode; double tempetaturaQueEuAchoTC = 0.0;
for ( int i = 0; i < TEMPERATURE_SAMPLES_TC; i++ ) {
tempetaturaQueEuAchoTC += temperaturaMediaTC[i];
} }
} tempetaturaQueEuAchoTC /= TEMPERATURE_SAMPLES_TC;
// Grava o valor aual para o proximo ciclo
temperaturaQueAchavaTC = tempetaturaQueEuAchoTC;
// Read data off of the DHT11 sensor #ifdef __debug
int chk = DHT.read11(DHT11_PIN); Serial.print(millis());
Serial.print(", ThermoCouple, ");
Serial.print(Setpoint, 2);
Serial.print(", ");
Serial.print(temperaturaQueDizTC, 2);
Serial.print(", ");
Serial.println(tempetaturaQueEuAchoTC, 2);
#endif
}
// debug received data currentTime = millis();
tempSensorOK = debugDHT(chk); if (currentTime > (dhtReadTime + 200)) {
// Read data off of the DHT11 sensor
int chk = DHT.read11(DHT11_PIN);
// debug received data
tempSensorOK = debugDHT(chk);
dhtReadTime = millis();
}
else {
tempSensorOK = false;
}
if(tempSensorOK) { if(tempSensorOK) {
double temperaturaQueDiz = DHT.temperature; double temperaturaQueDiz = DHT.temperature;
if (temperaturaQueAchava == 200.0) { if (temperaturaQueAchava == 200.0) {
temperaturaQueAchava = temperaturaQueDiz; temperaturaQueAchava = temperaturaQueDiz;
if(millis() < 1000) {
for( temperaturaMediaIndex = 0; temperaturaMediaIndex < TEMPERATURE_SAMPLES; temperaturaMediaIndex++ ) {
temperaturaMedia[temperaturaMediaIndex] = temperaturaQueAchava;
}
}
} }
// Calcular a temperatura de processamento // Calcular a temperatura de processamento
...@@ -135,84 +217,131 @@ void loop() ...@@ -135,84 +217,131 @@ void loop()
temperaturaMediaIndex = 0; temperaturaMediaIndex = 0;
} }
/*Serial.print("t[");
Serial.print(temperaturaMediaIndex);
Serial.print("]=");
Serial.print(temperaturaQueAchava);*/
if (temperaturaQueDiz > (temperaturaQueAchava + 0)) { if (temperaturaQueDiz > (temperaturaQueAchava + 0)) {
//Serial.print("+0.1, ");
temperaturaMedia[temperaturaMediaIndex] = (temperaturaQueAchava + 0.2); temperaturaMedia[temperaturaMediaIndex] = (temperaturaQueAchava + 0.2);
} }
else { else {
if (temperaturaQueDiz < (temperaturaQueAchava - 0.1)) { if (temperaturaQueDiz < (temperaturaQueAchava - 0.1)) {
//Serial.print("-0.1, ");
temperaturaMedia[temperaturaMediaIndex] = (temperaturaQueAchava - 1.0); temperaturaMedia[temperaturaMediaIndex] = (temperaturaQueAchava - 1.0);
} }
else { else {
//Serial.print(", ");
temperaturaMedia[temperaturaMediaIndex] = temperaturaQueDiz; temperaturaMedia[temperaturaMediaIndex] = temperaturaQueDiz;
} }
} }
// Calcula a média
double tempetaturaQueEuAcho = 0.0; double tempetaturaQueEuAcho = 0.0;
for ( int i = 0; i < TEMPERATURE_SAMPLES; i++ ) { for ( int i = 0; i < TEMPERATURE_SAMPLES; i++ ) {
/*Serial.print(temperaturaMedia[i]);
Serial.print(" ");*/
tempetaturaQueEuAcho += temperaturaMedia[i]; tempetaturaQueEuAcho += temperaturaMedia[i];
} }
tempetaturaQueEuAcho /= TEMPERATURE_SAMPLES; tempetaturaQueEuAcho /= TEMPERATURE_SAMPLES;
//Serial.print(", ");
/*
// Grava o valor aual para o proximo ciclo
if (temperaturaQueAchava > temperaturaQueDiz) temperaturaQueAchava = tempetaturaQueEuAcho;
tempetaturaQueEuAcho = temperaturaQueAchava - 0.25;
else if (temperaturaQueAchava < temperaturaQueDiz) #ifdef __debug
tempetaturaQueEuAcho = temperaturaQueAchava + 0.25; Serial.print(millis());
else Serial.print(", DHT, ");
tempetaturaQueEuAcho = temperaturaQueAchava;
//tempetaturaQueEuAcho = temperaturaQueDiz;
*/
#ifdef __debug
Serial.print("");
Serial.print(Setpoint, 2); Serial.print(Setpoint, 2);
Serial.print(", "); Serial.print(", ");
Serial.print(temperaturaQueDiz, 2); Serial.print(temperaturaQueDiz, 2);
Serial.print(", "); Serial.print(", ");
Serial.print(tempetaturaQueEuAcho, 2); Serial.println(tempetaturaQueEuAcho, 2);
Serial.print(", "); #endif
#endif
executeCompressorControl( tempetaturaQueEuAcho, Setpoint );
if ( tempetaturaQueEuAcho >= (Setpoint + 1.0) ) { }
// turn on compressor to start cooling #ifdef __info
relayState = true; Serial.print(millis());
digitalWrite( RelayPin, LOW ); Serial.print(", ");
Serial.print(Setpoint, 2);
Serial.print(", ");
Serial.print(temperaturaQueAchava, 2);
Serial.print(", ");
Serial.print(temperaturaQueAchavaTC, 2);
Serial.print(", ");
Serial.println(relayState?"1":"0");
#endif
}
void processBtnPress() {
if ( hasBtnPressed() ) {
// increase mode
SetpointMode++;
// reset mode back to 0
if ( SetpointMode > 63 ) {
SetpointMode = 0;
}
// change leds
setLEDs(SetpointMode);
if ( SetpointMode > 31 ) {
///TODO set automatic fermentation temperatures
Setpoint = SetpointMode - 32 + 0.5;
} }
else { else {
if ( tempetaturaQueEuAcho <= (Setpoint - 0.0) ) {
// set manual temperatures
// turn off compressor to stop cooling Setpoint = SetpointMode;
relayState = false;
digitalWrite( RelayPin, HIGH );
}
} }
}
#ifdef __debug }
if (relayState) {
Serial.println( "ON" ); void executeCompressorControl( double tempetaturaAtual, double temperaturaTarget ) {
if ( tempetaturaAtual >= (temperaturaTarget + 1.0) ) {
setCompressor(true);
}
else {
if ( tempetaturaAtual <= (temperaturaTarget - 0.0) ) {
setCompressor(false);
}
}
}
void setCompressor( boolean turnIt ) {
currentTime = millis();
if(relayState) {
if(turnIt) {
// Nothing to do, it is on, will stay on
} }
else { else {
Serial.println( "OFF" ); // turn off compressor to stop cooling
lastTurnOff = currentTime;
relayState = false;
digitalWrite( RelayPin, HIGH );
}
}
else {
if(turnIt) {
if( currentTime >= (lastTurnOff + MINIMUM_TIME_OFF)) {
// turn on compressor to start cooling
relayState = true;
digitalWrite( RelayPin, LOW );
}
}
else {
// Nothing to do, it is off, will stay off
} }
#endif
temperaturaQueAchava = tempetaturaQueEuAcho;
delay(50);
//delay(100);
} }
#ifdef __debug
Serial.print(millis());
Serial.print(", Compressor, ");
Serial.print(Setpoint, 2);
Serial.print(", ");
if (relayState) {
Serial.println( "ON" );
}
else {
Serial.println( "OFF" );
}
#endif
} }
void setLEDs( int number ) { void setLEDs( int number ) {
...@@ -258,10 +387,10 @@ boolean debugDHT( int chk ) { ...@@ -258,10 +387,10 @@ boolean debugDHT( int chk ) {
{ {
case DHTLIB_OK: case DHTLIB_OK:
ret = true; ret = true;
#ifdef __debug /*#ifdef __debug
Serial.print("DHT11, "); Serial.print("DHT11, ");
Serial.print("OK, "); Serial.print("OK, ");
#endif #endif*/
break; break;
case DHTLIB_ERROR_CHECKSUM: case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error, "); Serial.print("Checksum error, ");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment