Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.79 KB | None | 0 0
  1. #include <Arduino.h>
  2. #include <ESP8266WiFi.h>
  3. #include <ESPAsyncTCP.h>
  4. #include <ESP8266mDNS.h>
  5. #include <ESPAsyncWebServer.h>
  6. #include <PubSubClient.h>
  7. #include <PZEM004Tv30.h>
  8. #include <LiquidCrystal_I2C.h>
  9. #include <ArduinoOTA.h>
  10.  
  11. #include "index_page.h"
  12. #include "style.h"
  13. #define  DEBUG         1
  14.  
  15. //IO SETUP
  16. int afterboot_pin = 14;
  17. int status_led = 2;
  18.  
  19. //PZEM Setup
  20. bool pzem_rdy = false;
  21. unsigned long pzem_previousMillis = 0;            
  22. float voltage;
  23. float current;
  24. float power;
  25. float energy;
  26. float frequency;
  27. float pf;    
  28. PZEM004Tv30 pzem(13, 15); //RX TX
  29.  
  30. //LCD
  31. int lcd_menuposition = 1;
  32. int lcd_button_pin = 14;
  33. int lcd_total_menus = 3;
  34. bool lcd_button_status;
  35. bool last_lcd_button_status;
  36.  
  37. LiquidCrystal_I2C lcd(0x27,20,4);
  38.  
  39. //WiFi Info
  40. AsyncWebServer server(80);
  41. const char *ssid      = "Get Of My Lan";  
  42. const char *password  = "aaa222@@@";
  43. IPAddress staticIP(192,168,1,110);
  44. IPAddress gateway(192,168,1,254);
  45. IPAddress subnet(255,255,255,0);
  46.  
  47. //MQTT Info
  48. const char *mqtt_id       = "ESP_CurrentMeter";
  49. const char *mqtt_server   = "192.168.1.100";
  50. const char *mqtt_user     = "pi";
  51. const char *mqtt_pw       = "andre2009";
  52. const int   mqtt_port     = 1883;
  53. bool mqtt_connected = false;
  54. String mqtt_status;
  55. unsigned long mqtt_interval = 1000;
  56. unsigned long mqtt_previousMillis = 0;
  57. int mqtt_bufferint = 0;
  58.  
  59. WiFiClient espClient;
  60. PubSubClient client(espClient);
  61.  
  62. //OTA Hostname
  63. const char *OTA_hostname = "ESP_CurrentMeter";
  64. bool allow_OTA = false;
  65. bool OTA_begin = false;
  66. String OTA_Status;
  67.  
  68. void mqtt_callback(char* topic, byte* payload, unsigned int length) {
  69.  
  70.   //Print Payload
  71.   #ifdef DEBUG
  72.   Serial.print("MQTT Received: ");
  73.   Serial.print(topic);
  74.   Serial.print("/ ");
  75.   for ( int i = 0; i < length; i++) {
  76.     Serial.print((char)payload[i]);
  77.   }
  78.   Serial.println();
  79.   #endif
  80.  
  81.   //Convert payload to String
  82.   String mqtt_buffer = "";
  83.   for ( int i = 0; i < length; i++) {
  84.     mqtt_buffer += (char)payload[i];  
  85.   }
  86.  
  87.   //Convert Buffer to int
  88.   mqtt_bufferint = mqtt_buffer.toInt();
  89.  
  90.   if (strcmp(topic,"ESP_currentMeter/OTA") == 0){
  91.     if (mqtt_buffer == "ON") {
  92.       Serial.println("OTA ON!");
  93.       allow_OTA = true;
  94.       OTA_begin = true;
  95.  
  96.     } else if (mqtt_buffer == "OFF") {
  97.       Serial.println("OTA OFF!");
  98.       allow_OTA = false;
  99.       OTA_begin = false;
  100.     }
  101.   }
  102.   if (strcmp(topic,"ESP_currentMeter/REBOOT") == 0){
  103.     if (mqtt_buffer == "true"){
  104.       Serial.println("ESP Rebooting...");
  105.       ESP.restart();
  106.     }
  107.   }
  108. }
  109. void mqtt_setup(){
  110.   client.setServer(mqtt_server, mqtt_port);
  111.   client.setCallback(mqtt_callback);
  112.   int count = 0;
  113.   Serial.println("Connecting to the Broker MQTT...");
  114.   mqtt_status = "Trying to connect...";
  115.  
  116.   while (!client.connected()) {
  117.     if (client.connect(mqtt_id, mqtt_user, mqtt_pw )) {  
  118.       Serial.println("MQTT Ready");  
  119.       mqtt_status = "Connected";
  120.     } else {  
  121.       Serial.print("MQTT Failed to connect..  ");
  122.       Serial.print(client.state());
  123.       Serial.print(" - ");
  124.       Serial.print(count);
  125.       Serial.println("/3");
  126.       count++;
  127.       delay(2000);
  128.     }
  129.     if (count >= 3){
  130.       Serial.println("MQTT Failed!! Skiping this step.  ");
  131.       mqtt_status = "Failed to connect";
  132.       break;
  133.     }
  134.   }
  135. }
  136. void mqtt_pub(unsigned int current_value){
  137.  
  138.   unsigned long mqtt_currentMillis = millis();
  139.   if (mqtt_currentMillis - mqtt_previousMillis >= mqtt_interval) {
  140.     char mqtt_msg[10];
  141.     sprintf(mqtt_msg,"%d", current_value);
  142.     client.publish("ESP_currentMeter/currentValue",mqtt_msg);
  143.     client.loop();
  144.     #ifdef DEBUG
  145.       Serial.print("MQTT sent: ");
  146.       Serial.println(mqtt_msg);
  147.     #endif
  148.     mqtt_previousMillis = mqtt_currentMillis;
  149.   }
  150. }
  151. void fetch_pzemvalues(unsigned long interval){
  152.   unsigned long pzem_currentMillis = millis();
  153.   if (pzem_currentMillis - pzem_previousMillis >= interval) {
  154.     pzem_previousMillis = pzem_currentMillis;
  155.    
  156.     voltage   = pzem.voltage();
  157.     current   = pzem.current();
  158.     power     = pzem.power();
  159.     energy    = pzem.energy();
  160.     frequency = pzem.frequency();
  161.     pf        = pzem.pf();
  162.  
  163.     if (isnan(voltage)){
  164.       voltage   = 0;
  165.       current   = 0;
  166.       power     = 0;
  167.       energy    = 0;
  168.       frequency = 0;
  169.       pf        = 0;
  170.     }
  171.   }
  172. }
  173. void lcd_menu(){
  174.   switch (lcd_menuposition){
  175.     case 1:
  176.         lcd.clear();
  177.         lcd.setCursor(0,0);
  178.         lcd.print("V: ");
  179.         lcd.print(voltage);
  180.  
  181.         lcd.setCursor(0,1);
  182.         lcd.print("A: ");
  183.         lcd.print(current);
  184.  
  185.         lcd.setCursor(0,2);
  186.         lcd.print("P: ");
  187.         lcd.print(power);
  188.  
  189.         lcd.setCursor(0,3);
  190.         lcd.print("E: ");
  191.         lcd.print(energy);
  192.       break;
  193.     case 2:
  194.         lcd.clear();
  195.         lcd.setCursor(0,0);
  196.         lcd.print("F: ");
  197.         lcd.print(frequency);
  198.  
  199.         lcd.setCursor(0,1);
  200.         lcd.print("PF: ");
  201.         lcd.print(pf);
  202.       break;
  203.     default:
  204.         lcd.clear();
  205.         lcd.print("Erro carregar menu...");
  206.       break;
  207.   }  
  208. }
  209. String processor(const String& var){
  210.  
  211.   if (var == "VOLTAGE") {
  212.       return String(voltage);
  213.   }
  214.   else if(var == "CURRENT"){
  215.     return String(current);
  216.   }
  217.   else if(var == "POWER"){
  218.     return String(power);
  219.   }
  220.   else if(var == "ENERGY"){
  221.     return String(energy);
  222.   }
  223.   else if(var == "FREQUENCY"){
  224.     return String(frequency);
  225.   }
  226.   else if(var == "PF"){
  227.     return String(pf);
  228.   }
  229.   return String();
  230. }
  231.  
  232. bool wifi_setup(){
  233.  
  234.   WiFi.mode(WIFI_STA);
  235.   WiFi.config(staticIP, gateway, subnet);
  236.   WiFi.begin(ssid, password);
  237.   int count = 0;
  238.   while (WiFi.status() != WL_CONNECTED) {
  239.     Serial.print("Connecting to WiFi...  ");
  240.     Serial.print(count);
  241.     Serial.println("/10");
  242.     delay(500);
  243.     count++;
  244.     if (count >= 10){
  245.       Serial.println("Wifi failed to connect! Reboot to reconnect.");
  246.       break;
  247.     }
  248.   }
  249.   if (WiFi.status() == WL_CONNECTED){
  250.     Serial.println("Connected to the network!");
  251.     Serial.print("STA IP Address: ");
  252.     Serial.println(WiFi.localIP());
  253.  
  254.     server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  255.       request->send_P(200, "text/html", index_html, processor);
  256.     });
  257.     server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
  258.       request->send_P(200, "text/css", index_css);
  259.     });
  260.     server.on("/VOLTAGE", HTTP_GET, [](AsyncWebServerRequest *request){
  261.       request->send_P(200, "text/plain",String(voltage).c_str());
  262.     });
  263.     server.on("/CURRENT", HTTP_GET, [](AsyncWebServerRequest *request){
  264.       request->send_P(200, "text/plain",String(current).c_str());
  265.     });
  266.     server.on("/POWER", HTTP_GET, [](AsyncWebServerRequest *request){
  267.       request->send_P(200, "text/plain",String(power).c_str());
  268.     });
  269.     server.on("/ENERGY", HTTP_GET, [](AsyncWebServerRequest *request){
  270.       request->send_P(200, "text/plain",String(energy).c_str());
  271.     });
  272.     server.on("/FREQUENCY", HTTP_GET, [](AsyncWebServerRequest *request){
  273.       request->send_P(200, "text/plain",String(frequency).c_str());
  274.     });
  275.     server.on("/PF", HTTP_GET, [](AsyncWebServerRequest *request){
  276.       request->send_P(200, "text/plain",String(pf).c_str());
  277.     });
  278.     server.on("/OTA_Status", HTTP_GET, [](AsyncWebServerRequest *request){
  279.       request->send_P(200, "text/plain",OTA_Status.c_str());
  280.     });
  281.     server.on("/MQTT_Status", HTTP_GET, [](AsyncWebServerRequest *request){
  282.       request->send_P(200, "text/plain",mqtt_status.c_str());
  283.     });
  284.     server.on("/ESP_REBOOT", HTTP_GET, [](AsyncWebServerRequest *request){
  285.       ESP.restart();
  286.       request->send_P(200, "text/plain","");
  287.     });
  288.     server.on("/reset_energia", HTTP_GET, [](AsyncWebServerRequest *request){
  289.       pzem.resetEnergy();
  290.       request->send_P(200, "text/plain","");
  291.     });
  292.     return true;
  293.   }
  294.   return false;
  295.    
  296. }
  297. void OTA_setup(){
  298.  
  299.   ArduinoOTA.setHostname(OTA_hostname);
  300.   client.publish("ESP_currentMeter/MQTT_Log", "OTA SETUP");
  301.   ArduinoOTA.onStart([]() {
  302.     Serial.println("Start");
  303.     client.publish("ESP_currentMeter/MQTT_Log", "START");
  304.   });
  305.   ArduinoOTA.onEnd([]() {
  306.     Serial.println("\nEnd");
  307.     client.publish("ESP_currentMeter/MQTT_Log", "EEND");
  308.   });
  309.   ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
  310.     Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  311.     String p = "Progress: " + String((progress / (total / 100)));
  312.     client.publish("ESP_currentMeter/MQTT_Log", p.c_str());
  313.   });
  314.   ArduinoOTA.onError([](ota_error_t error) {
  315.     Serial.printf("Error[%u]: ", error);
  316.     if (error == OTA_AUTH_ERROR){
  317.       Serial.println("Auth Failed");
  318.       client.publish("ESP_currentMeter/MQTT_Log", "Auth Failed");
  319.       }
  320.     else if (error == OTA_BEGIN_ERROR){
  321.       Serial.println("Begin Failed");
  322.       client.publish("ESP_currentMeter/MQTT_Log", "Begin Failed");
  323.       }
  324.     else if (error == OTA_CONNECT_ERROR){
  325.       Serial.println("Connect Failed");
  326.       client.publish("ESP_currentMeter/MQTT_Log", "Connect Failed");
  327.       }
  328.     else if (error == OTA_RECEIVE_ERROR) {
  329.       Serial.println("Receive Failed");
  330.       client.publish("ESP_currentMeter/MQTT_Log", "Receive Failed");
  331.       }
  332.     else if (error == OTA_END_ERROR) {
  333.       Serial.println("End Failed");
  334.       client.publish("ESP_currentMeter/MQTT_Log", "End Failed");
  335.       }
  336.   });
  337.   ArduinoOTA.begin();
  338.   Serial.println("OTA Ready!");
  339.  
  340.   client.publish("ESP_currentMeter/MQTT_Log", "OTA SETUP Comleted");
  341. }
  342. void read_io(){
  343.   lcd_button_status = digitalRead(lcd_button_pin);
  344.   if (lcd_button_status != last_lcd_button_status){
  345.     lcd_menuposition++;
  346.     if (lcd_menuposition >= lcd_total_menus){
  347.       lcd_menuposition = 1;
  348.     }
  349.   }
  350. }
  351. void setup() {
  352.  
  353.   Serial.begin(115200);
  354.   Serial.println("ESP_CurrentMeter On!");
  355.   pinMode(afterboot_pin, OUTPUT);
  356.   pinMode(status_led, OUTPUT);
  357.   pinMode(lcd_button_pin, INPUT);
  358.   digitalWrite(status_led, LOW);
  359.  
  360.   lcd.init();
  361.   lcd.setCursor(2,0);
  362.   lcd.print("ESP_CurrentMeter");
  363.  
  364.   if (wifi_setup()){
  365.     mqtt_setup();
  366.     server.begin();
  367.     client.subscribe("ESP_currentMeter/OTA",1);
  368.     client.subscribe("ESP_currentMeter/REBOOT",1);
  369.   } else {
  370.     Serial.println("MQTT & OTA Disabled.");
  371.   }
  372.  
  373.   delay(500);
  374.   digitalWrite(status_led, HIGH);
  375.   digitalWrite(afterboot_pin, HIGH);
  376.   Serial.println("____________ESP Ready!____________");
  377. }
  378.  
  379. void loop() {
  380.  
  381.   //Allow OTA Updates
  382.   if (allow_OTA){
  383.     OTA_Status = "Ready";
  384.     if (OTA_begin){
  385.       OTA_setup();
  386.       OTA_begin = false;
  387.     }
  388.     ArduinoOTA.handle();
  389.   } else {
  390.     OTA_Status = "OFF";
  391.   }
  392.  
  393.   //Check MQTT
  394.   if (!client.connected()){
  395.     mqtt_status = "Not connected";
  396.   }
  397.  
  398.   fetch_pzemvalues(1000); //Interval
  399.  
  400.   client.loop();
  401. }
  402. //add to webpage OTA/Price/
  403. //Check PZEM STATUS
  404. //Reset energy
  405. //ADD RECONNECT MQTT
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement