Sous vide projekti - matpi/EmbeddedSystemsUTU GitHub Wiki
Rauman opettajankoulutuslaitoksen käsityön aineopintojen sulautetut järjestelmät -projektina toteutimme sous vide -keittimen. Järjestelmään kuuluu riisikeitin sekä Arduino-ohjattu kontrolleri. Kontrollerin tarkoituksena on säätää keittimelle menevää sähkövirtaa releen avulla. Riisikeittimessä olevan vedenlämpötilaa tarkkailaan lämpöanturilla, joka on yhteydessä Arduinoon. Kontrollerilla asetetaan tavoitelämpötila, jonka laite pitää tasaisena 0,5 celsiusasteen tarkkuudella.
Käytimme laitteessa Internetistä löytynyttä esimerkkiprojektia, joka pitkien etsintöjen ja tiedonhaun jälkeen. Osoite sivustoon: http://www.instructables.com/id/Cheap-and-effective-Sous-Vide-cooker-Arduino-power/
Käytimme sivustolla esiteltyä esimerkkikoodia monipuolisten ja tarkkojen ominaisuuksien perusteella. Osoite koodiin: https://github.com/egiust/SousVideAdaptativeArduino/blob/master/sousvide.ino
Syventyäksemme projektiin, toteutimme oman koodin. Koodin toimintaperiaate on sama kuin esimerkkikoodissa, tosin yksinkertaistettuna. Lähtökohtana oli kehittää koodista toimiva rakentamallemme kokoonpanolle. Koodi ei ole tällä hetkellä käyttökelpoinen, vaan vaatisi lisää kehittämistä.
Oma koodimme: // inputs // Pushbutton + on pin 6 with INPUT_PULLUP mode // Pushbutton - on pin 5 with INPUT_PULLUP mode // Temperature sensor on pin 9 (data pin of OneWire sensor)
// outputs // Relay on pin 8 // Speaker (piezo) on pin 13 // 8 digit LED display DataIn on pin 12 // 8 digit LED display CLK on pin 11 // 8 digit LED display LOAD on pin 10
// ------------------------- LIBRARIES #include <LedControl.h> #include <OneWire.h> #include <DallasTemperature.h>
// ------------------------- CONSTANTS
// push-buttons int BT_TEMP_MORE_PIN=6; //INPUT_PULLUP mode int BT_TEMP_LESS_PIN=5; //INPUT_PULLUP mode
// piezo int PIEZO_PIN=13;
// temperature sensor int ONE_WIRE_BUS=9;
// relay int RELAY_OUT_PIN=8;
/* LedControl : pin 12 is connected to the DataIn pin 11 is connected to the CLK pin 10 is connected to LOAD We have 1 MAX7219. */ LedControl lc=LedControl(12,11,10,1); // Set up a oneWire instance and Dallas temperature sensor OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); // variable to store temperature probe address DeviceAddress tempProbeAddress;
// Staattiset eli ei voi muuttaa ohjelman juostessa. double eli liukuluku eli voi olla desimaaleja
double DEADBAND=1; double OHJEARVOMUUTOS=1; double MAX_OHJEARVO=90; double MIN_OHJEARVO=50;
// Muuttujat arvot muuttuu ohjelman aikana
double lampotila; double ohjearvo; double ylaraja; double alaraja;
boolean alaNappiPohjassa; boolean ylaNappiPohjassa;
// Funktiot
void ohjearvoYlos(){ ohjearvo+OHJEARVOMUUTOS; laskeDeadband();
if (ohjearvo>MAX_OHJEARVO){ ohjearvo=MAX_OHJEARVO; }
}
void ohjearvoAlas(){ ohjearvo-OHJEARVOMUUTOS; laskeDeadband();
if (ohjearvo<MIN_OHJEARVO){
ohjearvo=MIN_OHJEARVO;
}
}
void laskeDeadband(){ ylaraja=ohjearvo+DEADBAND/2; alaraja=ohjearvo-DEADBAND/2; }
void saada(){
if(lampotila<alaraja){
relePaalle();
}
else if(lampotila>ylaraja){
relePois();
}
}
void relePaalle(){ digitalWrite(RELAY_OUT_PIN, HIGH); }
void relePois(){ digitalWrite(RELAY_OUT_PIN, LOW); }
void lueYlaNappi(){ boolean painettu = digitalRead(BT_TEMP_MORE_PIN); //esimerkki koodi, ei toimi vielä näin
if(!ylaNappiPohjassa && painettu){ ohjearvoYlos(); }
ylaNappiPohjassa=painettu; }
void lueAlaNappi(){ boolean painettu = digitalRead(BT_TEMP_LESS_PIN); //esimerkki koodi, ei toimi vielä näin
if(!alaNappiPohjassa && painettu){ ohjearvoAlas(); }
alaNappiPohjassa=painettu;
}
void printNumber(double ohje, double lampo) {
int v;
int ones;
int tens;
int hundreds;
boolean negative;
//printataan ohje näytön alkuosaan
v= (int)ohje*10;
if(v < -999 || v > 999)
return;
if(v<0) {
negative=true;
v=v*-1;
}
ones=v%10;
v=v/10;
tens=v%10;
v=v/10;
hundreds=v;
if(negative) {
//print character '-' in the leftmost column
lc.setChar(0,3,'-',false);
}
else {
//print a blank in the sign column
lc.setChar(0,3,' ',false);
}
//Now print the number digit by digit
lc.setDigit(0,0,(byte)hundreds,false);
lc.setDigit(0,1,(byte)tens,false);
lc.setDigit(0,2,(byte)ones,false);
lc.setLed(0,0,1,true);
//printataan mitattu lampo näytön loppupäähän
v= (int)lampo*10;
if(v < -999 || v > 999)
return;
if(v<0) {
negative=true;
v=v*-1;
}
ones=v%10;
v=v/10;
tens=v%10;
v=v/10;
hundreds=v;
if(negative) {
//print character '-' in the leftmost column
lc.setChar(0,3,'-',false);
}
else {
//print a blank in the sign column
lc.setChar(0,3,' ',false);
}
//Now print the number digit by digit
lc.setDigit(0,5,(byte)hundreds,false);
lc.setDigit(0,6,(byte)tens,false);
lc.setDigit(0,7,(byte)ones,false);
lc.setLed(0,0,6,true);
}
void setup() { //Init variables ohjearvo= 60; ylaraja= 60,5; alaraja= 59,5;
Serial.begin(9600);
/*
Initialize MAX7219 display driver
*/
lc.shutdown(0,false);
lc.setIntensity(0,2);
lc.clearDisplay(0);
/*
Initialize pushButtons
*/
pinMode(BT_TEMP_MORE_PIN, INPUT_PULLUP);
pinMode(BT_TEMP_LESS_PIN, INPUT_PULLUP);
/*
Initialize temperature sensor
*/
sensors.begin();
delay(1000);
sensors.getAddress(tempProbeAddress, 0);
delay(1000);
sensors.requestTemperaturesByIndex(0); // Send the command to get temperatures
delay(1000);
/*
Read temperature
*/
lampotila = sensors.getTempC(tempProbeAddress);
}
void loop() {
lueYlaNappi(); lueAlaNappi(); lampotila = sensors.getTempC(tempProbeAddress); saada(); printNumber(ohjearvo, lampotila); }