#include #include #include #include #include #include #include #define VINTHUB_SERIALNUM 370437 //CHANGE THIS #define WATER_SENSOR_HUBPORT 1 #define FROM "YOUR EMAIL HERE @gmail.com" #define CURL_USERNAME "YOUR EMAIL HERE @gmail.com" #define CURL_PASSWORD "YOUR PASSWORD HERE" #define CURL_URL "smtp://smtp.gmail.com:587" //CHANGE THIS IF NOT USING GMAIL #define TO "4035555555@txt.bell.ca" #define SLEEP_TIME 1//sleep 1 second in main loop #define SENSOR_VALUE_DANGEROUS 2.5 //2.5V seems reasonable #define MINS_30 1800 //send text message every 30mins #define UNKNOWN_VALUE 0 double sensorValue = UNKNOWN_VALUE; //will store voltage from water sensor int initialMessage = 1; static const char *payload_text[] = { "Subject: Water Leak Detector\r\n", "\r\n", /* empty line to divide headers from body, see RFC5322 */ "Water leak detected!\r\n", "\r\n", NULL }; struct upload_status { int lines_read; }; static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) { struct upload_status *upload_ctx = (struct upload_status *)userp; const char *data; if ((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { return 0; } data = payload_text[upload_ctx->lines_read]; if (data) { size_t len = strlen(data); memcpy(ptr, data, len); upload_ctx->lines_read++; return len; } return 0; } int sendMessage(/*struct PhoneNumberInfo info*/void){ CURL *curl; CURLcode res = CURLE_OK; struct curl_slist *recipients = NULL; struct upload_status upload_ctx; int i = 0; upload_ctx.lines_read = 0; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, CURL_URL); curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); recipients = curl_slist_append(recipients, TO); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); curl_easy_setopt(curl, CURLOPT_USERNAME, CURL_USERNAME); curl_easy_setopt(curl, CURLOPT_PASSWORD, CURL_PASSWORD); curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); /* Send the message */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK){ PhidgetLog_log(PHIDGET_LOG_ERROR,"curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); return 1; } /* Free the list of recipients */ curl_slist_free_all(recipients); curl_easy_cleanup(curl); } return 0; } int main(void) { PhidgetVoltageInputHandle waterSensor; PhidgetReturnCode result; time_t lastTime; PhidgetLog_enable(PHIDGET_LOG_INFO, "waterleakdetector.log"); PhidgetNet_enableServerDiscovery(PHIDGETSERVER_DEVICE); char value[20]; int i; //create waterSensor Voltage Input result = PhidgetVoltageInput_create(&waterSensor); if (result != EPHIDGET_OK) { PhidgetLog_log(PHIDGET_LOG_ERROR, "failed to create voltage input object"); return 1; } result = Phidget_setDeviceSerialNumber((PhidgetHandle)waterSensor, VINTHUB_SERIALNUM); if (result != EPHIDGET_OK) { PhidgetLog_log(PHIDGET_LOG_ERROR, "failed to set device serial number"); return 1; } result = Phidget_setHubPort((PhidgetHandle)waterSensor, WATER_SENSOR_HUBPORT); if (result != EPHIDGET_OK) { PhidgetLog_log(PHIDGET_LOG_ERROR, "failed to set hub port"); return 1; } result = Phidget_setIsHubPortDevice((PhidgetHandle)waterSensor, 1); if (result != EPHIDGET_OK) { PhidgetLog_log(PHIDGET_LOG_ERROR, "failed to set is hub port device"); return 1; } result = Phidget_openWaitForAttachment((PhidgetHandle)waterSensor, 2000); if (result != EPHIDGET_OK) { PhidgetLog_log(PHIDGET_LOG_ERROR, "failed to open water channel"); return 1; } while (1) { result = PhidgetVoltageInput_getVoltage(waterSensor,&sensorValue); if (result != EPHIDGET_OK) { PhidgetLog_log(PHIDGET_LOG_ERROR, "Failed to get sensor value"); sensorValue = UNKNOWN_VALUE; } else{ snprintf(value, 20, "%f", sensorValue); PhidgetLog_log(PHIDGET_LOG_INFO, "Got sensor value: %f", sensorValue); } if (sensorValue > SENSOR_VALUE_DANGEROUS) { time_t currentTime; time(¤tTime); if(initialMessage || difftime(currentTime,lastTime) > MINS_30){ PhidgetLog_log(PHIDGET_LOG_INFO, "Dangerous water level detected, sending text message"); initialMessage = 0; time(&lastTime); sendMessage(); } } sleep(SLEEP_TIME); //sleep in seconds } return 0; }