init
Dependencies: DS1820 PID max6675 mbed-STM32F103C8T6 mbed-rtos mbed millis
main.cpp@1:922b74c260d9, 2017-10-16 (annotated)
- Committer:
- sandrosole
- Date:
- Mon Oct 16 19:45:14 2017 +0000
- Revision:
- 1:922b74c260d9
- Parent:
- 0:d1510e5f71f1
init
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sandrosole | 0:d1510e5f71f1 | 1 | #include "mbed.h" |
sandrosole | 0:d1510e5f71f1 | 2 | #include "rtos.h" |
sandrosole | 0:d1510e5f71f1 | 3 | |
sandrosole | 0:d1510e5f71f1 | 4 | //---- |
sandrosole | 0:d1510e5f71f1 | 5 | |
sandrosole | 0:d1510e5f71f1 | 6 | #include "millis.h" |
sandrosole | 0:d1510e5f71f1 | 7 | |
sandrosole | 0:d1510e5f71f1 | 8 | //---- |
sandrosole | 0:d1510e5f71f1 | 9 | #include "DS1820.h" |
sandrosole | 0:d1510e5f71f1 | 10 | |
sandrosole | 0:d1510e5f71f1 | 11 | //--- Thread |
sandrosole | 0:d1510e5f71f1 | 12 | Thread tTempCtrl; |
sandrosole | 0:d1510e5f71f1 | 13 | Thread tMainCtrl; |
sandrosole | 0:d1510e5f71f1 | 14 | |
sandrosole | 0:d1510e5f71f1 | 15 | //--- Function |
sandrosole | 0:d1510e5f71f1 | 16 | void TempController(); |
sandrosole | 0:d1510e5f71f1 | 17 | void MainController(); |
sandrosole | 0:d1510e5f71f1 | 18 | |
sandrosole | 0:d1510e5f71f1 | 19 | //--- |
sandrosole | 0:d1510e5f71f1 | 20 | #define TEMP 1 |
sandrosole | 0:d1510e5f71f1 | 21 | #define LICHT 2 |
sandrosole | 0:d1510e5f71f1 | 22 | |
sandrosole | 0:d1510e5f71f1 | 23 | typedef struct checkedUnion { |
sandrosole | 0:d1510e5f71f1 | 24 | int type; |
sandrosole | 0:d1510e5f71f1 | 25 | union sensor_u { |
sandrosole | 0:d1510e5f71f1 | 26 | float temperature; |
sandrosole | 0:d1510e5f71f1 | 27 | float licht; |
sandrosole | 0:d1510e5f71f1 | 28 | } sensor; |
sandrosole | 0:d1510e5f71f1 | 29 | |
sandrosole | 0:d1510e5f71f1 | 30 | uint32_t counter; /* A counter value */ |
sandrosole | 0:d1510e5f71f1 | 31 | } message_t; |
sandrosole | 0:d1510e5f71f1 | 32 | |
sandrosole | 0:d1510e5f71f1 | 33 | //--- |
sandrosole | 0:d1510e5f71f1 | 34 | Serial serial(USBTX, USBRX); |
sandrosole | 0:d1510e5f71f1 | 35 | DS1820 ds1820(PA_9); |
sandrosole | 0:d1510e5f71f1 | 36 | |
sandrosole | 0:d1510e5f71f1 | 37 | //--- |
sandrosole | 0:d1510e5f71f1 | 38 | MemoryPool<message_t, 8> mpool; |
sandrosole | 0:d1510e5f71f1 | 39 | Queue<message_t, 8> queue; |
sandrosole | 0:d1510e5f71f1 | 40 | |
sandrosole | 0:d1510e5f71f1 | 41 | //--- |
sandrosole | 0:d1510e5f71f1 | 42 | int main() |
sandrosole | 0:d1510e5f71f1 | 43 | { |
sandrosole | 0:d1510e5f71f1 | 44 | serial.baud(19200); |
sandrosole | 0:d1510e5f71f1 | 45 | |
sandrosole | 0:d1510e5f71f1 | 46 | tTempCtrl.start(TempController); |
sandrosole | 0:d1510e5f71f1 | 47 | tMainCtrl.start(MainController); |
sandrosole | 0:d1510e5f71f1 | 48 | |
sandrosole | 0:d1510e5f71f1 | 49 | Thread::wait(osWaitForever); |
sandrosole | 0:d1510e5f71f1 | 50 | } |
sandrosole | 0:d1510e5f71f1 | 51 | |
sandrosole | 0:d1510e5f71f1 | 52 | void MainController() |
sandrosole | 0:d1510e5f71f1 | 53 | { |
sandrosole | 0:d1510e5f71f1 | 54 | float temperature; |
sandrosole | 0:d1510e5f71f1 | 55 | float licht; |
sandrosole | 0:d1510e5f71f1 | 56 | |
sandrosole | 0:d1510e5f71f1 | 57 | while (true) { |
sandrosole | 0:d1510e5f71f1 | 58 | osEvent evt = queue.get(); |
sandrosole | 0:d1510e5f71f1 | 59 | if (evt.status == osEventMessage) { |
sandrosole | 0:d1510e5f71f1 | 60 | message_t *message = (message_t*)evt.value.p; |
sandrosole | 0:d1510e5f71f1 | 61 | switch ( message->type ) { |
sandrosole | 0:d1510e5f71f1 | 62 | case TEMP: |
sandrosole | 0:d1510e5f71f1 | 63 | printf("\Temperature: %.2f C\n\r", message->sensor.temperature); |
sandrosole | 0:d1510e5f71f1 | 64 | temperature = message->sensor.temperature; |
sandrosole | 0:d1510e5f71f1 | 65 | break; |
sandrosole | 0:d1510e5f71f1 | 66 | case LICHT: |
sandrosole | 0:d1510e5f71f1 | 67 | printf("\Licht: %.2f C\n\r", message->sensor.licht); |
sandrosole | 0:d1510e5f71f1 | 68 | licht = message->sensor.temperature; |
sandrosole | 0:d1510e5f71f1 | 69 | break; |
sandrosole | 0:d1510e5f71f1 | 70 | } |
sandrosole | 0:d1510e5f71f1 | 71 | printf("Number of cycles: %u\n\r", message->counter); |
sandrosole | 0:d1510e5f71f1 | 72 | |
sandrosole | 0:d1510e5f71f1 | 73 | mpool.free(message); |
sandrosole | 0:d1510e5f71f1 | 74 | } |
sandrosole | 0:d1510e5f71f1 | 75 | |
sandrosole | 0:d1510e5f71f1 | 76 | Thread::wait(1); |
sandrosole | 0:d1510e5f71f1 | 77 | } |
sandrosole | 0:d1510e5f71f1 | 78 | } |
sandrosole | 0:d1510e5f71f1 | 79 | |
sandrosole | 0:d1510e5f71f1 | 80 | void TempController() |
sandrosole | 0:d1510e5f71f1 | 81 | { |
sandrosole | 0:d1510e5f71f1 | 82 | uint32_t i = 0; |
sandrosole | 0:d1510e5f71f1 | 83 | |
sandrosole | 0:d1510e5f71f1 | 84 | while (true) { |
sandrosole | 0:d1510e5f71f1 | 85 | if(ds1820.begin()) { |
sandrosole | 0:d1510e5f71f1 | 86 | ds1820.startConversion(); |
sandrosole | 0:d1510e5f71f1 | 87 | Thread::wait(500); |
sandrosole | 0:d1510e5f71f1 | 88 | while(true) { |
sandrosole | 0:d1510e5f71f1 | 89 | // read temperature |
sandrosole | 0:d1510e5f71f1 | 90 | serial.printf("temp = %3.1f\r\n", ds1820.read()); |
sandrosole | 0:d1510e5f71f1 | 91 | ds1820.startConversion(); // start temperature conversion |
sandrosole | 0:d1510e5f71f1 | 92 | |
sandrosole | 0:d1510e5f71f1 | 93 | i++; // fake data update |
sandrosole | 0:d1510e5f71f1 | 94 | message_t *message = mpool.alloc(); |
sandrosole | 0:d1510e5f71f1 | 95 | message->type = TEMP; |
sandrosole | 0:d1510e5f71f1 | 96 | message->sensor.temperature = ds1820.read(); |
sandrosole | 0:d1510e5f71f1 | 97 | message->counter = i; |
sandrosole | 0:d1510e5f71f1 | 98 | |
sandrosole | 0:d1510e5f71f1 | 99 | queue.put(message); |
sandrosole | 0:d1510e5f71f1 | 100 | |
sandrosole | 0:d1510e5f71f1 | 101 | Thread::wait(250); // let DS1820 complete the temperature conversion |
sandrosole | 0:d1510e5f71f1 | 102 | } |
sandrosole | 0:d1510e5f71f1 | 103 | } else |
sandrosole | 0:d1510e5f71f1 | 104 | serial.printf("No DS1820 sensor found!\r\n"); |
sandrosole | 0:d1510e5f71f1 | 105 | |
sandrosole | 0:d1510e5f71f1 | 106 | Thread::wait(1000); |
sandrosole | 0:d1510e5f71f1 | 107 | } |
sandrosole | 0:d1510e5f71f1 | 108 | } |