A copy of very incomplete program for forum
Dependencies: mbed SDFileSystem
main.cpp
- Committer:
- roselea
- Date:
- 2012-03-17
- Revision:
- 1:d1c29c7b7ab3
- Parent:
- 0:bfcb5b67b1d6
File content as of revision 1:d1c29c7b7ab3:
/* * */ //////////////////////////////////////////////////////////////////// // Test code to read temperature from a Maxim DS18B20 or DS18S20 // 1-wire device //////////////////////////////////////////////////////////////////// #include <mbed.h> #include "DebugTrace.h" #include "DS18B20.h" #include "OneWireDefs.h" #include "SDFileSystem.h" DebugTrace trace(ON, TO_SERIAL); SDFileSystem *poSD; bool bSDfs_active=false; DigitalIn oSDCardPresent(p15); const int NUM_THERMS=5; // set of themometers const int SAMPLE_SIZE=5; // how many readings to average over #define ReturnAir 0 #define WasteAir 1 #define FreshAir 2 #define MixedAir 3 #define HeatedAir 4 DS18B20 oThermos[NUM_THERMS]={DS18B20(true, false, false, p16),DS18B20(true, false, false, p17),DS18B20(true, false, false, p18),DS18B20(true, false, false, p19),DS18B20(true, false, false, p20)}; float fTemps[NUM_THERMS][SAMPLE_SIZE+1]; //average and the last SAMPLE_SIZE readings int iCurrentSample; DigitalOut oPump(p23); typedef enum {Cooling,Neutral,Heating} tState; tState eState=Neutral; //main system state int iSubState=0; int iHeatingStates,iCoolingStates,iCoolingStep,iCoolingValue; float fHeatingStep,fHeatingValue; DigitalOut oLedPump(LED1); DigitalOut oLedRecirc(LED2); DigitalOut oLedByp(LED3); DigitalOut oLedFileOpen(LED4); const int NUM_SERVOS=2; #define HeatExBypass 0 #define FreshAirBypass 1 typedef struct { int iBase,iRange,iCurrent; PwmOut oOut; } tServo ; tServo oServos[NUM_SERVOS]={{0,0,0,PwmOut(p21)},{0,0,0,PwmOut(p22)}}; int BypassState; float MaxHeat,SetPoint; int TempFreq,LogFreq,ControlFreq; void read_temps(); void do_controls(); void adjust_pump(float current,float required); void log_values(time_t now); void set_servo(tServo *poServo,float fTarget); int main() { int x; time_t start,nexttemp,nextcontrol,nextlog,now; printf("Roselea Air conditioning control system\n"); FILE *fp; do { // wait for SD to be inserted hten attempt to open setting file if (oSDCardPresent==1) { printf("Waiting for SD Card\n"); while (oSDCardPresent) { //flash led while waitinf for the card oLedFileOpen=!oLedFileOpen; wait (0.5); } oLedFileOpen=0; wait (0.5); //allow poSD time to stabilse } poSD=new SDFileSystem(p11, p12, p13, p14, "poSD"); bSDfs_active=true; fp = fopen("/poSD/Settings.txt", "r"); if (fp == NULL) { printf("Could not open file for read\nPlease insert card with Settings.txt on it\n"); while (oSDCardPresent==0) { // wait for card to be removed then try again oLedFileOpen=!oLedFileOpen; wait (0.1); } delete poSD; bSDfs_active=false; } } while (fp==NULL); oLedFileOpen=1; struct tm t; fscanf(fp, "%d %d %d %d:%d:%d",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); //read the real time // convert to timestamp t.tm_mon--; t.tm_year=t.tm_year-1900; set_time(mktime(&t)); printf("Time has been set to %s\n",asctime(&t)); for (x=0; x<NUM_SERVOS; x++) { //initialise servos from file values int l,h; fscanf(fp,"%d %d",&l,&h); //read low and high values oServos[x].iBase=20000-l; oServos[x].iRange=(20000-h)-oServos[x].iBase; // calculate operation range oServos[x].oOut.period_us(20000); oServos[x].oOut.pulsewidth_us(oServos[x].iBase); printf("Servo %d has base of %d and range of %d\n",x+1,oServos[x].iBase,oServos[x].iRange); } fscanf(fp,"%d %d %d",&TempFreq,&LogFreq,&ControlFreq); printf("temp read time %d, log time %d and control time %d\n",TempFreq,LogFreq,ControlFreq); fscanf(fp,"%f",&SetPoint); printf("Temperature setpoint is %.1f \n",SetPoint); fscanf(fp,"%d %f",&iHeatingStates,&fHeatingStep); printf("There are %d heating states @ rate of %.1f\n",iHeatingStates,fHeatingStep); fscanf(fp,"%d %d",&iCoolingStates,&iCoolingStep); printf("There are %d cooling states @ rate of %d\n",iCoolingStates,iCoolingStep); fclose(fp); oLedFileOpen=0; // Initilize hardware for (x=0; x<NUM_THERMS; x++) //set up thermometers if (!oThermos[x].initialize()) printf("Thermometer %d failed to initialse\n",x); else { fTemps[x][0]=oThermos[x].readTemperature(); for (int y=1; y<=SAMPLE_SIZE; y++) fTemps[x][y]=fTemps[x][0]; //load into all entries } iCurrentSample=1; oPump=0; // Turn off the pump oLedPump=0; //Set_servo(FreshAirBypass,0); //Set_servo(HeatExBypass,0); start = time(NULL); nexttemp=start-10; //cause all actions at the start nextcontrol=start-10; nextlog=start-10; // infinite control loop ... while (1) { now=time(NULL); printf("%d\n",now); if (now>=nexttemp) { nexttemp+=TempFreq; read_temps(); } if (now>=nextcontrol) { nextcontrol+=ControlFreq; do_controls(); } if (eState>0 && fTemps[HeatedAir][0]!=fHeatingValue) adjust_pump(fTemps[HeatedAir][0],fHeatingValue); if (oSDCardPresent==1 && bSDfs_active) { //SD Card removed and SD file system is instansiated delete poSD; //deconstruct the SD File System bSDfs_active=false; printf("SD Card removed\n"); } if (oSDCardPresent==0 && !bSDfs_active) { //SD Card inserted and SD file system is void poSD=new SDFileSystem(p11, p12, p13, p14, "poSD"); //construct the SD File System bSDfs_active=true; printf("SD Card inserted\n"); } if (now>=nextlog) { nextlog+=LogFreq; log_values(now); } wait (1); //waste some time } } void read_temps() { int x; printf("conversion start\n"); for (x=0; x<NUM_THERMS; x++) fTemps[x][0]=oThermos[x].readTemperature(); printf("conversion finished\n"); } void do_controls() { } void adjust_pump(float current,float required) { if (current>required) oPump=0; else oPump=1; } void set_servo(tServo *poServo,float fTarget) { } void log_values(time_t now) { FILE *fp; int x; char sTime[25]; strftime (sTime,25,"%x %X",localtime(&now)); if (bSDfs_active) { fp=fopen("/poSD/log.csv","a"); if (fp) { oLedFileOpen=1; fprintf(fp,"%s,",sTime); //time for (x=0; x<NUM_THERMS; x++) fprintf(fp,"%.1f,",fTemps[x]); //fTemps //fprintf(fp,"%d,%.1f,",HeatingOn,HeatingSetPoint); // heating data for (x=0; x<NUM_SERVOS; x++) fprintf(fp,"%d,",oServos[x].iCurrent); //servo positions fprintf(fp,",0\r\n"); fclose(fp); oLedFileOpen=0; printf("Written - "); } else printf("Failed - "); } else printf("SD removed - "); fp=stdout; fprintf(fp,"%s,",sTime); //time for (x=0; x<NUM_THERMS; x++) fprintf(fp,"%.1f,",fTemps[x]); //fTemps //fprintf(fp,"%d,%.1f,",HeatingOn,HeatingSetPoint); // heating data for (x=0; x<NUM_SERVOS; x++) fprintf(fp,"%d,",oServos[x].iCurrent); //servo positions fprintf(fp,"0\n"); }