SEDO subject project

Dependencies:   ds3231 mbed-rtos mbed DHT

Committer:
ValenSalLop
Date:
Mon May 15 18:30:20 2017 +0000
Revision:
12:1d544cdab2cf
Parent:
9:5e9c4277151d
final;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ValenSalLop 9:5e9c4277151d 1 /*
ValenSalLop 9:5e9c4277151d 2 * Sensing operations
ValenSalLop 9:5e9c4277151d 3 */
ValenSalLop 9:5e9c4277151d 4 #include "mbed.h"
ValenSalLop 9:5e9c4277151d 5 #include "rtos.h"
ValenSalLop 9:5e9c4277151d 6
ValenSalLop 9:5e9c4277151d 7 #include "sensor.h"
ValenSalLop 9:5e9c4277151d 8
ValenSalLop 9:5e9c4277151d 9 extern CirQueue buffer;
ValenSalLop 9:5e9c4277151d 10 extern DHT DHTSensor;
ValenSalLop 9:5e9c4277151d 11 extern DigitalOut DHTEnable;
ValenSalLop 9:5e9c4277151d 12 extern uint32_t initSensor(void const *args)
ValenSalLop 9:5e9c4277151d 13 {
ValenSalLop 9:5e9c4277151d 14
ValenSalLop 9:5e9c4277151d 15 buffer = CirQueue();
ValenSalLop 9:5e9c4277151d 16 DHTSensor = DHT(D6, DHT11);
ValenSalLop 9:5e9c4277151d 17 DHTEnable = DigitalOut(D7);
ValenSalLop 9:5e9c4277151d 18 // TODO: Establecer alarma RTC para ejecucin periodica
ValenSalLop 9:5e9c4277151d 19
ValenSalLop 9:5e9c4277151d 20 return 1;
ValenSalLop 9:5e9c4277151d 21 }
ValenSalLop 9:5e9c4277151d 22 extern void sensor_thread(void const *args)
ValenSalLop 9:5e9c4277151d 23 {
ValenSalLop 9:5e9c4277151d 24
ValenSalLop 9:5e9c4277151d 25 int DHTError = 0;
ValenSalLop 9:5e9c4277151d 26 // TODO: gestion RTC adquirir hora
ValenSalLop 9:5e9c4277151d 27 time_t ts;
ValenSalLop 9:5e9c4277151d 28 while (true) {
ValenSalLop 9:5e9c4277151d 29 DHTError = 0;
ValenSalLop 9:5e9c4277151d 30 ts = rtc.get_epoch();
ValenSalLop 9:5e9c4277151d 31 if(ts<=0)
ValenSalLop 9:5e9c4277151d 32 // TODO : No hay hora
ValenSalLop 9:5e9c4277151d 33 SensorData measures;
ValenSalLop 9:5e9c4277151d 34 DHTError = readDHT(&measures);
ValenSalLop 9:5e9c4277151d 35 if(DHTError) {
ValenSalLop 9:5e9c4277151d 36 printf("DHTError: %d\n", DHTError);
ValenSalLop 9:5e9c4277151d 37 }
ValenSalLop 9:5e9c4277151d 38 buffer.push(measures);
ValenSalLop 9:5e9c4277151d 39 // TODO: inicio periodico segun RTC
ValenSalLop 9:5e9c4277151d 40 Thread::wait(5000);
ValenSalLop 9:5e9c4277151d 41 }
ValenSalLop 9:5e9c4277151d 42 }
ValenSalLop 9:5e9c4277151d 43
ValenSalLop 9:5e9c4277151d 44 int DHTread(SensorData* measures)
ValenSalLop 9:5e9c4277151d 45 {
ValenSalLop 9:5e9c4277151d 46 int error = 0;
ValenSalLop 9:5e9c4277151d 47 DHTEnable = 1;
ValenSalLop 9:5e9c4277151d 48 wait(500);
ValenSalLop 9:5e9c4277151d 49 error = DHTSensor.readData();
ValenSalLop 9:5e9c4277151d 50 if (0 == error) {
ValenSalLop 9:5e9c4277151d 51 measures->temperature = DHTSensor.ReadTemperature(CELCIUS);
ValenSalLop 9:5e9c4277151d 52 measures->humidity = DHTSensor.ReadHumidity();
ValenSalLop 9:5e9c4277151d 53 measures->dewPoint = DHTSensor.CalcdewPoint(*temperature, *humidity);
ValenSalLop 9:5e9c4277151d 54 }
ValenSalLop 9:5e9c4277151d 55 DHTEnable=0;
ValenSalLop 9:5e9c4277151d 56 return error;
ValenSalLop 9:5e9c4277151d 57 }
ValenSalLop 9:5e9c4277151d 58
ValenSalLop 9:5e9c4277151d 59 // Circle queue implementation
ValenSalLop 9:5e9c4277151d 60 CirQueue:: CirQueue()
ValenSalLop 9:5e9c4277151d 61 {
ValenSalLop 9:5e9c4277151d 62 front = 0;
ValenSalLop 9:5e9c4277151d 63 rear = -1;
ValenSalLop 9:5e9c4277151d 64 count = 0;
ValenSalLop 9:5e9c4277151d 65 }
ValenSalLop 9:5e9c4277151d 66
ValenSalLop 9:5e9c4277151d 67 int CirQueue:: isFull()
ValenSalLop 9:5e9c4277151d 68 {
ValenSalLop 9:5e9c4277151d 69 int full=0;
ValenSalLop 9:5e9c4277151d 70
ValenSalLop 9:5e9c4277151d 71 if( count == SENSOR_QUEUE_LENGTH )
ValenSalLop 9:5e9c4277151d 72 full = 1;
ValenSalLop 9:5e9c4277151d 73
ValenSalLop 9:5e9c4277151d 74 return full;
ValenSalLop 9:5e9c4277151d 75 }
ValenSalLop 9:5e9c4277151d 76
ValenSalLop 9:5e9c4277151d 77 int CirQueue:: isEmpty()
ValenSalLop 9:5e9c4277151d 78 {
ValenSalLop 9:5e9c4277151d 79 int empty=0;
ValenSalLop 9:5e9c4277151d 80
ValenSalLop 9:5e9c4277151d 81 if( count == 0 )
ValenSalLop 9:5e9c4277151d 82 empty = 1;
ValenSalLop 9:5e9c4277151d 83
ValenSalLop 9:5e9c4277151d 84 return empty;
ValenSalLop 9:5e9c4277151d 85 }
ValenSalLop 9:5e9c4277151d 86
ValenSalLop 9:5e9c4277151d 87
ValenSalLop 9:5e9c4277151d 88 int CirQueue:: pop(SensorData *item)
ValenSalLop 9:5e9c4277151d 89 {
ValenSalLop 9:5e9c4277151d 90 if( isEmpty() ) {
ValenSalLop 9:5e9c4277151d 91 return -1;
ValenSalLop 9:5e9c4277151d 92 }
ValenSalLop 9:5e9c4277151d 93 *item = ele[front];
ValenSalLop 9:5e9c4277151d 94 front = (front+1) % SENSOR_QUEUE_LENGTH;
ValenSalLop 9:5e9c4277151d 95 count--;
ValenSalLop 9:5e9c4277151d 96 return 0;
ValenSalLop 9:5e9c4277151d 97 }
ValenSalLop 9:5e9c4277151d 98
ValenSalLop 9:5e9c4277151d 99 int CirQueue:: push(SensorData item)
ValenSalLop 9:5e9c4277151d 100 {
ValenSalLop 9:5e9c4277151d 101 int res = 0;
ValenSalLop 9:5e9c4277151d 102 if( isFull() ) {
ValenSalLop 9:5e9c4277151d 103 SensorData latest_data;
ValenSalLop 9:5e9c4277151d 104 pop(&latest_data);
ValenSalLop 9:5e9c4277151d 105 res = -1;
ValenSalLop 9:5e9c4277151d 106 }
ValenSalLop 9:5e9c4277151d 107
ValenSalLop 9:5e9c4277151d 108 rear= (rear+1) % SENSOR_QUEUE_LENGTH;
ValenSalLop 9:5e9c4277151d 109
ValenSalLop 9:5e9c4277151d 110 ele[rear] = item;
ValenSalLop 9:5e9c4277151d 111 count++;
ValenSalLop 9:5e9c4277151d 112
ValenSalLop 9:5e9c4277151d 113 return res;
ValenSalLop 9:5e9c4277151d 114 }