#include "ZMPT101B.h"
#include "ACS712.h"
#include
#include
#include
#include
ZMPT101B voltageSensor(34);
ACS712 currentSensor(ACS712_20A, 36);
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
float P=0;
float U=0;
float I=0;
long dt=0;
float CulmPwh=0;
float units=0;
long changeScreen=0;
float lastSample=0;
unsigned long lasttime=0;
long ScreenSelect = 0;
void setup()
{
Serial.begin(9600);
delay(100);
voltageSensor.setSensitivity(0.0025);
voltageSensor.setZeroPoint(2621);
currentSensor.setZeroPoint(2943);
currentSensor.setSensitivity(0.15);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); }
// Clear the buffer
display.clearDisplay();
display.display();
//Caliberation Commands Need To Be Run On First Upload.
//CalibCurrent();
//CalibVoltage();
}
void loop()
{
// To measure voltage/current we need to know the frequency of voltage/current
// By default 50Hz is used, but you can specify desired frequency
// as first argument to getVoltageAC and getCurrentAC() method, if necessary
U = voltageSensor.getVoltageAC();
if(U<55)
{
U=0;
CulmPwh=0;
}
I = currentSensor.getCurrentAC();
dt = micros()- lastSample;
if(I<0.15)
{
I=0;
CulmPwh=0;
}
// To calculate the power we need voltage multiplied by current
P = U * I;
CulmPwh = CulmPwh + P*(dt/3600);///uWh
units= CulmPwh/1000;
if(millis()-changeScreen>5000)
{
ScreenSelect+=1;
changeScreen=millis();
}
if(millis()-lasttime>500)
{
if((ScreenSelect%4)==0)
{ displayVoltCurrent(); }//Volts and Current
else if( (ScreenSelect%4)==1)
{ displayInstPower(); }//Instantaenous Power
else if( (ScreenSelect%4)==2)
{ displayEnergy(); } //Energy
else if( (ScreenSelect%4)==3)
{ displayUnits(); } //Units
}
lastSample=micros();
}
CalibCurrent();
CalibVoltage();
displayVoltCurrent();
displayInstPower();
displayEnergy();
displayUnits();
displayCenter(String,Position);
void displayVoltCurrent()
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
void displayVoltCurrent()
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(3);
displayCenter(String(U)+"V",3);
display.setTextSize(3);
displayCenter(String(I)+"A",33);
display.display();
lasttime=millis();
}
void displayInstPower()
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
displayCenter("Power",3);
display.setTextSize(3);
if(P>1000)
{
displayCenter(String(P/1000)+"kW",30);
}
else
{
displayCenter(String(P)+"W",30);
}
display.display();
lasttime=millis();
}
void displayEnergy()
{
display.clearDisplay();
display.setTextColor(WHITE);
if(CulmPwh>1000000000)
{
display.setTextSize(2);
displayCenter("Energy kWh",3);
display.setTextSize(3);
displayCenter(String(CulmPwh/1000000000),30);
}
else if(CulmPwh<1000000000 && CulmPwh>1000000)
{
display.setTextSize(2);
displayCenter("Energy Wh",3);
display.setTextSize(3);
displayCenter(String(CulmPwh/1000000),30);
}
else if(CulmPwh<1000000 && CulmPwh>1000)
{
display.setTextSize(2)
displayCenter("Energy mWh",3);
display.setTextSize(3);
displayCenter(String(CulmPwh/1000),30);
}
else
{
display.setTextSize(2);
displayCenter("Energy uWh",3);
display.setTextSize(3);
displayCenter(String(CulmPwh),30);
}
display.display();
lasttime=millis();
}
void displayUnits()
{
display.clearDisplay();
display.setTextColor(WHITE);
if(units>1000000)
{
display.setTextSize(2);
displayCenter("Units",3);
display.setTextSize(3);
displayCenter(String(units/1000000),30);
}
else if(units<1000000 && units>1000)
{
display.setTextSize(2);
displayCenter("MilliUnits",3);
display.setTextSize(3);
displayCenter(String(units/1000),30);
}
else
{
display.setTextSize(2);
displayCenter("MicroUnits",3);
display.setTextSize(3);
displayCenter(String(units),30);
}
display.display();
lasttime=millis();
}
void CalibCurrent()
{
while(1)
{
currentSensor.calibrate();
Serial.print("Zero Point Current :");
Serial.println(currentSensor.getZeroPoint());
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("Current Zero Point :");
display.setCursor(0,20);
display.setTextSize(2);
display.print(currentSensor.getZeroPoint());
display.display();
delay(500);
}
}
void CalibVoltage()
{
while(1)
{
voltageSensor.calibrate();
Serial.print("Zero Point Voltage :");
Serial.println(voltageSensor.getZeroPoint());
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("Voltage Zero Point :");
display.setCursor(0,20);
display.setTextSize(2);
display.print(voltageSensor.getZeroPoint());
display.display();
delay(500);
}
}
void displayCenter(String text, int line)
{
int16_t x1;
int16_t y1;
uint16_t width;
uint16_t height;
display.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);
// display on horizontal center
display.setCursor((SCREEN_WIDTH - width) / 2, line);
display.println(text); // text to display
display.display();
}

Smart Energy Metter en utilisant le résumé du projet IoT et le référentiel GitHub
Ce projet de compteur d’énergie intelligent basé sur l’IoT montre comment l’ESP32 peut être utilisé pratiquement pour créer des solutions de surveillance de consommation d’énergie intelligentes. Tous les matériaux dont vous avez besoin pour construire votre système de surveillance de l’énergie sont disponibles dans notre référentiel GitHub, y compris les schémas de circuit, le code source et les instructions d’assemblage.
⇥ Qu’est-ce qu’un compteur d’énergie intelligent basé sur ESP32?
Un compteur d’énergie intelligent ESP32 est un gadget Internet des objets à faire soi-même qui suit l’utilisation d’énergie des appareils électriques en temps réel. Il mesure les paramètres électriques comme la tension, le courant, la puissance et la consommation d’énergie à l’aide d’un microcontrôleur ESP32, des capteurs de tension (ZMPT101B) et des capteurs de courant (ACS712).
⇥ Est-il possible d’utiliser ce dispositif de surveillance d’énergie ESP32 avec des normes de tension autres que 110 V et 220 V?
Il est possible d’adapter ce dispositif de surveillance de la consommation d’énergie basée sur ESP32 aux systèmes 110 V et 220 V. Avec une plage d’entrée de 80V à 380 V AC, le capteur de tension ZMMPT101B est approprié pour un certain nombre de normes internationales.
⇥ Quelles bibliothèques Arduino sont nécessaires pour ce projet impliquant la surveillance de l’énergie IoT?
Une bibliothèque ZMMPT101B personnalisée pour la détection de tension, la bibliothèque ACS712 pour la mesure actuelle et l’ADAFruit GFX et Adafruit SSD1306 pour le contrôle d’affichage OLED sont tous nécessaires pour le compteur d’énergie intelligent à l’aide du projet IOT. Pour la communication I2C, vous aurez également besoin de Wire.h et Spi.h, qui est préinstallé avec l’Arduino IDE.
Découvrez des projets de bricolage similaires à un dispositif de surveillance à l’aide d’ESP32


Dispositif de surveillance du sol basé sur l’IoT à l’aide d’ESP32, DHT11 et MQ135
Pour mettre en œuvre ce projet, nous utilisons un ESP32 comme contrôleur principal ainsi que des capteurs qui nous diront les conditions environnementales, et ils sont DHT11 pour la température et l’humidité, le capteur d’humidité du sol capacitif, le LDR pour l’intensité légère, le MQ135 pour la surveillance de l’indice de la qualité de l’air.

Retrouvez l’histoire de Raspberry Pi dans cette vidéo :

-
Sumsoctober Pour Tuya Compteur d'énergie WiFi 2 voies Bidirectionnel 1/2 Canal Avec Pince App Monito Pour Facteur de Puissance Et Fréquence Pour Analyse de Consommation (1 Voie)
-
Vinabo Wattmètre Prise Compteur d'Énergie, Consommation avec 7 Modes Surveillance,Prise Consommation Electrique pour Économie d'Energie,Écran LCD Rétroéclairé
