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>
dht DHT;
#define __debug
//#define __debug
#define __info
#define PROGRAM_VERSION "0.4.0"
......@@ -18,6 +19,22 @@ dht DHT;
#define LED6Pin 9
#define ButtonPin 13
#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];
double Setpoint;
......@@ -29,6 +46,11 @@ int temperaturaMediaIndex;
boolean tempSensorOK;
//unsigned long elapsed;
unsigned long currentTime;
unsigned long tcReadTime;
unsigned long dhtReadTime;
unsigned long lastTurnOff;
void setup()
{
Serial.begin(115200);
......@@ -40,16 +62,26 @@ void setup()
Serial.println();
Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)");
// ##############
temperaturaQueAchavaTC = 200.0;
// ##############
leds[0] = LED1Pin;
leds[1] = LED2Pin;
leds[2] = LED3Pin;
leds[3] = LED4Pin;
leds[4] = LED5Pin;
leds[5] = LED6Pin;
Setpoint = 18.0;
SetpointMode = 18;
Setpoint = 0.0;
SetpointMode = 0;
temperaturaQueAchava = 200.0;
// Read Timmers
currentTime = millis();
tcReadTime = millis();
dhtReadTime = millis();
lastTurnOff = 0;
// Relay
relayState = false;
pinMode(RelayPin, OUTPUT);
......@@ -75,6 +107,9 @@ void setup()
for( temperaturaMediaIndex = 0; temperaturaMediaIndex < TEMPERATURE_SAMPLES; temperaturaMediaIndex++ ) {
temperaturaMedia[temperaturaMediaIndex] = Setpoint;
}
for( temperaturaMediaIndexTC = 0; temperaturaMediaIndexTC < TEMPERATURE_SAMPLES_TC; temperaturaMediaIndexTC++ ) {
temperaturaMediaTC[temperaturaMediaIndexTC] = Setpoint;
}
setLEDs(SetpointMode);
......@@ -84,49 +119,96 @@ void setup()
void loop()
{
/*if ( millis() - 4000 > elapsed ) {
Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)");
elapsed = millis();
}*/
if ( hasBtnPressed() ) {
// increase mode
SetpointMode++;
processBtnPress();
// reset mode back to 0
if ( SetpointMode > 63 ) {
SetpointMode = 0;
double temperaturaQueDizTC = 0;
currentTime = millis();
if (currentTime > (tcReadTime + 50)) {
tcReadTime = millis();
temperaturaQueDizTC = thermocouple.read_temp() + TC_TEMP_OFFSET;
}
// change leds
setLEDs(SetpointMode);
if(temperaturaQueDizTC != 0) {
if (temperaturaQueAchavaTC == 200.0) {
temperaturaQueAchavaTC = temperaturaQueDizTC;
if ( SetpointMode > 31 ) {
if(millis() < 1000) {
for( temperaturaMediaIndexTC = 0; temperaturaMediaIndexTC < TEMPERATURE_SAMPLES_TC; temperaturaMediaIndexTC++ ) {
temperaturaMediaTC[temperaturaMediaIndexTC] = temperaturaQueAchavaTC;
}
}
}
///TODO set automatic fermentation temperatures
Setpoint = SetpointMode - 32 + 0.5;
// Calcular a temperatura de processamento
temperaturaMediaIndexTC++;
if ( temperaturaMediaIndexTC >= TEMPERATURE_SAMPLES_TC ) {
temperaturaMediaIndexTC = 0;
}
if (temperaturaQueDizTC > (temperaturaQueAchavaTC + 0)) {
//Serial.print("+0.1, ");
temperaturaMediaTC[temperaturaMediaIndexTC] = (temperaturaQueAchavaTC + 0.2);
}
else {
if (temperaturaQueDizTC < (temperaturaQueAchavaTC - 0.1)) {
//Serial.print("-0.1, ");
temperaturaMediaTC[temperaturaMediaIndexTC] = (temperaturaQueAchavaTC - 1.0);
}
else {
//Serial.print(", ");
temperaturaMediaTC[temperaturaMediaIndexTC] = temperaturaQueDizTC;
}
}
// set manual temperatures
Setpoint = SetpointMode;
// Calcula a média
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;
#ifdef __debug
Serial.print(millis());
Serial.print(", ThermoCouple, ");
Serial.print(Setpoint, 2);
Serial.print(", ");
Serial.print(temperaturaQueDizTC, 2);
Serial.print(", ");
Serial.println(tempetaturaQueEuAchoTC, 2);
#endif
}
currentTime = millis();
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) {
double temperaturaQueDiz = DHT.temperature;
if (temperaturaQueAchava == 200.0) {
temperaturaQueAchava = temperaturaQueDiz;
if(millis() < 1000) {
for( temperaturaMediaIndex = 0; temperaturaMediaIndex < TEMPERATURE_SAMPLES; temperaturaMediaIndex++ ) {
temperaturaMedia[temperaturaMediaIndex] = temperaturaQueAchava;
}
}
}
// Calcular a temperatura de processamento
......@@ -135,84 +217,131 @@ void loop()
temperaturaMediaIndex = 0;
}
/*Serial.print("t[");
Serial.print(temperaturaMediaIndex);
Serial.print("]=");
Serial.print(temperaturaQueAchava);*/
if (temperaturaQueDiz > (temperaturaQueAchava + 0)) {
//Serial.print("+0.1, ");
temperaturaMedia[temperaturaMediaIndex] = (temperaturaQueAchava + 0.2);
}
else {
if (temperaturaQueDiz < (temperaturaQueAchava - 0.1)) {
//Serial.print("-0.1, ");
temperaturaMedia[temperaturaMediaIndex] = (temperaturaQueAchava - 1.0);
}
else {
//Serial.print(", ");
temperaturaMedia[temperaturaMediaIndex] = temperaturaQueDiz;
}
}
// Calcula a média
double tempetaturaQueEuAcho = 0.0;
for ( int i = 0; i < TEMPERATURE_SAMPLES; i++ ) {
/*Serial.print(temperaturaMedia[i]);
Serial.print(" ");*/
tempetaturaQueEuAcho += temperaturaMedia[i];
}
tempetaturaQueEuAcho /= TEMPERATURE_SAMPLES;
//Serial.print(", ");
/*
// Grava o valor aual para o proximo ciclo
temperaturaQueAchava = tempetaturaQueEuAcho;
#ifdef __debug
Serial.print(millis());
Serial.print(", DHT, ");
Serial.print(Setpoint, 2);
Serial.print(", ");
Serial.print(temperaturaQueDiz, 2);
Serial.print(", ");
Serial.println(tempetaturaQueEuAcho, 2);
#endif
if (temperaturaQueAchava > temperaturaQueDiz)
tempetaturaQueEuAcho = temperaturaQueAchava - 0.25;
else if (temperaturaQueAchava < temperaturaQueDiz)
tempetaturaQueEuAcho = temperaturaQueAchava + 0.25;
else
tempetaturaQueEuAcho = temperaturaQueAchava;
executeCompressorControl( tempetaturaQueEuAcho, Setpoint );
}
//tempetaturaQueEuAcho = temperaturaQueDiz;
*/
#ifdef __debug
Serial.print("");
#ifdef __info
Serial.print(millis());
Serial.print(", ");
Serial.print(Setpoint, 2);
Serial.print(", ");
Serial.print(temperaturaQueDiz, 2);
Serial.print(temperaturaQueAchava, 2);
Serial.print(", ");
Serial.print(tempetaturaQueEuAcho, 2);
Serial.print(temperaturaQueAchavaTC, 2);
Serial.print(", ");
#endif
Serial.println(relayState?"1":"0");
#endif
}
if ( tempetaturaQueEuAcho >= (Setpoint + 1.0) ) {
void processBtnPress() {
if ( hasBtnPressed() ) {
// turn on compressor to start cooling
relayState = true;
digitalWrite( RelayPin, LOW );
// 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 {
// set manual temperatures
Setpoint = SetpointMode;
}
}
}
void executeCompressorControl( double tempetaturaAtual, double temperaturaTarget ) {
if ( tempetaturaAtual >= (temperaturaTarget + 1.0) ) {
setCompressor(true);
}
else {
if ( tempetaturaQueEuAcho <= (Setpoint - 0.0) ) {
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 {
// 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
}
}
#ifdef __debug
#ifdef __debug
Serial.print(millis());
Serial.print(", Compressor, ");
Serial.print(Setpoint, 2);
Serial.print(", ");
if (relayState) {
Serial.println( "ON" );
}
else {
Serial.println( "OFF" );
}
#endif
temperaturaQueAchava = tempetaturaQueEuAcho;
delay(50);
//delay(100);
}
#endif
}
void setLEDs( int number ) {
......@@ -258,10 +387,10 @@ boolean debugDHT( int chk ) {
{
case DHTLIB_OK:
ret = true;
#ifdef __debug
/*#ifdef __debug
Serial.print("DHT11, ");
Serial.print("OK, ");
#endif
#endif*/
break;
case DHTLIB_ERROR_CHECKSUM:
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