Voor het schoolvak Interactive products, kreeg ik de opdracht om een koffie machine aan te passen/te herprogrammeren met als doel, de interactie tussen gebruiker en product verbeteren. Arduino word geprogrammeerd in C en C++. De introductie van de opdracht begon met een barista die langskwam op de opleiding om uitleg te geven over het maken van koffie en de verschillende stijlen. Wat mij bij deze presentatie opviel, was de heerlijke zoetige smaak van de zogenoemde slow coffee (ouderwetse filter machine koffie). Na rondvraag onder wat mensen bleek ook dat de meeste mensen deze oude koffie soort toch als het lekkerst bestempelen.
Door deze voorliefde voor de authentieke koffie ging ik nadenken, waarom is de senseo dan geen slow coffee? zal die machine dan misschien te snel zijn koffie zetten? Zou je een senseo slow coffee kunnen laten maken welke gewoon iets langer duurt dan gewone senseo koffie?
Aan de hand van de vorige vragen die had, ben ik in het ontwerp traject begonnen met het maken van een fysiek moodboard met koffie geur. Deze was helemaal gefocused op het ontspannen zondag ochtend gevoel waar je gewoon echt lekker rustig wil genieten van een heerlijke kop koffie.
Hierna ben ik wat gaan testen en bekijken, en wat bleek een senseo koffie pad, bevat dezelfde soort koffie als je vroegere filter koffie machine. Het zou dus mogelijk moeten zijn, om slow coffee te maken met de senseo machine, mits deze iets langzamer zou lopen.
Aan het begin van het programmeren is er een state change diagram gemaakt, dit is een overzicht van de verschillende code blokken die nodig zijn om een stuk software te laten lopen.
Na dit diagram te hebben gemaakt begon het vinden van een geschikte donor koffie zetter. De oude senseo die nog op zolder stond leek hiervoor uitermate geschikt. De eerste stap was het open maken en het analyseren van de onderdelen en het board dat de onderdelen aanstuurt. De volgende stap was om het board die in de koffie zetter zat, er uit te halen en alle onderdelen aan te sluiten op de arduino. Toen begon er een zoektocht om uit te zoeken wat voor temperatuur sensor er in de boiler zat en hoe de overige componenten aan te sturen. Nadat de senseo meerdere keren is overgekookt bleek dat de temperatuur sensor langzaam reageerde. Deze langzamere reactie moest vervolgens ook weer in de code worden toegevoegd, wanneer de koffie zetter dus aan werd gezet hoefde de sensor minder warm te zijn als voor het tweede kopje koffie.
Vervolgens ben ik gaan kijken of ik de motor langzamer kon laten draaien. De motor bleek alleen via een relais schakelaar aangesloten te zijn op 230v, hier ben ik vervolgens maar met bij uit de weg gebleven.
Tot slot moest er ook nog een interactie bedacht worden bij de koffie machine, deze kwam er simpelweg op neer, dat het display met pijlen de knoppen aan geeft waarop gedrukt moet worden. De knoppen waren de volledige bovenkant van de koffie zetter. Hierdoor hoef je dus alleen je hand maar links of rechts op de koffie zetter te leggen.
Voor iedereen die geitereseerd is in de code die ik geschreven heb:
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//tempsensor settings
//#define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter!
//int tempPin = 1; //pin for temp sensor
//int tempReading; // the analog reading from the sensor
//declare phase of coffee making
String phase = "boot";
//settings for button controlers
const int BtnLeft = 6;
const int BtnRight = 7;
int leftbtn = 0;
int rightbtn = 0;
//defining the relay switches
int Boiler = 10; // Connect Digital Pin 10 on Arduino to CH1 on Relay Module which goes to water boiler
int Pump = 9; // Connect Digital Pin 9 on Arduino to CH2 on Relay Module which goes to the water pump
//the real temperture sensor settings
const int sensorPin = A0; // Analog input pin that senses Vout
int sensorValue = 0; // sensorPin default value
float Vin = 5; // Input voltage
float Vout = 0; // Vout default value
float Rref = 220; // resistor rood-rood-bruin-goud
float R = 0; // Tested resistors default value
String heating = "yes"; //variable for heating or not heating (otherwise machine will be switching the heater on every 2 seconds.)
void setup() {
Serial.begin(9600);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(0, 0);
// print the number of seconds since reset:
lcd.print("Great coffee?");
pinMode(Boiler, OUTPUT);
pinMode(Pump, OUTPUT);
pinMode(leftbtn, INPUT);
}
void loop() {
//code to be executed during every loop here
pumpoff();
boileroff();
//real sensor check
sensorValue = analogRead(sensorPin); // Read Vout on analog input pin A0 (Arduino can sense from 0-1023, 1023 is 5V)
Vout = (Vin * sensorValue) / 1023; // Convert Vout to volts
R = Rref * (1 / ((Vin / Vout) - 1)); // Formula to calculate tested resistor's value
Serial.print("R: ");
Serial.println(R); // Give calculated resistance in Serial Monitor
//rule for heating or not
Checkbtn();
if (leftbtn == HIGH && rightbtn == HIGH) {
pumpon();
boileroff();
delay(10000);
pumpoff();
Serial.println("pomp aan geweest");}
//Serial.println("loop executed");
if (phase == "standby"){
boileroff();
pumpoff();
lcd.setCursor(0, 0);
lcd.print("Standby mode, press");
lcd.setCursor(0, 1);
lcd.print("a button to boot");
if (leftbtn == HIGH || rightbtn == HIGH) {
phase = "preheat";
}
}
if (phase == "boot") {
boileron();
lcd.setCursor(0, 0);
// print the number of seconds since reset:
lcd.print("I'm heating up");
lcd.setCursor(0, 1);
lcd.print("Just a small moment");
if (R <= 3000) {boileroff() ;
delay(3000);
phase="wait";}
}
if (phase == "wait") { // set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
if(R >= 1200){
boileron();
delay (R/2);
boileroff;
delay (R);}
else {
lcd.setCursor(0, 1);
lcd.print("I'm warm ");
phase = "choose";
delay (1000);}
}
if (phase == "choose"){
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 0);
// print the number of seconds since reset:
lcd.print("<-- Fast coffee ");
lcd.setCursor(0, 1);
lcd.print("Slow coffee --> ");
//leftbtn = digitalRead(BtnLeft); moved to standerd loop because buttons are used on multiple places
//rightbtn = digitalRead(BtnRight); moved to standerd loop because buttons are used on multiple places
Checkbtn();
if (leftbtn == HIGH) {
phase = "fast";}
Checkbtn() ;
if (rightbtn == HIGH) {
phase = "slow";
}
}
if (phase == "fast"){
lcd.print(leftbtn);
lcd.setCursor(0, 0);
lcd.print("Fast coffee ");
lcd.setCursor(0, 1);
lcd.print("<-- 1 | 2 --> ");
delay(500);
Checkbtn();
if (rightbtn == HIGH) {
lcd.setCursor(0, 0);
lcd.print("Brewing 2 ");
lcd.setCursor(0, 1);
lcd.print("fast coffee ");
Serial.println("2 fast coffee");
pumpon();
boileron();
delay(40000);
pumpoff();
boileroff();
phase = "boot";
}
if (leftbtn == HIGH) {
lcd.setCursor(0, 0);
lcd.print("Brewing 1 ");
lcd.setCursor(0, 1);
lcd.print("fast coffee ");
Serial.println("1 fast coffee");
pumpon();
boileron();
delay(20000);
pumpoff();
boileroff();
phase = "boot";
}}
if (phase == "slow"){
Serial.println("slow started");
lcd.setCursor(0, 0);
lcd.print("Slow coffee = ");
lcd.setCursor(0, 1);
lcd.print("Perfect coffee ");
boileron();
pumpon();
delay(5000);//5 seconds water pouring over beans
pumpoff();
boileroff();
lcd.setCursor(0, 0);
lcd.print("Blooming for the ");
lcd.setCursor(0, 1);
lcd.print("ultimate aroma ");
delay(15000);
pumpon();
boileron();
delay(10000);
pumpoff();
boileroff();
lcd.setCursor(0, 0);
lcd.print("Just an small ");
lcd.setCursor(0, 1);
lcd.print("moment ");
delay(10000);
pumpon();
boileron();
delay(10000);
pumpoff();
boileroff();
phase = "boot";
Serial.println("slow DONE!!! =D =D");
}
//delay before script is looped
//delay(500);
}
//code sets
void Checkbtn() {
leftbtn = digitalRead(BtnLeft);
rightbtn = digitalRead(BtnRight);
}
void tempcheck() {
delay (1000);
if (R <= 1300) {heating = "no";delay(1000);}
else if ( R >= 1000) {heating = "yes";delay(1000);}
//if heating is yes heat:
if (heating == "yes") digitalWrite(Boiler, LOW);
if (heating == "no") digitalWrite(Boiler, HIGH);
}
void boileron() {
digitalWrite(Boiler, LOW);}
void boileroff() {
digitalWrite(Boiler, HIGH);}
void pumpon() {
digitalWrite(Pump, LOW);}
void pumpoff() {
digitalWrite(Pump, HIGH);}