kohacraft Lab
/
kc_tenkiyoho_LED2
tenkiyoho LED 2 (with ESP-WROOM-02)
Diff: main.cpp
- Revision:
- 0:fb93c5feca27
- Child:
- 1:5f560645b4fb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Sep 06 08:43:07 2015 +0000 @@ -0,0 +1,394 @@ +#include "mbed.h" +#include <string.h> + +Serial wifi(dp16, dp15); // ESP-WROOM-02 tx, rx +DigitalOut wifiRst(dp17); // /ESP-WROOM-02 RESET +DigitalIn lightSensor(dp4); //loom light sensor(CdS:GL5528 conect to dp4 and GND) + +PwmOut sunny(dp1); //dp1を晴れのLEDのPWM出力にします +PwmOut rainy(dp2); //dp2を雨のLEDのPWM出力にします +PwmOut cloudy(dp18); //dp18を曇りのLEDのPWM出力にします +PwmOut snowy(dp24); //dp18を雪のLEDのPWM出力にします + +#define baudrate 115200 + +static char rxbuff[1000]; //取得する文字列 +int buffAdr = 0; + +const char SSID[] = "your SSDI"; //アクセスポイントのSSID +const char PASS[] = "password"; //アクセスポイントのパスワード +const char WOEID[] = "28413961"; //天気を調べる場所 http://woeid.rosselliot.co.nz/ で郵便番号で検索して得られる8桁 + +//データを受信する +bool recvData() +{ + bool ret = false; + buffAdr = 0; + for( int i =0 ; i< sizeof( rxbuff ) ; i++ ) + rxbuff[i] = '\0'; + + int headerCount = 0; + + //1000000回ループしたらタイムアウトする + for( int i = 0; i < 1000000 ; i++ ) + { + if( wifi.readable() != 0 ) + { + rxbuff[buffAdr++] = wifi.getc(); //Serial.getc() + headerCount++; + if( headerCount <= 2400 ) //最初の2400文字捨てる + buffAdr=0; + if( buffAdr >= sizeof(rxbuff)-1 ) //バッファ溢れしたら終了 + { + ret = true; + i=1000000; //loopを早く終わらすために + break; + } + + } + } + + //文字列の最後を終端 + rxbuff[sizeof(rxbuff)-1] = '\0'; + return ret; +} + +//文字列から予報天気を抽出 +bool getWeather( char* str , int* weatherCord , int* tempLow , int* tempHi ) +{ + //文字列探索 + char *forecast; + if ( (forecast = strstr(str, "yweather:forecast") ) == NULL ) + { + //取得できず + weatherCord = 0; + tempLow = 0; + tempLow = 0; + return false; + } + + //最低気温を抽出 + char *lowStart,*lowEnd; + //int tempLow; + lowStart = strstr(forecast, "low"); + lowStart = strchr( lowStart , '\"' ); + lowStart++; //"の次の文字のポインタ + lowEnd = strchr( lowStart , '\"' ); + *lowEnd = '\0'; + *tempLow = atoi( lowStart ); //最低気温を数字に変換 + + //最高気温を抽出 + char *hiStart,*hiEnd; + //int tempHi; + hiStart = strstr(lowEnd+1, "high"); + hiStart = strchr( hiStart , '\"' ); + hiStart++; //"の次の文字のポインタ + hiEnd = strchr( hiStart , '\"' ); + *hiEnd = '\0'; + *tempHi = atoi( hiStart ); //最高気温を数字に変換 + + + //天気を抽出 + char *textStart,*textEnd; + char weatherText[32]; + textStart = strstr(hiEnd+1, "text"); + textStart = strchr( textStart , '\"' ); + textStart++; //"の次の文字のポインタ + textEnd = strchr( textStart , '\"' ); + *textEnd = '\0'; + strncpy( weatherText, textStart , 32); + + //天気コードを抽出 + char *codeStart,*codeEnd; + //int weatherCord; + codeStart = strstr(textEnd+1, "code"); + codeStart = strchr( codeStart , '\"' ); + codeStart++; //"の次の文字のポインタ + codeEnd = strchr( codeStart , '\"' ); + *codeEnd = '\0'; + *weatherCord = atoi( codeStart ); //最高気温を数字に変換 + + return true; +} + +//LEDを順番に光らせる +void ledIlluminationWait() +{ + snowy = 0.0; + sunny = 1.0; + wait(0.5); + + sunny = 0.0; + rainy = 1.0; + wait(0.5); + + rainy = 0.0; + cloudy = 1.0; + wait(0.5); + + cloudy = 0.0; + snowy = 1.0; + wait(0.5); + +} + +//天気に応じた明るさの変換 +float wheatherIllumination( float inValue1 , float inValue2) +{ + float temp; + + //1に近い場合は1を返す + if( inValue1 > 0.99 ) + { + temp = inValue1 -inValue2*0.3; //少し暗くする + return temp; + } + + //0に近い場合は0を返す + if( inValue1 < 0.01 ) + return 0.0; + + //それら以外 + temp = inValue2 * inValue1; + return temp; +} + +int main() { + + //LEDのPWM周期 + sunny.period(5); + rainy.period(5); + cloudy.period(5); + snowy.period(5); + + //天気情報 1:ほとんど ~0.5:ときどき ~0:なし + float sun = 0; + float rain = 0; + float cloud = 0; + float snow = 0; + + lightSensor.mode(PullUp); //室内の明るさセンサをプルアップする + wifi.baud(baudrate); //ビットレートを設定 + + while(1) + { + //無線LANモジュールをリセット + wifiRst = 1; + wifiRst = 0; + wifiRst = 1; + + //無線LANモジュールが安定するのを待つ + for( int i=0 ; i<5 ; i++ ) + { + ledIlluminationWait(); + } + + //最初にlanモジュールから出力される文字列を捨てる + char temp; + while( wifi.readable() == 1 ) + temp = wifi.getc(); + + //ATコマンドで無線LANモジュールをクライアントモードにする + wifi.printf("AT\r\n"); + ledIlluminationWait(); + + wifi.printf("AT+CWMODE=3\r\n"); + ledIlluminationWait(); + + //アクセスポイントに接続 + wifi.printf("AT+CWJAP=\"%s\",\"%s\"\r\n",SSID,PASS); + ledIlluminationWait(); + ledIlluminationWait(); + ledIlluminationWait(); + + while(1) + { + //サーバに接続 + wifi.printf("AT+CIPSTART=\"TCP\",\"188.125.93.38\",80\r\n"); + ledIlluminationWait(); + + //サーバに要求 + wifi.printf("AT+CIPSEND=72\r\n"); + ledIlluminationWait(); + + //サーバに要求 + wifi.printf("GET http://weather.yahooapis.com/forecastrss?u=c&w=%s HTTP/1.1\r\n\r\n",WOEID); + recvData(); //データの受信 + + //切断 + wifi.printf("AT+CIPCLOSE\r\n"); + + //文字列探索 + int weatherCord , tempHi , tempLow; + if( getWeather( rxbuff , &weatherCord , &tempLow , &tempHi ) == false ) //データの受信 + { + //予報の文字列がない + break; //最初からやり直す + } + + + //天気をLEDの色に変換する + switch(weatherCord) + { + //晴れ + case 24: + case 25: + case 31: + case 32: + case 36: + sun = 1; + rain = 0; + cloud = 0; + snow = 0; + break; + + //晴れ時々曇り + case 29: + case 30: + case 33: + case 34: + case 44: + sun = 1; + rain = 0; + cloud = 0.5; + snow = 0; + break; + + //晴れ時々雨 + case 45: + case 47: + sun = 1; + rain = 0.5; + cloud = 0; + snow = 0; + break; + + //晴れ時々雪 + case 46: + sun = 1; + rain = 0; + cloud = 0; + snow = 0.5; + break; + + + //曇り + case 19: + case 21: + case 22: + case 26: + sun = 0; + rain = 0; + cloud = 1; + snow = 0; + break; + + //曇り時々晴れ + case 27: + case 28: + sun = 0.5; + rain = 0; + cloud = 1; + snow = 0; + break; + + //曇り時々雨 + case 9: + case 11: + case 20: + case 37: + sun = 0; + rain = 0.5; + cloud = 1; + snow = 0; + break; + + //曇り時々雪 + case 8: + case 13: + sun = 0; + rain = 0; + cloud = 1; + snow = 0.5; + break; + + + //雨 + case 0: + case 1: + case 2: + case 3: + case 4: + case 6: + case 12: + case 17: + case 23: + case 38: + case 39: + case 40: + sun = 0; + rain = 1; + cloud = 0; + snow = 0; + break; + + //雨時々雪 + case 5: + case 10: + case 18: + case 35: + sun = 0; + rain = 1; + cloud = 0; + snow = 0.5; + break; + + + //雪 + case 14: + case 15: + case 16: + case 41: + case 42: + case 43: + sun = 0; + rain = 0; + cloud = 0; + snow = 1; + break; + + //雪時々雨 + case 7: + sun = 0; + rain = 0.5; + cloud = 0; + snow = 1; + break; + + + } + + for(int j=0 ; j<30*10 ; j++) //30分ループし続ける + { + //3秒かけて徐々に明るくする + for( float i = 0.0 ; i< 1.0 ; i+=0.01 ) + { + sunny = wheatherIllumination( sun , i ); + rainy = wheatherIllumination( rain , i ); + cloudy = wheatherIllumination( cloud , i ); + snowy = wheatherIllumination( snow , i ); + wait(0.03); + } + //3秒かけて徐々に暗くする + for( float i = 1.0 ; i> 0.0 ; i-=0.01 ) + { + sunny = wheatherIllumination( sun , i ); + rainy = wheatherIllumination( rain , i ); + cloudy = wheatherIllumination( cloud , i ); + snowy = wheatherIllumination( snow , i ); + wait(0.03); + } + } + } + } +}