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

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?

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