This program is done as an Lab assignment for ECE2036.

Dependencies:   4DGL-uLCD-SE PinDetect SDFileSystem mbed

Fork of mythermostat by jim hamblen

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.

Committer:
4180_1
Date:
Thu Jan 31 19:02:24 2013 +0000
Revision:
3:346ef671ef28
Parent:
2:58d85409f7ff
Child:
4:9a4d22a279b3
ver 1.1

Who changed what in which revision?

UserRevisionLine numberNew 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 2:58d85409f7ff 6 #include "TextLCD.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 2:58d85409f7ff 18 // use class to setup the LCD
4180_1 2:58d85409f7ff 19 TextLCD myLCD(p22, p23, p24, p25, p26, p27); // rs, e, d4-d7
4180_1 2:58d85409f7ff 20
4180_1 2:58d85409f7ff 21 // use class to setup pushbuttons pins
4180_1 2:58d85409f7ff 22 PinDetect pb1(p28);
4180_1 2:58d85409f7ff 23 PinDetect pb2(p29);
4180_1 2:58d85409f7ff 24 PinDetect pb3(p30);
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 2:58d85409f7ff 38 // heat or code mode jumper - removed when pushbuttons added
4180_1 2:58d85409f7ff 39 DigitalIn jumper_wire(p14);
4180_1 0:cc87c48aa43c 40
4180_1 2:58d85409f7ff 41 //also setting any unused analog input pins to digital outputs reduces A/D noise a bit
4180_1 2:58d85409f7ff 42 //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/
4180_1 2:58d85409f7ff 43 DigitalOut P16(p16);
4180_1 2:58d85409f7ff 44 DigitalOut P17(p17);
4180_1 2:58d85409f7ff 45 DigitalOut P18(p18);
4180_1 2:58d85409f7ff 46 DigitalOut P19(p19);
4180_1 2:58d85409f7ff 47 DigitalOut P20(p20);
4180_1 2:58d85409f7ff 48
4180_1 2:58d85409f7ff 49
4180_1 2:58d85409f7ff 50
4180_1 2:58d85409f7ff 51
4180_1 2:58d85409f7ff 52 // Global variables used in callbacks and main program
4180_1 2:58d85409f7ff 53 // C variables in interrupt routines should use volatile keyword
4180_1 2:58d85409f7ff 54 int volatile heat_setting=78; // heat to temp
4180_1 2:58d85409f7ff 55 int volatile cool_setting=68; // cool to temp
4180_1 2:58d85409f7ff 56 bool volatile mode=false; // heat or cool mpde
4180_1 0:cc87c48aa43c 57
4180_1 1:768b8bd42e33 58 // Callback routine is interrupt activated by a debounced pb1 hit
4180_1 2:58d85409f7ff 59 void pb1_hit_callback (void)
4180_1 2:58d85409f7ff 60 {
4180_1 2:58d85409f7ff 61 // ADD CODE HERE
4180_1 0:cc87c48aa43c 62 }
4180_1 1:768b8bd42e33 63 // Callback routine is interrupt activated by a debounced pb2 hit
4180_1 2:58d85409f7ff 64 void pb2_hit_callback (void)
4180_1 2:58d85409f7ff 65 {
4180_1 2:58d85409f7ff 66 // ADD CODE HERE
4180_1 2:58d85409f7ff 67 }
4180_1 2:58d85409f7ff 68 // Callback routine is interrupt activated by a debounced pb3 hit
4180_1 2:58d85409f7ff 69 void pb3_hit_callback (void)
4180_1 2:58d85409f7ff 70 {
4180_1 2:58d85409f7ff 71 // ADD CODE HERE
4180_1 1:768b8bd42e33 72 }
4180_1 2:58d85409f7ff 73
4180_1 0:cc87c48aa43c 74
4180_1 2:58d85409f7ff 75 int main()
4180_1 2:58d85409f7ff 76 {
4180_1 2:58d85409f7ff 77 float Current_temp=0.0;
4180_1 2:58d85409f7ff 78
4180_1 2:58d85409f7ff 79 // Use internal pullups for the three pushbuttons
4180_1 2:58d85409f7ff 80 pb1.mode(PullUp);
4180_1 1:768b8bd42e33 81 pb2.mode(PullUp);
4180_1 2:58d85409f7ff 82 pb3.mode(PullUp);
4180_1 0:cc87c48aa43c 83 // Delay for initial pullup to take effect
4180_1 0:cc87c48aa43c 84 wait(.01);
4180_1 1:768b8bd42e33 85 // Setup Interrupt callback functions for a pb hit
4180_1 1:768b8bd42e33 86 pb1.attach_deasserted(&pb1_hit_callback);
4180_1 1:768b8bd42e33 87 pb2.attach_deasserted(&pb2_hit_callback);
4180_1 3:346ef671ef28 88 pb3.attach_deasserted(&pb3_hit_callback);
4180_1 1:768b8bd42e33 89 // Start sampling pb inputs using interrupts
4180_1 1:768b8bd42e33 90 pb1.setSampleFrequency();
4180_1 1:768b8bd42e33 91 pb2.setSampleFrequency();
4180_1 3:346ef671ef28 92 pb3.setSampleFrequency();
4180_1 2:58d85409f7ff 93 // pushbuttons now setup and running
4180_1 2:58d85409f7ff 94
4180_1 2:58d85409f7ff 95
4180_1 2:58d85409f7ff 96 // start I/O examples - DELETE THIS IN YOUR CODE..BUT WILL USE THESE I/O IDEAS ELSEWHERE
4180_1 2:58d85409f7ff 97 // since all this compiles - the needed *.h files for these are in the project
4180_1 2:58d85409f7ff 98 //
4180_1 2:58d85409f7ff 99 Current_temp = myTMP36;
4180_1 2:58d85409f7ff 100 printf("Hello PC World\n\r"); // need terminal application running on PC to see this
4180_1 2:58d85409f7ff 101 myLCD.printf("Hello LCD World"); // LCD
4180_1 2:58d85409f7ff 102 mySpeaker.PlayNote(500.0, 1.0, 1.0); // Speaker buzz
4180_1 2:58d85409f7ff 103 myShiftbrite.write( 0, 50 ,0); // Green RGB LED
4180_1 2:58d85409f7ff 104 // SD card write file example - prints error message on PC when running until SD card hooked up
4180_1 3:346ef671ef28 105 // Delete to avoid blinking LED run time error
4180_1 3:346ef671ef28 106 mkdir("/sd/mydir", 0777); // set up directory and permissions
4180_1 2:58d85409f7ff 107 FILE *fp = fopen("/sd/mydir/sdtest.txt", "w"); //open SD
4180_1 2:58d85409f7ff 108 if(fp == NULL) {
4180_1 2:58d85409f7ff 109 error("Could not open file for write\n");
4180_1 2:58d85409f7ff 110 }
4180_1 2:58d85409f7ff 111 fprintf(fp, "Hello SD Card World!"); // write SD
4180_1 2:58d85409f7ff 112 fclose(fp); // close SD card
4180_1 2:58d85409f7ff 113 //
4180_1 2:58d85409f7ff 114 // end I/O examples
4180_1 2:58d85409f7ff 115
4180_1 2:58d85409f7ff 116
4180_1 2:58d85409f7ff 117
4180_1 2:58d85409f7ff 118
4180_1 3:346ef671ef28 119 // State machine code below will need changes and additions
4180_1 0:cc87c48aa43c 120 while (1) {
4180_1 2:58d85409f7ff 121 {
4180_1 2:58d85409f7ff 122 enum Statetype { Heat_off = 0, Heat_on };
4180_1 2:58d85409f7ff 123 Statetype state = Heat_off;
4180_1 2:58d85409f7ff 124 while(1) {
4180_1 2:58d85409f7ff 125 switch (state) {
4180_1 2:58d85409f7ff 126 case Heat_off:
4180_1 3:346ef671ef28 127 myLED4 = 0;
4180_1 2:58d85409f7ff 128 state = Heat_on;
4180_1 2:58d85409f7ff 129 break;
4180_1 2:58d85409f7ff 130 case Heat_on:
4180_1 3:346ef671ef28 131 myLED4 = 1;
4180_1 2:58d85409f7ff 132 state = Heat_off;
4180_1 2:58d85409f7ff 133 break;
4180_1 2:58d85409f7ff 134 }
4180_1 2:58d85409f7ff 135 wait(0.33);
4180_1 3:346ef671ef28 136 // heartbeat LED - common debug tool
4180_1 3:346ef671ef28 137 // blinks as long as code is running and not locked up
4180_1 3:346ef671ef28 138 myLED1=!myLED1;
4180_1 2:58d85409f7ff 139 }
4180_1 2:58d85409f7ff 140 }
4180_1 0:cc87c48aa43c 141 }
4180_1 0:cc87c48aa43c 142 }