Components and supplies
ESP8266 ESP-12E
HC-06 Bluetooth Module
Apps and platforms
Arduino IDE
Project description
Code
Main code
arduino
1#include <ESP8266WiFi.h> 2#include <WebSocketsServer.h> 3#include <ESP8266WebServer.h> 4#include "ESP8266HTTPUpdateServer.h" 5#include "ADE7753.h" 6#include <SPI.h> 7#include <Math.h> 8#include "Main_Webpage.h" 9 10#define SPI_Speed 1000000 //SPI Speed 11#define CS_Pin D8 //GPIO15 SPI_Chip Select Pin 12#define IRQPin D4 //IRQ Notify Pin on ESP8266 13 14const char* ssid = "XXXX"; 15const char* password = "XXXX"; 16 17ADE7753 myADE(CS_Pin); 18 19const char* host = "my_powermeter"; 20const char* update_path = "/firmware"; 21const char* update_username = "admin"; 22const char* update_password = "admin"; 23 24signed long WAVE_VAL [128]; 25long voltaje_A=0; 26long v_real=0; 27String v_string="", v_comp="", v_int="", v_dec=""; 28long corriente_A=0; 29long i_real=0; 30String i_string="", i_comp="", i_int="", i_dec=""; 31byte temp_val=0; 32long freq_val=0; 33long freq_real=0; 34String freq_string="", freq_comp="", freq_int="", freq_dec=""; 35String REG_DATA; 36signed int activa=0, reactiva=0, aparente=0; 37volatile byte wave_flag=false; 38volatile int wave_counter=0; 39 40unsigned long last; 41int inputVal; 42float voltVal; 43float voltValPrev = 0 ; 44String myString; 45 46String Voltage,Current,P_Power,S_Power,Q_Power,THDV,THDI,Temp,PF,WaveForm; 47 48 49ESP8266WebServer server (80); 50ESP8266HTTPUpdateServer httpUpdater; 51WebSocketsServer webSocket = WebSocketsServer(81); 52 53void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { 54 switch(type) { 55 case WStype_CONNECTED: {IPAddress ip = webSocket.remoteIP(num);webSocket.sendTXT(num,myString);}break; 56 case WStype_DISCONNECTED:break; 57 case WStype_TEXT:break; 58 case WStype_ERROR:break; 59 } 60} 61 62void set_ScreenHead(){ 63 REG_DATA=""; 64 REG_DATA=REG_DATA+String(myADE.read16bits(MODE))+'-'; 65 REG_DATA=REG_DATA+String(myADE.read16bits(LINECYC))+'-'; 66 REG_DATA=REG_DATA+String(myADE.read8bits(GAIN))+'-'; 67 REG_DATA=REG_DATA+String(myADE.read16bits(IRQEN)); 68 Serial.println(REG_DATA); 69} 70void get_Voltage(){ 71 myADE.write16(MODE, 0x8C); //Cycle energy accumulation Mode 72 set_ScreenHead(); 73 voltaje_A = myADE.getVRMS(10); 74 v_real=voltaje_A*449/1000; 75 v_comp= String(v_real); 76 v_dec= v_comp.substring(v_comp.length()-3); 77 v_int= v_comp; 78 v_int.replace(v_dec,""); 79 v_string=v_int + '.' + v_dec; 80 delay(0); 81} 82 83void get_Current(){ 84 myADE.write16(MODE, 0x8C); //Cycle energy accumulation Mode 85 set_ScreenHead(); 86 corriente_A = myADE.getIRMS(10); 87 i_real=corriente_A*449/1000; 88 i_comp= String(i_real); 89 i_dec= i_comp.substring(i_comp.length()-3); 90 i_int= i_comp; 91 i_int.replace(i_dec,""); 92 i_string=i_int + '.' + i_dec; 93 delay(0); 94} 95 96void get_Temp(){ 97 temp_val = myADE.read8bits(TEMP); 98 temp_val=(temp_val-222)*3+25; //If Chip produce value of 222 at 25°C 99 //------------------------------ 100 freq_val = myADE.read16bits(PERIOD); 101 freq_real=freq_val; 102 freq_comp= String(freq_real); 103 freq_dec= freq_comp.substring(freq_comp.length()-3); 104 freq_int= freq_comp; 105 freq_int.replace(freq_dec,""); 106 freq_string=freq_int + '.' + freq_dec + "Hz"; 107 delay(0); 108} 109 110 111void setup() { 112 pinMode(IRQPin, INPUT_PULLUP); 113 pinMode(CS_Pin, OUTPUT); 114 myADE.Start(SPI_Speed,CS_Pin); 115 digitalWrite (CS_Pin,LOW); 116 delay(10); 117 attachInterrupt(IRQPin,readWaveReg_I,FALLING); 118 myADE.write16(MODE, 0x8C); //Cycle energy accumulation Mode 119 myADE.write16(LINECYC, 0x78); //120 half-cycles to power accumulation 120 myADE.write8(GAIN, 0x00); //0.5V max per chanel 121 delay(10); 122 123 Serial.begin(115200); 124 Serial.println(); 125 126 WiFi.mode(WIFI_STA); //para que no inicie el SoftAP en el modo normal 127 WiFi.begin(ssid, password); 128 while (WiFi.status() != WL_CONNECTED) {delay(500); Serial.print(".");} 129 delay(0); 130 Serial.println(""); 131 Serial.print("IP address: "); 132 Serial.println(WiFi.localIP()); 133 134 webSocket.begin(); 135 webSocket.onEvent(webSocketEvent); 136 server.on("/", []() {server.send_P(200, "text/html", main_webpage);}); 137 httpUpdater.setup(&server, update_path, update_username, update_password); 138 server.begin(); 139} 140 141void loop() { 142 webSocket.loop(); 143 server.handleClient(); 144 if ((millis()-last) > 500) { 145 last = millis(); 146 get_Voltage(); 147 get_Current(); 148 if (wave_flag==false){ 149 WaveForm=""; 150 for(int a=0;a<128;a++){WaveForm=WaveForm+"$"+String(WAVE_VAL[a]*128/1950);} 151 get_WAVE_V(); 152 } 153 myString = String(v_string)+"#"+String(i_real) 154 +"#"+String(activa)+"#"+String(reactiva) 155 +"#"+String(aparente)+"#"+String(6*voltVal) 156 +"#"+String(7*voltVal)+"#"+String(8*voltVal) 157 +"#"+String(temp_val)+"#"+String(10*voltVal) 158 +"#"+String(11*voltVal)+"#"+String(12*voltVal) 159 +"#"+String(13*voltVal)+"#"+String(14*voltVal) 160 +"#"+String(15*voltVal)+"#"+String(freq_real)+"#"+String(REG_DATA)+"#"+WaveForm; 161 webSocket.broadcastTXT(myString); 162 Serial.println(myString); 163 } 164}
ADE7753 Library
arduino
1#include "Arduino.h" 2#ifndef ADE7753_h 3#define ADE7753_h 4 5#define WRITE 0x80 //0x80 = b10000000 voor te schrijven moet BT7 1 zijn 6 7#define MODE 0x09 //16B R/W U 8#define LINECYC 0x1C //16B R/W U 9#define GAIN 0x0F //08B R/W U 10#define IRQEN 0x0A //16B R/W U 11#define STATUS 0x0B //16B R U 12#define RSTSTATUS 0x0C //16B R U 13 14#define WAVEFORM 0x01 //24B R S 15#define IRMS 0x16 //24B R U 16#define VRMS 0x17 //24B R U 17#define TEMP 0x26 //08B R U 18#define PERIOD 0x27 //16B R U 19 20#define LAENERGY 0x04 //24B R U 21 22//-----------CONSTANTS----------------- 23#define ZX 0x10 //Indicates ZX event in STATUS REG 24#define WSMP 0x08 //Indicates WAVEFORM event in STATUS REG 25 26 27class ADE7753{ 28 public: 29 ADE7753(int _CS); 30 void Start(uint32_t SPI_speed , uint8_t chipSelect_Pin); 31 long getVRMS(); 32 long getInterruptStatus(); 33 long getResetInterruptStatus(); 34 35 //Later in private te plaatsen 36 unsigned char read8bits(char reg); 37 unsigned int read16bits(char reg); 38 unsigned long read24bits(char reg); 39 40 //write methodes, later ook in private plaatsen 41 void write8(char reg, unsigned char data); 42 void write16(char reg, unsigned int data); 43 void write24(char reg, unsigned long data); 44 45 private: 46 int CS; 47 48 void enable(); 49 void disable(); 50 void calibrateOffset(char phase); 51 52 53}; 54#endif
Main code
arduino
1#include <ESP8266WiFi.h> 2#include <WebSocketsServer.h> 3 4#include <ESP8266WebServer.h> 5#include 6 "ESP8266HTTPUpdateServer.h" 7#include "ADE7753.h" 8#include <SPI.h> 9#include 10 <Math.h> 11#include "Main_Webpage.h" 12 13#define SPI_Speed 1000000 //SPI Speed 14#define 15 CS_Pin D8 //GPIO15 SPI_Chip Select Pin 16#define IRQPin D4 //IRQ 17 Notify Pin on ESP8266 18 19const char* ssid = "XXXX"; 20const char* password 21 = "XXXX"; 22 23ADE7753 myADE(CS_Pin); 24 25const char* host = "my_powermeter"; 26const 27 char* update_path = "/firmware"; 28const char* update_username = "admin"; 29const 30 char* update_password = "admin"; 31 32signed long WAVE_VAL [128]; 33long voltaje_A=0; 34long 35 v_real=0; 36String v_string="", v_comp="", v_int="", v_dec=""; 37long 38 corriente_A=0; 39long i_real=0; 40String i_string="", i_comp="", i_int="", 41 i_dec=""; 42byte temp_val=0; 43long freq_val=0; 44long freq_real=0; 45String 46 freq_string="", freq_comp="", freq_int="", freq_dec=""; 47String REG_DATA; 48signed 49 int activa=0, reactiva=0, aparente=0; 50volatile byte wave_flag=false; 51volatile 52 int wave_counter=0; 53 54unsigned long last; 55int 56 inputVal; 57float voltVal; 58float 59 voltValPrev = 0 ; 60String myString; 61 62String 63 Voltage,Current,P_Power,S_Power,Q_Power,THDV,THDI,Temp,PF,WaveForm; 64 65 66ESP8266WebServer 67 server (80); 68ESP8266HTTPUpdateServer httpUpdater; 69WebSocketsServer webSocket 70 = WebSocketsServer(81); 71 72void webSocketEvent(uint8_t num, WStype_t type, uint8_t 73 * payload, size_t length) { 74 75 switch(type) { 76 case WStype_CONNECTED: {IPAddress 77 ip = webSocket.remoteIP(num);webSocket.sendTXT(num,myString);}break; 78 79 case WStype_DISCONNECTED:break; 80 case WStype_TEXT:break; 81 82 case WStype_ERROR:break; 83 } 84} 85 86void set_ScreenHead(){ 87 88 REG_DATA=""; 89 REG_DATA=REG_DATA+String(myADE.read16bits(MODE))+'-'; 90 91 REG_DATA=REG_DATA+String(myADE.read16bits(LINECYC))+'-'; 92 REG_DATA=REG_DATA+String(myADE.read8bits(GAIN))+'-'; 93 94 REG_DATA=REG_DATA+String(myADE.read16bits(IRQEN)); 95 Serial.println(REG_DATA); 96} 97void 98 get_Voltage(){ 99 myADE.write16(MODE, 0x8C); //Cycle 100 energy accumulation Mode 101 set_ScreenHead(); 102 voltaje_A = myADE.getVRMS(10); 103 104 v_real=voltaje_A*449/1000; 105 v_comp= String(v_real); 106 v_dec= v_comp.substring(v_comp.length()-3); 107 108 v_int= v_comp; 109 v_int.replace(v_dec,""); 110 v_string=v_int + '.' + v_dec; 111 112 delay(0); 113} 114 115void get_Current(){ 116 myADE.write16(MODE, 0x8C); //Cycle 117 energy accumulation Mode 118 set_ScreenHead(); 119 corriente_A = myADE.getIRMS(10); 120 121 i_real=corriente_A*449/1000; 122 i_comp= String(i_real); 123 i_dec= i_comp.substring(i_comp.length()-3); 124 125 i_int= i_comp; 126 i_int.replace(i_dec,""); 127 i_string=i_int + '.' + i_dec; 128 129 delay(0); 130} 131 132void get_Temp(){ 133 temp_val = myADE.read8bits(TEMP); 134 135 temp_val=(temp_val-222)*3+25; //If Chip produce value of 136 222 at 25°C 137 //------------------------------ 138 freq_val = myADE.read16bits(PERIOD); 139 140 freq_real=freq_val; 141 freq_comp= String(freq_real); 142 freq_dec= freq_comp.substring(freq_comp.length()-3); 143 144 freq_int= freq_comp; 145 freq_int.replace(freq_dec,""); 146 freq_string=freq_int 147 + '.' + freq_dec + "Hz"; 148 delay(0); 149} 150 151 152void setup() { 153 pinMode(IRQPin, 154 INPUT_PULLUP); 155 pinMode(CS_Pin, OUTPUT); 156 myADE.Start(SPI_Speed,CS_Pin); 157 158 digitalWrite (CS_Pin,LOW); 159 delay(10); 160 attachInterrupt(IRQPin,readWaveReg_I,FALLING); 161 162 myADE.write16(MODE, 0x8C); //Cycle energy accumulation Mode 163 myADE.write16(LINECYC, 164 0x78); //120 half-cycles to power accumulation 165 myADE.write8(GAIN, 0x00); 166 //0.5V max per chanel 167 delay(10); 168 169 Serial.begin(115200); 170 171 Serial.println(); 172 173 WiFi.mode(WIFI_STA); //para que no inicie el SoftAP 174 en el modo normal 175 WiFi.begin(ssid, password); 176 while (WiFi.status() != 177 WL_CONNECTED) {delay(500); Serial.print(".");} 178 delay(0); 179 Serial.println(""); 180 181 Serial.print("IP address: "); 182 Serial.println(WiFi.localIP()); 183 184 185 webSocket.begin(); 186 webSocket.onEvent(webSocketEvent); 187 server.on("/", 188 []() {server.send_P(200, "text/html", main_webpage);}); 189 httpUpdater.setup(&server, 190 update_path, update_username, update_password); 191 server.begin(); 192} 193 194void 195 loop() { 196 webSocket.loop(); 197 server.handleClient(); 198 199 if ((millis()-last) > 500) { 200 last = millis(); 201 get_Voltage(); 202 203 get_Current(); 204 if (wave_flag==false){ 205 WaveForm=""; 206 for(int 207 a=0;a<128;a++){WaveForm=WaveForm+"$"+String(WAVE_VAL[a]*128/1950);} 208 get_WAVE_V(); 209 210 } 211 myString = String(v_string)+"#"+String(i_real) 212 +"#"+String(activa)+"#"+String(reactiva) 213 214 +"#"+String(aparente)+"#"+String(6*voltVal) 215 +"#"+String(7*voltVal)+"#"+String(8*voltVal) 216 217 +"#"+String(temp_val)+"#"+String(10*voltVal) 218 +"#"+String(11*voltVal)+"#"+String(12*voltVal) 219 220 +"#"+String(13*voltVal)+"#"+String(14*voltVal) 221 +"#"+String(15*voltVal)+"#"+String(freq_real)+"#"+String(REG_DATA)+"#"+WaveForm; 222 223 webSocket.broadcastTXT(myString); 224 Serial.println(myString); 225 226 } 227}
ADE7753 Library
arduino
1#include "Arduino.h" 2#ifndef ADE7753_h 3#define ADE7753_h 4 5#define WRITE 0x80 //0x80 = b10000000 voor te schrijven moet BT7 1 zijn 6 7#define MODE 0x09 //16B R/W U 8#define LINECYC 0x1C //16B R/W U 9#define GAIN 0x0F //08B R/W U 10#define IRQEN 0x0A //16B R/W U 11#define STATUS 0x0B //16B R U 12#define RSTSTATUS 0x0C //16B R U 13 14#define WAVEFORM 0x01 //24B R S 15#define IRMS 0x16 //24B R U 16#define VRMS 0x17 //24B R U 17#define TEMP 0x26 //08B R U 18#define PERIOD 0x27 //16B R U 19 20#define LAENERGY 0x04 //24B R U 21 22//-----------CONSTANTS----------------- 23#define ZX 0x10 //Indicates ZX event in STATUS REG 24#define WSMP 0x08 //Indicates WAVEFORM event in STATUS REG 25 26 27class ADE7753{ 28 public: 29 ADE7753(int _CS); 30 void Start(uint32_t SPI_speed , uint8_t chipSelect_Pin); 31 long getVRMS(); 32 long getInterruptStatus(); 33 long getResetInterruptStatus(); 34 35 //Later in private te plaatsen 36 unsigned char read8bits(char reg); 37 unsigned int read16bits(char reg); 38 unsigned long read24bits(char reg); 39 40 //write methodes, later ook in private plaatsen 41 void write8(char reg, unsigned char data); 42 void write16(char reg, unsigned int data); 43 void write24(char reg, unsigned long data); 44 45 private: 46 int CS; 47 48 void enable(); 49 void disable(); 50 void calibrateOffset(char phase); 51 52 53}; 54#endif
ADE7753 Library
arduino
1#include "Arduino.h" 2#ifndef ADE7753_h 3#define ADE7753_h 4 5#define 6 WRITE 0x80 //0x80 = b10000000 voor te schrijven moet BT7 1 zijn 7 8#define MODE 9 0x09 //16B R/W U 10#define LINECYC 0x1C //16B R/W U 11#define 12 GAIN 0x0F //08B R/W U 13#define IRQEN 0x0A //16B R/W U 14#define 15 STATUS 0x0B //16B R U 16#define RSTSTATUS 0x0C //16B R U 17 18#define 19 WAVEFORM 0x01 //24B R S 20#define IRMS 0x16 //24B R U 21#define 22 VRMS 0x17 //24B R U 23#define TEMP 0x26 //08B R U 24#define 25 PERIOD 0x27 //16B R U 26 27#define LAENERGY 0x04 //24B R U 28 29//-----------CONSTANTS----------------- 30#define 31 ZX 0x10 //Indicates ZX event in STATUS REG 32#define WSMP 0x08 33 //Indicates WAVEFORM event in STATUS REG 34 35 36class ADE7753{ 37 public: 38 39 ADE7753(int _CS); 40 void Start(uint32_t SPI_speed , uint8_t chipSelect_Pin); 41 42 long getVRMS(); 43 long getInterruptStatus(); 44 long getResetInterruptStatus(); 45 46 47 //Later in private te plaatsen 48 unsigned char read8bits(char reg); 49 50 unsigned int read16bits(char reg); 51 unsigned long read24bits(char reg); 52 53 54 //write methodes, later ook in private plaatsen 55 void write8(char 56 reg, unsigned char data); 57 void write16(char reg, unsigned int data); 58 59 void write24(char reg, unsigned long data); 60 61 private: 62 int CS; 63 64 65 void enable(); 66 void disable(); 67 void calibrateOffset(char phase); 68 69 70 71}; 72#endif
Downloadable files
Circuit diagram
Circuit diagram
Circuit diagram
Circuit diagram
Documentation
PQduino Classic
PQduino Classic
PQduino Board
PQduino Board
PQduino Classic
PQduino Classic
PQduino Board
PQduino Board
Comments
Only logged in users can leave comments