2036 project
Dependencies: 4DGL-uLCD-SE EthernetInterface NTPClient SDFileSystem mbed-rtos mbed wave_player
Fork of 2036lab7_template by
main.cpp@1:a5f43fb83aca, 2018-10-25 (annotated)
- Committer:
- baaosen
- Date:
- Thu Oct 25 14:46:07 2018 +0000
- Revision:
- 1:a5f43fb83aca
- Parent:
- 0:df4d7c0a1594
ECE 2036 project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
4180_1 | 0:df4d7c0a1594 | 1 | #include "mbed.h" |
4180_1 | 0:df4d7c0a1594 | 2 | // Need include below to add the RTOS |
4180_1 | 0:df4d7c0a1594 | 3 | #include "rtos.h" |
baaosen | 1:a5f43fb83aca | 4 | #include "EthernetInterface.h" //needed for Extra Credit |
baaosen | 1:a5f43fb83aca | 5 | #include "NTPClient.h" |
4180_1 | 0:df4d7c0a1594 | 6 | #include "SDFileSystem.h" |
4180_1 | 0:df4d7c0a1594 | 7 | #include "uLCD_4DGL.h" |
4180_1 | 0:df4d7c0a1594 | 8 | #include "TMP36.h" |
4180_1 | 0:df4d7c0a1594 | 9 | #include "wave_player.h" |
baaosen | 1:a5f43fb83aca | 10 | #include "RGB.h" |
baaosen | 1:a5f43fb83aca | 11 | #include "time.h" |
4180_1 | 0:df4d7c0a1594 | 12 | // Setup four builtin leds for use by threads |
4180_1 | 0:df4d7c0a1594 | 13 | DigitalOut led1(LED1); |
4180_1 | 0:df4d7c0a1594 | 14 | DigitalOut led2(LED2); |
4180_1 | 0:df4d7c0a1594 | 15 | DigitalOut led3(LED3); |
4180_1 | 0:df4d7c0a1594 | 16 | DigitalOut led4(LED4); |
4180_1 | 0:df4d7c0a1594 | 17 | |
4180_1 | 0:df4d7c0a1594 | 18 | AnalogOut DACout(p18); // used to play sound on speaker |
4180_1 | 0:df4d7c0a1594 | 19 | |
4180_1 | 0:df4d7c0a1594 | 20 | //wave player plays a *.wav file to D/A and a PWM |
4180_1 | 0:df4d7c0a1594 | 21 | wave_player waver(&DACout); |
4180_1 | 0:df4d7c0a1594 | 22 | |
baaosen | 1:a5f43fb83aca | 23 | uLCD_4DGL uLCD(p9, p10, p11); // serial tx, serial rx, reset pin; |
baaosen | 1:a5f43fb83aca | 24 | Mutex lcd_mutex; |
4180_1 | 0:df4d7c0a1594 | 25 | |
4180_1 | 0:df4d7c0a1594 | 26 | SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card setup |
baaosen | 1:a5f43fb83aca | 27 | RGBLed myled(p24, p23, p22); |
baaosen | 1:a5f43fb83aca | 28 | inline float random_number() |
baaosen | 1:a5f43fb83aca | 29 | { |
baaosen | 1:a5f43fb83aca | 30 | return (rand()/(float(RAND_MAX))); |
baaosen | 1:a5f43fb83aca | 31 | } |
4180_1 | 0:df4d7c0a1594 | 32 | |
4180_1 | 0:df4d7c0a1594 | 33 | // Setup function code for three new threads to run. |
4180_1 | 0:df4d7c0a1594 | 34 | // Put in a while loop so that threads run forever. |
4180_1 | 0:df4d7c0a1594 | 35 | // Thread::wait will force at least a "x" millisecond |
4180_1 | 0:df4d7c0a1594 | 36 | // wait before the thread runs again. During this delay |
4180_1 | 0:df4d7c0a1594 | 37 | // the other threads will run |
4180_1 | 0:df4d7c0a1594 | 38 | // DO NOT use wait() with the RTOS!!!!! |
4180_1 | 0:df4d7c0a1594 | 39 | // wait just burns processor time and no other threads run |
4180_1 | 0:df4d7c0a1594 | 40 | void led2_thread(void const *argument) |
4180_1 | 0:df4d7c0a1594 | 41 | { |
4180_1 | 0:df4d7c0a1594 | 42 | led2 = 1; |
4180_1 | 0:df4d7c0a1594 | 43 | while (true) { |
baaosen | 1:a5f43fb83aca | 44 | // set up a timer to be used for sample rate interrupts |
baaosen | 1:a5f43fb83aca | 45 | myled.write(random_number(),0.0,0.0); |
baaosen | 1:a5f43fb83aca | 46 | wait(0.5); |
baaosen | 1:a5f43fb83aca | 47 | myled.write(0.0,0.0,1.0-random_number()); |
4180_1 | 0:df4d7c0a1594 | 48 | led2 = !led2; |
4180_1 | 0:df4d7c0a1594 | 49 | Thread::wait(2000); |
4180_1 | 0:df4d7c0a1594 | 50 | } |
4180_1 | 0:df4d7c0a1594 | 51 | } |
4180_1 | 0:df4d7c0a1594 | 52 | void led3_thread(void const *argument) |
4180_1 | 0:df4d7c0a1594 | 53 | { |
4180_1 | 0:df4d7c0a1594 | 54 | led3 = 1; |
4180_1 | 0:df4d7c0a1594 | 55 | while (true) { |
baaosen | 1:a5f43fb83aca | 56 | // precompute 128 sample points on one sine wave cycle |
baaosen | 1:a5f43fb83aca | 57 | // used for continuous sine wave output later |
baaosen | 1:a5f43fb83aca | 58 | FILE *p=fopen("/sd/fire.wav","r");; |
baaosen | 1:a5f43fb83aca | 59 | waver.play(p); |
baaosen | 1:a5f43fb83aca | 60 | fclose(p); |
4180_1 | 0:df4d7c0a1594 | 61 | led3 = !led3; |
4180_1 | 0:df4d7c0a1594 | 62 | Thread::wait(4000); |
4180_1 | 0:df4d7c0a1594 | 63 | } |
4180_1 | 0:df4d7c0a1594 | 64 | } |
4180_1 | 0:df4d7c0a1594 | 65 | void led4_thread(void const *argument) |
4180_1 | 0:df4d7c0a1594 | 66 | { |
baaosen | 1:a5f43fb83aca | 67 | TMP36 myTMP36(p15); |
4180_1 | 0:df4d7c0a1594 | 68 | led4 = 1; |
4180_1 | 0:df4d7c0a1594 | 69 | while (true) { |
baaosen | 1:a5f43fb83aca | 70 | float tempC = myTMP36.read(); |
baaosen | 1:a5f43fb83aca | 71 | //convert to degrees F |
baaosen | 1:a5f43fb83aca | 72 | float tempF = (9.0*tempC)/5.0 + 32.0; |
baaosen | 1:a5f43fb83aca | 73 | //print current temp |
baaosen | 1:a5f43fb83aca | 74 | lcd_mutex.lock(); |
baaosen | 1:a5f43fb83aca | 75 | uLCD.locate(1,4); |
baaosen | 1:a5f43fb83aca | 76 | uLCD.printf("%5.2F C %5.2F F \n\r", tempC, tempF); |
baaosen | 1:a5f43fb83aca | 77 | lcd_mutex.unlock(); |
4180_1 | 0:df4d7c0a1594 | 78 | led4 = !led4; |
4180_1 | 0:df4d7c0a1594 | 79 | Thread::wait(8000); |
4180_1 | 0:df4d7c0a1594 | 80 | } |
4180_1 | 0:df4d7c0a1594 | 81 | } |
4180_1 | 0:df4d7c0a1594 | 82 | |
4180_1 | 0:df4d7c0a1594 | 83 | int main() |
4180_1 | 0:df4d7c0a1594 | 84 | { |
4180_1 | 0:df4d7c0a1594 | 85 | led1 = 1; |
4180_1 | 0:df4d7c0a1594 | 86 | // code to set time in extra credit option goes here |
baaosen | 1:a5f43fb83aca | 87 | { |
baaosen | 1:a5f43fb83aca | 88 | EthernetInterface eth; |
baaosen | 1:a5f43fb83aca | 89 | NTPClient ntp; |
baaosen | 1:a5f43fb83aca | 90 | eth.init(); //Use DHCP |
baaosen | 1:a5f43fb83aca | 91 | wait(2); |
baaosen | 1:a5f43fb83aca | 92 | uLCD.cls(); |
baaosen | 1:a5f43fb83aca | 93 | uLCD.printf("\nGetting IP Address\r\n"); |
baaosen | 1:a5f43fb83aca | 94 | if(eth.connect(60000)!=0) { |
baaosen | 1:a5f43fb83aca | 95 | uLCD.printf("DHCP error - No IP\n"); |
baaosen | 1:a5f43fb83aca | 96 | set_time(1360000000); //starts RTC |
baaosen | 1:a5f43fb83aca | 97 | wait(10); |
baaosen | 1:a5f43fb83aca | 98 | } |
baaosen | 1:a5f43fb83aca | 99 | else { |
baaosen | 1:a5f43fb83aca | 100 | uLCD.printf("IP is %s\n", eth.getIPAddress()); |
baaosen | 1:a5f43fb83aca | 101 | wait(2); |
baaosen | 1:a5f43fb83aca | 102 | } |
baaosen | 1:a5f43fb83aca | 103 | uLCD.printf("\nTrying to update time via NTP...\r\n"); |
baaosen | 1:a5f43fb83aca | 104 | if (ntp.setTime("0.pool.ntp.org") == 0) |
baaosen | 1:a5f43fb83aca | 105 | { |
baaosen | 1:a5f43fb83aca | 106 | ntp.setTime("0.pool.ntp.org"); |
baaosen | 1:a5f43fb83aca | 107 | uLCD.printf("Set time successfully\r\n"); |
baaosen | 1:a5f43fb83aca | 108 | } |
baaosen | 1:a5f43fb83aca | 109 | wait(2); |
baaosen | 1:a5f43fb83aca | 110 | uLCD.cls(); |
baaosen | 1:a5f43fb83aca | 111 | } |
4180_1 | 0:df4d7c0a1594 | 112 | uLCD.baudrate(3000000); //jack up baud rate to max for fast display |
4180_1 | 0:df4d7c0a1594 | 113 | uLCD.text_width(2); //2x size text |
4180_1 | 0:df4d7c0a1594 | 114 | uLCD.text_height(2); |
4180_1 | 0:df4d7c0a1594 | 115 | // Create 3 new thread objects thread1, thread2, and thread3 |
4180_1 | 0:df4d7c0a1594 | 116 | // The RTOS will immediately start running them |
4180_1 | 0:df4d7c0a1594 | 117 | Thread thread1(led2_thread); |
4180_1 | 0:df4d7c0a1594 | 118 | Thread thread2(led3_thread); |
4180_1 | 0:df4d7c0a1594 | 119 | Thread thread3(led4_thread); |
4180_1 | 0:df4d7c0a1594 | 120 | // Main continues to run and is actually the first thread. |
4180_1 | 0:df4d7c0a1594 | 121 | // So a total of four threads are running now. |
4180_1 | 0:df4d7c0a1594 | 122 | // Each thread blinks an LED, but at a different rate |
4180_1 | 0:df4d7c0a1594 | 123 | // because of the different values used in Thread::wait(). |
4180_1 | 0:df4d7c0a1594 | 124 | // |
4180_1 | 0:df4d7c0a1594 | 125 | // Set time in seconds since Jan 1 1970 (Unix style) |
4180_1 | 0:df4d7c0a1594 | 126 | // must set time to start Real Time clock running |
4180_1 | 0:df4d7c0a1594 | 127 | char buffer[12]; |
4180_1 | 0:df4d7c0a1594 | 128 | time_t seconds; |
baaosen | 1:a5f43fb83aca | 129 | while (1) { |
4180_1 | 0:df4d7c0a1594 | 130 | // reads time structure |
4180_1 | 0:df4d7c0a1594 | 131 | seconds = time(NULL); |
4180_1 | 0:df4d7c0a1594 | 132 | // converts time structure to a string |
4180_1 | 0:df4d7c0a1594 | 133 | strftime(buffer, 12, "%T", localtime(&seconds)); |
4180_1 | 0:df4d7c0a1594 | 134 | // print time HH:MM:SS |
baaosen | 1:a5f43fb83aca | 135 | lcd_mutex.lock(); |
4180_1 | 0:df4d7c0a1594 | 136 | uLCD.locate(0,2); |
4180_1 | 0:df4d7c0a1594 | 137 | uLCD.printf("%s\n\r", buffer); |
baaosen | 1:a5f43fb83aca | 138 | lcd_mutex.unlock(); |
4180_1 | 0:df4d7c0a1594 | 139 | Thread::wait(1000); |
4180_1 | 0:df4d7c0a1594 | 140 | } |
4180_1 | 0:df4d7c0a1594 | 141 | } |