Simple IoT boardと電力計測モジュールINA226PRCを使ったサンプルプログラムです。計測したデータをIFTTTのMakerチャネルに送っています。 サンプリングは0.1秒刻みで、10秒間(100回計測)したら電圧、電流、電力それぞれについて平均、最大値、最小値を計算してIFTTTに送る仕様になっています。
Dependencies: INA226PRC SimpleIoTBoardLib mbed
main.cpp@1:0dc207174476, 2015-12-09 (annotated)
- Committer:
- leibun
- Date:
- Wed Dec 09 16:07:35 2015 +0000
- Revision:
- 1:0dc207174476
- Parent:
- 0:0b921803a9ba
First commit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leibun | 0:0b921803a9ba | 1 | #include "mbed.h" |
leibun | 0:0b921803a9ba | 2 | #include "ESP8266Interface.h" |
leibun | 0:0b921803a9ba | 3 | #include "TCPSocketConnection.h" |
leibun | 0:0b921803a9ba | 4 | #include "ifttt.h" |
leibun | 0:0b921803a9ba | 5 | #include "INA226.hpp" |
leibun | 0:0b921803a9ba | 6 | #include "float.h" |
leibun | 0:0b921803a9ba | 7 | #include "SoftSerialSendOnry.h" |
leibun | 0:0b921803a9ba | 8 | |
leibun | 0:0b921803a9ba | 9 | // ROOP_CNT * SAMPLING[sec] = 1ROOP_TIME[sec] |
leibun | 0:0b921803a9ba | 10 | #define ROOP_CNT 100 |
leibun | 0:0b921803a9ba | 11 | #define SAMPLING 0.1 |
leibun | 0:0b921803a9ba | 12 | |
leibun | 0:0b921803a9ba | 13 | // Please change your enviroment. |
leibun | 0:0b921803a9ba | 14 | const char WIFI_SSID[] = "ssid"; |
leibun | 0:0b921803a9ba | 15 | const char WIFI_PASSWORD[] = "password"; |
leibun | 0:0b921803a9ba | 16 | const char IFTTT_EVENT_NAME[] = "event_name"; |
leibun | 0:0b921803a9ba | 17 | const char IFTTT_SECRET_KEY[] = "secret_key"; |
leibun | 0:0b921803a9ba | 18 | |
leibun | 0:0b921803a9ba | 19 | // WIFI setting |
leibun | 0:0b921803a9ba | 20 | ESP8266Interface wifi(dp16, dp15, dp4, WIFI_SSID, WIFI_PASSWORD, 115200); // TX,RX,Reset,SSID,Password,Baud |
leibun | 0:0b921803a9ba | 21 | TCPSocketConnection socket; |
leibun | 0:0b921803a9ba | 22 | IFTTT *ifttt; |
leibun | 0:0b921803a9ba | 23 | |
leibun | 0:0b921803a9ba | 24 | //Serial pc(USBTX,USBRX); |
leibun | 0:0b921803a9ba | 25 | SoftSerialSendOnry pc(dp10); |
leibun | 0:0b921803a9ba | 26 | I2C i2c(dp5, dp27); |
leibun | 0:0b921803a9ba | 27 | INA226 VCmonitor(i2c); |
leibun | 0:0b921803a9ba | 28 | |
leibun | 0:0b921803a9ba | 29 | // Timer |
leibun | 0:0b921803a9ba | 30 | Timer timer; |
leibun | 0:0b921803a9ba | 31 | float nextUpdateTime = 0.0f; |
leibun | 0:0b921803a9ba | 32 | |
leibun | 0:0b921803a9ba | 33 | // Data params |
leibun | 0:0b921803a9ba | 34 | double minW = DBL_MAX, maxW = 0.0, totalW = 0.0; // Power[mW] |
leibun | 0:0b921803a9ba | 35 | double minV = DBL_MAX, maxV = 0.0, totalV = 0.0; // Voltage[mV] |
leibun | 0:0b921803a9ba | 36 | double minC = DBL_MAX, maxC = 0.0, totalC = 0.0; // Current[mA] |
leibun | 0:0b921803a9ba | 37 | unsigned int count = 0; |
leibun | 0:0b921803a9ba | 38 | |
leibun | 0:0b921803a9ba | 39 | void postIFTTT(){ |
leibun | 0:0b921803a9ba | 40 | char postData[128]; |
leibun | 0:0b921803a9ba | 41 | sprintf(postData, "%f,%f,%f,%f,%f,%f,%f,%f,%f", totalV/ROOP_CNT, maxV, minV, totalC/ROOP_CNT, maxC, minC, totalW/ROOP_CNT, maxW, minW); |
leibun | 0:0b921803a9ba | 42 | pc.printf("postData:%s\r\n",postData); |
leibun | 0:0b921803a9ba | 43 | ifttt->addIngredients(postData); |
leibun | 0:0b921803a9ba | 44 | ifttt->trigger(IFTTT_POST); |
leibun | 0:0b921803a9ba | 45 | } |
leibun | 0:0b921803a9ba | 46 | |
leibun | 0:0b921803a9ba | 47 | void record(){ |
leibun | 0:0b921803a9ba | 48 | nextUpdateTime += SAMPLING; |
leibun | 0:0b921803a9ba | 49 | double V,C,W; |
leibun | 0:0b921803a9ba | 50 | if((VCmonitor.getVoltage(&V) != 0) || (VCmonitor.getCurrent(&C) != 0)){ |
leibun | 0:0b921803a9ba | 51 | pc.printf("Error:VCmonitor does not get voltage or current.\r\n"); |
leibun | 0:0b921803a9ba | 52 | return; |
leibun | 0:0b921803a9ba | 53 | } |
leibun | 0:0b921803a9ba | 54 | count++; |
leibun | 0:0b921803a9ba | 55 | |
leibun | 0:0b921803a9ba | 56 | // Calculate power. |
leibun | 0:0b921803a9ba | 57 | W = V * C * 0.001;//[mW] |
leibun | 0:0b921803a9ba | 58 | // pc.printf("%7.2f [mV],%7.2f [mA], %f [mW]\r\n",V ,C ,W); |
leibun | 0:0b921803a9ba | 59 | |
leibun | 0:0b921803a9ba | 60 | // update Max ,Min and Average |
leibun | 0:0b921803a9ba | 61 | if(maxW < W){maxW = W;} |
leibun | 0:0b921803a9ba | 62 | if(maxV < V){maxV = V;} |
leibun | 0:0b921803a9ba | 63 | if(maxC < C){maxC = C;} |
leibun | 0:0b921803a9ba | 64 | if(minW > W){minW = W;} |
leibun | 0:0b921803a9ba | 65 | if(minV > V){minV = V;} |
leibun | 0:0b921803a9ba | 66 | if(minC > C){minC = C;} |
leibun | 0:0b921803a9ba | 67 | totalW += W; |
leibun | 0:0b921803a9ba | 68 | totalV += V; |
leibun | 0:0b921803a9ba | 69 | totalC += C; |
leibun | 0:0b921803a9ba | 70 | |
leibun | 0:0b921803a9ba | 71 | if(count >= ROOP_CNT){ // 0.1[sec] * 1000 = 10[sec] |
leibun | 0:0b921803a9ba | 72 | pc.printf("AVG %7.2f [mV],%7.2f [mA], %f [mW]\r\n",totalV/ROOP_CNT ,totalC/ROOP_CNT ,totalW/ROOP_CNT); |
leibun | 0:0b921803a9ba | 73 | pc.printf("MIN %7.2f [mV],%7.2f [mA], %f [mW]\r\n",minV, minC, minW); |
leibun | 0:0b921803a9ba | 74 | pc.printf("MAX %7.2f [mV],%7.2f [mA], %f [mW]\r\n",maxV, maxC, maxW); |
leibun | 0:0b921803a9ba | 75 | |
leibun | 0:0b921803a9ba | 76 | postIFTTT(); |
leibun | 0:0b921803a9ba | 77 | |
leibun | 0:0b921803a9ba | 78 | // clear params. |
leibun | 0:0b921803a9ba | 79 | minW = DBL_MAX, maxW = 0.0, totalW = 0.0; |
leibun | 0:0b921803a9ba | 80 | minV = DBL_MAX, maxV = 0.0, totalV = 0.0; |
leibun | 0:0b921803a9ba | 81 | minC = DBL_MAX, maxC = 0.0, totalC = 0.0; |
leibun | 0:0b921803a9ba | 82 | count = 0; |
leibun | 0:0b921803a9ba | 83 | nextUpdateTime = 0.0f; |
leibun | 0:0b921803a9ba | 84 | timer.reset(); |
leibun | 0:0b921803a9ba | 85 | } |
leibun | 0:0b921803a9ba | 86 | } |
leibun | 0:0b921803a9ba | 87 | |
leibun | 0:0b921803a9ba | 88 | void initIFTTT(){ |
leibun | 0:0b921803a9ba | 89 | wifi.init(); //Reset |
leibun | 0:0b921803a9ba | 90 | wifi.connect(); //Use DHCP |
leibun | 0:0b921803a9ba | 91 | |
leibun | 0:0b921803a9ba | 92 | pc.printf("IP Address is %s \n\r", wifi.getIPAddress()); |
leibun | 0:0b921803a9ba | 93 | // Initialize ifttt object, add up to 3 optional values, trigger event. |
leibun | 0:0b921803a9ba | 94 | ifttt = new IFTTT(IFTTT_EVENT_NAME, IFTTT_SECRET_KEY, &socket); // EventName, Secret Key, socket to use |
leibun | 0:0b921803a9ba | 95 | } |
leibun | 0:0b921803a9ba | 96 | |
leibun | 0:0b921803a9ba | 97 | void initINA226PRC(){ |
leibun | 0:0b921803a9ba | 98 | pc.printf("VCmonitor INA226 TEST Program. (BUILD:[" __DATE__ "/" __TIME__ "])\r\n"); |
leibun | 0:0b921803a9ba | 99 | |
leibun | 0:0b921803a9ba | 100 | if(!VCmonitor.isExist()){ |
leibun | 0:0b921803a9ba | 101 | pc.printf("VCmonitor NOT FOUND\r\n"); |
leibun | 0:0b921803a9ba | 102 | while(1){} |
leibun | 0:0b921803a9ba | 103 | } |
leibun | 0:0b921803a9ba | 104 | pc.printf("VCmonitor FOUND\r\n"); |
leibun | 0:0b921803a9ba | 105 | |
leibun | 0:0b921803a9ba | 106 | unsigned short val = 0; |
leibun | 0:0b921803a9ba | 107 | if(VCmonitor.rawRead(0x00,&val) != 0){ |
leibun | 0:0b921803a9ba | 108 | pc.printf("VCmonitor READ ERROR\r\n"); |
leibun | 0:0b921803a9ba | 109 | while(1){} |
leibun | 0:0b921803a9ba | 110 | } |
leibun | 0:0b921803a9ba | 111 | pc.printf("VCmonitor Reg 0x00 : 0x%04x\r\n",val); |
leibun | 0:0b921803a9ba | 112 | |
leibun | 0:0b921803a9ba | 113 | VCmonitor.setCurrentCalibration(); |
leibun | 0:0b921803a9ba | 114 | } |
leibun | 0:0b921803a9ba | 115 | |
leibun | 0:0b921803a9ba | 116 | void init(){ |
leibun | 0:0b921803a9ba | 117 | pc.baud(9600); |
leibun | 0:0b921803a9ba | 118 | initIFTTT(); |
leibun | 0:0b921803a9ba | 119 | initINA226PRC(); |
leibun | 0:0b921803a9ba | 120 | timer.start(); |
leibun | 0:0b921803a9ba | 121 | } |
leibun | 0:0b921803a9ba | 122 | |
leibun | 0:0b921803a9ba | 123 | int main() { |
leibun | 0:0b921803a9ba | 124 | init(); |
leibun | 0:0b921803a9ba | 125 | |
leibun | 0:0b921803a9ba | 126 | while(1){ |
leibun | 0:0b921803a9ba | 127 | // wait |
leibun | 0:0b921803a9ba | 128 | while(timer.read() < nextUpdateTime){} |
leibun | 0:0b921803a9ba | 129 | record(); |
leibun | 0:0b921803a9ba | 130 | } |
leibun | 0:0b921803a9ba | 131 | } |