204 lines
6.5 KiB
C
204 lines
6.5 KiB
C
/*
|
|
* th.c capture Temperature and Humidity readings, write them to sql database
|
|
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
|
|
|
rev 1.0 12/01/2013 WPNS built from Gordon Hendersen's rht03.c
|
|
rev 1.1 12/01/2013 WPNS don't retry, takes too long
|
|
rev 1.2 12/01/2013 WPNS allow one retry after 3-second delay
|
|
rev 1.3 12/01/2013 WPNS make cycle time variable
|
|
rev 1.4 12/01/2013 WPNS add mysql stuff in
|
|
rev 1.5 12/01/2013 WPNS do 60 second cycle, cleanup, trial run
|
|
rev 1.6 12/01/2013 WPNS clean up output format
|
|
rev 1.7 12/02/2013 WPNS allow more retries, minor cleanups
|
|
rev 1.79 12/04/2013 WPNS release to instructables
|
|
rev 1.8 01/06/2015 JDE updated code to try and drop anomolous temperature humidity readings before hitting the database
|
|
rev 1.9 04/06/2015 JDE updated to try and read MySQL configuration from /etc/th.conf file rather than hard coding it
|
|
rev 1.10 11/06/2015 JDE updated to remove echoing the config options to the th.log file
|
|
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <wiringPi.h>
|
|
#include <maxdetect.h>
|
|
#include <time.h>
|
|
|
|
#include <libconfig.h>
|
|
|
|
#include <mysql/mysql.h>
|
|
|
|
#define RHT03_PIN 7
|
|
#define CYCLETIME 60
|
|
#define RETRIES 3
|
|
|
|
void finish_with_error(MYSQL *con)
|
|
{
|
|
fprintf(stderr, "%s\n", mysql_error(con));
|
|
mysql_close(con);
|
|
exit(1);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
config_t cfg; /*Returns all parameters in this structure */
|
|
config_setting_t *setting;
|
|
const char *str1, *sqlServer, *databaseName, *username, *password;
|
|
|
|
char *config_file_name = "/etc/th.conf";
|
|
|
|
int temp, rh, oldtemp, difftemp ; // temperature and relative humidity readings
|
|
int loop; // how many times through the loop?
|
|
time_t oldtime,newtime; // when did we last take a reading?
|
|
|
|
char SQLstring[64]; // string to send to SQL engine
|
|
char TimeString[64]; // formatted time
|
|
time_t rawtime;
|
|
struct tm * timeinfo;
|
|
|
|
int status; // how did the read go?
|
|
|
|
/*Initialization */
|
|
config_init(&cfg);
|
|
|
|
/* Read the file. If there is an error, report it and exit. */
|
|
if (!config_read_file(&cfg, config_file_name))
|
|
{
|
|
printf("\n%s:%d - %s", config_error_file(&cfg), config_error_line(&cfg), config_error_text(&cfg));
|
|
config_destroy(&cfg);
|
|
return -1;
|
|
}
|
|
|
|
/* Get the configuration file name. */
|
|
if (config_lookup_string(&cfg, "filename", &str1))
|
|
printf("\nFile Type: %s", str1);
|
|
else
|
|
printf("\nNo 'filename' setting in configuration file.");
|
|
|
|
/*Read the parameter group*/
|
|
setting = config_lookup(&cfg, "params");
|
|
if (setting != NULL)
|
|
{
|
|
/*Read the server*/
|
|
if (config_setting_lookup_string(setting, "sqlServer", &sqlServer));
|
|
else
|
|
printf("\nERROR: No 'sqlServer' setting in configuration file.");
|
|
|
|
/*Read the database*/
|
|
if (config_setting_lookup_string(setting, "databaseName", &databaseName));
|
|
else
|
|
printf("\nERROR: No 'databaseName' setting in configuration file.");
|
|
|
|
/*Read the username*/
|
|
if (config_setting_lookup_string(setting, "username", &username));
|
|
else
|
|
printf("\nERROR: No 'username' setting in configuration file.");
|
|
|
|
/*Read the password*/
|
|
if (config_setting_lookup_string(setting, "password", &password));
|
|
else
|
|
printf("\nERROR: No 'password' setting in configuration file.");
|
|
|
|
printf("\n");
|
|
}
|
|
|
|
/* config_destroy(&cfg); */
|
|
|
|
/*MYSQL *con = mysql_init(NULL);
|
|
if (con == NULL) finish_with_error(con);
|
|
if (mysql_real_connect(con, sqlServer, username, password, databaseName, 0, NULL, 0) == NULL) finish_with_error(con);
|
|
sprintf(SQLstring,"SELECT ComputerTime, Temperature, Humidity FROM TempHumid ORDER BY id DESC LIMIT 1");
|
|
if (mysql_query(con, SQLstring)) finish_with_error(con);
|
|
MYSQL_RES *result = mysql_store_result(con);
|
|
if (result == NULL)
|
|
{
|
|
finish_with_error(con);
|
|
}
|
|
|
|
int num_fields = mysql_num_fields(result);
|
|
MYSQL_ROW row;
|
|
|
|
row = mysql_fetch_row(result);
|
|
for(int i = 0; i < num_fields; i++)
|
|
{
|
|
printf("%s ", row[i] ? row[i] : "NULL");
|
|
}
|
|
printf("\n"); */
|
|
|
|
/* THIS IS WHERE THE Temperautre humidity monitoring Code starts - really untidy and needs tidying up */
|
|
|
|
temp = rh = loop = 0 ;
|
|
oldtime = (int)time(NULL);
|
|
|
|
wiringPiSetup () ;
|
|
piHiPri (55) ;
|
|
|
|
printf("th.c rev 1.10 11/06/2015 JDE %sCycle time: %i seconds, %i retries\n",ctime(&oldtime),CYCLETIME,RETRIES);
|
|
fflush(stdout);
|
|
|
|
MYSQL *con = mysql_init(NULL);
|
|
|
|
if (con == NULL) finish_with_error(con);
|
|
|
|
if (mysql_real_connect(con, sqlServer, username, password, databaseName, 0, NULL, 0) == NULL) finish_with_error(con);
|
|
|
|
// wait for an interval to start and end
|
|
printf("Sync to cycletime...");
|
|
fflush(stdout);
|
|
while ((((int)time(NULL))%CYCLETIME)) delay(100);
|
|
oldtime = (int)time(NULL);
|
|
oldtemp = 500;
|
|
while (!(((int)time(NULL))%CYCLETIME)) delay(100);
|
|
printf("\n");
|
|
fflush(stdout);
|
|
|
|
for (;;)
|
|
{
|
|
// wait for an interval to start
|
|
while ((((int)time(NULL))%CYCLETIME)) delay(100);
|
|
|
|
/*****************************************************************/
|
|
|
|
// read new data
|
|
temp = rh = -1;
|
|
loop=RETRIES;
|
|
|
|
status = readRHT03 (RHT03_PIN, &temp, &rh);
|
|
while ((!status) && loop--)
|
|
{
|
|
printf("-Retry-");
|
|
fflush(stdout);
|
|
delay(3000);
|
|
status = readRHT03 (RHT03_PIN, &temp, &rh);
|
|
}
|
|
|
|
newtime = (int)time(NULL);
|
|
// deltime = newtime-oldtime;
|
|
time(&rawtime);
|
|
timeinfo = localtime (&rawtime);
|
|
strftime (TimeString,64,"%F %T",timeinfo);
|
|
|
|
fflush(stdout);
|
|
oldtime = newtime;
|
|
difftemp = temp - oldtemp;
|
|
|
|
printf("Current Temp: %5.1f, Previous Temp: %5.1f, Temperature Difference: %5.1fC\n",(temp / 10.0),(oldtemp / 10.0),(difftemp / 10.0)) ;
|
|
if (temp > oldtemp && difftemp > 100) {
|
|
printf("Damn ... the sensor returned a bad reading!\n");
|
|
}
|
|
else {
|
|
sprintf(SQLstring,"INSERT INTO TempHumid VALUES(unix_timestamp(now()),%5.1f,%5.1f,NULL)",(temp / 10.0),(rh / 10.0));
|
|
if (mysql_query(con, SQLstring)) finish_with_error(con);
|
|
oldtemp = temp;
|
|
}
|
|
|
|
/*****************************************************************/
|
|
|
|
// wait for the rest of that interval to finish
|
|
while (!(((int)time(NULL))%CYCLETIME)) delay(100);
|
|
}
|
|
|
|
return 0 ;
|
|
|
|
config_destroy(&cfg);
|
|
}
|