SEDO subject project

Dependencies:   ds3231 mbed-rtos mbed DHT

Committer:
ValenSalLop
Date:
Sat Apr 29 15:10:34 2017 +0000
Revision:
7:8065e844e99a
Parent:
6:dff022cf4d99
Child:
9:5e9c4277151d
Refactor & Wake up interruption added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ValenSalLop 0:de99871168ac 1 #include "mbed.h"
ValenSalLop 0:de99871168ac 2 #include "rtos.h"
ValenSalLop 0:de99871168ac 3 #include "ds3231.h"
ValenSalLop 5:19ccff89f555 4 #include "DHT.h"
ValenSalLop 0:de99871168ac 5
ValenSalLop 0:de99871168ac 6 #define ESC 0x1B
ValenSalLop 0:de99871168ac 7
ValenSalLop 3:158f844200a9 8 #define I2C_SDA D14
ValenSalLop 3:158f844200a9 9 #define I2C_SCL D15
ValenSalLop 7:8065e844e99a 10 #define DHT_EN_PIN D7
ValenSalLop 7:8065e844e99a 11 #define DHT_PIN D6
ValenSalLop 5:19ccff89f555 12 #define M_DIR_PIN D4
ValenSalLop 5:19ccff89f555 13 #define M_SPE_PIN D5
ValenSalLop 0:de99871168ac 14
ValenSalLop 7:8065e844e99a 15 void setupRTC();
ValenSalLop 0:de99871168ac 16 void get_user_input(char* message, uint8_t min, uint8_t max, uint32_t* member);
ValenSalLop 0:de99871168ac 17 void get_user_input(char* message, uint8_t min, uint8_t max, bool* member);
ValenSalLop 7:8065e844e99a 18 int readDHT(float* temperature, float* humidity, float* dewPoint);
ValenSalLop 7:8065e844e99a 19 int measure(time_t* ts, float* temperature, float* humidity, float* dewPoint);
ValenSalLop 7:8065e844e99a 20 int setMotor(int direction, double speed);
ValenSalLop 7:8065e844e99a 21 void wakeupFromRTC(void);
ValenSalLop 5:19ccff89f555 22
ValenSalLop 5:19ccff89f555 23 Ds3231 rtc(D14, D15);
ValenSalLop 5:19ccff89f555 24
ValenSalLop 7:8065e844e99a 25 PwmOut m_speed(D4);
ValenSalLop 7:8065e844e99a 26 DigitalOut m_direction(D5);
ValenSalLop 5:19ccff89f555 27
ValenSalLop 7:8065e844e99a 28 DHT DHTSensor(D6, DHT11);
ValenSalLop 7:8065e844e99a 29 DigitalOut DHTEnable(D7);
ValenSalLop 5:19ccff89f555 30
ValenSalLop 7:8065e844e99a 31 InterruptIn iRTC(D8);
ValenSalLop 0:de99871168ac 32
ValenSalLop 0:de99871168ac 33 int main(void)
ValenSalLop 0:de99871168ac 34 {
ValenSalLop 7:8065e844e99a 35 int measureError = 0;
ValenSalLop 7:8065e844e99a 36 float temperature = 0.0, humidity = 0.0, dewPoint = 0.0;
ValenSalLop 7:8065e844e99a 37 int motorDirection = 0;
ValenSalLop 7:8065e844e99a 38 double motorSpeed = 0.0;
ValenSalLop 7:8065e844e99a 39 char buffer[32];
ValenSalLop 7:8065e844e99a 40 time_t ts;
ValenSalLop 7:8065e844e99a 41
ValenSalLop 7:8065e844e99a 42 //setupRTC();
ValenSalLop 7:8065e844e99a 43
ValenSalLop 7:8065e844e99a 44 iRTC.rise(wakeupFromRTC);
ValenSalLop 7:8065e844e99a 45
ValenSalLop 7:8065e844e99a 46 while(true) {
ValenSalLop 7:8065e844e99a 47 //printf("%c[2J", ESC); //clear screen
ValenSalLop 7:8065e844e99a 48 sleep();
ValenSalLop 7:8065e844e99a 49 ts = rtc.get_epoch();
ValenSalLop 7:8065e844e99a 50 measureError = measure(&ts,&temperature,&humidity,&dewPoint);
ValenSalLop 7:8065e844e99a 51
ValenSalLop 7:8065e844e99a 52 if(!measureError) {
ValenSalLop 7:8065e844e99a 53 printf("\nTime as seconds since January 1, 1970 = %d\n", ts);
ValenSalLop 7:8065e844e99a 54 printf("Temperature in Celcius: %4.2f\n", temperature);
ValenSalLop 7:8065e844e99a 55 printf("Humidity is %4.2f, Dewpoint: %4.2f\n", humidity, dewPoint);
ValenSalLop 7:8065e844e99a 56 setMotor(motorDirection, motorSpeed);
ValenSalLop 7:8065e844e99a 57 }
ValenSalLop 7:8065e844e99a 58 wait(1);
ValenSalLop 7:8065e844e99a 59 }//loop
ValenSalLop 7:8065e844e99a 60 }
ValenSalLop 7:8065e844e99a 61 int measure(time_t* ts, float* temperature, float* humidity, float* dewPoint)
ValenSalLop 7:8065e844e99a 62 {
ValenSalLop 7:8065e844e99a 63 int DHTError = 0;
ValenSalLop 7:8065e844e99a 64 *ts = rtc.get_epoch();
ValenSalLop 7:8065e844e99a 65 if(*ts<=0)
ValenSalLop 7:8065e844e99a 66 return 1;
ValenSalLop 7:8065e844e99a 67 DHTError = readDHT( temperature, humidity, dewPoint);
ValenSalLop 7:8065e844e99a 68 if(DHTError) {
ValenSalLop 7:8065e844e99a 69 printf("DHTError: %d\n", DHTError);
ValenSalLop 7:8065e844e99a 70 return 2;
ValenSalLop 7:8065e844e99a 71 }
ValenSalLop 7:8065e844e99a 72 return 0;
ValenSalLop 7:8065e844e99a 73
ValenSalLop 7:8065e844e99a 74 }
ValenSalLop 7:8065e844e99a 75 int readDHT(float* temperature, float* humidity, float* dewPoint)
ValenSalLop 7:8065e844e99a 76 {
ValenSalLop 7:8065e844e99a 77 int error = 0;
ValenSalLop 7:8065e844e99a 78 DHTEnable = 1;
ValenSalLop 7:8065e844e99a 79 wait(2);
ValenSalLop 7:8065e844e99a 80 error = DHTSensor.readData();
ValenSalLop 7:8065e844e99a 81 if (0 == error) {
ValenSalLop 7:8065e844e99a 82 *temperature = DHTSensor.ReadTemperature(CELCIUS);
ValenSalLop 7:8065e844e99a 83 *humidity = DHTSensor.ReadHumidity();
ValenSalLop 7:8065e844e99a 84 *dewPoint = DHTSensor.CalcdewPoint(*temperature, *humidity);
ValenSalLop 7:8065e844e99a 85 }
ValenSalLop 7:8065e844e99a 86 DHTEnable=0;
ValenSalLop 7:8065e844e99a 87 return error;
ValenSalLop 7:8065e844e99a 88 }
ValenSalLop 7:8065e844e99a 89
ValenSalLop 7:8065e844e99a 90 int setMotor(int direction, double speed)
ValenSalLop 7:8065e844e99a 91 {
ValenSalLop 7:8065e844e99a 92 if(speed<0 or speed>255)
ValenSalLop 7:8065e844e99a 93 return 1;
ValenSalLop 7:8065e844e99a 94 else {
ValenSalLop 7:8065e844e99a 95 m_speed = speed;
ValenSalLop 7:8065e844e99a 96 if(direction)
ValenSalLop 7:8065e844e99a 97 m_direction=1;
ValenSalLop 7:8065e844e99a 98 else
ValenSalLop 7:8065e844e99a 99 m_direction=0;
ValenSalLop 7:8065e844e99a 100 }
ValenSalLop 7:8065e844e99a 101 return 0;
ValenSalLop 7:8065e844e99a 102 }
ValenSalLop 7:8065e844e99a 103
ValenSalLop 7:8065e844e99a 104 void setupRTC()
ValenSalLop 7:8065e844e99a 105 {
ValenSalLop 7:8065e844e99a 106
ValenSalLop 0:de99871168ac 107 //default, use bit masks in ds3231.h for desired operation
ValenSalLop 5:19ccff89f555 108 ds3231_cntl_stat_t rtc_control_status = {0,0};
ValenSalLop 0:de99871168ac 109 ds3231_time_t rtc_time;
ValenSalLop 0:de99871168ac 110 ds3231_calendar_t rtc_calendar;
ValenSalLop 5:19ccff89f555 111
ValenSalLop 0:de99871168ac 112 rtc.set_cntl_stat_reg(rtc_control_status);
ValenSalLop 5:19ccff89f555 113
ValenSalLop 0:de99871168ac 114 //get day from user
ValenSalLop 0:de99871168ac 115 get_user_input("\nPlease enter day of week, 1 for Sunday (1-7): ", 1,
ValenSalLop 5:19ccff89f555 116 7, &rtc_calendar.day);
ValenSalLop 0:de99871168ac 117
ValenSalLop 0:de99871168ac 118 //get day of month from user
ValenSalLop 5:19ccff89f555 119 get_user_input("\nPlease enter day of month (1-31): ", 1, 31,
ValenSalLop 5:19ccff89f555 120 &rtc_calendar.date);
ValenSalLop 0:de99871168ac 121
ValenSalLop 0:de99871168ac 122 //get month from user
ValenSalLop 5:19ccff89f555 123 get_user_input("\nPlease enter the month, 1 for January (1-12): ", 1,
ValenSalLop 5:19ccff89f555 124 12, &rtc_calendar.month);
ValenSalLop 0:de99871168ac 125
ValenSalLop 0:de99871168ac 126 //get year from user
ValenSalLop 5:19ccff89f555 127 get_user_input("\nPlease enter the year (0-99): ",0, 99,
ValenSalLop 5:19ccff89f555 128 &rtc_calendar.year);
ValenSalLop 5:19ccff89f555 129
ValenSalLop 0:de99871168ac 130 //Get time mode
ValenSalLop 5:19ccff89f555 131 get_user_input("\nWhat time mode? 1 for 12hr 0 for 24hr: ", 0, 1,
ValenSalLop 5:19ccff89f555 132 &rtc_time.mode);
ValenSalLop 5:19ccff89f555 133
ValenSalLop 5:19ccff89f555 134 if(rtc_time.mode) {
ValenSalLop 0:de99871168ac 135 //Get AM/PM status
ValenSalLop 5:19ccff89f555 136 get_user_input("\nIs it AM or PM? 0 for AM 1 for PM: ", 0, 1,
ValenSalLop 5:19ccff89f555 137 &rtc_time.am_pm);
ValenSalLop 0:de99871168ac 138 //Get hour from user
ValenSalLop 5:19ccff89f555 139 get_user_input("\nPlease enter the hour (1-12): ", 1, 12,
ValenSalLop 5:19ccff89f555 140 &rtc_time.hours);
ValenSalLop 5:19ccff89f555 141 } else {
ValenSalLop 5:19ccff89f555 142 //Get hour from user
ValenSalLop 5:19ccff89f555 143 get_user_input("\nPlease enter the hour (0-23): ", 0, 23,
ValenSalLop 0:de99871168ac 144 &rtc_time.hours);
ValenSalLop 0:de99871168ac 145 }
ValenSalLop 5:19ccff89f555 146
ValenSalLop 0:de99871168ac 147 //Get minutes from user
ValenSalLop 5:19ccff89f555 148 get_user_input("\nPlease enter the minute (0-59): ", 0, 59,
ValenSalLop 0:de99871168ac 149 &rtc_time.minutes);
ValenSalLop 5:19ccff89f555 150
ValenSalLop 5:19ccff89f555 151
ValenSalLop 0:de99871168ac 152 //Get seconds from user
ValenSalLop 5:19ccff89f555 153 get_user_input("\nPlease enter the second (0-59): ", 0, 59,
ValenSalLop 0:de99871168ac 154 &rtc_time.seconds);
ValenSalLop 5:19ccff89f555 155
ValenSalLop 5:19ccff89f555 156
ValenSalLop 5:19ccff89f555 157
ValenSalLop 0:de99871168ac 158 //Set the time, uses inverted logic for return value
ValenSalLop 5:19ccff89f555 159 if(rtc.set_time(rtc_time)) {
ValenSalLop 0:de99871168ac 160 printf("\nrtc.set_time failed!!\n");
ValenSalLop 0:de99871168ac 161 exit(0);
ValenSalLop 0:de99871168ac 162 }
ValenSalLop 5:19ccff89f555 163
ValenSalLop 0:de99871168ac 164 //Set the calendar, uses inverted logic for return value
ValenSalLop 5:19ccff89f555 165 if(rtc.set_calendar(rtc_calendar)) {
ValenSalLop 0:de99871168ac 166 printf("\nrtc.set_calendar failed!!\n");
ValenSalLop 0:de99871168ac 167 exit(0);
ValenSalLop 0:de99871168ac 168 }
ValenSalLop 5:19ccff89f555 169
ValenSalLop 5:19ccff89f555 170
ValenSalLop 0:de99871168ac 171 }
ValenSalLop 0:de99871168ac 172
ValenSalLop 0:de99871168ac 173 /**********************************************************************
ValenSalLop 5:19ccff89f555 174 * Function: get_user_input()
ValenSalLop 0:de99871168ac 175 * Parameters: message - user prompt
ValenSalLop 0:de99871168ac 176 * min - minimum value of input
ValenSalLop 0:de99871168ac 177 * max - maximum value of input
ValenSalLop 5:19ccff89f555 178 * member - pointer to struct member
ValenSalLop 0:de99871168ac 179 * Returns: none
ValenSalLop 0:de99871168ac 180 *
ValenSalLop 0:de99871168ac 181 * Description: get time/date input from user
ValenSalLop 0:de99871168ac 182 *
ValenSalLop 0:de99871168ac 183 **********************************************************************/
ValenSalLop 0:de99871168ac 184 void get_user_input(char* message, uint8_t min, uint8_t max, uint32_t* member)
ValenSalLop 0:de99871168ac 185 {
ValenSalLop 0:de99871168ac 186 uint32_t temp;
ValenSalLop 0:de99871168ac 187
ValenSalLop 5:19ccff89f555 188 do {
ValenSalLop 0:de99871168ac 189 printf("\n%s", message);
ValenSalLop 5:19ccff89f555 190
ValenSalLop 0:de99871168ac 191 //for some reason mbed doesn't like a pointer to a member in scanf
ValenSalLop 0:de99871168ac 192 //term.scanf("%d", member); works with gcc on RPi
ValenSalLop 0:de99871168ac 193 scanf("%d", &temp);
ValenSalLop 5:19ccff89f555 194
ValenSalLop 0:de99871168ac 195 *member = temp;
ValenSalLop 5:19ccff89f555 196
ValenSalLop 5:19ccff89f555 197 if((*(member)< min) || (*(member) > max)) {
ValenSalLop 0:de99871168ac 198 printf("\nERROR-RTI");
ValenSalLop 0:de99871168ac 199 }
ValenSalLop 5:19ccff89f555 200 } while((*(member) < min) || (*(member) > max));
ValenSalLop 0:de99871168ac 201 }
ValenSalLop 0:de99871168ac 202
ValenSalLop 0:de99871168ac 203
ValenSalLop 0:de99871168ac 204 void get_user_input(char* message, uint8_t min, uint8_t max, bool* member)
ValenSalLop 0:de99871168ac 205 {
ValenSalLop 0:de99871168ac 206 uint32_t temp;
ValenSalLop 0:de99871168ac 207
ValenSalLop 5:19ccff89f555 208 do {
ValenSalLop 0:de99871168ac 209 printf("\n%s", message);
ValenSalLop 5:19ccff89f555 210
ValenSalLop 0:de99871168ac 211 //for some reason mbed doesn't like a pointer to a member in scanf
ValenSalLop 0:de99871168ac 212 //term.scanf("%d", member); works with gcc on RPi
ValenSalLop 0:de99871168ac 213 scanf("%d", &temp);
ValenSalLop 5:19ccff89f555 214
ValenSalLop 0:de99871168ac 215 *member = temp;
ValenSalLop 5:19ccff89f555 216
ValenSalLop 5:19ccff89f555 217 if((*(member)< min) || (*(member) > max)) {
ValenSalLop 0:de99871168ac 218 printf("\nERROR-RTI");
ValenSalLop 0:de99871168ac 219 }
ValenSalLop 5:19ccff89f555 220 } while((*(member) < min) || (*(member) > max));
ValenSalLop 0:de99871168ac 221 }
ValenSalLop 7:8065e844e99a 222 void wakeupFromRTC(void){}
ValenSalLop 0:de99871168ac 223