![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
wind logger
Dependencies: SDFileSystem TextLCD mbed
Fork of windmeter4receive by
main.cpp@0:36c080f46ab1, 2014-08-08 (annotated)
- Committer:
- data37
- Date:
- Fri Aug 08 08:41:02 2014 +0000
- Revision:
- 0:36c080f46ab1
- Child:
- 1:4810436d9e48
tsrp wind logger
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
data37 | 0:36c080f46ab1 | 1 | #include "mbed.h" |
data37 | 0:36c080f46ab1 | 2 | #include "TextLCD.h" |
data37 | 0:36c080f46ab1 | 3 | #include "PowerControl/PowerControl.h" |
data37 | 0:36c080f46ab1 | 4 | #include "PowerControl/EthernetPowerControl.h" |
data37 | 0:36c080f46ab1 | 5 | #include "SDFileSystem.h" |
data37 | 0:36c080f46ab1 | 6 | // wind data receiver (not SDcard logger) |
data37 | 0:36c080f46ab1 | 7 | DigitalOut myled1(LED1); |
data37 | 0:36c080f46ab1 | 8 | DigitalOut myled2(LED2); |
data37 | 0:36c080f46ab1 | 9 | DigitalOut myled3(LED3); |
data37 | 0:36c080f46ab1 | 10 | DigitalOut myled4(LED4); |
data37 | 0:36c080f46ab1 | 11 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
data37 | 0:36c080f46ab1 | 12 | TextLCD lcd(p24, p26, p27, p28, p29, p30); // rs, e, d4-d7 |
data37 | 0:36c080f46ab1 | 13 | |
data37 | 0:36c080f46ab1 | 14 | Serial pc(USBTX, USBRX); |
data37 | 0:36c080f46ab1 | 15 | Serial xbee(p13,p14); |
data37 | 0:36c080f46ab1 | 16 | |
data37 | 0:36c080f46ab1 | 17 | #define PI 3.1415926535 |
data37 | 0:36c080f46ab1 | 18 | |
data37 | 0:36c080f46ab1 | 19 | int main() { |
data37 | 0:36c080f46ab1 | 20 | PHY_PowerDown(); |
data37 | 0:36c080f46ab1 | 21 | myled1=1; |
data37 | 0:36c080f46ab1 | 22 | myled2=0; |
data37 | 0:36c080f46ab1 | 23 | myled3=0; |
data37 | 0:36c080f46ab1 | 24 | myled4=0; |
data37 | 0:36c080f46ab1 | 25 | |
data37 | 0:36c080f46ab1 | 26 | pc.baud(9600); |
data37 | 0:36c080f46ab1 | 27 | xbee.baud(9600); |
data37 | 0:36c080f46ab1 | 28 | |
data37 | 0:36c080f46ab1 | 29 | |
data37 | 0:36c080f46ab1 | 30 | //wind data value |
data37 | 0:36c080f46ab1 | 31 | char wind_data[256]; |
data37 | 0:36c080f46ab1 | 32 | float windvel_5min_ave,windvel_5sec_ave; |
data37 | 0:36c080f46ab1 | 33 | float winddeg_5sec_ave=0.0,winddeg_5min_ave=0.0; |
data37 | 0:36c080f46ab1 | 34 | char winddeg_5min_ave_c[4],winddeg_5sec_ave_c[4]; |
data37 | 0:36c080f46ab1 | 35 | //strcpy(winddeg_5sec_ave_c," "); |
data37 | 0:36c080f46ab1 | 36 | //strcpy(winddeg_5min_ave_c," "); |
data37 | 0:36c080f46ab1 | 37 | //float year,month,day; |
data37 | 0:36c080f46ab1 | 38 | //char time[8]; |
data37 | 0:36c080f46ab1 | 39 | //float pre,temp; |
data37 | 0:36c080f46ab1 | 40 | int i=0; |
data37 | 0:36c080f46ab1 | 41 | int j=0; |
data37 | 0:36c080f46ab1 | 42 | int h=0; |
data37 | 0:36c080f46ab1 | 43 | char k[2]; |
data37 | 0:36c080f46ab1 | 44 | |
data37 | 0:36c080f46ab1 | 45 | //Value |
data37 | 0:36c080f46ab1 | 46 | long dt = 1000000; //1 Hz (1000000 us, 1000 ms) |
data37 | 0:36c080f46ab1 | 47 | //float time = 0.0; |
data37 | 0:36c080f46ab1 | 48 | Timer ti; |
data37 | 0:36c080f46ab1 | 49 | long tminus = 0; |
data37 | 0:36c080f46ab1 | 50 | |
data37 | 0:36c080f46ab1 | 51 | |
data37 | 0:36c080f46ab1 | 52 | //LCD startup |
data37 | 0:36c080f46ab1 | 53 | lcd.cls(); |
data37 | 0:36c080f46ab1 | 54 | |
data37 | 0:36c080f46ab1 | 55 | lcd.locate(0,0); |
data37 | 0:36c080f46ab1 | 56 | lcd.printf("-Windmeter LCD!-"); |
data37 | 0:36c080f46ab1 | 57 | |
data37 | 0:36c080f46ab1 | 58 | lcd.locate(0,1); |
data37 | 0:36c080f46ab1 | 59 | lcd.printf("-----Ready!-----"); |
data37 | 0:36c080f46ab1 | 60 | wait(2); |
data37 | 0:36c080f46ab1 | 61 | //uint8_t buf[128]; |
data37 | 0:36c080f46ab1 | 62 | lcd.cls(); |
data37 | 0:36c080f46ab1 | 63 | lcd.locate(0,0); |
data37 | 0:36c080f46ab1 | 64 | lcd.printf("------Wait------"); |
data37 | 0:36c080f46ab1 | 65 | lcd.locate(0,1); |
data37 | 0:36c080f46ab1 | 66 | lcd.printf("----no data!----"); |
data37 | 0:36c080f46ab1 | 67 | ti.reset(); |
data37 | 0:36c080f46ab1 | 68 | |
data37 | 0:36c080f46ab1 | 69 | //wind parameter set |
data37 | 0:36c080f46ab1 | 70 | char wind_data[256]; |
data37 | 0:36c080f46ab1 | 71 | //char winddeg_c[4]; |
data37 | 0:36c080f46ab1 | 72 | char winddeg_5sec_ave_c[4],winddeg_5min_ave_c[4]; |
data37 | 0:36c080f46ab1 | 73 | float winddeg,windvel; |
data37 | 0:36c080f46ab1 | 74 | float windvel_5sec[6],windvel_5min[301]; |
data37 | 0:36c080f46ab1 | 75 | float winddeg_5sec[6],winddeg_5min[301]; |
data37 | 0:36c080f46ab1 | 76 | float windvel_5sec_ave=0.0,windvel_5min_ave=0.0; |
data37 | 0:36c080f46ab1 | 77 | float winddeg_5sec_ave=0.0,winddeg_5min_ave=0.0; |
data37 | 0:36c080f46ab1 | 78 | for(i=0; i<=5; i++){windvel_5sec[i]=0.0; winddeg_5sec[i]=0.0;} |
data37 | 0:36c080f46ab1 | 79 | for(i=0; i<=300; i++){windvel_5min[i]=0.0; winddeg_5min[i]=0.0;} |
data37 | 0:36c080f46ab1 | 80 | |
data37 | 0:36c080f46ab1 | 81 | char idir[14] = "/sd/"; |
data37 | 0:36c080f46ab1 | 82 | char time_c[7],date_c[9]; |
data37 | 0:36c080f46ab1 | 83 | |
data37 | 0:36c080f46ab1 | 84 | sprintf(date_c,"%4d%2d%2d",y_date,m_date,d_date); |
data37 | 0:36c080f46ab1 | 85 | sprintf(time_c,"%2d%2d%2d",h_time,m_time,s_time); |
data37 | 0:36c080f46ab1 | 86 | |
data37 | 0:36c080f46ab1 | 87 | char filename[15] = ""; |
data37 | 0:36c080f46ab1 | 88 | strcat(filename,date_c); |
data37 | 0:36c080f46ab1 | 89 | strcat(filename,time_c); |
data37 | 0:36c080f46ab1 | 90 | |
data37 | 0:36c080f46ab1 | 91 | char dir[100] = ""; |
data37 | 0:36c080f46ab1 | 92 | strcat(idir,date_c); |
data37 | 0:36c080f46ab1 | 93 | mkdir(idir, 0777); |
data37 | 0:36c080f46ab1 | 94 | |
data37 | 0:36c080f46ab1 | 95 | strcat(dir,idir); |
data37 | 0:36c080f46ab1 | 96 | strcat(dir,"/"); |
data37 | 0:36c080f46ab1 | 97 | strcat(dir,filename); |
data37 | 0:36c080f46ab1 | 98 | strcat(dir,".csv"); |
data37 | 0:36c080f46ab1 | 99 | |
data37 | 0:36c080f46ab1 | 100 | FILE *fp = fopen(dir, "w"); |
data37 | 0:36c080f46ab1 | 101 | if(fp == NULL) { |
data37 | 0:36c080f46ab1 | 102 | error("Could not open file for write\r\n"); |
data37 | 0:36c080f46ab1 | 103 | myled3 = 1; |
data37 | 0:36c080f46ab1 | 104 | } |
data37 | 0:36c080f46ab1 | 105 | //fprintf(fp, "Year,Month,Day,hh:mm:ss,wind_velocity[m/s],wind_velocity_5sec[m/s],wind_velocity_5min[m/s],wind_direction[deg],wind_direction_5sec[deg],wind_direction_5min[deg],Atmospheric Pressure[Pa],Temperature[degC]\n"); |
data37 | 0:36c080f46ab1 | 106 | fprintf(fp, "Year,Month,Day,hh:mm:ss,wind_velocity[m/s],wind_direction[deg],wind_velocity_5sec[m/s],wind_direction_5sec[deg],wind_velocity_5min[m/s],wind_direction_5min[deg]\n"); |
data37 | 0:36c080f46ab1 | 107 | |
data37 | 0:36c080f46ab1 | 108 | fclose(fp); |
data37 | 0:36c080f46ab1 | 109 | |
data37 | 0:36c080f46ab1 | 110 | while(1){ |
data37 | 0:36c080f46ab1 | 111 | ti.start(); |
data37 | 0:36c080f46ab1 | 112 | myled1=0; |
data37 | 0:36c080f46ab1 | 113 | i=0; |
data37 | 0:36c080f46ab1 | 114 | while(xbee.getc()!='Q'){ |
data37 | 0:36c080f46ab1 | 115 | lcd.locate(0,16); |
data37 | 0:36c080f46ab1 | 116 | lcd.printf("i"); |
data37 | 0:36c080f46ab1 | 117 | } |
data37 | 0:36c080f46ab1 | 118 | myled1 = 1; |
data37 | 0:36c080f46ab1 | 119 | i=0; |
data37 | 0:36c080f46ab1 | 120 | while( (wind_data[i]=xbee.getc()) != '\r'){ |
data37 | 0:36c080f46ab1 | 121 | i++; |
data37 | 0:36c080f46ab1 | 122 | if(i==256){ |
data37 | 0:36c080f46ab1 | 123 | //lcd.locate(0,1); |
data37 | 0:36c080f46ab1 | 124 | //lcd.printf("Data read Error"); |
data37 | 0:36c080f46ab1 | 125 | i=255; |
data37 | 0:36c080f46ab1 | 126 | break; |
data37 | 0:36c080f46ab1 | 127 | } |
data37 | 0:36c080f46ab1 | 128 | } |
data37 | 0:36c080f46ab1 | 129 | myled1 = 0; |
data37 | 0:36c080f46ab1 | 130 | wind_data[i]='\0'; |
data37 | 0:36c080f46ab1 | 131 | if(i<=256){ |
data37 | 0:36c080f46ab1 | 132 | //if( sscanf(wind_data, "WAPT,%f,%f,%c,%f",&year,&month,&day,&time,&windvel_5sec_ave,&winddeg_5sec_ave_c,&windvel_5min_ave,&winddeg_5min_ave_c,&pre,&temp) >= 1) |
data37 | 0:36c080f46ab1 | 133 | //if( sscanf(wind_data, "WAPT,%f,%f,%f,%f,%s",&windvel_5sec_ave,&winddeg_5sec_ave,&windvel_5min_ave,&winddeg_5min_ave,&k) >= 1) |
data37 | 0:36c080f46ab1 | 134 | if( sscanf(wind_data, ",%f,%f,%c,%f",&winddeg,&windvel,&ms,&check) >= 1){ |
data37 | 0:36c080f46ab1 | 135 | if( check == 0 ){ |
data37 | 0:36c080f46ab1 | 136 | windvel_5sec[j] = windvel; |
data37 | 0:36c080f46ab1 | 137 | winddeg_5sec[j] = winddeg; |
data37 | 0:36c080f46ab1 | 138 | windvel_5min[k] = windvel; |
data37 | 0:36c080f46ab1 | 139 | winddeg_5min[k] = winddeg; |
data37 | 0:36c080f46ab1 | 140 | |
data37 | 0:36c080f46ab1 | 141 | j++; |
data37 | 0:36c080f46ab1 | 142 | k++; |
data37 | 0:36c080f46ab1 | 143 | |
data37 | 0:36c080f46ab1 | 144 | if(j==5){j=1;} |
data37 | 0:36c080f46ab1 | 145 | if(k==300){k=1;} |
data37 | 0:36c080f46ab1 | 146 | |
data37 | 0:36c080f46ab1 | 147 | for(i=1; i<=5; i++){windvel_5sec_ave +=windvel_5sec[i];} |
data37 | 0:36c080f46ab1 | 148 | for(i=1; i<=5; i++){winddeg_5sec_ave +=winddeg_5sec[i];} |
data37 | 0:36c080f46ab1 | 149 | windvel_5sec_ave /= 5.0; |
data37 | 0:36c080f46ab1 | 150 | winddeg_5sec_ave /= 5.0; |
data37 | 0:36c080f46ab1 | 151 | for(i=1; i<=300; i++){windvel_5min_ave +=windvel_5min[i];} |
data37 | 0:36c080f46ab1 | 152 | for(i=1; i<=300; i++){winddeg_5min_ave +=winddeg_5min[i];} |
data37 | 0:36c080f46ab1 | 153 | windvel_5min_ave /= 300.0; |
data37 | 0:36c080f46ab1 | 154 | winddeg_5min_ave /= 300.0; |
data37 | 0:36c080f46ab1 | 155 | if(winddeg_5sec_ave>348.75 || winddeg_5sec_ave<=11.25){strcpy(winddeg_5sec_ave_c,"N ");} |
data37 | 0:36c080f46ab1 | 156 | if(winddeg_5sec_ave>11.25 && winddeg_5sec_ave<=33.75){strcpy(winddeg_5sec_ave_c,"NNE");} |
data37 | 0:36c080f46ab1 | 157 | if(winddeg_5sec_ave>33.75 && winddeg_5sec_ave<=56.25){strcpy(winddeg_5sec_ave_c,"NE ");} |
data37 | 0:36c080f46ab1 | 158 | if(winddeg_5sec_ave>56.25 && winddeg_5sec_ave<=78.75){strcpy(winddeg_5sec_ave_c,"ENE");} |
data37 | 0:36c080f46ab1 | 159 | if(winddeg_5sec_ave>78.75 && winddeg_5sec_ave<=101.25){strcpy(winddeg_5sec_ave_c,"E ");} |
data37 | 0:36c080f46ab1 | 160 | if(winddeg_5sec_ave>101.25 && winddeg_5sec_ave<=123.75){strcpy(winddeg_5sec_ave_c,"ESE");} |
data37 | 0:36c080f46ab1 | 161 | if(winddeg_5sec_ave>123.75 && winddeg_5sec_ave<=146.25){strcpy(winddeg_5sec_ave_c,"SE ");} |
data37 | 0:36c080f46ab1 | 162 | if(winddeg_5sec_ave>146.25 && winddeg_5sec_ave<=168.75){strcpy(winddeg_5sec_ave_c,"SSE");} |
data37 | 0:36c080f46ab1 | 163 | if(winddeg_5sec_ave>168.75 && winddeg_5sec_ave<=191.25){strcpy(winddeg_5sec_ave_c,"S ");} |
data37 | 0:36c080f46ab1 | 164 | if(winddeg_5sec_ave>191.25 && winddeg_5sec_ave<=213.75){strcpy(winddeg_5sec_ave_c,"SSW");} |
data37 | 0:36c080f46ab1 | 165 | if(winddeg_5sec_ave>213.75 && winddeg_5sec_ave<=236.25){strcpy(winddeg_5sec_ave_c,"SW ");} |
data37 | 0:36c080f46ab1 | 166 | if(winddeg_5sec_ave>236.25 && winddeg_5sec_ave<=258.75){strcpy(winddeg_5sec_ave_c,"WSW");} |
data37 | 0:36c080f46ab1 | 167 | if(winddeg_5sec_ave>258.75 && winddeg_5sec_ave<=281.25){strcpy(winddeg_5sec_ave_c,"W ");} |
data37 | 0:36c080f46ab1 | 168 | if(winddeg_5sec_ave>281.25 && winddeg_5sec_ave<=303.75){strcpy(winddeg_5sec_ave_c,"WNW");} |
data37 | 0:36c080f46ab1 | 169 | if(winddeg_5sec_ave>303.75 && winddeg_5sec_ave<=326.25){strcpy(winddeg_5sec_ave_c,"NW ");} |
data37 | 0:36c080f46ab1 | 170 | if(winddeg_5sec_ave>326.25 && winddeg_5sec_ave<=348.75){strcpy(winddeg_5sec_ave_c,"NNW");} |
data37 | 0:36c080f46ab1 | 171 | |
data37 | 0:36c080f46ab1 | 172 | if(winddeg_5min_ave>348.75 || winddeg_5min_ave<=11.25){strcpy(winddeg_5min_ave_c,"N ");} |
data37 | 0:36c080f46ab1 | 173 | if(winddeg_5min_ave>11.25 && winddeg_5min_ave<=33.75){strcpy(winddeg_5min_ave_c,"NNE");} |
data37 | 0:36c080f46ab1 | 174 | if(winddeg_5min_ave>33.75 && winddeg_5min_ave<=56.25){strcpy(winddeg_5min_ave_c,"NE ");} |
data37 | 0:36c080f46ab1 | 175 | if(winddeg_5min_ave>56.25 && winddeg_5min_ave<=78.75){strcpy(winddeg_5min_ave_c,"ENE");} |
data37 | 0:36c080f46ab1 | 176 | if(winddeg_5min_ave>78.75 && winddeg_5min_ave<=101.25){strcpy(winddeg_5min_ave_c,"E ");} |
data37 | 0:36c080f46ab1 | 177 | if(winddeg_5min_ave>101.25 && winddeg_5min_ave<=123.75){strcpy(winddeg_5min_ave_c,"ESE");} |
data37 | 0:36c080f46ab1 | 178 | if(winddeg_5min_ave>123.75 && winddeg_5min_ave<=146.25){strcpy(winddeg_5min_ave_c,"SE ");} |
data37 | 0:36c080f46ab1 | 179 | if(winddeg_5min_ave>146.25 && winddeg_5min_ave<=168.75){strcpy(winddeg_5min_ave_c,"SSE");} |
data37 | 0:36c080f46ab1 | 180 | if(winddeg_5min_ave>168.75 && winddeg_5min_ave<=191.25){strcpy(winddeg_5min_ave_c,"S ");} |
data37 | 0:36c080f46ab1 | 181 | if(winddeg_5min_ave>191.25 && winddeg_5min_ave<=213.75){strcpy(winddeg_5min_ave_c,"SSW");} |
data37 | 0:36c080f46ab1 | 182 | if(winddeg_5min_ave>213.75 && winddeg_5min_ave<=236.25){strcpy(winddeg_5min_ave_c,"SW ");} |
data37 | 0:36c080f46ab1 | 183 | if(winddeg_5min_ave>236.25 && winddeg_5min_ave<=258.75){strcpy(winddeg_5min_ave_c,"WSW");} |
data37 | 0:36c080f46ab1 | 184 | if(winddeg_5min_ave>258.75 && winddeg_5min_ave<=281.25){strcpy(winddeg_5min_ave_c,"W ");} |
data37 | 0:36c080f46ab1 | 185 | if(winddeg_5min_ave>281.25 && winddeg_5min_ave<=303.75){strcpy(winddeg_5min_ave_c,"WNW");} |
data37 | 0:36c080f46ab1 | 186 | if(winddeg_5min_ave>303.75 && winddeg_5min_ave<=326.25){strcpy(winddeg_5min_ave_c,"NW ");} |
data37 | 0:36c080f46ab1 | 187 | if(winddeg_5min_ave>326.25 && winddeg_5min_ave<=348.75){strcpy(winddeg_5min_ave_c,"NNW");} |
data37 | 0:36c080f46ab1 | 188 | |
data37 | 0:36c080f46ab1 | 189 | if(h>=9) {h=0;} |
data37 | 0:36c080f46ab1 | 190 | else {h++;} |
data37 | 0:36c080f46ab1 | 191 | lcd.cls(); |
data37 | 0:36c080f46ab1 | 192 | lcd.locate(0,0); |
data37 | 0:36c080f46ab1 | 193 | lcd.printf("5s:%5.2fm/s %s",windvel_5sec_ave,winddeg_5sec_ave_c); |
data37 | 0:36c080f46ab1 | 194 | lcd.locate(0,1); |
data37 | 0:36c080f46ab1 | 195 | lcd.printf("5m:%5.2fm/s %s%d",windvel_5min_ave,winddeg_5min_ave_c,h); |
data37 | 0:36c080f46ab1 | 196 | //lcd.locate(0,1); |
data37 | 0:36c080f46ab1 | 197 | //lcd.printf("%6.2f hPa %4.2f ",Press[0]/100.0,Press[1]); |
data37 | 0:36c080f46ab1 | 198 | } |
data37 | 0:36c080f46ab1 | 199 | else |
data37 | 0:36c080f46ab1 | 200 | { |
data37 | 0:36c080f46ab1 | 201 | lcd.cls(); |
data37 | 0:36c080f46ab1 | 202 | lcd.locate(0,0); |
data37 | 0:36c080f46ab1 | 203 | lcd.printf("-Windmeter LCD!-"); |
data37 | 0:36c080f46ab1 | 204 | lcd.locate(0,1); |
data37 | 0:36c080f46ab1 | 205 | lcd.printf("Data read Error"); |
data37 | 0:36c080f46ab1 | 206 | } |
data37 | 0:36c080f46ab1 | 207 | } |
data37 | 0:36c080f46ab1 | 208 | strcpy(winddeg_5sec_ave_c," "); |
data37 | 0:36c080f46ab1 | 209 | strcpy(winddeg_5min_ave_c," "); |
data37 | 0:36c080f46ab1 | 210 | for(i=0; i<=256; i++) wind_data[i] = 0; |
data37 | 0:36c080f46ab1 | 211 | } |
data37 | 0:36c080f46ab1 | 212 | |
data37 | 0:36c080f46ab1 | 213 | while(1) { |
data37 | 0:36c080f46ab1 | 214 | myled1 = 1; |
data37 | 0:36c080f46ab1 | 215 | wait(0.2); |
data37 | 0:36c080f46ab1 | 216 | myled1 = 0; |
data37 | 0:36c080f46ab1 | 217 | wait(0.2); |
data37 | 0:36c080f46ab1 | 218 | } |
data37 | 0:36c080f46ab1 | 219 | } |