
Simple test program to get familiar with functionality of MBED RTOS on ST Nucleo-F411RE. Tasks for LED blinking, user button, temperature measurement with DS1620, temperature measurement with internal temperature sensor of ST32F411RE, ultrasonic distance measurement and displaying result on 16x2 TextLCD.
Dependencies: DS1620_improved TextLCD_improved mbed-rtos mbed
main.cpp@7:05f4f9d3c168, 2015-12-13 (annotated)
- Committer:
- dzoni
- Date:
- Sun Dec 13 11:12:19 2015 +0000
- Revision:
- 7:05f4f9d3c168
- Parent:
- 6:d1435e38c1b4
Release 2.0 (RTOS + rewritten to separate tasks). Remaining:; - split tasks to separate source files; - program FSM(s) tisked by RTOS timer instead of Thread::wait() in tasks
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dzoni | 0:75ede6a15252 | 1 | #include "mbed.h" |
dzoni | 5:ff77acf7d21d | 2 | #include "rtos.h" |
dzoni | 0:75ede6a15252 | 3 | #include "DS1620.h" |
dzoni | 0:75ede6a15252 | 4 | #include "TextLCD.h" |
dzoni | 0:75ede6a15252 | 5 | |
dzoni | 7:05f4f9d3c168 | 6 | static TextLCD lcd(PA_8, PA_7, PA_9, PA_1, PB_5, PA_10, TextLCD::LCD16x2); |
dzoni | 5:ff77acf7d21d | 7 | |
dzoni | 7:05f4f9d3c168 | 8 | static DS1620 ds1620Sensor(PB_4, PB_10, PB_3); |
dzoni | 0:75ede6a15252 | 9 | |
dzoni | 5:ff77acf7d21d | 10 | static uint32_t uiCnt=0; |
dzoni | 0:75ede6a15252 | 11 | |
dzoni | 7:05f4f9d3c168 | 12 | static DigitalOut led2(LED2); |
dzoni | 7:05f4f9d3c168 | 13 | static DigitalIn button1(USER_BUTTON); |
dzoni | 6:d1435e38c1b4 | 14 | |
dzoni | 6:d1435e38c1b4 | 15 | static DigitalOut trigDist(PB_9); |
dzoni | 6:d1435e38c1b4 | 16 | static DigitalIn echoDist(PA_6); |
dzoni | 6:d1435e38c1b4 | 17 | |
dzoni | 6:d1435e38c1b4 | 18 | static Timer timer; |
dzoni | 6:d1435e38c1b4 | 19 | |
dzoni | 6:d1435e38c1b4 | 20 | static struct { |
dzoni | 6:d1435e38c1b4 | 21 | uint32_t timerTicks; |
dzoni | 6:d1435e38c1b4 | 22 | float distance; |
dzoni | 6:d1435e38c1b4 | 23 | } dist_data = { 10000, 10.0f }; |
dzoni | 6:d1435e38c1b4 | 24 | |
dzoni | 7:05f4f9d3c168 | 25 | static struct { |
dzoni | 7:05f4f9d3c168 | 26 | uint32_t temp_raw; |
dzoni | 7:05f4f9d3c168 | 27 | float temperature; |
dzoni | 7:05f4f9d3c168 | 28 | } temp_data = { 0, 10.0f }; |
dzoni | 7:05f4f9d3c168 | 29 | |
dzoni | 7:05f4f9d3c168 | 30 | static struct { |
dzoni | 7:05f4f9d3c168 | 31 | uint32_t on_time; |
dzoni | 7:05f4f9d3c168 | 32 | uint32_t off_time; |
dzoni | 7:05f4f9d3c168 | 33 | } flash_times = { 100, 2500 }; |
dzoni | 7:05f4f9d3c168 | 34 | |
dzoni | 6:d1435e38c1b4 | 35 | |
dzoni | 6:d1435e38c1b4 | 36 | |
dzoni | 5:ff77acf7d21d | 37 | static void initDS1620Temp() { |
dzoni | 0:75ede6a15252 | 38 | ds1620Sensor.setSerialClockFrequency(freq500k); |
dzoni | 0:75ede6a15252 | 39 | if ((ds1620Sensor.readConfig() & 0x03) != 0x03) { |
dzoni | 0:75ede6a15252 | 40 | ds1620Sensor.writeConfig(0x03); |
dzoni | 0:75ede6a15252 | 41 | } |
dzoni | 5:ff77acf7d21d | 42 | } |
dzoni | 0:75ede6a15252 | 43 | |
dzoni | 7:05f4f9d3c168 | 44 | void led2_thread(void const *args) { |
dzoni | 7:05f4f9d3c168 | 45 | |
dzoni | 7:05f4f9d3c168 | 46 | while (true) { |
dzoni | 7:05f4f9d3c168 | 47 | led2 = 1; |
dzoni | 7:05f4f9d3c168 | 48 | Thread::wait(flash_times.on_time); |
dzoni | 7:05f4f9d3c168 | 49 | |
dzoni | 7:05f4f9d3c168 | 50 | led2 = 0; |
dzoni | 7:05f4f9d3c168 | 51 | Thread::wait(flash_times.off_time); |
dzoni | 7:05f4f9d3c168 | 52 | } |
dzoni | 7:05f4f9d3c168 | 53 | } |
dzoni | 7:05f4f9d3c168 | 54 | |
dzoni | 7:05f4f9d3c168 | 55 | void ubutton_thread(void const *args) { |
dzoni | 7:05f4f9d3c168 | 56 | static uint32_t last_state = button1; |
dzoni | 7:05f4f9d3c168 | 57 | uint32_t temp; |
dzoni | 7:05f4f9d3c168 | 58 | |
dzoni | 7:05f4f9d3c168 | 59 | while (true) { |
dzoni | 7:05f4f9d3c168 | 60 | if (button1 != last_state) { |
dzoni | 7:05f4f9d3c168 | 61 | temp = flash_times.on_time; |
dzoni | 7:05f4f9d3c168 | 62 | flash_times.on_time = flash_times.off_time; |
dzoni | 7:05f4f9d3c168 | 63 | flash_times.off_time = temp; |
dzoni | 7:05f4f9d3c168 | 64 | } |
dzoni | 7:05f4f9d3c168 | 65 | |
dzoni | 7:05f4f9d3c168 | 66 | Thread::wait(250); |
dzoni | 7:05f4f9d3c168 | 67 | } |
dzoni | 7:05f4f9d3c168 | 68 | } |
dzoni | 7:05f4f9d3c168 | 69 | |
dzoni | 7:05f4f9d3c168 | 70 | |
dzoni | 5:ff77acf7d21d | 71 | void temp_thread(void const *args) { |
dzoni | 7:05f4f9d3c168 | 72 | |
dzoni | 7:05f4f9d3c168 | 73 | while (true) { |
dzoni | 5:ff77acf7d21d | 74 | ds1620Sensor.startConversion(); |
dzoni | 0:75ede6a15252 | 75 | |
dzoni | 0:75ede6a15252 | 76 | // Wait for conversion completion (Tconv = 750 ms typ) |
dzoni | 5:ff77acf7d21d | 77 | Thread::wait(750); |
dzoni | 0:75ede6a15252 | 78 | while (!(ds1620Sensor.readConfig() & 0x80)) |
dzoni | 5:ff77acf7d21d | 79 | Thread::wait(10); |
dzoni | 5:ff77acf7d21d | 80 | |
dzoni | 7:05f4f9d3c168 | 81 | temp_data.temperature = ds1620Sensor.getHighResolutionTemperature(); |
dzoni | 7:05f4f9d3c168 | 82 | temp_data.temp_raw = ds1620Sensor.readTemperatureRaw(); |
dzoni | 5:ff77acf7d21d | 83 | } |
dzoni | 5:ff77acf7d21d | 84 | } |
dzoni | 5:ff77acf7d21d | 85 | |
dzoni | 5:ff77acf7d21d | 86 | void disp_thread(void const *args) { |
dzoni | 7:05f4f9d3c168 | 87 | |
dzoni | 7:05f4f9d3c168 | 88 | while (true) { |
dzoni | 0:75ede6a15252 | 89 | lcd.cls(); |
dzoni | 7:05f4f9d3c168 | 90 | lcd.printf("Raw:%3u % 5.0f mm", temp_data.temp_raw, dist_data.distance); |
dzoni | 5:ff77acf7d21d | 91 | uiCnt += 2; |
dzoni | 0:75ede6a15252 | 92 | lcd.locate(0, 1); |
dzoni | 7:05f4f9d3c168 | 93 | lcd.printf("Float: %3.2f%cC", temp_data.temperature, 0xdf); |
dzoni | 0:75ede6a15252 | 94 | |
dzoni | 5:ff77acf7d21d | 95 | Thread::wait(1900); |
dzoni | 0:75ede6a15252 | 96 | } |
dzoni | 0:75ede6a15252 | 97 | } |
dzoni | 5:ff77acf7d21d | 98 | |
dzoni | 6:d1435e38c1b4 | 99 | void dist_thread(void const *args) { |
dzoni | 6:d1435e38c1b4 | 100 | |
dzoni | 7:05f4f9d3c168 | 101 | while (true) { |
dzoni | 6:d1435e38c1b4 | 102 | // Dej puls na trig |
dzoni | 6:d1435e38c1b4 | 103 | trigDist = 1; |
dzoni | 6:d1435e38c1b4 | 104 | Thread::wait(1); |
dzoni | 6:d1435e38c1b4 | 105 | trigDist = 0; |
dzoni | 6:d1435e38c1b4 | 106 | |
dzoni | 6:d1435e38c1b4 | 107 | if (echoDist != 0) { |
dzoni | 6:d1435e38c1b4 | 108 | dist_data.timerTicks = 0; |
dzoni | 6:d1435e38c1b4 | 109 | dist_data.distance = 0.0f; |
dzoni | 6:d1435e38c1b4 | 110 | } else { |
dzoni | 6:d1435e38c1b4 | 111 | timer.stop(); |
dzoni | 6:d1435e38c1b4 | 112 | timer.reset(); |
dzoni | 6:d1435e38c1b4 | 113 | |
dzoni | 6:d1435e38c1b4 | 114 | // Cekej na hranu na Echo |
dzoni | 6:d1435e38c1b4 | 115 | while (echoDist != 1) |
dzoni | 6:d1435e38c1b4 | 116 | ; |
dzoni | 6:d1435e38c1b4 | 117 | |
dzoni | 6:d1435e38c1b4 | 118 | // Zacni merit cas |
dzoni | 6:d1435e38c1b4 | 119 | timer.start(); |
dzoni | 6:d1435e38c1b4 | 120 | |
dzoni | 6:d1435e38c1b4 | 121 | // Cekej na hranu na Echo |
dzoni | 6:d1435e38c1b4 | 122 | while (echoDist != 0) |
dzoni | 6:d1435e38c1b4 | 123 | ; |
dzoni | 6:d1435e38c1b4 | 124 | |
dzoni | 6:d1435e38c1b4 | 125 | // Zastav mereni |
dzoni | 6:d1435e38c1b4 | 126 | timer.stop(); |
dzoni | 6:d1435e38c1b4 | 127 | |
dzoni | 6:d1435e38c1b4 | 128 | dist_data.timerTicks = timer.read_us(); |
dzoni | 6:d1435e38c1b4 | 129 | |
dzoni | 6:d1435e38c1b4 | 130 | // 340 ms-1 |
dzoni | 6:d1435e38c1b4 | 131 | dist_data.distance = (timer.read()/2.0f - 0.0f)*340.0f*1000.0f; |
dzoni | 6:d1435e38c1b4 | 132 | } |
dzoni | 6:d1435e38c1b4 | 133 | |
dzoni | 6:d1435e38c1b4 | 134 | Thread::wait(500); |
dzoni | 6:d1435e38c1b4 | 135 | } |
dzoni | 6:d1435e38c1b4 | 136 | } |
dzoni | 6:d1435e38c1b4 | 137 | |
dzoni | 6:d1435e38c1b4 | 138 | |
dzoni | 5:ff77acf7d21d | 139 | int main() { |
dzoni | 5:ff77acf7d21d | 140 | |
dzoni | 5:ff77acf7d21d | 141 | Thread::wait(1000); |
dzoni | 5:ff77acf7d21d | 142 | |
dzoni | 5:ff77acf7d21d | 143 | initDS1620Temp(); |
dzoni | 5:ff77acf7d21d | 144 | |
dzoni | 7:05f4f9d3c168 | 145 | Thread dispThread(disp_thread, NULL, osPriorityLow); |
dzoni | 7:05f4f9d3c168 | 146 | Thread tempThread(temp_thread, NULL, osPriorityLow); |
dzoni | 7:05f4f9d3c168 | 147 | Thread distThread(dist_thread, NULL, osPriorityRealtime); |
dzoni | 7:05f4f9d3c168 | 148 | Thread led2Thread(led2_thread, NULL, osPriorityNormal); |
dzoni | 7:05f4f9d3c168 | 149 | Thread ubuttonThread(ubutton_thread, NULL, osPriorityAboveNormal); |
dzoni | 5:ff77acf7d21d | 150 | |
dzoni | 5:ff77acf7d21d | 151 | Thread::wait(osWaitForever); |
dzoni | 5:ff77acf7d21d | 152 | } |
dzoni | 0:75ede6a15252 | 153 |