Simple IoT boardと電力計測モジュールINA226PRCを使ったサンプルプログラムです。計測したデータをIFTTTのMakerチャネルに送っています。 サンプリングは0.1秒刻みで、10秒間(100回計測)したら電圧、電流、電力それぞれについて平均、最大値、最小値を計算してIFTTTに送る仕様になっています。

Dependencies:   INA226PRC SimpleIoTBoardLib mbed

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?

UserRevisionLine numberNew 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 }