tenki yoho LED (with ESP-WROOM-02)

Dependencies:   mbed

Committer:
kohacraft
Date:
Sun Sep 06 05:33:04 2015 +0000
Revision:
2:5686f264238a
Parent:
1:06fd45432b0c
Child:
3:5689bfb78c7b
bug fix

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 0:26fecc2ddabd 14 static char rxbuff[1000]; //取得する文字列
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 1:06fd45432b0c 19 const char WOEID[] = "28413961"; //天気を調べる場所 http://woeid.rosselliot.co.nz/ で郵便番号で検索して得られる8桁
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 0:26fecc2ddabd 38 if( headerCount <= 2400 ) //最初の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 0:26fecc2ddabd 69 //最低気温を抽出
kohacraft 0:26fecc2ddabd 70 char *lowStart,*lowEnd;
kohacraft 0:26fecc2ddabd 71 //int tempLow;
kohacraft 0:26fecc2ddabd 72 lowStart = strstr(forecast, "low");
kohacraft 0:26fecc2ddabd 73 lowStart = strchr( lowStart , '\"' );
kohacraft 0:26fecc2ddabd 74 lowStart++; //"の次の文字のポインタ
kohacraft 0:26fecc2ddabd 75 lowEnd = strchr( lowStart , '\"' );
kohacraft 0:26fecc2ddabd 76 *lowEnd = '\0';
kohacraft 0:26fecc2ddabd 77 *tempLow = atoi( lowStart ); //最低気温を数字に変換
kohacraft 0:26fecc2ddabd 78
kohacraft 0:26fecc2ddabd 79 //最高気温を抽出
kohacraft 0:26fecc2ddabd 80 char *hiStart,*hiEnd;
kohacraft 0:26fecc2ddabd 81 //int tempHi;
kohacraft 0:26fecc2ddabd 82 hiStart = strstr(lowEnd+1, "high");
kohacraft 0:26fecc2ddabd 83 hiStart = strchr( hiStart , '\"' );
kohacraft 0:26fecc2ddabd 84 hiStart++; //"の次の文字のポインタ
kohacraft 0:26fecc2ddabd 85 hiEnd = strchr( hiStart , '\"' );
kohacraft 0:26fecc2ddabd 86 *hiEnd = '\0';
kohacraft 0:26fecc2ddabd 87 *tempHi = atoi( hiStart ); //最高気温を数字に変換
kohacraft 0:26fecc2ddabd 88
kohacraft 0:26fecc2ddabd 89
kohacraft 0:26fecc2ddabd 90 //天気を抽出
kohacraft 0:26fecc2ddabd 91 char *textStart,*textEnd;
kohacraft 0:26fecc2ddabd 92 char weatherText[32];
kohacraft 0:26fecc2ddabd 93 textStart = strstr(hiEnd+1, "text");
kohacraft 0:26fecc2ddabd 94 textStart = strchr( textStart , '\"' );
kohacraft 0:26fecc2ddabd 95 textStart++; //"の次の文字のポインタ
kohacraft 0:26fecc2ddabd 96 textEnd = strchr( textStart , '\"' );
kohacraft 0:26fecc2ddabd 97 *textEnd = '\0';
kohacraft 0:26fecc2ddabd 98 strncpy( weatherText, textStart , 32);
kohacraft 0:26fecc2ddabd 99
kohacraft 0:26fecc2ddabd 100 //天気コードを抽出
kohacraft 0:26fecc2ddabd 101 char *codeStart,*codeEnd;
kohacraft 0:26fecc2ddabd 102 //int weatherCord;
kohacraft 0:26fecc2ddabd 103 codeStart = strstr(textEnd+1, "code");
kohacraft 0:26fecc2ddabd 104 codeStart = strchr( codeStart , '\"' );
kohacraft 0:26fecc2ddabd 105 codeStart++; //"の次の文字のポインタ
kohacraft 0:26fecc2ddabd 106 codeEnd = strchr( codeStart , '\"' );
kohacraft 0:26fecc2ddabd 107 *codeEnd = '\0';
kohacraft 0:26fecc2ddabd 108 *weatherCord = atoi( codeStart ); //最高気温を数字に変換
kohacraft 0:26fecc2ddabd 109
kohacraft 0:26fecc2ddabd 110 return true;
kohacraft 0:26fecc2ddabd 111 }
kohacraft 0:26fecc2ddabd 112
kohacraft 0:26fecc2ddabd 113
kohacraft 0:26fecc2ddabd 114 int main() {
kohacraft 0:26fecc2ddabd 115
kohacraft 0:26fecc2ddabd 116 //LEDのPWM周期
kohacraft 0:26fecc2ddabd 117 red.period(5);
kohacraft 0:26fecc2ddabd 118 green.period(5);
kohacraft 0:26fecc2ddabd 119 blue.period(5);
kohacraft 0:26fecc2ddabd 120
kohacraft 0:26fecc2ddabd 121 lightSensor.mode(PullUp); //室内の明るさセンサをプルアップする
kohacraft 0:26fecc2ddabd 122 wifi.baud(baudrate); //ビットレートを設定
kohacraft 0:26fecc2ddabd 123
kohacraft 0:26fecc2ddabd 124 while(1)
kohacraft 0:26fecc2ddabd 125 {
kohacraft 0:26fecc2ddabd 126 //無線LANモジュールをリセット
kohacraft 0:26fecc2ddabd 127 wifiRst = 1;
kohacraft 0:26fecc2ddabd 128 wifiRst = 0;
kohacraft 0:26fecc2ddabd 129 wifiRst = 1;
kohacraft 0:26fecc2ddabd 130
kohacraft 0:26fecc2ddabd 131 //無線LANモジュールが安定するのを待つ
kohacraft 0:26fecc2ddabd 132 for( int i=0 ; i<10 ; i++ )
kohacraft 0:26fecc2ddabd 133 {
kohacraft 0:26fecc2ddabd 134 red = 0.9; green = 1.0; blue = 0.0;
kohacraft 0:26fecc2ddabd 135 wait( 0.5 );
kohacraft 0:26fecc2ddabd 136 red = 0.0; green = 0.0; blue = 0.0;
kohacraft 0:26fecc2ddabd 137 wait( 0.5 );
kohacraft 0:26fecc2ddabd 138 }
kohacraft 0:26fecc2ddabd 139
kohacraft 0:26fecc2ddabd 140 //最初にlanモジュールから出力される文字列を捨てる
kohacraft 0:26fecc2ddabd 141 char temp;
kohacraft 0:26fecc2ddabd 142 while( wifi.readable() == 1 )
kohacraft 0:26fecc2ddabd 143 temp = wifi.getc();
kohacraft 0:26fecc2ddabd 144
kohacraft 0:26fecc2ddabd 145 //ATコマンドで無線LANモジュールをクライアントモードにする
kohacraft 0:26fecc2ddabd 146 wifi.printf("AT\r\n");
kohacraft 0:26fecc2ddabd 147 wait(2);
kohacraft 0:26fecc2ddabd 148 red = 0.9; green = 1.0; blue = 0.0;
kohacraft 0:26fecc2ddabd 149 wifi.printf("AT+CWMODE=3\r\n");
kohacraft 0:26fecc2ddabd 150 wait(2);
kohacraft 0:26fecc2ddabd 151 red = 0.6; green = 0.8; blue = 0.3;
kohacraft 0:26fecc2ddabd 152 //アクセスポイントに接続
kohacraft 0:26fecc2ddabd 153 wifi.printf("AT+CWJAP=\"%s\",\"%s\"\r\n",SSID,PASS);
kohacraft 0:26fecc2ddabd 154 red = 0.4; green = 0.6; blue = 0.6;
kohacraft 0:26fecc2ddabd 155 wait(3);
kohacraft 0:26fecc2ddabd 156 red = 0.2; green = 0.4; blue = 0.8;
kohacraft 0:26fecc2ddabd 157 wait(3);
kohacraft 0:26fecc2ddabd 158 red = 0.0; green = 0.2; blue = 1.0;
kohacraft 0:26fecc2ddabd 159
kohacraft 0:26fecc2ddabd 160
kohacraft 0:26fecc2ddabd 161 while(1)
kohacraft 0:26fecc2ddabd 162 {
kohacraft 0:26fecc2ddabd 163 //サーバに接続
kohacraft 0:26fecc2ddabd 164 wifi.printf("AT+CIPSTART=\"TCP\",\"188.125.93.38\",80\r\n");
kohacraft 0:26fecc2ddabd 165 wait(2);
kohacraft 0:26fecc2ddabd 166
kohacraft 0:26fecc2ddabd 167 //サーバに要求
kohacraft 0:26fecc2ddabd 168 wifi.printf("AT+CIPSEND=72\r\n");
kohacraft 0:26fecc2ddabd 169 wait(2);
kohacraft 0:26fecc2ddabd 170
kohacraft 2:5686f264238a 171 //受信
kohacraft 0:26fecc2ddabd 172 wifi.printf("GET http://weather.yahooapis.com/forecastrss?u=c&w=%s HTTP/1.1\r\n\r\n",WOEID);
kohacraft 2:5686f264238a 173 recvData();
kohacraft 0:26fecc2ddabd 174
kohacraft 0:26fecc2ddabd 175 //切断
kohacraft 0:26fecc2ddabd 176 wifi.printf("AT+CIPCLOSE\r\n");
kohacraft 0:26fecc2ddabd 177
kohacraft 0:26fecc2ddabd 178 //文字列探索
kohacraft 0:26fecc2ddabd 179 int weatherCord , tempHi , tempLow;
kohacraft 0:26fecc2ddabd 180 if( getWeather( rxbuff , &weatherCord , &tempLow , &tempHi ) == false ) //データの受信
kohacraft 0:26fecc2ddabd 181 {
kohacraft 0:26fecc2ddabd 182 //予報の文字列がない
kohacraft 0:26fecc2ddabd 183 red = 1.0;
kohacraft 0:26fecc2ddabd 184 wait(2);
kohacraft 0:26fecc2ddabd 185 break; //最初からやり直す
kohacraft 0:26fecc2ddabd 186 }
kohacraft 0:26fecc2ddabd 187
kohacraft 0:26fecc2ddabd 188
kohacraft 0:26fecc2ddabd 189 //天気をLEDの色に変換する
kohacraft 0:26fecc2ddabd 190 float rStart , gStart , bStart , rEnd , gEnd , bEnd;
kohacraft 0:26fecc2ddabd 191 switch(weatherCord)
kohacraft 0:26fecc2ddabd 192 {
kohacraft 0:26fecc2ddabd 193 //雨
kohacraft 0:26fecc2ddabd 194 case 0:
kohacraft 0:26fecc2ddabd 195 case 1:
kohacraft 0:26fecc2ddabd 196 case 2:
kohacraft 0:26fecc2ddabd 197 case 3:
kohacraft 0:26fecc2ddabd 198 case 4:
kohacraft 0:26fecc2ddabd 199 case 5:
kohacraft 0:26fecc2ddabd 200 case 6:
kohacraft 0:26fecc2ddabd 201 case 11:
kohacraft 0:26fecc2ddabd 202 case 12:
kohacraft 0:26fecc2ddabd 203 case 17:
kohacraft 0:26fecc2ddabd 204 case 18:
kohacraft 0:26fecc2ddabd 205 case 35:
kohacraft 0:26fecc2ddabd 206 case 37:
kohacraft 0:26fecc2ddabd 207 case 38:
kohacraft 0:26fecc2ddabd 208 case 39:
kohacraft 0:26fecc2ddabd 209 case 40:
kohacraft 0:26fecc2ddabd 210 case 45:
kohacraft 0:26fecc2ddabd 211 case 47:
kohacraft 0:26fecc2ddabd 212 rStart = 0.0; gStart = 0.0; bStart = 1.0;
kohacraft 0:26fecc2ddabd 213 rEnd = 0.0; gEnd = 0.3; bEnd = 0.8;
kohacraft 0:26fecc2ddabd 214 break;
kohacraft 0:26fecc2ddabd 215
kohacraft 0:26fecc2ddabd 216 //雪
kohacraft 0:26fecc2ddabd 217 case 7:
kohacraft 0:26fecc2ddabd 218 case 8:
kohacraft 0:26fecc2ddabd 219 case 9:
kohacraft 0:26fecc2ddabd 220 case 10:
kohacraft 0:26fecc2ddabd 221 case 13:
kohacraft 0:26fecc2ddabd 222 case 14:
kohacraft 0:26fecc2ddabd 223 case 15:
kohacraft 0:26fecc2ddabd 224 case 16:
kohacraft 0:26fecc2ddabd 225 case 23:
kohacraft 0:26fecc2ddabd 226 case 41:
kohacraft 0:26fecc2ddabd 227 case 42:
kohacraft 0:26fecc2ddabd 228 case 43:
kohacraft 0:26fecc2ddabd 229 case 46:
kohacraft 0:26fecc2ddabd 230 rStart = 1.0; gStart = 0.8; bStart = 0.8;
kohacraft 0:26fecc2ddabd 231 rEnd = 0.8; gEnd = 0.6; bEnd = 0.6;
kohacraft 0:26fecc2ddabd 232 break;
kohacraft 0:26fecc2ddabd 233
kohacraft 0:26fecc2ddabd 234 //曇り
kohacraft 0:26fecc2ddabd 235 case 19:
kohacraft 0:26fecc2ddabd 236 case 20:
kohacraft 0:26fecc2ddabd 237 case 22:
kohacraft 0:26fecc2ddabd 238 case 26:
kohacraft 0:26fecc2ddabd 239 case 27:
kohacraft 0:26fecc2ddabd 240 case 28:
kohacraft 0:26fecc2ddabd 241 case 44:
kohacraft 0:26fecc2ddabd 242 rStart = 0.6; gStart = 0.4; bStart = 0.4;
kohacraft 0:26fecc2ddabd 243 rEnd = 0.25; gEnd = 0.2; bEnd = 0.15;
kohacraft 0:26fecc2ddabd 244 break;
kohacraft 0:26fecc2ddabd 245
kohacraft 0:26fecc2ddabd 246 //晴れ
kohacraft 0:26fecc2ddabd 247 case 21:
kohacraft 0:26fecc2ddabd 248 case 24:
kohacraft 0:26fecc2ddabd 249 case 25:
kohacraft 0:26fecc2ddabd 250 case 29:
kohacraft 0:26fecc2ddabd 251 case 30:
kohacraft 0:26fecc2ddabd 252 case 31:
kohacraft 0:26fecc2ddabd 253 case 32:
kohacraft 0:26fecc2ddabd 254 case 33:
kohacraft 0:26fecc2ddabd 255 case 34:
kohacraft 0:26fecc2ddabd 256 case 36:
kohacraft 0:26fecc2ddabd 257 rStart = 1.0; gStart = 0.5; bStart = 0.0;
kohacraft 0:26fecc2ddabd 258 rEnd = 1.0; gEnd = 0.3; bEnd = 0.2;
kohacraft 0:26fecc2ddabd 259 break;
kohacraft 0:26fecc2ddabd 260
kohacraft 0:26fecc2ddabd 261 default:
kohacraft 0:26fecc2ddabd 262 rStart = 0.0; gStart = 0.0; bStart = 0.0;
kohacraft 0:26fecc2ddabd 263 rEnd = 1.0; gEnd = 0.0; bEnd = 1.0;
kohacraft 0:26fecc2ddabd 264 break;
kohacraft 0:26fecc2ddabd 265 }
kohacraft 0:26fecc2ddabd 266
kohacraft 0:26fecc2ddabd 267 for(int j=0 ; j<30*60/2 ; j++) //30分ループし続ける
kohacraft 0:26fecc2ddabd 268 {
kohacraft 0:26fecc2ddabd 269 //startの色からendの色へと1秒かけて色を変化させる
kohacraft 0:26fecc2ddabd 270 for( float i=0 ; i<100 ; i++ )
kohacraft 0:26fecc2ddabd 271 {
kohacraft 0:26fecc2ddabd 272 red = rStart + (rEnd-rStart)*i/100.0;
kohacraft 0:26fecc2ddabd 273 green = gStart + (gEnd-gStart)*i/100.0;
kohacraft 0:26fecc2ddabd 274 blue = bStart + (bEnd-bStart)*i/100.0;
kohacraft 0:26fecc2ddabd 275 if( lightSensor != 0 )
kohacraft 0:26fecc2ddabd 276 {
kohacraft 0:26fecc2ddabd 277 red = red*0.1; green = green*0.1; blue = blue*0.1;
kohacraft 0:26fecc2ddabd 278 }
kohacraft 0:26fecc2ddabd 279 wait(0.01);
kohacraft 0:26fecc2ddabd 280 }
kohacraft 0:26fecc2ddabd 281 //endの色からstartの色へと1秒かけて色を変化させる
kohacraft 0:26fecc2ddabd 282 for( float i=0 ; i<100 ; i++ )
kohacraft 0:26fecc2ddabd 283 {
kohacraft 0:26fecc2ddabd 284 red = rEnd + (rStart-rEnd)*i/100.0;
kohacraft 0:26fecc2ddabd 285 green = gEnd + (gStart-gEnd)*i/100.0;
kohacraft 0:26fecc2ddabd 286 blue = bEnd + (bStart-bEnd)*i/100.0;
kohacraft 0:26fecc2ddabd 287 if( lightSensor != 0 )
kohacraft 0:26fecc2ddabd 288 {
kohacraft 0:26fecc2ddabd 289 red = red*0.1; green = green*0.1; blue = blue*0.1;
kohacraft 0:26fecc2ddabd 290 }
kohacraft 0:26fecc2ddabd 291 wait(0.01);
kohacraft 0:26fecc2ddabd 292 }
kohacraft 0:26fecc2ddabd 293 }
kohacraft 0:26fecc2ddabd 294 }
kohacraft 0:26fecc2ddabd 295 }
kohacraft 0:26fecc2ddabd 296 }