Working better. Maybe a little more improvement needs to be made to the display algorithm.
Dependencies: 4DGL-uLCD-SE MAX31855 mbed-rtos mbed
Fork of Coffee_Roaster_testing by
main.cpp@9:d7300899fd85, 2014-12-02 (annotated)
- Committer:
- ericspatterson
- Date:
- Tue Dec 02 18:10:09 2014 +0000
- Revision:
- 9:d7300899fd85
- Parent:
- 8:1db15ab871a4
Final Project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ericspatterson | 0:4fbaafa6574c | 1 | #include "mbed.h" |
ericspatterson | 0:4fbaafa6574c | 2 | #include "uLCD_4DGL.h" |
ericspatterson | 0:4fbaafa6574c | 3 | #include "rtos.h" |
ericspatterson | 0:4fbaafa6574c | 4 | #include "stdio.h" |
ericspatterson | 0:4fbaafa6574c | 5 | #include "max31855.h" |
ericspatterson | 2:c94244d1cab4 | 6 | #include <mpr121.h> |
ericspatterson | 8:1db15ab871a4 | 7 | #include "Stopwatch.h" |
ericspatterson | 2:c94244d1cab4 | 8 | |
ericspatterson | 9:d7300899fd85 | 9 | |
ericspatterson | 9:d7300899fd85 | 10 | DigitalOut toggle(p30); // toggle for Nichrome wire SSR |
ericspatterson | 9:d7300899fd85 | 11 | DigitalIn up(p19); // User reset button |
ericspatterson | 4:85eb29963721 | 12 | DigitalOut motor(p22); // motor control |
ericspatterson | 0:4fbaafa6574c | 13 | |
ericspatterson | 0:4fbaafa6574c | 14 | uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin; |
ericspatterson | 0:4fbaafa6574c | 15 | SPI thermoSPI(p5,p6,p7); // setup SPI interface |
ericspatterson | 0:4fbaafa6574c | 16 | max31855 max1(thermoSPI, p20); //setup max31855 interface |
ericspatterson | 9:d7300899fd85 | 17 | InterruptIn interrupt(p26); // Create the interrupt receiver object on pin 26 |
ericspatterson | 9:d7300899fd85 | 18 | I2C i2c(p28, p27); // Setup the i2c bus on pins 28 and 27 |
ericspatterson | 9:d7300899fd85 | 19 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); // Setup the Mpr121: // constructor(i2c object, i2c address of the mpr121) |
ericspatterson | 9:d7300899fd85 | 20 | |
ericspatterson | 0:4fbaafa6574c | 21 | Mutex lcd_mutex; // mutex to make the lcd lib thread safe |
ericspatterson | 0:4fbaafa6574c | 22 | Semaphore four_slots(1); //Activate semaphore |
ericspatterson | 9:d7300899fd85 | 23 | Stopwatch watch = Stopwatch(); |
ericspatterson | 0:4fbaafa6574c | 24 | |
ericspatterson | 9:d7300899fd85 | 25 | int settemp = 1; // initial temperature set |
ericspatterson | 0:4fbaafa6574c | 26 | float ftemperature = 0; // float variable for temperature |
ericspatterson | 0:4fbaafa6574c | 27 | float ctemperature = 0; // float variable for temperature |
ericspatterson | 9:d7300899fd85 | 28 | int temptemp=1; |
ericspatterson | 8:1db15ab871a4 | 29 | int key_code=-1; |
ericspatterson | 8:1db15ab871a4 | 30 | int a =0; |
ericspatterson | 8:1db15ab871a4 | 31 | int place= 100; |
ericspatterson | 8:1db15ab871a4 | 32 | int s = 00; |
ericspatterson | 8:1db15ab871a4 | 33 | int m = 00; |
ericspatterson | 8:1db15ab871a4 | 34 | int h = 00; |
ericspatterson | 8:1db15ab871a4 | 35 | |
ericspatterson | 2:c94244d1cab4 | 36 | |
ericspatterson | 9:d7300899fd85 | 37 | // Thread 1: run stopwatch timer |
ericspatterson | 6:076572f58a5e | 38 | void elapsedtime(void const *args) //elapsed timer for when program starts |
ericspatterson | 6:076572f58a5e | 39 | { |
ericspatterson | 8:1db15ab871a4 | 40 | watch.start(); |
ericspatterson | 0:4fbaafa6574c | 41 | } |
ericspatterson | 0:4fbaafa6574c | 42 | |
ericspatterson | 0:4fbaafa6574c | 43 | |
ericspatterson | 1:26267401354a | 44 | // Thread 2: print the temperature from the thermocouple - MAX31855 device |
ericspatterson | 6:076572f58a5e | 45 | void thermoread(void const *args) //line 2 |
ericspatterson | 6:076572f58a5e | 46 | { |
ericspatterson | 6:076572f58a5e | 47 | while(true) { |
ericspatterson | 6:076572f58a5e | 48 | if (max1.ready()==1) { |
ericspatterson | 9:d7300899fd85 | 49 | ctemperature = max1.read_temp(); //Get the reading in celsius |
ericspatterson | 9:d7300899fd85 | 50 | ftemperature = (ctemperature)*(9.0/5.0)+32.0; //Get the reading in fahrenheit |
ericspatterson | 8:1db15ab871a4 | 51 | } |
ericspatterson | 8:1db15ab871a4 | 52 | } |
ericspatterson | 8:1db15ab871a4 | 53 | } |
ericspatterson | 8:1db15ab871a4 | 54 | |
ericspatterson | 8:1db15ab871a4 | 55 | |
ericspatterson | 8:1db15ab871a4 | 56 | // Thread 3: reset temp |
ericspatterson | 8:1db15ab871a4 | 57 | void thermoset(void const *args) //line 2 |
ericspatterson | 8:1db15ab871a4 | 58 | { |
ericspatterson | 8:1db15ab871a4 | 59 | while(true) { |
ericspatterson | 8:1db15ab871a4 | 60 | if(up == 1) { |
ericspatterson | 9:d7300899fd85 | 61 | a = 0; |
ericspatterson | 9:d7300899fd85 | 62 | temptemp=0; |
ericspatterson | 9:d7300899fd85 | 63 | while(a<3) { //USER MUST INPUT 3 NUMBERS |
ericspatterson | 9:d7300899fd85 | 64 | if(key_code>=0 && key_code<=9) { |
ericspatterson | 9:d7300899fd85 | 65 | wait(.1); |
ericspatterson | 9:d7300899fd85 | 66 | if(a==0)temptemp=key_code*100; |
ericspatterson | 9:d7300899fd85 | 67 | if(a==1)temptemp+=key_code*10; |
ericspatterson | 9:d7300899fd85 | 68 | if(a==2)temptemp+=key_code*1; |
ericspatterson | 9:d7300899fd85 | 69 | a++; |
ericspatterson | 9:d7300899fd85 | 70 | key_code = -1; //clear keycode |
ericspatterson | 9:d7300899fd85 | 71 | } |
ericspatterson | 9:d7300899fd85 | 72 | } |
ericspatterson | 9:d7300899fd85 | 73 | settemp=temptemp; |
ericspatterson | 0:4fbaafa6574c | 74 | } |
ericspatterson | 0:4fbaafa6574c | 75 | } |
ericspatterson | 0:4fbaafa6574c | 76 | } |
ericspatterson | 0:4fbaafa6574c | 77 | |
ericspatterson | 2:c94244d1cab4 | 78 | |
ericspatterson | 6:076572f58a5e | 79 | void fallInterrupt() |
ericspatterson | 6:076572f58a5e | 80 | { |
ericspatterson | 6:076572f58a5e | 81 | int i=0; |
ericspatterson | 6:076572f58a5e | 82 | int value=mpr121.read(0x00); |
ericspatterson | 6:076572f58a5e | 83 | value +=mpr121.read(0x01)<<8; |
ericspatterson | 6:076572f58a5e | 84 | i=0; |
ericspatterson | 9:d7300899fd85 | 85 | for (i=0; i<12; i++) { // puts key number out to 0-12 digits |
ericspatterson | 6:076572f58a5e | 86 | if (((value>>i)&0x01)==1) key_code=i; |
ericspatterson | 6:076572f58a5e | 87 | } |
ericspatterson | 6:076572f58a5e | 88 | if(key_code== 10) { |
ericspatterson | 6:076572f58a5e | 89 | motor = 0; |
ericspatterson | 6:076572f58a5e | 90 | } |
ericspatterson | 6:076572f58a5e | 91 | if(key_code== 11) { |
ericspatterson | 6:076572f58a5e | 92 | motor = 1; |
ericspatterson | 6:076572f58a5e | 93 | } |
ericspatterson | 2:c94244d1cab4 | 94 | } |
ericspatterson | 2:c94244d1cab4 | 95 | |
ericspatterson | 8:1db15ab871a4 | 96 | |
ericspatterson | 6:076572f58a5e | 97 | int main() |
ericspatterson | 6:076572f58a5e | 98 | { |
ericspatterson | 6:076572f58a5e | 99 | max1.initialise(); //initialize thermocouple IC |
ericspatterson | 6:076572f58a5e | 100 | uLCD.baudrate(3000000); //set LCD baudrate |
ericspatterson | 6:076572f58a5e | 101 | interrupt.fall(&fallInterrupt); |
ericspatterson | 6:076572f58a5e | 102 | interrupt.mode(PullUp); |
ericspatterson | 6:076572f58a5e | 103 | Thread t1(elapsedtime); //run elapsed time counter |
ericspatterson | 6:076572f58a5e | 104 | Thread t2(thermoread); //read and display temperature from thermocouple |
ericspatterson | 8:1db15ab871a4 | 105 | Thread t3(thermoset); // user set temperature |
ericspatterson | 6:076572f58a5e | 106 | |
ericspatterson | 6:076572f58a5e | 107 | while(1) { //hystersis program |
ericspatterson | 8:1db15ab871a4 | 108 | char* time = watch.getTime(); |
ericspatterson | 8:1db15ab871a4 | 109 | four_slots.wait(); //lock screen |
ericspatterson | 8:1db15ab871a4 | 110 | uLCD.color(0xFFFF00); //set color |
ericspatterson | 8:1db15ab871a4 | 111 | uLCD.locate(0,0); //col,row for time |
ericspatterson | 8:1db15ab871a4 | 112 | uLCD.printf("Time | %s",time);//%2d:%2d:%2d", h,m,s); // display time |
ericspatterson | 8:1db15ab871a4 | 113 | uLCD.locate(0,5); |
ericspatterson | 8:1db15ab871a4 | 114 | uLCD.printf("Set | %3d",settemp); // current set temperature |
ericspatterson | 8:1db15ab871a4 | 115 | uLCD.locate(0,6); |
ericspatterson | 8:1db15ab871a4 | 116 | uLCD.printf("Current | %4.2f", ftemperature); // temperature reading |
ericspatterson | 8:1db15ab871a4 | 117 | uLCD.locate(0,2); |
ericspatterson | 8:1db15ab871a4 | 118 | uLCD.printf("Motor | "); //motor state in "on" or "off" state |
ericspatterson | 8:1db15ab871a4 | 119 | uLCD.locate(0,13); |
ericspatterson | 8:1db15ab871a4 | 120 | uLCD.printf("New Temp| %3d",temptemp); //new user temperature |
ericspatterson | 8:1db15ab871a4 | 121 | if(motor==0) { |
ericspatterson | 8:1db15ab871a4 | 122 | uLCD.locate(11,2); //col,row |
ericspatterson | 8:1db15ab871a4 | 123 | uLCD.printf("OFF"); |
ericspatterson | 6:076572f58a5e | 124 | } |
ericspatterson | 8:1db15ab871a4 | 125 | if(motor==1) { |
ericspatterson | 8:1db15ab871a4 | 126 | uLCD.locate(11,2); //col,row |
ericspatterson | 8:1db15ab871a4 | 127 | uLCD.printf("ON "); |
ericspatterson | 8:1db15ab871a4 | 128 | } |
ericspatterson | 8:1db15ab871a4 | 129 | four_slots.release(); // release screen resource |
ericspatterson | 6:076572f58a5e | 130 | if(ftemperature < settemp-1) { //condition for 1 degree under |
ericspatterson | 2:c94244d1cab4 | 131 | toggle=1; //turn on ssr for nichrome wire |
ericspatterson | 2:c94244d1cab4 | 132 | } |
ericspatterson | 8:1db15ab871a4 | 133 | if(ftemperature > settemp-1) { |
ericspatterson | 7:8a0223a951c1 | 134 | toggle=0; //turn off ssr for nichrome wire |
ericspatterson | 7:8a0223a951c1 | 135 | } |
ericspatterson | 0:4fbaafa6574c | 136 | } |
ericspatterson | 0:4fbaafa6574c | 137 | } |