-
-
Save oOtoOomyOo/c94a8f8da7937ba88f688ede0da1ca97 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <PZEM004T.h> | |
#include "RTClib.h" | |
#include "EEPROM.h" | |
#include <WiFi.h> | |
#include <WebServer.h> | |
#include <AutoConnect.h> | |
#include "SPIFFS.h" | |
const uint8_t SENSORS_MAX_NUMBER = 3; | |
const uint8_t NUMBER_OF_SELECTION_PIN = 3; | |
unsigned int DATA_SIZE; | |
WebServer Server; | |
AutoConnect Portal(Server); | |
RTC_DS3231 rtc; | |
DateTime now; | |
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; | |
String getDateAndTime(DateTime now); | |
String DateText(DateTime now); | |
String TimeText(DateTime now); | |
bool isSensorAvailable[SENSORS_MAX_NUMBER]; | |
bool loopLED = 0; | |
const int relayPin = 23; | |
const int buttonPin = 34; | |
const int wifiLED_pin = 2; | |
const int loopLED_pin = 2; | |
uint8_t sensorsSellectionPins[NUMBER_OF_SELECTION_PIN] = {19, 18, 5}; | |
uint8_t sellectedSensorAddress = B000000; | |
struct electricalValues | |
{ | |
double voltage; | |
double current; | |
double power; | |
double energy; | |
}; | |
struct Reading | |
{ | |
int ID; | |
char dateAndTime[20]; | |
electricalValues electricalReadings; | |
}; | |
struct RshedDevice | |
{ | |
unsigned int ID; | |
int availableSensorsNumber = 0; | |
Reading reading[SENSORS_MAX_NUMBER]; | |
}; | |
RshedDevice RD; | |
Reading previousReading[SENSORS_MAX_NUMBER]; | |
PZEM004T pzem(&Serial2); | |
IPAddress ip(192, 168, 1, 1); | |
const char *host = " some URL"; | |
// const char *host = " some URL"; | |
const int httpPort = 80; | |
WiFiClient client; | |
int count = 0; | |
// const char ssid [] = "STC_WiFi_D5EE"; // The SSID (name) of the Wi-Fi network you want to connect to | |
// const char password [] = "1222222224"; // The password of the Wi-Fi network | |
bool pzemrdy = false; | |
bool WiFiStatus = 0; | |
bool WiFiStatusIndicator = 0; | |
unsigned long previousMillis = 0; | |
unsigned long reCheckTime = 300000; | |
unsigned long reSendTime = 1800000; //3600000; | |
unsigned long previousMillisForSendData = 0; | |
double readCurrent(); | |
double readVoltage(); | |
double readPower(); | |
double readEnergy(); | |
double senddata(); | |
//test | |
void resizeArraySize(Reading *array, size_t array_size, size_t new_array_size); | |
int checkAndReturnAvailableSensors(); | |
void assignID(); | |
electricalValues getSensorReadings(int id); | |
void switchToSensorID(uint8_t id); | |
Reading getSensorsInformation(int ID); | |
void sendData(RshedDevice sendRD); | |
void rootPage() | |
{ | |
char content[] = "Hello, world"; | |
Server.send(200, "text/plain", content); | |
} | |
unsigned long reconnectingAtttempts; | |
bool atLeastSensorPluged = 0; | |
bool sensorStillPluged = 0; | |
int ID = 0; | |
int I = 0; | |
// int unsentReadingsNumber = 0; | |
int eeAddressStart = 10; | |
int eeAddress = eeAddressStart; //change location | |
void setup() | |
{ | |
Serial.println(); | |
Serial.println("VVVVVV Start void setup VVVVVV"); | |
Serial.begin(115200); | |
Server.on("/", rootPage); | |
if (Portal.begin()) | |
{ | |
Serial.println("HTTP server:" + WiFi.localIP().toString()); | |
} | |
//pzem.setReadTimeout(1000); | |
for (int i = 0; i <= NUMBER_OF_SELECTION_PIN - 1; i++) | |
{ | |
pinMode(sensorsSellectionPins[i], OUTPUT); | |
delay(1); | |
} | |
for (int i = 0; i <= NUMBER_OF_SELECTION_PIN - 1; i++) | |
{ | |
digitalWrite(sensorsSellectionPins[i], LOW); | |
delay(1); | |
} | |
for (int g = 0; g <= NUMBER_OF_SELECTION_PIN - 1; g++) | |
{ | |
Serial.print(" arduino digital pin number ("); | |
Serial.print(sensorsSellectionPins[g]); | |
Serial.print(") state: "); | |
Serial.println(digitalRead(sensorsSellectionPins[g])); | |
delay(1); | |
} | |
pinMode(wifiLED_pin, OUTPUT); | |
pinMode(loopLED_pin, OUTPUT); | |
pinMode(relayPin, OUTPUT); | |
pinMode(buttonPin, INPUT); | |
if (!rtc.begin()) | |
{ | |
Serial.println("Couldn't find RTC"); | |
while (1) | |
; | |
} | |
if (rtc.lostPower()) | |
{ | |
Serial.println("RTC lost power, lets set the time!"); | |
// following line sets the RTC to the date & time this sketch was compiled | |
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); | |
// This line sets the RTC with an explicit date & time, for example to set | |
// January 21, 2014 at 3am you would call: | |
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); | |
} | |
while (!pzemrdy) | |
{ | |
now= rtc.now(); | |
Serial.println("Connecting to PZEM..."); | |
Serial.println(DateText(now)); | |
Serial.println(TimeText(now)); | |
pzemrdy = pzem.setAddress(ip); | |
delay(1000); | |
} | |
// WiFi.begin(ssid, password); // Connect to the network | |
// Serial.print("Connecting to "); | |
// Serial.print(ssid); | |
// Serial.println(" ..."); | |
// int i = 0; | |
// if (WiFi.status() != WL_CONNECTED) | |
// { // Wait for the Wi-Fi to connect | |
// delay(1000); | |
// Serial.print(++i); | |
// Serial.print(' '); | |
// } | |
RD.ID = 2; | |
Serial.println("^^^^^^ End void setup ^^^^^^"); | |
Serial.println(); | |
} | |
void loop() | |
{ | |
Portal.handleClient(); | |
int mm = sizeof(RD); | |
Serial.println(mm); | |
Serial.println(); | |
Serial.println("VVVVVV Start void loop VVVVVV"); | |
if (WiFi.status() != WL_CONNECTED && WiFiStatusIndicator == 0) | |
{ | |
Serial.println("WiFi disconnected"); | |
WiFiStatus = 0; | |
digitalWrite(wifiLED_pin, HIGH); | |
WiFiStatusIndicator = 1; | |
Serial.println("reconnecting.."); | |
reconnectingAtttempts = 0; | |
} | |
else if (WiFi.status() == WL_CONNECTED){ | |
WiFiStatus = 1; | |
digitalWrite(wifiLED_pin, LOW); | |
} | |
else if (WiFiStatusIndicator == 1) | |
{ | |
WiFi.reconnect(); | |
Serial.print("reconnecting attempt: "); | |
Serial.println(reconnectingAtttempts); | |
reconnectingAtttempts++; | |
} | |
if (WiFiStatus == 1 && WiFiStatusIndicator == 1) | |
{ | |
Serial.println("RECONNECTED succsesfully"); | |
WiFiStatusIndicator = 0; | |
} | |
if (digitalRead(buttonPin) == HIGH) | |
{ | |
int i = 0; | |
bool resetSSID; | |
bool resetPZEM; | |
resetSSID = 0; | |
resetPZEM = 0; | |
while (digitalRead(buttonPin) == HIGH) | |
{ | |
delay(200); | |
i++; | |
if (i == 25) | |
{ | |
//resetSSID = 1; | |
resetPZEM = 1; | |
break; | |
} | |
} | |
if (resetSSID == 1) | |
{ | |
// RESET CODE | |
WiFi.disconnect(true); | |
SPIFFS.format(); //erases stored values | |
ESP.restart(); | |
} | |
if (resetPZEM == 1){ | |
digitalWrite(relayPin, HIGH); | |
delay(5500); | |
digitalWrite(relayPin, LOW); | |
delay(1000); | |
digitalWrite(relayPin, HIGH); | |
delay(1000); | |
digitalWrite(relayPin, LOW); | |
} | |
} | |
//////////////////////////////////////STAAAAAAAAAAAAAAAAAAAAAAAAAAAART | |
if (millis() - previousMillis >= reCheckTime || previousMillis == 0 || previousMillis > millis() || atLeastSensorPluged == 0 || sensorStillPluged == 0) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (millis() - previousMillis >= reCheckTime || previousMillis == 0 || previousMillis > millis() || atLeastSensorPluged == 0) VVVVVV"); | |
RD.availableSensorsNumber = checkAndReturnAvailableSensors(); | |
Serial.print("availableSensorsNumber: "); | |
Serial.println(RD.availableSensorsNumber); | |
if (RD.availableSensorsNumber > 0) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (RD.availableSensorsNumber != 0) VVVVVV"); | |
atLeastSensorPluged = 1; | |
} | |
else | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start ELSE (RD.availableSensorsNumber != 0) VVVVVV"); | |
atLeastSensorPluged = 0; | |
} | |
previousMillis = millis(); | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
if (atLeastSensorPluged == true) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (atLeastSensorPluged != 0) VVVVVV"); | |
Serial.println(" sensorpluged="); | |
Serial.println(atLeastSensorPluged); | |
while (isSensorAvailable[ID] == 0) // while ( sensor not pluged) | |
{ | |
ID++; | |
delay(10); | |
if (ID >= SENSORS_MAX_NUMBER) | |
{ | |
ID = -1; | |
break; | |
} | |
} | |
if (ID >= 0 && ID < SENSORS_MAX_NUMBER) | |
{ | |
RD.reading[I] = getSensorsInformation(ID); | |
if (RD.reading[I].electricalReadings.voltage >= 0.0 && RD.reading[I].electricalReadings.energy >= 0.0) | |
{ | |
sensorStillPluged = 1; | |
Serial.println(" volt != -1 "); | |
} | |
else | |
{ | |
Serial.println(" volt = -1 "); | |
sensorStillPluged = 0; | |
} | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
} | |
else | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start ELSE (atLeastSensorPluged != 0) VVVVVV"); | |
ID = 0; | |
I = 0; | |
Serial.println(" ^^^^^^ End ELSE ^^^^^^"); | |
} | |
if (atLeastSensorPluged == 1 && sensorStillPluged == 1) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (atLeastSensorPluged == 1) VVVVVV"); | |
I++; | |
ID++; | |
if (I >= RD.availableSensorsNumber) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (I == RD.availableSensorsNumber) VVVVVV"); | |
ID = 0; | |
I = 0; | |
if ((millis() - previousMillisForSendData >= reSendTime || previousMillisForSendData > millis() || previousMillisForSendData == 0) /*&& unsentReadingsNumber > 0*/) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF ((millis() - previousMillisForSendData >= reSendTime || previousMillisForSendData > millis()) && unsentReadingsNumber > 0) VVVVVV"); | |
if (!client.connect(host, httpPort)) | |
{ | |
Serial.println(" connection failed"); | |
} | |
else | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start ELSE (!client.connect(host, httpPort)) VVVVVV"); | |
Serial.println("sendData(RD)"); | |
sendData(RD); | |
Serial.println(" ^^^^^^ End ELSE ^^^^^^"); | |
Serial.println(); | |
} | |
previousMillisForSendData = millis(); | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
if (loopLED == 0) { | |
loopLED= 1; | |
digitalWrite(loopLED_pin, loopLED); | |
} | |
else{ | |
loopLED= 0; | |
digitalWrite(loopLED_pin, loopLED); | |
} | |
Serial.println("^^^^^^ End void loop ^^^^^^"); | |
Serial.println(); | |
} | |
double readVoltage() | |
{ | |
double v = pzem.voltage(ip); | |
delay(1); | |
if (v < 0.0) | |
v = 0.0; | |
return v; | |
} | |
double readCurrent() | |
{ | |
double i = pzem.current(ip); | |
delay(1); | |
return i; | |
} | |
double readPower() | |
{ | |
double p = pzem.power(ip); | |
delay(1); | |
return p; | |
} | |
double readEnergy() | |
{ | |
float e = pzem.energy(ip); | |
delay(1); | |
e = e / 1000.0; | |
return e; | |
} | |
int checkAndReturnAvailableSensors() | |
{ | |
Serial.println(); | |
Serial.println(">>>>> Start checkAndReturnAvailableSensors <<<<<"); | |
int new_availableSensorsNumber = 0; | |
for (uint8_t id = 0; id <= SENSORS_MAX_NUMBER; id++) | |
{ | |
switchToSensorID(id); | |
int sensAvailablity = readVoltage(); | |
Serial.print("new_availableSensors= ID : "); | |
Serial.print(id); | |
Serial.print(" / SensAvai : "); | |
Serial.println(sensAvailablity); | |
if (sensAvailablity > 0) | |
{ | |
isSensorAvailable[id] = 1; | |
new_availableSensorsNumber++; | |
} | |
else | |
{ | |
isSensorAvailable[id] = 0; | |
} | |
delay(1); | |
} | |
Serial.println(">>>>>End checkAndReturnAvailableSensors<<<<<"); | |
Serial.println(" isSensorAvailable array: "); | |
for (uint8_t i = 0; i <= SENSORS_MAX_NUMBER; i++) | |
{ | |
Serial.print(" "); | |
Serial.println(i); | |
Serial.print(": "); | |
Serial.println(isSensorAvailable[i]); | |
delay(1); | |
} | |
Serial.print(" vvvvvv returned value: "); | |
Serial.println(new_availableSensorsNumber); | |
Serial.println(); | |
return new_availableSensorsNumber; | |
} | |
void assignID() | |
{ | |
for (uint8_t id = 0; id <= SENSORS_MAX_NUMBER; id++) | |
{ | |
int i = 0; | |
if (isSensorAvailable[id] == 1) | |
{ | |
RD.reading[i].ID = id; | |
i++; | |
} | |
delay(1); | |
} | |
Serial.println(">>>>>void assignID method done!<<<<<"); | |
} | |
Reading getSensorsInformation(int ID) | |
{ | |
Serial.print(">>>>> Start getSensorsInformation ( ID= "); | |
Serial.print(ID); | |
Serial.println(") <<<<<"); | |
Reading inFunctionReading; | |
inFunctionReading.ID = ID; | |
inFunctionReading.electricalReadings = getSensorReadings(ID); | |
now = rtc.now(); | |
strcpy(inFunctionReading.dateAndTime, getDateAndTime(now).c_str()); | |
//inFunctionReading.dateAndTime = getDateAndTime(now); | |
Serial.print(">>>>> End Reading getSensorsInformation("); | |
Serial.print(ID); | |
Serial.println(") <<<<<"); | |
Serial.print(" vvvvvv returned value: "); | |
Serial.println(inFunctionReading.dateAndTime); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.ID); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.electricalReadings.voltage); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.electricalReadings.current); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.electricalReadings.power); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.electricalReadings.energy); | |
return inFunctionReading; | |
} | |
String getDateAndTime(DateTime now) | |
{ | |
String dateAndTimeText = DateText(now) + ' ' + TimeText(now); | |
return (dateAndTimeText); | |
} | |
String DateText(DateTime now) | |
{ | |
String dateText = ""; | |
dateText = String(now.year()) + '-'; | |
if (now.month() < 10) | |
dateText += '0'; | |
dateText += String(now.month()) + '-'; | |
if (now.day() < 10) | |
dateText += '0'; | |
dateText += String(now.day()); | |
return dateText; //e.g 2019-01-15 | |
} | |
String TimeText(DateTime now) | |
{ | |
//size of TimeText: 9 bytes ???? use sizeof to check | |
String timeText = ""; | |
if (now.hour() < 10) | |
timeText += '0'; | |
timeText += String(now.hour()) + ':'; | |
if (now.minute() < 10) | |
timeText += '0'; | |
timeText += String(now.minute()) + ':'; | |
if (now.second() < 10) | |
timeText += '0'; | |
timeText += String(now.second()); | |
return timeText; //e.g 16:05:35 | |
} | |
electricalValues getSensorReadings(int id) | |
{ | |
Serial.print(">>>>> Start electricalValues getSensorReadings("); | |
Serial.print(id); | |
Serial.println(")<<<<<"); | |
//bool readingError= 0; | |
switchToSensorID(id); | |
electricalValues new_electricalReadings; | |
new_electricalReadings.voltage = readVoltage(); | |
if (new_electricalReadings.voltage > 0.01) | |
{ | |
new_electricalReadings.current = readCurrent(); | |
new_electricalReadings.power = readPower(); | |
new_electricalReadings.energy = readEnergy(); | |
} | |
else | |
{ | |
new_electricalReadings.voltage = -1.0; | |
new_electricalReadings.current = -1.0; | |
new_electricalReadings.power = -1.0; | |
new_electricalReadings.energy = readEnergy(); | |
} | |
Serial.print(">>>>> End electricalValues getSensorReadings("); | |
Serial.print(id); | |
Serial.println(")<<<<<"); | |
Serial.print(" vvvvvv returned value: "); | |
Serial.println(new_electricalReadings.voltage); | |
Serial.print(" "); | |
Serial.println(new_electricalReadings.current); | |
Serial.print(" "); | |
Serial.println(new_electricalReadings.power); | |
Serial.print(" "); | |
Serial.println(new_electricalReadings.energy); | |
Serial.print(" "); | |
return new_electricalReadings; | |
} | |
void switchToSensorID(uint8_t id) | |
{ | |
Serial.print(">>>>> Start void switchToSensorID("); | |
Serial.print(id); | |
Serial.println(") <<<<<"); | |
sellectedSensorAddress = id; | |
for (int g = 0; g <= NUMBER_OF_SELECTION_PIN - 1; g++) | |
{ | |
digitalWrite(sensorsSellectionPins[g], (sellectedSensorAddress >> g) & 1); | |
Serial.print(" arduino digital pin number ("); | |
Serial.print(sensorsSellectionPins[g]); | |
Serial.print(") state: "); | |
Serial.println(digitalRead(sensorsSellectionPins[g])); | |
delay(1); | |
} | |
Serial.print(">>>>> End void switchToSensorID("); | |
Serial.print(id); | |
Serial.println(")<<<<<"); | |
} | |
void resizeArraySize(Reading *array, size_t array_size, size_t new_array_size) | |
{ | |
//Reading castArray[array_size]; | |
Serial.println(">>>>> Start void resizeArraySize <<<<<"); | |
Serial.print(" ^^^^^ array length: "); | |
size_t n = sizeof(array) / sizeof(array[0]); | |
Serial.println(n); | |
for (int i = 0; i < array_size; i++) | |
{ | |
Serial.print("i: "); | |
Serial.print(i); | |
for (int m = 0; m < 20; m++) | |
{ | |
//Serial.print(" " + array[i].dateAndTime[m]); | |
} | |
Serial.print(" , "); | |
delay(1); | |
} | |
Serial.println(); | |
Reading *array_tmp = 0; | |
size_t size; | |
array_tmp = new Reading[new_array_size]; | |
if (array_size < new_array_size) | |
size = array_size; | |
else | |
size = new_array_size; | |
for (int i = 0; i <= size; ++i) | |
{ | |
array_tmp[i] = array[i]; | |
delay(1); | |
} | |
delete[] array; | |
array = 0; | |
array = array_tmp; | |
array_tmp = 0; | |
array_size = new_array_size; | |
Serial.println(">>>>> End void resizeArraySize!<<<<<"); | |
Serial.print(" vvvvvv returned value: "); | |
Serial.print(" ^^^^^ array length: "); | |
n = sizeof(array) / sizeof(array[0]); | |
Serial.println(n); | |
for (int i = 0; i < array_size; i++) | |
{ | |
Serial.print("i: "); | |
Serial.println(i); | |
for (int m = 0; m < 20; m++) | |
{ | |
// Serial.print(" " + ; Serial.println(array[i].dateAndTime[m])); | |
delay(1); | |
} | |
Serial.print(" , "); | |
delay(1); | |
} | |
Serial.println(); | |
} | |
void sendData(RshedDevice sendRD) | |
{ | |
Serial.println(">>>>> Start void sendData <<<<<"); | |
String PostData = "{"; | |
PostData += "\"ID\" : "; | |
PostData += sendRD.ID; | |
PostData += " ,"; | |
PostData += "\"readings\" : ["; | |
int arr_len = sendRD.availableSensorsNumber; | |
for (int i = 0; i < arr_len; i++) | |
{ | |
String POST_dateAndTime; | |
POST_dateAndTime = ""; | |
for (int g = 0; g < 19; g++) | |
{ | |
POST_dateAndTime += sendRD.reading[i].dateAndTime[g]; | |
delay(1); | |
} | |
PostData += "{\"ID\" : "; | |
PostData += sendRD.reading[i].ID; | |
PostData += ",\"date\" : \""; | |
PostData += POST_dateAndTime + "\" ,"; | |
PostData += "\"current\" : \""; | |
PostData += sendRD.reading[i].electricalReadings.current; | |
PostData += "\","; | |
PostData += "\"energy\" : \""; | |
PostData += sendRD.reading[i].electricalReadings.energy; | |
PostData += "\","; | |
PostData += "\"power\" : \""; | |
PostData += sendRD.reading[i].electricalReadings.power; | |
PostData += "\","; | |
PostData += "\"voltage\" : \""; | |
PostData += sendRD.reading[i].electricalReadings.voltage; | |
PostData += "\""; | |
PostData += "}"; | |
if (i < arr_len - 1) | |
{ | |
PostData += ","; | |
} | |
delay(1); | |
} | |
PostData += "]}"; | |
Serial.println(PostData); | |
client.println("POST /postReq/ HTTP/1.1"); | |
client.println("Host: us-central1-rshed-project-appz-wrld.cloudfunctions.net"); | |
// client.println("Host: us-central1-rshd-999e5.cloudfunctions.net"); | |
client.println("Accept: */*"); | |
client.println("User-Agent: Mozilla/5.0 (compatible; Rigor/1.0.0; http://rigor.com)"); | |
client.println("Content-Type: application/json"); | |
client.println("Connection: close"); | |
client.print("Content-Length: "); | |
client.println(PostData.length()); | |
client.println(); | |
client.println(PostData); | |
count++; | |
Serial.println(count); | |
Serial.println(">>>>> End void sendData <<<<<"); | |
} | |
#include <PZEM004T.h> | |
#include "RTClib.h" | |
#include "EEPROM.h" | |
#include <WiFi.h> | |
#include <WebServer.h> | |
#include <AutoConnect.h> | |
#include "SPIFFS.h" | |
const uint8_t SENSORS_MAX_NUMBER = 3; | |
const uint8_t NUMBER_OF_SELECTION_PIN = 3; | |
unsigned int DATA_SIZE; | |
WebServer Server; | |
AutoConnect Portal(Server); | |
RTC_DS3231 rtc; | |
DateTime now; | |
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; | |
String getDateAndTime(DateTime now); | |
String DateText(DateTime now); | |
String TimeText(DateTime now); | |
bool isSensorAvailable[SENSORS_MAX_NUMBER]; | |
bool loopLED = 0; | |
const int relayPin = 23; | |
const int buttonPin = 34; | |
const int wifiLED_pin = 2; | |
const int loopLED_pin = 2; | |
uint8_t sensorsSellectionPins[NUMBER_OF_SELECTION_PIN] = {19, 18, 5}; | |
uint8_t sellectedSensorAddress = B000000; | |
struct electricalValues | |
{ | |
double voltage; | |
double current; | |
double power; | |
double energy; | |
}; | |
struct Reading | |
{ | |
int ID; | |
char dateAndTime[20]; | |
electricalValues electricalReadings; | |
}; | |
struct RshedDevice | |
{ | |
unsigned int ID; | |
int availableSensorsNumber = 0; | |
Reading reading[SENSORS_MAX_NUMBER]; | |
}; | |
RshedDevice RD; | |
Reading previousReading[SENSORS_MAX_NUMBER]; | |
PZEM004T pzem(&Serial2); | |
IPAddress ip(192, 168, 1, 1); | |
const char *host = "https://us-central1-rshed-project-appz-wrld.cloudfunctions.net"; | |
// const char *host = "https://us-central1-rshd-999e5.cloudfunctions.net"; | |
const int httpPort = 80; | |
WiFiClient client; | |
int count = 0; | |
// const char ssid [] = "STC_WiFi_D5EE"; // The SSID (name) of the Wi-Fi network you want to connect to | |
// const char password [] = "1222222224"; // The password of the Wi-Fi network | |
bool pzemrdy = false; | |
bool WiFiStatus = 0; | |
bool WiFiStatusIndicator = 0; | |
unsigned long previousMillis = 0; | |
unsigned long reCheckTime = 300000; | |
unsigned long reSendTime = 1800000; //3600000; | |
unsigned long previousMillisForSendData = 0; | |
double readCurrent(); | |
double readVoltage(); | |
double readPower(); | |
double readEnergy(); | |
double senddata(); | |
//test | |
void resizeArraySize(Reading *array, size_t array_size, size_t new_array_size); | |
int checkAndReturnAvailableSensors(); | |
void assignID(); | |
electricalValues getSensorReadings(int id); | |
void switchToSensorID(uint8_t id); | |
Reading getSensorsInformation(int ID); | |
void sendData(RshedDevice sendRD); | |
void rootPage() | |
{ | |
char content[] = "Hello, world"; | |
Server.send(200, "text/plain", content); | |
} | |
unsigned long reconnectingAtttempts; | |
bool atLeastSensorPluged = 0; | |
bool sensorStillPluged = 0; | |
int ID = 0; | |
int I = 0; | |
// int unsentReadingsNumber = 0; | |
int eeAddressStart = 10; | |
int eeAddress = eeAddressStart; //change location | |
void setup() | |
{ | |
Serial.println(); | |
Serial.println("VVVVVV Start void setup VVVVVV"); | |
Serial.begin(115200); | |
Server.on("/", rootPage); | |
if (Portal.begin()) | |
{ | |
Serial.println("HTTP server:" + WiFi.localIP().toString()); | |
} | |
//pzem.setReadTimeout(1000); | |
for (int i = 0; i <= NUMBER_OF_SELECTION_PIN - 1; i++) | |
{ | |
pinMode(sensorsSellectionPins[i], OUTPUT); | |
delay(1); | |
} | |
for (int i = 0; i <= NUMBER_OF_SELECTION_PIN - 1; i++) | |
{ | |
digitalWrite(sensorsSellectionPins[i], LOW); | |
delay(1); | |
} | |
for (int g = 0; g <= NUMBER_OF_SELECTION_PIN - 1; g++) | |
{ | |
Serial.print(" arduino digital pin number ("); | |
Serial.print(sensorsSellectionPins[g]); | |
Serial.print(") state: "); | |
Serial.println(digitalRead(sensorsSellectionPins[g])); | |
delay(1); | |
} | |
pinMode(wifiLED_pin, OUTPUT); | |
pinMode(loopLED_pin, OUTPUT); | |
pinMode(relayPin, OUTPUT); | |
pinMode(buttonPin, INPUT); | |
if (!rtc.begin()) | |
{ | |
Serial.println("Couldn't find RTC"); | |
while (1) | |
; | |
} | |
if (rtc.lostPower()) | |
{ | |
Serial.println("RTC lost power, lets set the time!"); | |
// following line sets the RTC to the date & time this sketch was compiled | |
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); | |
// This line sets the RTC with an explicit date & time, for example to set | |
// January 21, 2014 at 3am you would call: | |
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); | |
} | |
while (!pzemrdy) | |
{ | |
now= rtc.now(); | |
Serial.println("Connecting to PZEM..."); | |
Serial.println(DateText(now)); | |
Serial.println(TimeText(now)); | |
pzemrdy = pzem.setAddress(ip); | |
delay(1000); | |
} | |
// WiFi.begin(ssid, password); // Connect to the network | |
// Serial.print("Connecting to "); | |
// Serial.print(ssid); | |
// Serial.println(" ..."); | |
// int i = 0; | |
// if (WiFi.status() != WL_CONNECTED) | |
// { // Wait for the Wi-Fi to connect | |
// delay(1000); | |
// Serial.print(++i); | |
// Serial.print(' '); | |
// } | |
RD.ID = 2; | |
Serial.println("^^^^^^ End void setup ^^^^^^"); | |
Serial.println(); | |
} | |
void loop() | |
{ | |
Portal.handleClient(); | |
int mm = sizeof(RD); | |
Serial.println(mm); | |
Serial.println(); | |
Serial.println("VVVVVV Start void loop VVVVVV"); | |
if (WiFi.status() != WL_CONNECTED && WiFiStatusIndicator == 0) | |
{ | |
Serial.println("WiFi disconnected"); | |
WiFiStatus = 0; | |
digitalWrite(wifiLED_pin, HIGH); | |
WiFiStatusIndicator = 1; | |
Serial.println("reconnecting.."); | |
reconnectingAtttempts = 0; | |
} | |
else if (WiFi.status() == WL_CONNECTED){ | |
WiFiStatus = 1; | |
digitalWrite(wifiLED_pin, LOW); | |
} | |
else if (WiFiStatusIndicator == 1) | |
{ | |
WiFi.reconnect(); | |
Serial.print("reconnecting attempt: "); | |
Serial.println(reconnectingAtttempts); | |
reconnectingAtttempts++; | |
} | |
if (WiFiStatus == 1 && WiFiStatusIndicator == 1) | |
{ | |
Serial.println("RECONNECTED succsesfully"); | |
WiFiStatusIndicator = 0; | |
} | |
if (digitalRead(buttonPin) == HIGH) | |
{ | |
int i = 0; | |
bool resetSSID; | |
bool resetPZEM; | |
resetSSID = 0; | |
resetPZEM = 0; | |
while (digitalRead(buttonPin) == HIGH) | |
{ | |
delay(200); | |
i++; | |
if (i == 25) | |
{ | |
//resetSSID = 1; | |
resetPZEM = 1; | |
break; | |
} | |
} | |
if (resetSSID == 1) | |
{ | |
// RESET CODE | |
WiFi.disconnect(true); | |
SPIFFS.format(); //erases stored values | |
ESP.restart(); | |
} | |
if (resetPZEM == 1){ | |
digitalWrite(relayPin, HIGH); | |
delay(5500); | |
digitalWrite(relayPin, LOW); | |
delay(1000); | |
digitalWrite(relayPin, HIGH); | |
delay(1000); | |
digitalWrite(relayPin, LOW); | |
} | |
} | |
//////////////////////////////////////STAAAAAAAAAAAAAAAAAAAAAAAAAAAART | |
if (millis() - previousMillis >= reCheckTime || previousMillis == 0 || previousMillis > millis() || atLeastSensorPluged == 0 || sensorStillPluged == 0) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (millis() - previousMillis >= reCheckTime || previousMillis == 0 || previousMillis > millis() || atLeastSensorPluged == 0) VVVVVV"); | |
RD.availableSensorsNumber = checkAndReturnAvailableSensors(); | |
Serial.print("availableSensorsNumber: "); | |
Serial.println(RD.availableSensorsNumber); | |
if (RD.availableSensorsNumber > 0) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (RD.availableSensorsNumber != 0) VVVVVV"); | |
atLeastSensorPluged = 1; | |
} | |
else | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start ELSE (RD.availableSensorsNumber != 0) VVVVVV"); | |
atLeastSensorPluged = 0; | |
} | |
previousMillis = millis(); | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
if (atLeastSensorPluged == true) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (atLeastSensorPluged != 0) VVVVVV"); | |
Serial.println(" sensorpluged="); | |
Serial.println(atLeastSensorPluged); | |
while (isSensorAvailable[ID] == 0) // while ( sensor not pluged) | |
{ | |
ID++; | |
delay(10); | |
if (ID >= SENSORS_MAX_NUMBER) | |
{ | |
ID = -1; | |
break; | |
} | |
} | |
if (ID >= 0 && ID < SENSORS_MAX_NUMBER) | |
{ | |
RD.reading[I] = getSensorsInformation(ID); | |
if (RD.reading[I].electricalReadings.voltage >= 0.0 && RD.reading[I].electricalReadings.energy >= 0.0) | |
{ | |
sensorStillPluged = 1; | |
Serial.println(" volt != -1 "); | |
} | |
else | |
{ | |
Serial.println(" volt = -1 "); | |
sensorStillPluged = 0; | |
} | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
} | |
else | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start ELSE (atLeastSensorPluged != 0) VVVVVV"); | |
ID = 0; | |
I = 0; | |
Serial.println(" ^^^^^^ End ELSE ^^^^^^"); | |
} | |
if (atLeastSensorPluged == 1 && sensorStillPluged == 1) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (atLeastSensorPluged == 1) VVVVVV"); | |
I++; | |
ID++; | |
if (I >= RD.availableSensorsNumber) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF (I == RD.availableSensorsNumber) VVVVVV"); | |
ID = 0; | |
I = 0; | |
if ((millis() - previousMillisForSendData >= reSendTime || previousMillisForSendData > millis() || previousMillisForSendData == 0) /*&& unsentReadingsNumber > 0*/) | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start IF ((millis() - previousMillisForSendData >= reSendTime || previousMillisForSendData > millis()) && unsentReadingsNumber > 0) VVVVVV"); | |
if (!client.connect(host, httpPort)) | |
{ | |
Serial.println(" connection failed"); | |
} | |
else | |
{ | |
Serial.println(); | |
Serial.println(" VVVVVV Start ELSE (!client.connect(host, httpPort)) VVVVVV"); | |
Serial.println("sendData(RD)"); | |
sendData(RD); | |
Serial.println(" ^^^^^^ End ELSE ^^^^^^"); | |
Serial.println(); | |
} | |
previousMillisForSendData = millis(); | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
Serial.println(" ^^^^^^ End IF ^^^^^^"); | |
Serial.println(); | |
} | |
if (loopLED == 0) { | |
loopLED= 1; | |
digitalWrite(loopLED_pin, loopLED); | |
} | |
else{ | |
loopLED= 0; | |
digitalWrite(loopLED_pin, loopLED); | |
} | |
Serial.println("^^^^^^ End void loop ^^^^^^"); | |
Serial.println(); | |
} | |
double readVoltage() | |
{ | |
double v = pzem.voltage(ip); | |
delay(1); | |
if (v < 0.0) | |
v = 0.0; | |
return v; | |
} | |
double readCurrent() | |
{ | |
double i = pzem.current(ip); | |
delay(1); | |
return i; | |
} | |
double readPower() | |
{ | |
double p = pzem.power(ip); | |
delay(1); | |
return p; | |
} | |
double readEnergy() | |
{ | |
float e = pzem.energy(ip); | |
delay(1); | |
e = e / 1000.0; | |
return e; | |
} | |
int checkAndReturnAvailableSensors() | |
{ | |
Serial.println(); | |
Serial.println(">>>>> Start checkAndReturnAvailableSensors <<<<<"); | |
int new_availableSensorsNumber = 0; | |
for (uint8_t id = 0; id <= SENSORS_MAX_NUMBER; id++) | |
{ | |
switchToSensorID(id); | |
int sensAvailablity = readVoltage(); | |
Serial.print("new_availableSensors= ID : "); | |
Serial.print(id); | |
Serial.print(" / SensAvai : "); | |
Serial.println(sensAvailablity); | |
if (sensAvailablity > 0) | |
{ | |
isSensorAvailable[id] = 1; | |
new_availableSensorsNumber++; | |
} | |
else | |
{ | |
isSensorAvailable[id] = 0; | |
} | |
delay(1); | |
} | |
Serial.println(">>>>>End checkAndReturnAvailableSensors<<<<<"); | |
Serial.println(" isSensorAvailable array: "); | |
for (uint8_t i = 0; i <= SENSORS_MAX_NUMBER; i++) | |
{ | |
Serial.print(" "); | |
Serial.println(i); | |
Serial.print(": "); | |
Serial.println(isSensorAvailable[i]); | |
delay(1); | |
} | |
Serial.print(" vvvvvv returned value: "); | |
Serial.println(new_availableSensorsNumber); | |
Serial.println(); | |
return new_availableSensorsNumber; | |
} | |
void assignID() | |
{ | |
for (uint8_t id = 0; id <= SENSORS_MAX_NUMBER; id++) | |
{ | |
int i = 0; | |
if (isSensorAvailable[id] == 1) | |
{ | |
RD.reading[i].ID = id; | |
i++; | |
} | |
delay(1); | |
} | |
Serial.println(">>>>>void assignID method done!<<<<<"); | |
} | |
Reading getSensorsInformation(int ID) | |
{ | |
Serial.print(">>>>> Start getSensorsInformation ( ID= "); | |
Serial.print(ID); | |
Serial.println(") <<<<<"); | |
Reading inFunctionReading; | |
inFunctionReading.ID = ID; | |
inFunctionReading.electricalReadings = getSensorReadings(ID); | |
now = rtc.now(); | |
strcpy(inFunctionReading.dateAndTime, getDateAndTime(now).c_str()); | |
//inFunctionReading.dateAndTime = getDateAndTime(now); | |
Serial.print(">>>>> End Reading getSensorsInformation("); | |
Serial.print(ID); | |
Serial.println(") <<<<<"); | |
Serial.print(" vvvvvv returned value: "); | |
Serial.println(inFunctionReading.dateAndTime); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.ID); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.electricalReadings.voltage); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.electricalReadings.current); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.electricalReadings.power); | |
Serial.print(" "); | |
Serial.println(inFunctionReading.electricalReadings.energy); | |
return inFunctionReading; | |
} | |
String getDateAndTime(DateTime now) | |
{ | |
String dateAndTimeText = DateText(now) + ' ' + TimeText(now); | |
return (dateAndTimeText); | |
} | |
String DateText(DateTime now) | |
{ | |
String dateText = ""; | |
dateText = String(now.year()) + '-'; | |
if (now.month() < 10) | |
dateText += '0'; | |
dateText += String(now.month()) + '-'; | |
if (now.day() < 10) | |
dateText += '0'; | |
dateText += String(now.day()); | |
return dateText; //e.g 2019-01-15 | |
} | |
String TimeText(DateTime now) | |
{ | |
//size of TimeText: 9 bytes ???? use sizeof to check | |
String timeText = ""; | |
if (now.hour() < 10) | |
timeText += '0'; | |
timeText += String(now.hour()) + ':'; | |
if (now.minute() < 10) | |
timeText += '0'; | |
timeText += String(now.minute()) + ':'; | |
if (now.second() < 10) | |
timeText += '0'; | |
timeText += String(now.second()); | |
return timeText; //e.g 16:05:35 | |
} | |
electricalValues getSensorReadings(int id) | |
{ | |
Serial.print(">>>>> Start electricalValues getSensorReadings("); | |
Serial.print(id); | |
Serial.println(")<<<<<"); | |
//bool readingError= 0; | |
switchToSensorID(id); | |
electricalValues new_electricalReadings; | |
new_electricalReadings.voltage = readVoltage(); | |
if (new_electricalReadings.voltage > 0.01) | |
{ | |
new_electricalReadings.current = readCurrent(); | |
new_electricalReadings.power = readPower(); | |
new_electricalReadings.energy = readEnergy(); | |
} | |
else | |
{ | |
new_electricalReadings.voltage = -1.0; | |
new_electricalReadings.current = -1.0; | |
new_electricalReadings.power = -1.0; | |
new_electricalReadings.energy = readEnergy(); | |
} | |
Serial.print(">>>>> End electricalValues getSensorReadings("); | |
Serial.print(id); | |
Serial.println(")<<<<<"); | |
Serial.print(" vvvvvv returned value: "); | |
Serial.println(new_electricalReadings.voltage); | |
Serial.print(" "); | |
Serial.println(new_electricalReadings.current); | |
Serial.print(" "); | |
Serial.println(new_electricalReadings.power); | |
Serial.print(" "); | |
Serial.println(new_electricalReadings.energy); | |
Serial.print(" "); | |
return new_electricalReadings; | |
} | |
void switchToSensorID(uint8_t id) | |
{ | |
Serial.print(">>>>> Start void switchToSensorID("); | |
Serial.print(id); | |
Serial.println(") <<<<<"); | |
sellectedSensorAddress = id; | |
for (int g = 0; g <= NUMBER_OF_SELECTION_PIN - 1; g++) | |
{ | |
digitalWrite(sensorsSellectionPins[g], (sellectedSensorAddress >> g) & 1); | |
Serial.print(" arduino digital pin number ("); | |
Serial.print(sensorsSellectionPins[g]); | |
Serial.print(") state: "); | |
Serial.println(digitalRead(sensorsSellectionPins[g])); | |
delay(1); | |
} | |
Serial.print(">>>>> End void switchToSensorID("); | |
Serial.print(id); | |
Serial.println(")<<<<<"); | |
} | |
void resizeArraySize(Reading *array, size_t array_size, size_t new_array_size) | |
{ | |
//Reading castArray[array_size]; | |
Serial.println(">>>>> Start void resizeArraySize <<<<<"); | |
Serial.print(" ^^^^^ array length: "); | |
size_t n = sizeof(array) / sizeof(array[0]); | |
Serial.println(n); | |
for (int i = 0; i < array_size; i++) | |
{ | |
Serial.print("i: "); | |
Serial.print(i); | |
for (int m = 0; m < 20; m++) | |
{ | |
//Serial.print(" " + array[i].dateAndTime[m]); | |
} | |
Serial.print(" , "); | |
delay(1); | |
} | |
Serial.println(); | |
Reading *array_tmp = 0; | |
size_t size; | |
array_tmp = new Reading[new_array_size]; | |
if (array_size < new_array_size) | |
size = array_size; | |
else | |
size = new_array_size; | |
for (int i = 0; i <= size; ++i) | |
{ | |
array_tmp[i] = array[i]; | |
delay(1); | |
} | |
delete[] array; | |
array = 0; | |
array = array_tmp; | |
array_tmp = 0; | |
array_size = new_array_size; | |
Serial.println(">>>>> End void resizeArraySize!<<<<<"); | |
Serial.print(" vvvvvv returned value: "); | |
Serial.print(" ^^^^^ array length: "); | |
n = sizeof(array) / sizeof(array[0]); | |
Serial.println(n); | |
for (int i = 0; i < array_size; i++) | |
{ | |
Serial.print("i: "); | |
Serial.println(i); | |
for (int m = 0; m < 20; m++) | |
{ | |
// Serial.print(" " + ; Serial.println(array[i].dateAndTime[m])); | |
delay(1); | |
} | |
Serial.print(" , "); | |
delay(1); | |
} | |
Serial.println(); | |
} | |
void sendData(RshedDevice sendRD) | |
{ | |
Serial.println(">>>>> Start void sendData <<<<<"); | |
String PostData = "{"; | |
PostData += "\"ID\" : "; | |
PostData += sendRD.ID; | |
PostData += " ,"; | |
PostData += "\"readings\" : ["; | |
int arr_len = sendRD.availableSensorsNumber; | |
for (int i = 0; i < arr_len; i++) | |
{ | |
String POST_dateAndTime; | |
POST_dateAndTime = ""; | |
for (int g = 0; g < 19; g++) | |
{ | |
POST_dateAndTime += sendRD.reading[i].dateAndTime[g]; | |
delay(1); | |
} | |
PostData += "{\"ID\" : "; | |
PostData += sendRD.reading[i].ID; | |
PostData += ",\"date\" : \""; | |
PostData += POST_dateAndTime + "\" ,"; | |
PostData += "\"current\" : \""; | |
PostData += sendRD.reading[i].electricalReadings.current; | |
PostData += "\","; | |
PostData += "\"energy\" : \""; | |
PostData += sendRD.reading[i].electricalReadings.energy; | |
PostData += "\","; | |
PostData += "\"power\" : \""; | |
PostData += sendRD.reading[i].electricalReadings.power; | |
PostData += "\","; | |
PostData += "\"voltage\" : \""; | |
PostData += sendRD.reading[i].electricalReadings.voltage; | |
PostData += "\""; | |
PostData += "}"; | |
if (i < arr_len - 1) | |
{ | |
PostData += ","; | |
} | |
delay(1); | |
} | |
PostData += "]}"; | |
Serial.println(PostData); | |
client.println("POST /postReq/ HTTP/1.1"); | |
client.println("Host: some URL"); | |
// client.println("Host: some URL"); | |
client.println("Accept: */*"); | |
client.println("User-Agent: Mozilla/5.0 (compatible; Rigor/1.0.0; http://rigor.com)"); | |
client.println("Content-Type: application/json"); | |
client.println("Connection: close"); | |
client.print("Content-Length: "); | |
client.println(PostData.length()); | |
client.println(); | |
client.println(PostData); | |
count++; | |
Serial.println(count); | |
Serial.println(">>>>> End void sendData <<<<<"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey bro , I'm monitoring current using ct sensor. I'm tapping current every 10th second and it light sleeps in between. But it gets stuck and doesn't run the code. The red light is on. I tried using both battery and from the adapter too. But still turns off after 2-3 of running it