RJ 12 Connector Bl 1 nc socket(soladin)
6 5 4 3 2 1 Bl/wi 2 RX - 1 2 3 4 5 6
____________________ Or 3 RX + ___________________
| || || || || || || | Or/Wi 4 TX + | || || || || || || |
| || || || || || || | Gr 5 TX - | |
| | Gr/Wi 6 nc | |
|_____frontview_____| |_____frontview____ |
|_______| [______]
|___|
ARDUINO RJ 12 connector
TX(D7) �--------------------------� 2 (TX-) Gr
____
+ 3.3V �----------[____]----------� 3 (TX+) Or/Wi
150R
____
+ 3.3V �----------[____]-----†
10K |
RX(D6) �---------------------†----� 4 (RX+) Or
gnd �--------------------------� 5 (RX-) Bl/Wi
#include
#include // https://github.com/adafruit/Adafruit_MQTT_Library
#include // https://github.com/tzapu/WiFiManager
#include
#include
#include // standard softwareserial library from esp8266
#include // https://github.com/teding/SolaDin
SoftwareSerial solCom(12, 13); // wemos D1 Mini D6 D7 serial to connect to soladin
Soladin sol ;
WiFiClient espClient;
PubSubClient client(espClient);
Ticker ticker;
WiFiManager wifiManager;
boolean solConnect = false;
unsigned long last;
byte retries = 0;
boolean successQ = false;
const char* mqtt_server = "mqtt.server.com";
const char* mqtt_user = "";
const char* mqtt_pass = "";
const char* PVVoltTopic = "solar/PVVolt";
const char* PVAmpTopic = "solar/PVAmp";
const char* GridFreqTopic = "solar/GridFreq";
const char* GridVoltTopic = "solar/GridVolt";
const char* GridPowerTopic = "solar/GridPower";
const char* DevTempTopic = "solar/DeviceTemp";
const char* TotalPowerTopic = "solar/TotalPower";
void setup() {
Serial.begin(115200);
pinMode(BUILTIN_LED, OUTPUT);
ticker.attach(0.6, tick);
wifiManager.setAPCallback(configModeCallback);
if (!wifiManager.autoConnect("Soladin")) {
Serial.println("failed to connect and hit timeout");
ESP.reset();
delay(1000);
}
ticker.detach();
digitalWrite(BUILTIN_LED, LOW);
solCom.begin(9600);
sol.begin(&solCom);
last = millis();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
retries = 0;
while ((! solConnect) && (retries < 6)){
Serial.println("trying connection to soladin");
solConnect = sol.query(PRB);
delay(1000*retries);
retries++;
Serial.print("tries = ");
Serial.println(retries);
}
if (((long)(millis()-last) > 60000) && (WiFi.status() == WL_CONNECTED) && solConnect) {
successQ = false;
retries = 0;
while ((! successQ) && (retries < 6)) {
Serial.println("query soladin");
successQ = sol.query(DVS);
if (! successQ) {
delay(1000*retries);
retries++;
}
}
solConnect = successQ;
if (solConnect) {
Serial.print("PV Voltage :");
Serial.println(String(float(sol.PVvolt)/10).c_str());
Serial.print("V \n PV Current :");
Serial.println(String(float(sol.PVamp)/100).c_str());
Serial.print("A \n Grid Frequency :");
Serial.println(String(float(sol.Gridfreq)/100).c_str());
Serial.print("Hz \n Grid Voltage :");
Serial.println(String(sol.Gridvolt).c_str());
Serial.print("V \n Current Grid Power :");
Serial.println(String(sol.Gridpower).c_str());
Serial.print("W \n Device Temperature :");
Serial.println(String(sol.DeviceTemp).c_str());
Serial.print("C \n Total Power :");
Serial.println(String(float(sol.Totalpower)/100).c_str());
Serial.print("kWh");
client.publish(PVVoltTopic, String(float(sol.PVvolt)/10).c_str());
client.publish(PVAmpTopic, String(float(sol.PVamp)/100).c_str());
client.publish(GridFreqTopic, String(float(sol.Gridfreq)/100).c_str());
client.publish(GridVoltTopic, String(sol.Gridvolt).c_str());
client.publish(GridPowerTopic, String(sol.Gridpower).c_str());
client.publish(DevTempTopic, String(sol.DeviceTemp).c_str());
client.publish(TotalPowerTopic, String(float(sol.Totalpower)/100).c_str());
last = millis();
}
}
delay(1000+(retries*10000));
}
void tick()
{
//toggle state
int state = digitalRead(BUILTIN_LED);
digitalWrite(BUILTIN_LED, !state);
}
void configModeCallback (WiFiManager *myWiFiManager) {
Serial.println("Entered config mode");
Serial.println(WiFi.softAPIP());
//if you used auto generated SSID, print it
Serial.println(myWiFiManager->getConfigPortalSSID());
//entered config mode, make led toggle faster
ticker.attach(0.2, tick);
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.print("\n");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str(),mqtt_user, mqtt_pass)) {
Serial.println("connected");
client.subscribe(PVVoltTopic);
client.subscribe(PVAmpTopic);
client.subscribe(GridFreqTopic);
client.subscribe(GridVoltTopic);
client.subscribe(GridPowerTopic);
client.subscribe(DevTempTopic);
client.subscribe(TotalPowerTopic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}