tenki yoho LED (with ESP-WROOM-02)

Dependencies:   mbed

Committer:
kohacraft
Date:
Wed May 04 02:58:14 2016 +0000
Revision:
4:1c1fb59cf7d9
Parent:
3:5689bfb78c7b
yahoo API ????????; ????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kohacraft 0:26fecc2ddabd 1 #include "mbed.h"
kohacraft 0:26fecc2ddabd 2 #include <string.h>
kohacraft 0:26fecc2ddabd 3
kohacraft 0:26fecc2ddabd 4 Serial wifi(dp16, dp15); // ESP-WROOM-02 tx, rx
kohacraft 0:26fecc2ddabd 5 DigitalOut wifiRst(dp17); // /ESP-WROOM-02 RESET
kohacraft 0:26fecc2ddabd 6 DigitalIn lightSensor(dp4); //loom light sensor(CdS:GL5528 conect to dp4 and GND)
kohacraft 0:26fecc2ddabd 7
kohacraft 0:26fecc2ddabd 8 PwmOut red(dp1); //dp1を赤のLEDのPWM出力にします
kohacraft 0:26fecc2ddabd 9 PwmOut green(dp2); //dp2を緑のLEDのPWM出力にします
kohacraft 0:26fecc2ddabd 10 PwmOut blue(dp18); //dp18を青のLEDのPWM出力にします
kohacraft 0:26fecc2ddabd 11
kohacraft 0:26fecc2ddabd 12 #define baudrate 115200
kohacraft 0:26fecc2ddabd 13
kohacraft 4:1c1fb59cf7d9 14 static char rxbuff[1500]; //取得する文字列
kohacraft 0:26fecc2ddabd 15 int buffAdr = 0;
kohacraft 0:26fecc2ddabd 16
kohacraft 2:5686f264238a 17 const char SSID[] = "your ssid"; //アクセスポイントのSSID
kohacraft 0:26fecc2ddabd 18 const char PASS[] = "password"; //アクセスポイントのパスワード
kohacraft 4:1c1fb59cf7d9 19 const char WOEID[] = "28413961"; //天気を調べる場所 http://woeid.rosselliot.co.nz/ で郵便番号で検索して得られる番号
kohacraft 0:26fecc2ddabd 20
kohacraft 0:26fecc2ddabd 21 //データを受信する
kohacraft 0:26fecc2ddabd 22 bool recvData()
kohacraft 0:26fecc2ddabd 23 {
kohacraft 0:26fecc2ddabd 24 bool ret = false;
kohacraft 0:26fecc2ddabd 25 buffAdr = 0;
kohacraft 0:26fecc2ddabd 26 for( int i =0 ; i< sizeof( rxbuff ) ; i++ )
kohacraft 0:26fecc2ddabd 27 rxbuff[i] = '\0';
kohacraft 0:26fecc2ddabd 28
kohacraft 0:26fecc2ddabd 29 int headerCount = 0;
kohacraft 0:26fecc2ddabd 30
kohacraft 0:26fecc2ddabd 31 //1000000回ループしたらタイムアウトする
kohacraft 0:26fecc2ddabd 32 for( int i = 0; i < 1000000 ; i++ )
kohacraft 0:26fecc2ddabd 33 {
kohacraft 0:26fecc2ddabd 34 if( wifi.readable() != 0 )
kohacraft 0:26fecc2ddabd 35 {
kohacraft 0:26fecc2ddabd 36 rxbuff[buffAdr++] = wifi.getc(); //Serial.getc()
kohacraft 0:26fecc2ddabd 37 headerCount++;
kohacraft 4:1c1fb59cf7d9 38 if( headerCount <= 1500 ) //最初の2400文字捨てる
kohacraft 0:26fecc2ddabd 39 buffAdr=0;
kohacraft 0:26fecc2ddabd 40 if( buffAdr >= sizeof(rxbuff)-1 ) //バッファ溢れしたら終了
kohacraft 0:26fecc2ddabd 41 {
kohacraft 0:26fecc2ddabd 42 ret = true;
kohacraft 0:26fecc2ddabd 43 i=1000000; //loopを早く終わらすために
kohacraft 0:26fecc2ddabd 44 break;
kohacraft 0:26fecc2ddabd 45 }
kohacraft 0:26fecc2ddabd 46
kohacraft 0:26fecc2ddabd 47 }
kohacraft 0:26fecc2ddabd 48 }
kohacraft 0:26fecc2ddabd 49
kohacraft 0:26fecc2ddabd 50 //文字列の最後を終端
kohacraft 0:26fecc2ddabd 51 rxbuff[sizeof(rxbuff)-1] = '\0';
kohacraft 0:26fecc2ddabd 52 return ret;
kohacraft 0:26fecc2ddabd 53 }
kohacraft 0:26fecc2ddabd 54
kohacraft 0:26fecc2ddabd 55 //文字列から予報天気を抽出
kohacraft 0:26fecc2ddabd 56 bool getWeather( char* str , int* weatherCord , int* tempLow , int* tempHi )
kohacraft 0:26fecc2ddabd 57 {
kohacraft 0:26fecc2ddabd 58 //文字列探索
kohacraft 0:26fecc2ddabd 59 char *forecast;
kohacraft 0:26fecc2ddabd 60 if ( (forecast = strstr(str, "yweather:forecast") ) == NULL )
kohacraft 0:26fecc2ddabd 61 {
kohacraft 0:26fecc2ddabd 62 //取得できず
kohacraft 0:26fecc2ddabd 63 weatherCord = 0;
kohacraft 0:26fecc2ddabd 64 tempLow = 0;
kohacraft 0:26fecc2ddabd 65 tempLow = 0;
kohacraft 0:26fecc2ddabd 66 return false;
kohacraft 0:26fecc2ddabd 67 }
kohacraft 0:26fecc2ddabd 68
kohacraft 4:1c1fb59cf7d9 69 //天気コードを抽出
kohacraft 4:1c1fb59cf7d9 70 char *codeStart,*codeEnd;
kohacraft 4:1c1fb59cf7d9 71 //int weatherCord;
kohacraft 4:1c1fb59cf7d9 72 codeStart = strstr(forecast, "code=");
kohacraft 4:1c1fb59cf7d9 73 codeStart = strchr( codeStart , '\"' );
kohacraft 4:1c1fb59cf7d9 74 codeStart++; //"の次の文字のポインタ
kohacraft 4:1c1fb59cf7d9 75 codeEnd = strchr( codeStart , '\"' );
kohacraft 4:1c1fb59cf7d9 76 *codeEnd = '\0';
kohacraft 4:1c1fb59cf7d9 77 *weatherCord = atoi( codeStart ); //最高気温を数字に変換
kohacraft 4:1c1fb59cf7d9 78
kohacraft 4:1c1fb59cf7d9 79 //最高気温を抽出
kohacraft 4:1c1fb59cf7d9 80 char *hiStart,*hiEnd;
kohacraft 4:1c1fb59cf7d9 81 //int tempHi;
kohacraft 4:1c1fb59cf7d9 82 hiStart = strstr(codeEnd+1, "high=");
kohacraft 4:1c1fb59cf7d9 83 hiStart = strchr( hiStart , '\"' );
kohacraft 4:1c1fb59cf7d9 84 hiStart++; //"の次の文字のポインタ
kohacraft 4:1c1fb59cf7d9 85 hiEnd = strchr( hiStart , '\"' );
kohacraft 4:1c1fb59cf7d9 86 *hiEnd = '\0';
kohacraft 4:1c1fb59cf7d9 87 *tempHi = atoi( hiStart ); //最高気温を数字に変換
kohacraft 4:1c1fb59cf7d9 88
kohacraft 0:26fecc2ddabd 89 //最低気温を抽出
kohacraft 0:26fecc2ddabd 90 char *lowStart,*lowEnd;
kohacraft 0:26fecc2ddabd 91 //int tempLow;
kohacraft 4:1c1fb59cf7d9 92 lowStart = strstr(hiEnd+1, "low=");
kohacraft 0:26fecc2ddabd 93 lowStart = strchr( lowStart , '\"' );
kohacraft 0:26fecc2ddabd 94 lowStart++; //"の次の文字のポインタ
kohacraft 0:26fecc2ddabd 95 lowEnd = strchr( lowStart , '\"' );
kohacraft 0:26fecc2ddabd 96 *lowEnd = '\0';
kohacraft 0:26fecc2ddabd 97 *tempLow = atoi( lowStart ); //最低気温を数字に変換
kohacraft 0:26fecc2ddabd 98
kohacraft 0:26fecc2ddabd 99 //天気を抽出
kohacraft 0:26fecc2ddabd 100 char *textStart,*textEnd;
kohacraft 0:26fecc2ddabd 101 char weatherText[32];
kohacraft 4:1c1fb59cf7d9 102 textStart = strstr(lowEnd+1, "text=");
kohacraft 0:26fecc2ddabd 103 textStart = strchr( textStart , '\"' );
kohacraft 0:26fecc2ddabd 104 textStart++; //"の次の文字のポインタ
kohacraft 0:26fecc2ddabd 105 textEnd = strchr( textStart , '\"' );
kohacraft 0:26fecc2ddabd 106 *textEnd = '\0';
kohacraft 0:26fecc2ddabd 107 strncpy( weatherText, textStart , 32);
kohacraft 0:26fecc2ddabd 108
kohacraft 0:26fecc2ddabd 109 return true;
kohacraft 0:26fecc2ddabd 110 }
kohacraft 0:26fecc2ddabd 111
kohacraft 0:26fecc2ddabd 112
kohacraft 0:26fecc2ddabd 113 int main() {
kohacraft 0:26fecc2ddabd 114
kohacraft 0:26fecc2ddabd 115 //LEDのPWM周期
kohacraft 0:26fecc2ddabd 116 red.period(5);
kohacraft 0:26fecc2ddabd 117 green.period(5);
kohacraft 0:26fecc2ddabd 118 blue.period(5);
kohacraft 0:26fecc2ddabd 119
kohacraft 0:26fecc2ddabd 120 lightSensor.mode(PullUp); //室内の明るさセンサをプルアップする
kohacraft 0:26fecc2ddabd 121 wifi.baud(baudrate); //ビットレートを設定
kohacraft 0:26fecc2ddabd 122
kohacraft 0:26fecc2ddabd 123 while(1)
kohacraft 0:26fecc2ddabd 124 {
kohacraft 0:26fecc2ddabd 125 //無線LANモジュールをリセット
kohacraft 0:26fecc2ddabd 126 wifiRst = 1;
kohacraft 0:26fecc2ddabd 127 wifiRst = 0;
kohacraft 0:26fecc2ddabd 128 wifiRst = 1;
kohacraft 0:26fecc2ddabd 129
kohacraft 0:26fecc2ddabd 130 //無線LANモジュールが安定するのを待つ
kohacraft 0:26fecc2ddabd 131 for( int i=0 ; i<10 ; i++ )
kohacraft 0:26fecc2ddabd 132 {
kohacraft 0:26fecc2ddabd 133 red = 0.9; green = 1.0; blue = 0.0;
kohacraft 0:26fecc2ddabd 134 wait( 0.5 );
kohacraft 0:26fecc2ddabd 135 red = 0.0; green = 0.0; blue = 0.0;
kohacraft 0:26fecc2ddabd 136 wait( 0.5 );
kohacraft 0:26fecc2ddabd 137 }
kohacraft 0:26fecc2ddabd 138
kohacraft 0:26fecc2ddabd 139 //最初にlanモジュールから出力される文字列を捨てる
kohacraft 0:26fecc2ddabd 140 char temp;
kohacraft 0:26fecc2ddabd 141 while( wifi.readable() == 1 )
kohacraft 0:26fecc2ddabd 142 temp = wifi.getc();
kohacraft 0:26fecc2ddabd 143
kohacraft 0:26fecc2ddabd 144 //ATコマンドで無線LANモジュールをクライアントモードにする
kohacraft 0:26fecc2ddabd 145 wifi.printf("AT\r\n");
kohacraft 0:26fecc2ddabd 146 wait(2);
kohacraft 0:26fecc2ddabd 147 red = 0.9; green = 1.0; blue = 0.0;
kohacraft 4:1c1fb59cf7d9 148 wifi.printf("AT+CWMODE=1\r\n");
kohacraft 0:26fecc2ddabd 149 wait(2);
kohacraft 0:26fecc2ddabd 150 red = 0.6; green = 0.8; blue = 0.3;
kohacraft 0:26fecc2ddabd 151 //アクセスポイントに接続
kohacraft 0:26fecc2ddabd 152 wifi.printf("AT+CWJAP=\"%s\",\"%s\"\r\n",SSID,PASS);
kohacraft 0:26fecc2ddabd 153 red = 0.4; green = 0.6; blue = 0.6;
kohacraft 0:26fecc2ddabd 154 wait(3);
kohacraft 0:26fecc2ddabd 155 red = 0.2; green = 0.4; blue = 0.8;
kohacraft 0:26fecc2ddabd 156 wait(3);
kohacraft 0:26fecc2ddabd 157 red = 0.0; green = 0.2; blue = 1.0;
kohacraft 0:26fecc2ddabd 158
kohacraft 0:26fecc2ddabd 159
kohacraft 0:26fecc2ddabd 160 while(1)
kohacraft 0:26fecc2ddabd 161 {
kohacraft 0:26fecc2ddabd 162 //サーバに接続
kohacraft 4:1c1fb59cf7d9 163 wifi.printf("AT+CIPSTART=\"TCP\",\"query.yahooapis.com\",80\r\n");
kohacraft 0:26fecc2ddabd 164 wait(2);
kohacraft 0:26fecc2ddabd 165
kohacraft 0:26fecc2ddabd 166 //サーバに要求
kohacraft 4:1c1fb59cf7d9 167 char str[200];
kohacraft 4:1c1fb59cf7d9 168 sprintf(str , "GET http://query.yahooapis.com/v1/public/yql?q=SELECT%%20*%%20FROM%%20weather.forecast%%20WHERE%%20woeid%%3D%%22%s%%22%20and%%20u%%3D%%22c%%22\r\nHost: query.yahooapis.com\r\nConnection: close\r\n\r\n\r\n",WOEID);
kohacraft 4:1c1fb59cf7d9 169 wifi.printf("AT+CIPSEND=%d\r\n",strlen(str));
kohacraft 4:1c1fb59cf7d9 170 wait(1);
kohacraft 0:26fecc2ddabd 171
kohacraft 2:5686f264238a 172 //受信
kohacraft 4:1c1fb59cf7d9 173 wifi.printf("%s",str);
kohacraft 2:5686f264238a 174 recvData();
kohacraft 0:26fecc2ddabd 175
kohacraft 0:26fecc2ddabd 176 //切断
kohacraft 0:26fecc2ddabd 177 wifi.printf("AT+CIPCLOSE\r\n");
kohacraft 4:1c1fb59cf7d9 178 wifi.printf("%s\r\n",rxbuff);
kohacraft 0:26fecc2ddabd 179
kohacraft 0:26fecc2ddabd 180 //文字列探索
kohacraft 0:26fecc2ddabd 181 int weatherCord , tempHi , tempLow;
kohacraft 0:26fecc2ddabd 182 if( getWeather( rxbuff , &weatherCord , &tempLow , &tempHi ) == false ) //データの受信
kohacraft 0:26fecc2ddabd 183 {
kohacraft 0:26fecc2ddabd 184 //予報の文字列がない
kohacraft 4:1c1fb59cf7d9 185 wifi.printf("Can not find strng:forecast\r\n");
kohacraft 4:1c1fb59cf7d9 186 for( int i=0 ; i<5 ; i++ )
kohacraft 4:1c1fb59cf7d9 187 {
kohacraft 4:1c1fb59cf7d9 188 red = 1.0;
kohacraft 4:1c1fb59cf7d9 189 wait(0.25);
kohacraft 4:1c1fb59cf7d9 190 red = 0.0;
kohacraft 4:1c1fb59cf7d9 191 wait(0.25);
kohacraft 4:1c1fb59cf7d9 192 }
kohacraft 0:26fecc2ddabd 193 break; //最初からやり直す
kohacraft 0:26fecc2ddabd 194 }
kohacraft 4:1c1fb59cf7d9 195 wifi.printf("weatherCord:%d tempLow:%d tempHi:%d\r\n",weatherCord , tempLow , tempHi);
kohacraft 0:26fecc2ddabd 196
kohacraft 0:26fecc2ddabd 197 //天気をLEDの色に変換する
kohacraft 0:26fecc2ddabd 198 float rStart , gStart , bStart , rEnd , gEnd , bEnd;
kohacraft 0:26fecc2ddabd 199 switch(weatherCord)
kohacraft 0:26fecc2ddabd 200 {
kohacraft 0:26fecc2ddabd 201 //雨
kohacraft 0:26fecc2ddabd 202 case 0:
kohacraft 0:26fecc2ddabd 203 case 1:
kohacraft 0:26fecc2ddabd 204 case 2:
kohacraft 0:26fecc2ddabd 205 case 3:
kohacraft 0:26fecc2ddabd 206 case 4:
kohacraft 0:26fecc2ddabd 207 case 5:
kohacraft 0:26fecc2ddabd 208 case 6:
kohacraft 0:26fecc2ddabd 209 case 11:
kohacraft 0:26fecc2ddabd 210 case 12:
kohacraft 0:26fecc2ddabd 211 case 17:
kohacraft 0:26fecc2ddabd 212 case 18:
kohacraft 0:26fecc2ddabd 213 case 35:
kohacraft 0:26fecc2ddabd 214 case 37:
kohacraft 0:26fecc2ddabd 215 case 38:
kohacraft 0:26fecc2ddabd 216 case 39:
kohacraft 0:26fecc2ddabd 217 case 40:
kohacraft 0:26fecc2ddabd 218 case 45:
kohacraft 0:26fecc2ddabd 219 case 47:
kohacraft 0:26fecc2ddabd 220 rStart = 0.0; gStart = 0.0; bStart = 1.0;
kohacraft 0:26fecc2ddabd 221 rEnd = 0.0; gEnd = 0.3; bEnd = 0.8;
kohacraft 0:26fecc2ddabd 222 break;
kohacraft 0:26fecc2ddabd 223
kohacraft 0:26fecc2ddabd 224 //雪
kohacraft 0:26fecc2ddabd 225 case 7:
kohacraft 0:26fecc2ddabd 226 case 8:
kohacraft 0:26fecc2ddabd 227 case 9:
kohacraft 0:26fecc2ddabd 228 case 10:
kohacraft 0:26fecc2ddabd 229 case 13:
kohacraft 0:26fecc2ddabd 230 case 14:
kohacraft 0:26fecc2ddabd 231 case 15:
kohacraft 0:26fecc2ddabd 232 case 16:
kohacraft 0:26fecc2ddabd 233 case 23:
kohacraft 0:26fecc2ddabd 234 case 41:
kohacraft 0:26fecc2ddabd 235 case 42:
kohacraft 0:26fecc2ddabd 236 case 43:
kohacraft 0:26fecc2ddabd 237 case 46:
kohacraft 0:26fecc2ddabd 238 rStart = 1.0; gStart = 0.8; bStart = 0.8;
kohacraft 0:26fecc2ddabd 239 rEnd = 0.8; gEnd = 0.6; bEnd = 0.6;
kohacraft 0:26fecc2ddabd 240 break;
kohacraft 0:26fecc2ddabd 241
kohacraft 0:26fecc2ddabd 242 //曇り
kohacraft 0:26fecc2ddabd 243 case 19:
kohacraft 0:26fecc2ddabd 244 case 20:
kohacraft 0:26fecc2ddabd 245 case 22:
kohacraft 0:26fecc2ddabd 246 case 26:
kohacraft 0:26fecc2ddabd 247 case 27:
kohacraft 0:26fecc2ddabd 248 case 28:
kohacraft 0:26fecc2ddabd 249 case 44:
kohacraft 0:26fecc2ddabd 250 rStart = 0.6; gStart = 0.4; bStart = 0.4;
kohacraft 0:26fecc2ddabd 251 rEnd = 0.25; gEnd = 0.2; bEnd = 0.15;
kohacraft 0:26fecc2ddabd 252 break;
kohacraft 0:26fecc2ddabd 253
kohacraft 0:26fecc2ddabd 254 //晴れ
kohacraft 0:26fecc2ddabd 255 case 21:
kohacraft 0:26fecc2ddabd 256 case 24:
kohacraft 0:26fecc2ddabd 257 case 25:
kohacraft 0:26fecc2ddabd 258 case 29:
kohacraft 0:26fecc2ddabd 259 case 30:
kohacraft 0:26fecc2ddabd 260 case 31:
kohacraft 0:26fecc2ddabd 261 case 32:
kohacraft 0:26fecc2ddabd 262 case 33:
kohacraft 0:26fecc2ddabd 263 case 34:
kohacraft 0:26fecc2ddabd 264 case 36:
kohacraft 0:26fecc2ddabd 265 rStart = 1.0; gStart = 0.5; bStart = 0.0;
kohacraft 0:26fecc2ddabd 266 rEnd = 1.0; gEnd = 0.3; bEnd = 0.2;
kohacraft 0:26fecc2ddabd 267 break;
kohacraft 0:26fecc2ddabd 268
kohacraft 0:26fecc2ddabd 269 default:
kohacraft 0:26fecc2ddabd 270 rStart = 0.0; gStart = 0.0; bStart = 0.0;
kohacraft 0:26fecc2ddabd 271 rEnd = 1.0; gEnd = 0.0; bEnd = 1.0;
kohacraft 0:26fecc2ddabd 272 break;
kohacraft 0:26fecc2ddabd 273 }
kohacraft 0:26fecc2ddabd 274
kohacraft 0:26fecc2ddabd 275 for(int j=0 ; j<30*60/2 ; j++) //30分ループし続ける
kohacraft 0:26fecc2ddabd 276 {
kohacraft 0:26fecc2ddabd 277 //startの色からendの色へと1秒かけて色を変化させる
kohacraft 0:26fecc2ddabd 278 for( float i=0 ; i<100 ; i++ )
kohacraft 0:26fecc2ddabd 279 {
kohacraft 0:26fecc2ddabd 280 red = rStart + (rEnd-rStart)*i/100.0;
kohacraft 0:26fecc2ddabd 281 green = gStart + (gEnd-gStart)*i/100.0;
kohacraft 0:26fecc2ddabd 282 blue = bStart + (bEnd-bStart)*i/100.0;
kohacraft 0:26fecc2ddabd 283 if( lightSensor != 0 )
kohacraft 0:26fecc2ddabd 284 {
kohacraft 0:26fecc2ddabd 285 red = red*0.1; green = green*0.1; blue = blue*0.1;
kohacraft 0:26fecc2ddabd 286 }
kohacraft 0:26fecc2ddabd 287 wait(0.01);
kohacraft 0:26fecc2ddabd 288 }
kohacraft 0:26fecc2ddabd 289 //endの色からstartの色へと1秒かけて色を変化させる
kohacraft 0:26fecc2ddabd 290 for( float i=0 ; i<100 ; i++ )
kohacraft 0:26fecc2ddabd 291 {
kohacraft 0:26fecc2ddabd 292 red = rEnd + (rStart-rEnd)*i/100.0;
kohacraft 0:26fecc2ddabd 293 green = gEnd + (gStart-gEnd)*i/100.0;
kohacraft 0:26fecc2ddabd 294 blue = bEnd + (bStart-bEnd)*i/100.0;
kohacraft 0:26fecc2ddabd 295 if( lightSensor != 0 )
kohacraft 0:26fecc2ddabd 296 {
kohacraft 0:26fecc2ddabd 297 red = red*0.1; green = green*0.1; blue = blue*0.1;
kohacraft 0:26fecc2ddabd 298 }
kohacraft 0:26fecc2ddabd 299 wait(0.01);
kohacraft 0:26fecc2ddabd 300 }
kohacraft 0:26fecc2ddabd 301 }
kohacraft 0:26fecc2ddabd 302 }
kohacraft 0:26fecc2ddabd 303 }
kohacraft 0:26fecc2ddabd 304 }