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

Dependencies:   INA226PRC SimpleIoTBoardLib mbed

main.cpp

Committer:
leibun
Date:
2015-12-09
Revision:
1:0dc207174476
Parent:
0:0b921803a9ba

File content as of revision 1:0dc207174476:

#include "mbed.h"
#include "ESP8266Interface.h"
#include "TCPSocketConnection.h"
#include "ifttt.h"
#include "INA226.hpp"
#include "float.h"
#include "SoftSerialSendOnry.h"

// ROOP_CNT * SAMPLING[sec] = 1ROOP_TIME[sec]
#define ROOP_CNT 100
#define SAMPLING 0.1

// Please change your enviroment.
const char WIFI_SSID[] = "ssid";
const char WIFI_PASSWORD[] = "password";
const char IFTTT_EVENT_NAME[] = "event_name";
const char IFTTT_SECRET_KEY[] = "secret_key";

// WIFI setting
ESP8266Interface wifi(dp16, dp15, dp4, WIFI_SSID, WIFI_PASSWORD, 115200); // TX,RX,Reset,SSID,Password,Baud
TCPSocketConnection socket;
IFTTT *ifttt;

//Serial pc(USBTX,USBRX);
SoftSerialSendOnry pc(dp10);
I2C i2c(dp5, dp27);
INA226 VCmonitor(i2c);

// Timer
Timer timer;
float nextUpdateTime = 0.0f;

// Data params
double minW = DBL_MAX, maxW = 0.0, totalW = 0.0; // Power[mW]
double minV = DBL_MAX, maxV = 0.0, totalV = 0.0; // Voltage[mV]
double minC = DBL_MAX, maxC = 0.0, totalC = 0.0; // Current[mA]
unsigned int count = 0;

void postIFTTT(){
    char postData[128];
    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);
    pc.printf("postData:%s\r\n",postData);
    ifttt->addIngredients(postData);
    ifttt->trigger(IFTTT_POST);
}

void record(){
    nextUpdateTime += SAMPLING;
    double V,C,W;
    if((VCmonitor.getVoltage(&V) != 0) || (VCmonitor.getCurrent(&C) != 0)){
        pc.printf("Error:VCmonitor does not get voltage or current.\r\n");
        return;
    }
    count++;
    
    // Calculate power.
    W = V * C * 0.001;//[mW]
//    pc.printf("%7.2f [mV],%7.2f [mA], %f [mW]\r\n",V ,C ,W);
    
    // update Max ,Min and Average
    if(maxW < W){maxW = W;}
    if(maxV < V){maxV = V;}
    if(maxC < C){maxC = C;}
    if(minW > W){minW = W;}
    if(minV > V){minV = V;}
    if(minC > C){minC = C;}
    totalW += W;
    totalV += V;
    totalC += C;

    if(count >= ROOP_CNT){ // 0.1[sec] * 1000 = 10[sec]
        pc.printf("AVG %7.2f [mV],%7.2f [mA], %f [mW]\r\n",totalV/ROOP_CNT ,totalC/ROOP_CNT ,totalW/ROOP_CNT);
        pc.printf("MIN %7.2f [mV],%7.2f [mA], %f [mW]\r\n",minV, minC, minW);
        pc.printf("MAX %7.2f [mV],%7.2f [mA], %f [mW]\r\n",maxV, maxC, maxW);
        
        postIFTTT();

        // clear params.
        minW = DBL_MAX, maxW = 0.0, totalW = 0.0;
        minV = DBL_MAX, maxV = 0.0, totalV = 0.0;
        minC = DBL_MAX, maxC = 0.0, totalC = 0.0;
        count = 0;
        nextUpdateTime = 0.0f;
        timer.reset();
    }
}

void initIFTTT(){
    wifi.init(); //Reset
    wifi.connect(); //Use DHCP
    
    pc.printf("IP Address is %s \n\r", wifi.getIPAddress());
    // Initialize ifttt object, add up to 3 optional values, trigger event. 
    ifttt = new IFTTT(IFTTT_EVENT_NAME, IFTTT_SECRET_KEY, &socket); // EventName, Secret Key, socket to use    
}

void initINA226PRC(){
    pc.printf("VCmonitor INA226 TEST Program. (BUILD:[" __DATE__ "/" __TIME__ "])\r\n");

    if(!VCmonitor.isExist()){
        pc.printf("VCmonitor NOT FOUND\r\n");
        while(1){}
    }
    pc.printf("VCmonitor FOUND\r\n");

    unsigned short val = 0;
    if(VCmonitor.rawRead(0x00,&val) != 0){
        pc.printf("VCmonitor READ ERROR\r\n");
        while(1){}
    }
    pc.printf("VCmonitor Reg 0x00 : 0x%04x\r\n",val);

    VCmonitor.setCurrentCalibration();
}

void init(){
    pc.baud(9600);
    initIFTTT();
    initINA226PRC();
    timer.start();
}

int main() {
    init();
    
    while(1){
        // wait
        while(timer.read() < nextUpdateTime){}
        record();
    }
}