This program is done as an Lab assignment for ECE2036.
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed
Fork of mythermostat by
This program is a lab assignment to ECE 2036. It uses uLCD, pushputtons and SDCard via sdFileSystem. This is designed as a concept to train animal that could be used by biologist to determine if lemurs have a concept of numbers. uLCD is divided into two different rectangle. In each rectangle, program generate random shapes of different color. Pushbutton is used to select which side has smaller number of shapes. Each trial, result is stored in sdCard as datalogging.
main.cpp@4:9a4d22a279b3, 2014-01-23 (annotated)
- Committer:
- 4180_1
- Date:
- Thu Jan 23 16:47:05 2014 +0000
- Revision:
- 4:9a4d22a279b3
- Parent:
- 3:346ef671ef28
- Child:
- 5:e3916a6d72b8
ver 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
4180_1 | 2:58d85409f7ff | 1 | // skeleton code for ECE 2036 thermostat lab |
4180_1 | 2:58d85409f7ff | 2 | // code must be added by students |
4180_1 | 0:cc87c48aa43c | 3 | #include "mbed.h" |
4180_1 | 2:58d85409f7ff | 4 | #include "TMP36.h" |
4180_1 | 2:58d85409f7ff | 5 | #include "SDFileSystem.h" |
4180_1 | 4:9a4d22a279b3 | 6 | #include "uLCD_4DGL.h" |
4180_1 | 0:cc87c48aa43c | 7 | #include "PinDetect.h" |
4180_1 | 2:58d85409f7ff | 8 | #include "Speaker.h" |
4180_1 | 2:58d85409f7ff | 9 | // must add your new class code to the project file Shiftbrite.h |
4180_1 | 2:58d85409f7ff | 10 | #include "Shiftbrite.h" |
4180_1 | 2:58d85409f7ff | 11 | |
4180_1 | 2:58d85409f7ff | 12 | // use class to setup temperature sensor pins |
4180_1 | 2:58d85409f7ff | 13 | TMP36 myTMP36(p15); //Analog in |
4180_1 | 0:cc87c48aa43c | 14 | |
4180_1 | 2:58d85409f7ff | 15 | // use class to setup microSD card filesystem |
4180_1 | 2:58d85409f7ff | 16 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
4180_1 | 2:58d85409f7ff | 17 | |
4180_1 | 4:9a4d22a279b3 | 18 | // use class to setup the Color LCD |
4180_1 | 4:9a4d22a279b3 | 19 | uLCD_4DGL uLCD(p28, p27, p29); // create a global uLCD object |
4180_1 | 2:58d85409f7ff | 20 | |
4180_1 | 2:58d85409f7ff | 21 | // use class to setup pushbuttons pins |
4180_1 | 4:9a4d22a279b3 | 22 | PinDetect pb1(p23); |
4180_1 | 4:9a4d22a279b3 | 23 | PinDetect pb2(p24); |
4180_1 | 4:9a4d22a279b3 | 24 | PinDetect pb3(p25); |
4180_1 | 2:58d85409f7ff | 25 | |
4180_1 | 2:58d85409f7ff | 26 | // use class to setup speaker pin |
4180_1 | 2:58d85409f7ff | 27 | Speaker mySpeaker(p21); //PWM out |
4180_1 | 0:cc87c48aa43c | 28 | |
4180_1 | 2:58d85409f7ff | 29 | // use class to setup Shiftbrite pins |
4180_1 | 2:58d85409f7ff | 30 | Shiftbrite myShiftbrite(p9, p10, p11, p12, p13);// ei li di n/c ci |
4180_1 | 2:58d85409f7ff | 31 | |
4180_1 | 2:58d85409f7ff | 32 | // use class to setup Mbed's four on-board LEDs |
4180_1 | 2:58d85409f7ff | 33 | DigitalOut myLED1(LED1); |
4180_1 | 2:58d85409f7ff | 34 | DigitalOut myLED2(LED2); |
4180_1 | 2:58d85409f7ff | 35 | DigitalOut myLED3(LED3); |
4180_1 | 2:58d85409f7ff | 36 | DigitalOut myLED4(LED4); |
4180_1 | 2:58d85409f7ff | 37 | |
4180_1 | 4:9a4d22a279b3 | 38 | |
4180_1 | 0:cc87c48aa43c | 39 | |
4180_1 | 2:58d85409f7ff | 40 | //also setting any unused analog input pins to digital outputs reduces A/D noise a bit |
4180_1 | 2:58d85409f7ff | 41 | //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/ |
4180_1 | 2:58d85409f7ff | 42 | DigitalOut P16(p16); |
4180_1 | 2:58d85409f7ff | 43 | DigitalOut P17(p17); |
4180_1 | 2:58d85409f7ff | 44 | DigitalOut P18(p18); |
4180_1 | 2:58d85409f7ff | 45 | DigitalOut P19(p19); |
4180_1 | 2:58d85409f7ff | 46 | DigitalOut P20(p20); |
4180_1 | 2:58d85409f7ff | 47 | |
4180_1 | 2:58d85409f7ff | 48 | |
4180_1 | 2:58d85409f7ff | 49 | |
4180_1 | 2:58d85409f7ff | 50 | |
4180_1 | 2:58d85409f7ff | 51 | // Global variables used in callbacks and main program |
4180_1 | 2:58d85409f7ff | 52 | // C variables in interrupt routines should use volatile keyword |
4180_1 | 2:58d85409f7ff | 53 | int volatile heat_setting=78; // heat to temp |
4180_1 | 2:58d85409f7ff | 54 | int volatile cool_setting=68; // cool to temp |
4180_1 | 4:9a4d22a279b3 | 55 | bool volatile mode=false; // heat or cool mode |
4180_1 | 0:cc87c48aa43c | 56 | |
4180_1 | 1:768b8bd42e33 | 57 | // Callback routine is interrupt activated by a debounced pb1 hit |
4180_1 | 2:58d85409f7ff | 58 | void pb1_hit_callback (void) |
4180_1 | 2:58d85409f7ff | 59 | { |
4180_1 | 2:58d85409f7ff | 60 | // ADD CODE HERE |
4180_1 | 0:cc87c48aa43c | 61 | } |
4180_1 | 1:768b8bd42e33 | 62 | // Callback routine is interrupt activated by a debounced pb2 hit |
4180_1 | 2:58d85409f7ff | 63 | void pb2_hit_callback (void) |
4180_1 | 2:58d85409f7ff | 64 | { |
4180_1 | 2:58d85409f7ff | 65 | // ADD CODE HERE |
4180_1 | 2:58d85409f7ff | 66 | } |
4180_1 | 2:58d85409f7ff | 67 | // Callback routine is interrupt activated by a debounced pb3 hit |
4180_1 | 2:58d85409f7ff | 68 | void pb3_hit_callback (void) |
4180_1 | 2:58d85409f7ff | 69 | { |
4180_1 | 2:58d85409f7ff | 70 | // ADD CODE HERE |
4180_1 | 1:768b8bd42e33 | 71 | } |
4180_1 | 2:58d85409f7ff | 72 | |
4180_1 | 0:cc87c48aa43c | 73 | |
4180_1 | 2:58d85409f7ff | 74 | int main() |
4180_1 | 2:58d85409f7ff | 75 | { |
4180_1 | 2:58d85409f7ff | 76 | float Current_temp=0.0; |
4180_1 | 2:58d85409f7ff | 77 | |
4180_1 | 2:58d85409f7ff | 78 | // Use internal pullups for the three pushbuttons |
4180_1 | 2:58d85409f7ff | 79 | pb1.mode(PullUp); |
4180_1 | 1:768b8bd42e33 | 80 | pb2.mode(PullUp); |
4180_1 | 2:58d85409f7ff | 81 | pb3.mode(PullUp); |
4180_1 | 0:cc87c48aa43c | 82 | // Delay for initial pullup to take effect |
4180_1 | 0:cc87c48aa43c | 83 | wait(.01); |
4180_1 | 1:768b8bd42e33 | 84 | // Setup Interrupt callback functions for a pb hit |
4180_1 | 1:768b8bd42e33 | 85 | pb1.attach_deasserted(&pb1_hit_callback); |
4180_1 | 1:768b8bd42e33 | 86 | pb2.attach_deasserted(&pb2_hit_callback); |
4180_1 | 3:346ef671ef28 | 87 | pb3.attach_deasserted(&pb3_hit_callback); |
4180_1 | 1:768b8bd42e33 | 88 | // Start sampling pb inputs using interrupts |
4180_1 | 1:768b8bd42e33 | 89 | pb1.setSampleFrequency(); |
4180_1 | 1:768b8bd42e33 | 90 | pb2.setSampleFrequency(); |
4180_1 | 3:346ef671ef28 | 91 | pb3.setSampleFrequency(); |
4180_1 | 2:58d85409f7ff | 92 | // pushbuttons now setup and running |
4180_1 | 2:58d85409f7ff | 93 | |
4180_1 | 2:58d85409f7ff | 94 | |
4180_1 | 2:58d85409f7ff | 95 | // start I/O examples - DELETE THIS IN YOUR CODE..BUT WILL USE THESE I/O IDEAS ELSEWHERE |
4180_1 | 2:58d85409f7ff | 96 | // since all this compiles - the needed *.h files for these are in the project |
4180_1 | 2:58d85409f7ff | 97 | // |
4180_1 | 4:9a4d22a279b3 | 98 | Current_temp = myTMP36; //Read temp sensor |
4180_1 | 4:9a4d22a279b3 | 99 | printf("Hello PC World\n\r"); // need terminal application running on PC to see this output |
4180_1 | 4:9a4d22a279b3 | 100 | uLCD.printf("\n\rHello LCD World\n\r"); // LCD |
4180_1 | 2:58d85409f7ff | 101 | mySpeaker.PlayNote(500.0, 1.0, 1.0); // Speaker buzz |
4180_1 | 2:58d85409f7ff | 102 | myShiftbrite.write( 0, 50 ,0); // Green RGB LED |
4180_1 | 2:58d85409f7ff | 103 | // SD card write file example - prints error message on PC when running until SD card hooked up |
4180_1 | 4:9a4d22a279b3 | 104 | // Delete to avoid run time error |
4180_1 | 3:346ef671ef28 | 105 | mkdir("/sd/mydir", 0777); // set up directory and permissions |
4180_1 | 2:58d85409f7ff | 106 | FILE *fp = fopen("/sd/mydir/sdtest.txt", "w"); //open SD |
4180_1 | 2:58d85409f7ff | 107 | if(fp == NULL) { |
4180_1 | 2:58d85409f7ff | 108 | error("Could not open file for write\n"); |
4180_1 | 2:58d85409f7ff | 109 | } |
4180_1 | 2:58d85409f7ff | 110 | fprintf(fp, "Hello SD Card World!"); // write SD |
4180_1 | 2:58d85409f7ff | 111 | fclose(fp); // close SD card |
4180_1 | 2:58d85409f7ff | 112 | // |
4180_1 | 2:58d85409f7ff | 113 | // end I/O examples |
4180_1 | 2:58d85409f7ff | 114 | |
4180_1 | 2:58d85409f7ff | 115 | |
4180_1 | 2:58d85409f7ff | 116 | |
4180_1 | 2:58d85409f7ff | 117 | |
4180_1 | 3:346ef671ef28 | 118 | // State machine code below will need changes and additions |
4180_1 | 0:cc87c48aa43c | 119 | while (1) { |
4180_1 | 2:58d85409f7ff | 120 | { |
4180_1 | 2:58d85409f7ff | 121 | enum Statetype { Heat_off = 0, Heat_on }; |
4180_1 | 2:58d85409f7ff | 122 | Statetype state = Heat_off; |
4180_1 | 2:58d85409f7ff | 123 | while(1) { |
4180_1 | 2:58d85409f7ff | 124 | switch (state) { |
4180_1 | 2:58d85409f7ff | 125 | case Heat_off: |
4180_1 | 3:346ef671ef28 | 126 | myLED4 = 0; |
4180_1 | 2:58d85409f7ff | 127 | state = Heat_on; |
4180_1 | 2:58d85409f7ff | 128 | break; |
4180_1 | 2:58d85409f7ff | 129 | case Heat_on: |
4180_1 | 3:346ef671ef28 | 130 | myLED4 = 1; |
4180_1 | 2:58d85409f7ff | 131 | state = Heat_off; |
4180_1 | 2:58d85409f7ff | 132 | break; |
4180_1 | 2:58d85409f7ff | 133 | } |
4180_1 | 2:58d85409f7ff | 134 | wait(0.33); |
4180_1 | 3:346ef671ef28 | 135 | // heartbeat LED - common debug tool |
4180_1 | 3:346ef671ef28 | 136 | // blinks as long as code is running and not locked up |
4180_1 | 3:346ef671ef28 | 137 | myLED1=!myLED1; |
4180_1 | 2:58d85409f7ff | 138 | } |
4180_1 | 2:58d85409f7ff | 139 | } |
4180_1 | 0:cc87c48aa43c | 140 | } |
4180_1 | 0:cc87c48aa43c | 141 | } |