![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Using mbed for sous vide
Dependencies: 4DGL-uLCD-SE DS1820 PinDetect Speaker mbed
Fork of DS18B20 by
Diff: main.cpp
- Revision:
- 1:2d86c674a78b
- Parent:
- 0:03ec282c2908
--- a/main.cpp Fri Jan 29 19:01:56 2010 +0000 +++ b/main.cpp Sun Dec 04 23:10:56 2016 +0000 @@ -1,29 +1,207 @@ #include "mbed.h" -#include <stdint.h> -#include "DS18B20.h" +#include "uLCD_4DGL.h" +#include "Speaker.h" +#include "DS1820.h" +#include "PinDetect.h" +#include <time.h> + +//Program by: Tianhang Ren, Minsuk Chun, Richard Lee + +//////////////////////////////////////////////////////// +//Initialize +/////////////////////////////////////////////////////// -DigitalInOut sensor(p5); // sensor connected to pin 5 +DS1820 probe(p5); +PinDetect pbUp(p18); // Buttons to raise/lower/enter temperature +PinDetect pbDown(p19); +PinDetect pbEnter (p20); +Serial pc(USBTX, USBRX); // serial comms over usb back to console +//Timer T; +DigitalOut myled1(LED1); // On when relay is engaged +DigitalOut myled2(LED2); +DigitalOut myled3(LED3); +DigitalOut myled4(LED4); +uLCD_4DGL uLCD(p28, p27, p29); // create a global uLCD object -Ticker timer; // used for our microsec timing -Serial pc(USBTX, USBRX); // serial comms over usb back to console +DigitalOut ctrl(p8); //relay control + +// setup instance of new Speaker class, mySpeaker using pin 21 +// the pin must be a PWM output pin +Speaker mySpeaker(p26); + +float userTemp = 0; //user desired temperature of device +int check = 0; //indicates whether enter key is pressed +float timeCook = 0; + -int main() { - pc.printf("\n\r=====================================================\n\r"); - pc.printf("DS18B20 Configuration\n\r"); - sensor.mode(PullUp); - - ROM_Code_t ROM_Code = ReadROM(); - pc.printf("Family code: 0x%X\n\r", ROM_Code.BYTES.familyCode); - pc.printf("Serial Number: "); - for (uint32_t i = 6; i != 0; --i) { - pc.printf("%02X%s", ROM_Code.BYTES.serialNo[i-1], (i != 1)?":":"\r\n"); +//////////////////////////////////////////////////////// +// Initialize pushbuttons +/////////////////////////////////////////////////////// + + +// Callback routine is interrupt activated by a debounced pb1 hit +void pbUp_hit_callback (void) +{ + // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED + myled1 = !myled1; + mySpeaker.PlayNote(200.0,0.25,0.1); + userTemp++; + timeCook +=5; //TODO CHANGE TIME BACK TO 10 INTERVALS +} + +// Callback routine is interrupt activated by a debounced pb2 hit +void pbDown_hit_callback (void) +{ + // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED + myled2 = !myled2; + mySpeaker.PlayNote(400.0,0.25,0.1); + userTemp--; + if (userTemp <=0) { + userTemp = 0; } - pc.printf("CRC: 0x%X\r\n", ROM_Code.BYTES.CRC); - - pc.printf("\n\rRunning temperature conversion...\n\r"); - while (1) { - displayTemperature(pc); - wait(10); - } + timeCook-=5; + if (timeCook <=0) + timeCook=0; +} +// Callback routine is interrupt activated by a debounced pb3 hit +void pbEnter_hit_callback (void) +{ + // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED + myled3 = !myled3; + mySpeaker.PlayNote(800.0,0.10,0.1); + mySpeaker.PlayNote(1000.0,0.10,0.1); + mySpeaker.PlayNote(1200.0,0.10,0.1); + check++; } +//////////////////////////////////////////////////////// +// Main method starts here +//////////////////////////////////////////////////////// + +int main() +{ +//setup three SPST push buttons + pbUp.mode(PullUp); //add internal pullup resistor + pbDown.mode(PullUp); + pbEnter.mode(PullUp); + +// Delay for initial pullup to take effect + wait(.01); + +// Setup Interrupt callback functions for a pb hit + pbUp.attach_deasserted(&pbUp_hit_callback); + pbDown.attach_deasserted(&pbDown_hit_callback); + pbEnter.attach_deasserted(&pbEnter_hit_callback); + +// Start sampling pb inputs using interrupts + pbUp.setSampleFrequency(); + pbDown.setSampleFrequency(); + pbEnter.setSampleFrequency(); + +// pushbuttons now setup and running + +//////////////////////////////////////////////////////// +// Ask for temperature and time desired +//////////////////////////////////////////////////////// + + uLCD.printf("Enter desired temperature"); //Ask for desired temperature + while(check ==0) { //if check flag is 0, means enter has not been pushed + if (pbUp) { + uLCD.locate(0,3); + uLCD.printf("%4.0f", userTemp); + } + if (pbDown) { + uLCD.locate(0,3); + uLCD.printf("%4.0f", userTemp); + } + } + + float finalTemp = userTemp; //reassign to final temp + check = 0; + uLCD.cls(); + uLCD.locate(0,0); + timeCook = 0; //reset timeCook + uLCD.printf("Enter cooking time"); //Cooking time in minutes + while (check == 0) { + if (pbUp) { + uLCD.locate(0,3); + uLCD.printf("%4.0f", timeCook); + } + if (pbDown) { + uLCD.locate(0,3); + uLCD.printf("%4.0f", timeCook); + } + } + float finalTime = timeCook *60; //reassign to final time + ctrl = 1; // Turn on relay + float tempLimit = 0; //intitialize variable to track temperature + uLCD.locate(0,0); + uLCD.printf("Set Temp (C)", finalTemp); //print set temperature + while (tempLimit < (finalTemp + 1)) { //Loop while temperature is 1 degrees over destination + probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready + tempLimit = probe.temperature(); + uLCD.locate(0,3); + uLCD.printf("It is %3.1foC\r", probe.temperature()); + wait(1); + } +//////////////////////////////////////////////////////// +// Start cooking with finalized temperatures and time +//////////////////////////////////////////////////////// + + //PLAY SOUND FROM SPEAKER + /* T.start(); //Timer start (s)*/ + float time_remaining = 1; + ctrl = 0; + uLCD.cls(); + uLCD.locate(0,0); + uLCD.printf("Set Temperature %4.0foC\r", finalTemp); + set_time(1256729737); // Set RTC time to Wed, 28 Oct 2009 11:35:37 + // time_t seconds = time(NULL); + + while(time_remaining > 0) { //Loop while timer has not reached desired time + if (tempLimit < (finalTemp - 1)) { //If temperature is 2 degrees C lower than desired, turn relay on + ctrl = 1; + } else if (tempLimit >= finalTemp) { + ctrl = 0; + } + tempLimit = probe.temperature(); + probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready + uLCD.locate(0,3); + uLCD.printf("It is %3.1foC\r", probe.temperature()); + uLCD.locate(0,5); + time_t seconds = time(NULL); //Cycle RTC + time_remaining = finalTime - (seconds - 1256729737); + + if ((time_remaining/3600) >= 1 ) + uLCD.printf("Time remaining: \n%4.0f hours", time_remaining/3600); + else if ((time_remaining/60) >= 1) + uLCD.printf("Time remaining: %4.0f minutes", time_remaining/60); + else + uLCD.printf("Time remaining: %4.0f seconds", time_remaining); + } + + ctrl = 0; + + //PLAY SOUND FROM SPEAKER + mySpeaker.PlayNote(1567.98,0.25,0.1); + mySpeaker.PlayNote(1046.50,0.25,0.1); + mySpeaker.PlayNote(1174.66,0.25,0.1); + mySpeaker.PlayNote(1318.51,0.25,0.1); + mySpeaker.PlayNote(1396.91,0.25,0.1); + mySpeaker.PlayNote(1567.98,0.25,0.1); + mySpeaker.PlayNote(1046.50,0.25,0.1); + mySpeaker.PlayNote(1046.50,0.25,0.1); + mySpeaker.PlayNote(1760.00,0.25,0.1); + mySpeaker.PlayNote(1396.91,0.25,0.1); + mySpeaker.PlayNote(1567.98,0.25,0.1); + mySpeaker.PlayNote(1760.00,0.25,0.1); + mySpeaker.PlayNote(1975.53,0.25,0.1); + mySpeaker.PlayNote(2093.00,0.25,0.1); + mySpeaker.PlayNote(1046.50,0.25,0.1); + mySpeaker.PlayNote(1046.50,0.25,0.1); + + uLCD.cls(); + uLCD.locate(0,0); + uLCD.printf("Food is ready"); +} +