ESP8266で家の消費電力を計測する
前にラズパイやArduino+ESP8266で作ったりと遠回りしてきたけど、このほど最終的にESP8266オンリーでくみ上げました。なぜなら、Arduino+ESP8266だとたまーに止まっていて、WDTで再起動させてもESP8266のモデムがうまく動作してないことがあったためです。
データベースサーバーの確保は前の記事と同じなので割愛します。
回路図
Arduinoを使わないため、ロジック変換機や5V電源の引き回しが不要となりすっきり組めます。
スケッチ
スケッチもArduino編のものを踏襲しています。若干HTTPClientの使い方が変わっていますがGETリクエストをset_power.phpに送るのは同じです。set_power.phpはArduino編に掲載してあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <Adafruit_ADS1X15.h> #include <Wire.h> //ネットワーク const char* ssid = "SSID"; const char* password = "password"; // 静的IPアドレス(XXを好きなものに変える。DHCPでもOK) IPAddress ip(192, 168, 10, XX); IPAddress gateway(192,168, 10, 1); IPAddress subnet(255, 255, 255, 0); IPAddress DNS(192, 168, 10, 1); Adafruit_ADS1115 ads; const float FACTOR = 30; //30A/1V const float multiplier = 0.03125F * 1.27; float ch01_current,ch23_current; long loop_time = millis(); void connectWifi(){ // Connect to Wi-Fi WiFi.mode(WIFI_STA); WiFi.config(ip, gateway, subnet, DNS); delay(100); WiFi.begin(ssid, password); Serial.print("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } ESP.wdtFeed(); Serial.println(""); Serial.println(WiFi.localIP()); } void setup() { Serial.begin(115200); Serial.println(""); Serial.println("Initializing..."); //I2C初期化 Wire.begin(0,2); //wifi接続 connectWifi(); //ADS1115の初期化 ads.setGain(GAIN_FOUR); if (!ads.begin()) { Serial.println("Failed to initialize ADS."); ESP.restart(); } } void getRMS(){ float voltage,voltage2; float corriente,corriente2; float sum = 0,sum2 = 0; long timepo = millis(); int counter = 0; while(millis() - timepo < 5000){ //WDT Reset回避 yield(); //ch0-1計測 voltage = ads.readADC_Differential_0_1() * multiplier; corriente = voltage * FACTOR; corriente /= 1000.0; sum += sq(corriente); //ch2-3計測 voltage2 = ads.readADC_Differential_2_3() * multiplier; corriente2 = voltage2 * FACTOR; corriente2 /= 1000.0; sum2 += sq(corriente2); counter = counter + 1; } corriente = sqrt(sum / counter); corriente2 = sqrt(sum2 / counter); ch01_current = corriente; ch23_current = corriente2; } void printMeasure(String prefix, float value, String postfix){ Serial.print(prefix); Serial.print(value,3); Serial.println(postfix); } // 電力データ送信 php経由 --------------------------------------------------- bool sendpower(String url) { if(WiFi.status() != WL_CONNECTED) { Serial.println("Wifi is disable"); ESP.restart(); while(1){ delay(100); } } WiFiClient client; HTTPClient http; http.begin(client,url); http.setTimeout(5000); int httpCode = http.GET(); Serial.print("httpCode:"); Serial.println(httpCode); char res = http.getString().charAt(0); http.end(); if(httpCode==200){ Serial.println("Send OK"); Serial.println(res); Serial.println("---end"); return true; }else{ Serial.println("Send Failed"); return false; } } void loop() { wdt_enable(WDTO_8S); getRMS(); float ch01_power = ch01_current * 100; float ch23_power = ch23_current * 100; long pass_time = millis() - loop_time; loop_time = millis(); float ch01_watthour = (ch01_power * pass_time) / 3600000; float ch23_watthour = (ch23_power * pass_time) / 3600000; printMeasure("CH01_POWER: ",ch01_power,"W"); printMeasure("CH01_WHour: ",ch01_watthour,"Wh"); printMeasure("CH23_POWER: ",ch23_power,"W"); printMeasure("CH23_WHour: ",ch23_watthour,"Wh"); printMeasure("TIME: ",pass_time,"mSec"); char ch01_power_st[20]; char ch23_power_st[20]; char ch01_watthour_st[20]; char ch23_watthour_st[20]; dtostrf(ch01_power, 0, 6,ch01_power_st); dtostrf(ch23_power, 0, 6,ch23_power_st); dtostrf(ch01_watthour, 0, 6,ch01_watthour_st); dtostrf(ch23_watthour, 0, 6,ch23_watthour_st); // 192.168.10.21の81ポート set_power.phpへGETリクエスト char url[250]; sprintf(url, "http://192.168.10.20:81/set_power.php?ch01_power=%s&ch23_power=%s&ch01_watthour=%s&ch23_watthour=%s",ch01_power_st,ch23_power_st,ch01_watthour_st,ch23_watthour_st); Serial.println(url); sendpower(url); wdt_reset(); wdt_disable(); } |
完成と運用
SCT-013とは100均のヘットフォン延長コードを切断して利用しています。また、USBコネクタは給電用で接続しています。大分すっきりし、安定して動作するようになりました。