init

Dependencies:   DS1820 PID max6675 mbed-STM32F103C8T6 mbed-rtos mbed millis

Committer:
sandrosole
Date:
Mon Oct 16 19:45:14 2017 +0000
Revision:
1:922b74c260d9
Parent:
0:d1510e5f71f1
init

Who changed what in which revision?

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