Georgia Tech - ECE 4180 Project - Smart Fan / Mbed 2 deprecated Smart Fan

Dependencies:   mbed Servo mbed-rtos X_NUCLEO_53L0A1

Committer:
TSavang
Date:
Fri Apr 24 17:12:31 2020 +0000
Revision:
13:74d440e3000b
Parent:
12:dd53c18e9cf2
Child:
14:63c2b3d14d06
Updated from Test-LIDAR-Motor with Buetooth thread which has also been simplified.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
johnAlexander 0:ce8359133ae6 1 #include "mbed.h"
Davidroid 10:891e10d3b4a6 2 #include "XNucleo53L0A1.h"
spulavarty3 12:dd53c18e9cf2 3 #include "rtos.h"
spulavarty3 12:dd53c18e9cf2 4 #include "Servo.h"
johnAlexander 0:ce8359133ae6 5 #include <stdio.h>
spulavarty3 12:dd53c18e9cf2 6
TSavang 13:74d440e3000b 7 //BusOut myleds(LED4,LED3,LED2,LED1); //LEDS for debugging
TSavang 13:74d440e3000b 8
TSavang 13:74d440e3000b 9 Serial blue(p13,p14);
4180_1 11:5186cc367be0 10 Serial pc(USBTX,USBRX);
spulavarty3 12:dd53c18e9cf2 11 Servo myservo(p21);
4180_1 11:5186cc367be0 12 DigitalOut shdn(p26);
4180_1 11:5186cc367be0 13 // This VL53L0X board test application performs a range measurement in polling mode
4180_1 11:5186cc367be0 14 // Use 3.3(Vout) for Vin, p28 for SDA, p27 for SCL, P26 for shdn on mbed LPC1768
johnAlexander 0:ce8359133ae6 15
4180_1 11:5186cc367be0 16 //I2C sensor pins
4180_1 11:5186cc367be0 17 #define VL53L0_I2C_SDA p28
4180_1 11:5186cc367be0 18 #define VL53L0_I2C_SCL p27
johnAlexander 0:ce8359133ae6 19
Davidroid 10:891e10d3b4a6 20 static XNucleo53L0A1 *board=NULL;
johnAlexander 1:3483e701ec59 21
spulavarty3 12:dd53c18e9cf2 22 Thread lidar_thread;
spulavarty3 12:dd53c18e9cf2 23 Thread motor_thread;
TSavang 13:74d440e3000b 24 Thread bluetooth_thread;
spulavarty3 12:dd53c18e9cf2 25
spulavarty3 12:dd53c18e9cf2 26 uint32_t volatile distance_copy;
spulavarty3 12:dd53c18e9cf2 27 int volatile status;
spulavarty3 12:dd53c18e9cf2 28 double volatile on_speed = .1;
spulavarty3 12:dd53c18e9cf2 29
spulavarty3 12:dd53c18e9cf2 30 Mutex distance_lock;
spulavarty3 12:dd53c18e9cf2 31 Mutex status_lock;
spulavarty3 12:dd53c18e9cf2 32 Mutex speed_lock;
spulavarty3 12:dd53c18e9cf2 33
spulavarty3 12:dd53c18e9cf2 34 void check_distance()
spulavarty3 12:dd53c18e9cf2 35 {
spulavarty3 12:dd53c18e9cf2 36 uint32_t distance;
spulavarty3 12:dd53c18e9cf2 37
spulavarty3 12:dd53c18e9cf2 38 //loop taking and printing distance
spulavarty3 12:dd53c18e9cf2 39 while (1)
spulavarty3 12:dd53c18e9cf2 40 {
spulavarty3 12:dd53c18e9cf2 41 distance_lock.lock();
spulavarty3 12:dd53c18e9cf2 42 status_lock.lock();
spulavarty3 12:dd53c18e9cf2 43 status = board->sensor_centre->get_distance(&distance);
spulavarty3 12:dd53c18e9cf2 44 distance_copy = distance;
spulavarty3 12:dd53c18e9cf2 45
spulavarty3 12:dd53c18e9cf2 46 // for debugging, print distance to pc
spulavarty3 12:dd53c18e9cf2 47 if (status == VL53L0X_ERROR_NONE)
spulavarty3 12:dd53c18e9cf2 48 {
spulavarty3 12:dd53c18e9cf2 49 pc.printf("D=%ld mm\r\n", distance_copy);
spulavarty3 12:dd53c18e9cf2 50 }
spulavarty3 12:dd53c18e9cf2 51 distance_lock.unlock();
spulavarty3 12:dd53c18e9cf2 52 status_lock.unlock();
spulavarty3 12:dd53c18e9cf2 53 }
spulavarty3 12:dd53c18e9cf2 54
spulavarty3 12:dd53c18e9cf2 55 }
spulavarty3 12:dd53c18e9cf2 56
spulavarty3 12:dd53c18e9cf2 57 void fan_control()
spulavarty3 12:dd53c18e9cf2 58 {
spulavarty3 12:dd53c18e9cf2 59 while (1)
spulavarty3 12:dd53c18e9cf2 60 {
spulavarty3 12:dd53c18e9cf2 61 status_lock.lock();
spulavarty3 12:dd53c18e9cf2 62 distance_lock.lock();
spulavarty3 12:dd53c18e9cf2 63 speed_lock.lock();
spulavarty3 12:dd53c18e9cf2 64 if (status == VL53L0X_ERROR_NONE)
spulavarty3 12:dd53c18e9cf2 65 {
spulavarty3 12:dd53c18e9cf2 66 if (distance_copy <= 610) // within 2 feet (distance is in mm)
spulavarty3 12:dd53c18e9cf2 67 {
spulavarty3 12:dd53c18e9cf2 68 myservo = on_speed;
spulavarty3 12:dd53c18e9cf2 69 }
spulavarty3 12:dd53c18e9cf2 70 else
spulavarty3 12:dd53c18e9cf2 71 {
spulavarty3 12:dd53c18e9cf2 72 myservo = 0;
spulavarty3 12:dd53c18e9cf2 73 }
spulavarty3 12:dd53c18e9cf2 74
spulavarty3 12:dd53c18e9cf2 75 }
spulavarty3 12:dd53c18e9cf2 76 status_lock.unlock();
spulavarty3 12:dd53c18e9cf2 77 distance_lock.unlock();
spulavarty3 12:dd53c18e9cf2 78 speed_lock.unlock();
spulavarty3 12:dd53c18e9cf2 79
spulavarty3 12:dd53c18e9cf2 80 Thread::yield();
spulavarty3 12:dd53c18e9cf2 81 }
spulavarty3 12:dd53c18e9cf2 82 }
spulavarty3 12:dd53c18e9cf2 83
TSavang 13:74d440e3000b 84 void speed_control()
TSavang 13:74d440e3000b 85 {
TSavang 13:74d440e3000b 86 char bnum=0;
TSavang 13:74d440e3000b 87 char bhit=0;
TSavang 13:74d440e3000b 88 //myleds = 0;
TSavang 13:74d440e3000b 89 while(1) {
TSavang 13:74d440e3000b 90 if (blue.getc()=='!') {
TSavang 13:74d440e3000b 91 if (blue.getc()=='B') { //button data packet
TSavang 13:74d440e3000b 92 bnum = blue.getc(); //button number
TSavang 13:74d440e3000b 93 bhit = blue.getc(); //1=hit, 0=release
TSavang 13:74d440e3000b 94 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
TSavang 13:74d440e3000b 95 switch (bnum) {
TSavang 13:74d440e3000b 96
TSavang 13:74d440e3000b 97 case '5': //button 5 up arrow - Increase fan speed.
TSavang 13:74d440e3000b 98 if (bhit=='1')
TSavang 13:74d440e3000b 99 {
TSavang 13:74d440e3000b 100 if( on_speed < 0.95 )
TSavang 13:74d440e3000b 101 {
TSavang 13:74d440e3000b 102 speed_lock.lock();
TSavang 13:74d440e3000b 103 on_speed = on_speed + .1;
TSavang 13:74d440e3000b 104 speed_lock.unlock();
TSavang 13:74d440e3000b 105 //myleds = myleds + 1;
TSavang 13:74d440e3000b 106 }
TSavang 13:74d440e3000b 107 }
TSavang 13:74d440e3000b 108 break;
TSavang 13:74d440e3000b 109
TSavang 13:74d440e3000b 110 case '6': //button 6 down arrow - Decrease fan speed.
TSavang 13:74d440e3000b 111 if (bhit=='1') {
TSavang 13:74d440e3000b 112 if( on_speed > 0.05 )
TSavang 13:74d440e3000b 113 {
TSavang 13:74d440e3000b 114 speed_lock.lock();
TSavang 13:74d440e3000b 115 on_speed = on_speed - 0.1;
TSavang 13:74d440e3000b 116 speed_lock.unlock();
TSavang 13:74d440e3000b 117 //myleds = myleds - 1;
TSavang 13:74d440e3000b 118 }
TSavang 13:74d440e3000b 119 }
TSavang 13:74d440e3000b 120 break;
TSavang 13:74d440e3000b 121
TSavang 13:74d440e3000b 122 case '7': //button 7 left arrow - Turn fan off.
TSavang 13:74d440e3000b 123 if (bhit=='1') {
TSavang 13:74d440e3000b 124 speed_lock.lock();
TSavang 13:74d440e3000b 125 on_speed = 0;
TSavang 13:74d440e3000b 126 speed_lock.unlock();
TSavang 13:74d440e3000b 127 //myleds = 0;
TSavang 13:74d440e3000b 128 }
TSavang 13:74d440e3000b 129 break;
TSavang 13:74d440e3000b 130 }
TSavang 13:74d440e3000b 131 }
TSavang 13:74d440e3000b 132 }
TSavang 13:74d440e3000b 133 }
TSavang 13:74d440e3000b 134 }
TSavang 13:74d440e3000b 135 }
TSavang 13:74d440e3000b 136
TSavang 13:74d440e3000b 137
johnAlexander 0:ce8359133ae6 138 int main()
4180_1 11:5186cc367be0 139 {
johnAlexander 7:c8087e7333b8 140 DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
johnAlexander 7:c8087e7333b8 141 /* creates the 53L0A1 expansion board singleton obj */
Davidroid 10:891e10d3b4a6 142 board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2);
spulavarty3 12:dd53c18e9cf2 143
4180_1 11:5186cc367be0 144 shdn = 0; //must reset sensor for an mbed reset to work
spulavarty3 12:dd53c18e9cf2 145 Thread::wait(100);
4180_1 11:5186cc367be0 146 shdn = 1;
spulavarty3 12:dd53c18e9cf2 147 Thread::wait(100);
spulavarty3 12:dd53c18e9cf2 148
spulavarty3 12:dd53c18e9cf2 149 status_lock.lock();
4180_1 11:5186cc367be0 150 /* init the 53L0A1 board with default values */
johnAlexander 7:c8087e7333b8 151 status = board->init_board();
spulavarty3 12:dd53c18e9cf2 152
spulavarty3 12:dd53c18e9cf2 153 while (status)
spulavarty3 12:dd53c18e9cf2 154 {
4180_1 11:5186cc367be0 155 pc.printf("Failed to init board! \r\n");
4180_1 11:5186cc367be0 156 status = board->init_board();
spulavarty3 12:dd53c18e9cf2 157 Thread::yield();
johnAlexander 7:c8087e7333b8 158 }
spulavarty3 12:dd53c18e9cf2 159 status_lock.unlock();
spulavarty3 12:dd53c18e9cf2 160
spulavarty3 12:dd53c18e9cf2 161 myservo = 0;
spulavarty3 12:dd53c18e9cf2 162
spulavarty3 12:dd53c18e9cf2 163 lidar_thread.start(check_distance);
spulavarty3 12:dd53c18e9cf2 164 motor_thread.start(fan_control);
TSavang 13:74d440e3000b 165 bluetooth_thread.start(speed_control);
johnAlexander 0:ce8359133ae6 166 }