mbed/ARM 活用事例 第3章 SDカードを使ってファイルを操作するプログラムを作る
Dependencies: EthernetNetIf NTPClient_NetServices TextLCD mbed ConfigFile SDFileSystem
main.cpp@0:3f9b3f85f89b, 2011-10-04 (annotated)
- Committer:
- sunifu
- Date:
- Tue Oct 04 13:04:02 2011 +0000
- Revision:
- 0:3f9b3f85f89b
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sunifu | 0:3f9b3f85f89b | 1 | #include "mbed.h" |
sunifu | 0:3f9b3f85f89b | 2 | #include "TextLCD.h" |
sunifu | 0:3f9b3f85f89b | 3 | #include "SDFileSystem.h" |
sunifu | 0:3f9b3f85f89b | 4 | #include "ConfigFile.h" |
sunifu | 0:3f9b3f85f89b | 5 | #include "NTPClient.h" |
sunifu | 0:3f9b3f85f89b | 6 | #include "EthernetNetIf.h" |
sunifu | 0:3f9b3f85f89b | 7 | |
sunifu | 0:3f9b3f85f89b | 8 | TextLCD lcd(p24, p26, p27, p28, p29, p30); |
sunifu | 0:3f9b3f85f89b | 9 | SDFileSystem sd(p5, p6, p7, p8, "sd1") ; |
sunifu | 0:3f9b3f85f89b | 10 | LocalFileSystem local("local"); |
sunifu | 0:3f9b3f85f89b | 11 | |
sunifu | 0:3f9b3f85f89b | 12 | ConfigFile cfg; |
sunifu | 0:3f9b3f85f89b | 13 | AnalogIn temp_in(p20); |
sunifu | 0:3f9b3f85f89b | 14 | AnalogIn humid_in(p19); |
sunifu | 0:3f9b3f85f89b | 15 | |
sunifu | 0:3f9b3f85f89b | 16 | Ticker in, write; |
sunifu | 0:3f9b3f85f89b | 17 | |
sunifu | 0:3f9b3f85f89b | 18 | char strTimeMsg[16]; |
sunifu | 0:3f9b3f85f89b | 19 | |
sunifu | 0:3f9b3f85f89b | 20 | float r_temp, r_humid; |
sunifu | 0:3f9b3f85f89b | 21 | NTPClient ntp; |
sunifu | 0:3f9b3f85f89b | 22 | |
sunifu | 0:3f9b3f85f89b | 23 | void dataWriting() { |
sunifu | 0:3f9b3f85f89b | 24 | FILE *fp; |
sunifu | 0:3f9b3f85f89b | 25 | // |
sunifu | 0:3f9b3f85f89b | 26 | lcd.cls(); |
sunifu | 0:3f9b3f85f89b | 27 | if ( (fp = fopen("/sd1/env.txt","a")) == NULL ) { |
sunifu | 0:3f9b3f85f89b | 28 | lcd.printf("Open Failed. \n") ; |
sunifu | 0:3f9b3f85f89b | 29 | exit(0); |
sunifu | 0:3f9b3f85f89b | 30 | } |
sunifu | 0:3f9b3f85f89b | 31 | printf("%s,%6.2f,%6.2f\r\n",strTimeMsg,r_temp, r_humid); |
sunifu | 0:3f9b3f85f89b | 32 | fprintf(fp,"%s,%5.3f,%5.3f\r\n",strTimeMsg,r_temp, r_humid); |
sunifu | 0:3f9b3f85f89b | 33 | fclose(fp); |
sunifu | 0:3f9b3f85f89b | 34 | } |
sunifu | 0:3f9b3f85f89b | 35 | |
sunifu | 0:3f9b3f85f89b | 36 | void UpdateLCD(){ |
sunifu | 0:3f9b3f85f89b | 37 | |
sunifu | 0:3f9b3f85f89b | 38 | float temp,humid; |
sunifu | 0:3f9b3f85f89b | 39 | time_t ctTime; |
sunifu | 0:3f9b3f85f89b | 40 | |
sunifu | 0:3f9b3f85f89b | 41 | temp = temp_in; |
sunifu | 0:3f9b3f85f89b | 42 | humid = humid_in; |
sunifu | 0:3f9b3f85f89b | 43 | |
sunifu | 0:3f9b3f85f89b | 44 | // r_temp = temp * 3.3 * 100 ; // ---- (1) |
sunifu | 0:3f9b3f85f89b | 45 | r_temp = temp * 55.0 ; // ---- (2) |
sunifu | 0:3f9b3f85f89b | 46 | r_humid = humid * 3.3 * 100 ; |
sunifu | 0:3f9b3f85f89b | 47 | |
sunifu | 0:3f9b3f85f89b | 48 | lcd.cls(); |
sunifu | 0:3f9b3f85f89b | 49 | lcd.locate(1,1); |
sunifu | 0:3f9b3f85f89b | 50 | lcd.printf("%5.1f",r_temp); |
sunifu | 0:3f9b3f85f89b | 51 | lcd.locate(6,1); |
sunifu | 0:3f9b3f85f89b | 52 | lcd.putc(0xDf); |
sunifu | 0:3f9b3f85f89b | 53 | lcd.putc(0x43); |
sunifu | 0:3f9b3f85f89b | 54 | |
sunifu | 0:3f9b3f85f89b | 55 | lcd.locate(9,1); |
sunifu | 0:3f9b3f85f89b | 56 | lcd.printf("%5.1f%%",r_humid); |
sunifu | 0:3f9b3f85f89b | 57 | |
sunifu | 0:3f9b3f85f89b | 58 | ctTime = time(NULL)+32400; |
sunifu | 0:3f9b3f85f89b | 59 | strftime(strTimeMsg,16,"%y/%m/%d %H:%M",localtime(&ctTime)); |
sunifu | 0:3f9b3f85f89b | 60 | |
sunifu | 0:3f9b3f85f89b | 61 | lcd.locate(0,0); |
sunifu | 0:3f9b3f85f89b | 62 | lcd.printf("%s",strTimeMsg); |
sunifu | 0:3f9b3f85f89b | 63 | } |
sunifu | 0:3f9b3f85f89b | 64 | |
sunifu | 0:3f9b3f85f89b | 65 | /* ----- Set RTC by ConfigFile -----*/ |
sunifu | 0:3f9b3f85f89b | 66 | void setRTC_ConfFile() |
sunifu | 0:3f9b3f85f89b | 67 | { |
sunifu | 0:3f9b3f85f89b | 68 | char *strData = "DATE"; |
sunifu | 0:3f9b3f85f89b | 69 | char dvalue[16]; |
sunifu | 0:3f9b3f85f89b | 70 | char *strTime = "TIME"; |
sunifu | 0:3f9b3f85f89b | 71 | char tvalue[16]; |
sunifu | 0:3f9b3f85f89b | 72 | int year, month; |
sunifu | 0:3f9b3f85f89b | 73 | struct tm ltime; |
sunifu | 0:3f9b3f85f89b | 74 | |
sunifu | 0:3f9b3f85f89b | 75 | if (!cfg.read("/local/datetime.cfg")) { |
sunifu | 0:3f9b3f85f89b | 76 | printf("Failure to read a configuration file.\n"); |
sunifu | 0:3f9b3f85f89b | 77 | } |
sunifu | 0:3f9b3f85f89b | 78 | |
sunifu | 0:3f9b3f85f89b | 79 | /* |
sunifu | 0:3f9b3f85f89b | 80 | * Get a configuration value. |
sunifu | 0:3f9b3f85f89b | 81 | */ |
sunifu | 0:3f9b3f85f89b | 82 | if (cfg.getValue(strData, &dvalue[0], sizeof(dvalue))) { |
sunifu | 0:3f9b3f85f89b | 83 | |
sunifu | 0:3f9b3f85f89b | 84 | } |
sunifu | 0:3f9b3f85f89b | 85 | if (cfg.getValue(strTime, &tvalue[0], sizeof(tvalue))) { |
sunifu | 0:3f9b3f85f89b | 86 | |
sunifu | 0:3f9b3f85f89b | 87 | } |
sunifu | 0:3f9b3f85f89b | 88 | sscanf(dvalue,"%d/%d/%d",&year,&month,<ime.tm_mday); |
sunifu | 0:3f9b3f85f89b | 89 | sscanf(tvalue,"%d:%d",<ime.tm_hour,<ime.tm_min); |
sunifu | 0:3f9b3f85f89b | 90 | |
sunifu | 0:3f9b3f85f89b | 91 | ltime.tm_year = year - 1900; |
sunifu | 0:3f9b3f85f89b | 92 | ltime.tm_mon = month -1 ; |
sunifu | 0:3f9b3f85f89b | 93 | ltime.tm_sec = 0; |
sunifu | 0:3f9b3f85f89b | 94 | |
sunifu | 0:3f9b3f85f89b | 95 | set_time(mktime(<ime)-32400) ; |
sunifu | 0:3f9b3f85f89b | 96 | printf("[able to read a datetime.cfg]\r\n"); |
sunifu | 0:3f9b3f85f89b | 97 | } |
sunifu | 0:3f9b3f85f89b | 98 | |
sunifu | 0:3f9b3f85f89b | 99 | |
sunifu | 0:3f9b3f85f89b | 100 | |
sunifu | 0:3f9b3f85f89b | 101 | /* ----- Set RTC by NTP ----- */ |
sunifu | 0:3f9b3f85f89b | 102 | void setRTC_NTP() |
sunifu | 0:3f9b3f85f89b | 103 | { |
sunifu | 0:3f9b3f85f89b | 104 | char strNtpErrMsg[32] ; |
sunifu | 0:3f9b3f85f89b | 105 | EthernetErr ethErr; |
sunifu | 0:3f9b3f85f89b | 106 | EthernetNetIf eth; |
sunifu | 0:3f9b3f85f89b | 107 | |
sunifu | 0:3f9b3f85f89b | 108 | /* static ip |
sunifu | 0:3f9b3f85f89b | 109 | EthernetNetIf eth( // (2) -- static IP address |
sunifu | 0:3f9b3f85f89b | 110 | IpAddr(192,168,0,20), // IP Address |
sunifu | 0:3f9b3f85f89b | 111 | IpAddr(255,255,255,0), // Subnet Mask |
sunifu | 0:3f9b3f85f89b | 112 | IpAddr(192,168,0,1), // Default Gateway |
sunifu | 0:3f9b3f85f89b | 113 | IpAddr(192,168,0,1) // DNS Server |
sunifu | 0:3f9b3f85f89b | 114 | ) ; |
sunifu | 0:3f9b3f85f89b | 115 | */ |
sunifu | 0:3f9b3f85f89b | 116 | |
sunifu | 0:3f9b3f85f89b | 117 | |
sunifu | 0:3f9b3f85f89b | 118 | lcd.cls(); |
sunifu | 0:3f9b3f85f89b | 119 | lcd.locate(0,0); |
sunifu | 0:3f9b3f85f89b | 120 | lcd.printf("Please wait..."); |
sunifu | 0:3f9b3f85f89b | 121 | |
sunifu | 0:3f9b3f85f89b | 122 | ethErr = eth.setup() ; |
sunifu | 0:3f9b3f85f89b | 123 | |
sunifu | 0:3f9b3f85f89b | 124 | if( ethErr != ETH_OK ) |
sunifu | 0:3f9b3f85f89b | 125 | { |
sunifu | 0:3f9b3f85f89b | 126 | printf("Error %d in setup.\r\n", ethErr); |
sunifu | 0:3f9b3f85f89b | 127 | lcd.locate(0,1); |
sunifu | 0:3f9b3f85f89b | 128 | lcd.printf("NW Setup Error."); |
sunifu | 0:3f9b3f85f89b | 129 | } |
sunifu | 0:3f9b3f85f89b | 130 | |
sunifu | 0:3f9b3f85f89b | 131 | |
sunifu | 0:3f9b3f85f89b | 132 | Host ntpsrv(IpAddr(), 123, "ntp.nict.jp") ; |
sunifu | 0:3f9b3f85f89b | 133 | //Host ntpsrv(IpAddr(), 123, "192.244.80.200"); |
sunifu | 0:3f9b3f85f89b | 134 | NTPResult ntpResult = ntp.setTime(ntpsrv) ; |
sunifu | 0:3f9b3f85f89b | 135 | |
sunifu | 0:3f9b3f85f89b | 136 | if( ntpResult == NTP_OK ){ |
sunifu | 0:3f9b3f85f89b | 137 | sprintf(strNtpErrMsg,"NTP Connect OK!"); |
sunifu | 0:3f9b3f85f89b | 138 | }else if ( ntpResult == NTP_PRTCL ){ |
sunifu | 0:3f9b3f85f89b | 139 | sprintf(strNtpErrMsg,"NTP Protocol error.") ; |
sunifu | 0:3f9b3f85f89b | 140 | }else if ( ntpResult == NTP_TIMEOUT ){ |
sunifu | 0:3f9b3f85f89b | 141 | sprintf(strNtpErrMsg,"Connection timeout."); |
sunifu | 0:3f9b3f85f89b | 142 | }else if ( ntpResult == NTP_DNS ){ |
sunifu | 0:3f9b3f85f89b | 143 | sprintf(strNtpErrMsg,"Could not resolve DNS hostname.") ; |
sunifu | 0:3f9b3f85f89b | 144 | }else if ( ntpResult == NTP_PROCESSING ){ |
sunifu | 0:3f9b3f85f89b | 145 | sprintf(strNtpErrMsg,"Processing."); |
sunifu | 0:3f9b3f85f89b | 146 | }else{ |
sunifu | 0:3f9b3f85f89b | 147 | sprintf(strNtpErrMsg,"NTP Error."); |
sunifu | 0:3f9b3f85f89b | 148 | } |
sunifu | 0:3f9b3f85f89b | 149 | printf("[%s]\r\n",strNtpErrMsg); |
sunifu | 0:3f9b3f85f89b | 150 | } |
sunifu | 0:3f9b3f85f89b | 151 | |
sunifu | 0:3f9b3f85f89b | 152 | |
sunifu | 0:3f9b3f85f89b | 153 | int main() { |
sunifu | 0:3f9b3f85f89b | 154 | |
sunifu | 0:3f9b3f85f89b | 155 | // set RTC by ConfigFile |
sunifu | 0:3f9b3f85f89b | 156 | //setRTC_ConfFile() ; |
sunifu | 0:3f9b3f85f89b | 157 | |
sunifu | 0:3f9b3f85f89b | 158 | // set RTC by NTP |
sunifu | 0:3f9b3f85f89b | 159 | setRTC_NTP(); |
sunifu | 0:3f9b3f85f89b | 160 | |
sunifu | 0:3f9b3f85f89b | 161 | lcd.cls(); |
sunifu | 0:3f9b3f85f89b | 162 | lcd.locate(0,0); |
sunifu | 0:3f9b3f85f89b | 163 | lcd.printf("Please wait..."); |
sunifu | 0:3f9b3f85f89b | 164 | |
sunifu | 0:3f9b3f85f89b | 165 | in.attach(&UpdateLCD,10); |
sunifu | 0:3f9b3f85f89b | 166 | write.attach(&dataWriting,300); |
sunifu | 0:3f9b3f85f89b | 167 | |
sunifu | 0:3f9b3f85f89b | 168 | while(1){ |
sunifu | 0:3f9b3f85f89b | 169 | } |
sunifu | 0:3f9b3f85f89b | 170 | } |