Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE DS1820 PinDetect Speaker mbed
Fork of DS18B20 by
Diff: main.cpp
- Revision:
- 1:2d86c674a78b
- Parent:
- 0:03ec282c2908
diff -r 03ec282c2908 -r 2d86c674a78b main.cpp
--- 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");
+}
+
