2036 project

Dependencies:   4DGL-uLCD-SE EthernetInterface NTPClient SDFileSystem mbed-rtos mbed wave_player

Fork of 2036lab7_template by jim hamblen

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?

UserRevisionLine numberNew 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 }