The programming code of a smart voltage-meter

hello every one ,
i’m trying to make a smart voltage meter to measure AC voltage and send the readings to a mobile phone using MQTT and openhab .

hardware and circuit diagram :

  • ESP8266-12E wifi module
  • voltage sensor
  • bridge rectifier
  • resistor ( 428 kohm)
  • fan regulator ( to change input voltage for test )

i have a problem in the code that have to be burned to the esp module .
i have the code of a smart fire sensor that sends a notification when fire detected . i’m trying to modify this code to work with my voltage meter .
those are the two codes :
complete fire sensor code :


  • Device Title: MK-FireSensor V2
  • Device Description: MQTT Fire Sensor
  • Device Explanation: This device connects to your existing
  •                 fire detectors and when they go off this
  •                 device sends an MQTT message to the server
  • Device information:
  • Author: Matt Kaczynski
  • Website:
  • Code may only be distrbuted through any other methods
  • of obtaining or distributing are prohibited
  • Copyright © 2016-2018
  • Note: After flashing the code once you can remotely access your device by going to http://HOSTNAMEOFDEVICE.local/firmware
  • obviously replace HOSTNAMEOFDEVICE with whatever you defined below. The user name and password are also defined below.

#include <FS.h> //this needs to be first, or it all crashes and burns…
#include <Servo.h>
#include <ESP8266WiFi.h> //
#include <MQTTClient.h> //
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //
#include <ArduinoJson.h> //
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>

//define your default values here, if there are different values in config.json, they are overwritten.
char host[34];
char mqtt_server[40];
char mqtt_port[6] = “1883”;
char mqtt_topic[50];
char mqtt_isAuthentication[7] = “FALSE”;
char mqtt_username[40];
char mqtt_password[40];
char update_username[40];
char update_password[40];
char update_path[34] = “/firmware”;

//Unique device ID
const char* mqttDeviceID;

//Form Custom SSID
String ssidAP = “MK-FireSensor” + String(ESP.getChipId());

//flag for saving data
bool shouldSaveConfig = false;

//callback notifying us of the need to save config
void saveConfigCallback ()
shouldSaveConfig = true;

//the time when the sensor outputs a low impulse
long unsigned int lowIn;

//the amount of milliseconds the sensor has to be low
//before we assume all detection has stopped
long unsigned int pause = 100;

//sensor variables
boolean lockLow = true;
boolean takeLowTime;

//the digital pin connected to the fire sensor’s output
int sensorPin = 13;

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;

WiFiClient net;
MQTTClient client;

unsigned long lastMillis = 0;

void connect();

void setup()
if (SPIFFS.begin())
if (SPIFFS.exists("/config.json"))
//file exists, reading and loading
File configFile ="/config.json", “r”);
if (configFile)
size_t size = configFile.size();
// Allocate a buffer to store contents of the file.
std::unique_ptr<char[]> buf(new char[size]);

    configFile.readBytes(buf.get(), size);
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.parseObject(buf.get());
    if (json.success()) 
      strcpy(host, json["host"]);
      strcpy(update_username, json["update_username"]);
      strcpy(update_password, json["update_password"]);
      strcpy(mqtt_isAuthentication, json["mqtt_isAuthentication"]);
      strcpy(mqtt_username, json["mqtt_username"]);
      strcpy(mqtt_password, json["mqtt_password"]);
      strcpy(update_path, json["update_path"]);
      strcpy(mqtt_server, json["mqtt_server"]);
      strcpy(mqtt_port, json["mqtt_port"]);
      strcpy(mqtt_topic, json["mqtt_topic"]);

//end read

// The extra parameters to be configured (can be either global or just in the setup)
// After connecting, parameter.getValue() will get you the configured value
// id/name placeholder/prompt default length
WiFiManagerParameter custom_text0(“

Select your wifi network and type in your password, if you do not see your wifi then scroll down to the bottom and press scan to check again.

WiFiManagerParameter custom_text1(“

Hostname/MQTT ID

WiFiManagerParameter custom_text2(“

Enter a name for this device which will be used for the hostname on your network and identify the device from MQTT.

WiFiManagerParameter custom_host(“name”, “Device Name”, host, 32);

WiFiManagerParameter custom_text3(“


WiFiManagerParameter custom_text4(“

Enter the details of your MQTT server and then enter the topic for which the device sends Fire Detector State MQTT messages to. If your server requires authentication then set it to True and enter your server credentials otherwise leave it at false and keep the fields blank.

WiFiManagerParameter custom_mqtt_server(“server”, “MQTT Server IP”, mqtt_server, 40);
WiFiManagerParameter custom_mqtt_port(“port”, “MQTT Server Port”, mqtt_port, 5);
WiFiManagerParameter custom_mqtt_topic(“topic”, “MQTT Out Topic”, mqtt_topic, 50);
WiFiManagerParameter custom_mqtt_isAuthentication(“isAuthentication”, “MQTT Authentication?”, mqtt_isAuthentication, 7);
WiFiManagerParameter custom_mqtt_username(“userMQTT”, “Username For MQTT Account”, mqtt_username, 40);
WiFiManagerParameter custom_mqtt_password(“passwordMQTT”, “Password For MQTT Account”, mqtt_password, 40);

WiFiManagerParameter custom_text5(“

Web Updater

WiFiManagerParameter custom_text6(“

The web updater allows you to update the firmware of the device via a web browser by going to its ip address or hostname /firmware ex. you can change the update path below. The update page is protected so enter a username and password you would like to use to access it.

WiFiManagerParameter custom_update_username(“user”, “Username For Web Updater”, update_username, 40);
WiFiManagerParameter custom_update_password(“password”, “Password For Web Updater”, update_password, 40);
WiFiManagerParameter custom_device_path(“path”, “Updater Path”, update_path, 32);
WiFiManagerParameter custom_text7(“

To reset device settings restart the device and quickly move the jumper from RUN to PGM, wait 10 seconds and put the jumper back to RUN.

WiFiManagerParameter custom_text8(””);

//Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wifiManager;

//set config save notify callback

//set static ip
//wifiManager.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0));

//add all your parameters here
wifiManager.setCustomHeadElement(".c{text-align: center;} div,input{padding:5px;font-size:1em;} input{width:95%;} body{text-align: center;font-family:oswald;} button{border:0;background-color:#313131;color:white;line-height:2.4rem;font-size:1.2rem;text-transform: uppercase;width:100%;font-family:oswald;} .q{float: right;width: 65px;text-align: right;} body{background-color: #575757;}h1 {color: white; font-family: oswald;}p {color: white; font-family: open+sans;}a {color: #78C5EF; text-align: center;line-height:2.4rem;font-size:1.2rem;font-family:oswald;}");



//reset settings - for testing

//set minimu quality of signal so it ignores AP’s under that quality
//defaults to 8%

//sets timeout until configuration portal gets turned off
//useful to make it all retry or go to sleep
//in seconds

//fetches ssid and pass and tries to connect
//if it does not connect it starts an access point with the specified name
//here “AutoConnectAP”
//and goes into a blocking loop awaiting configuration
if (!wifiManager.autoConnect(ssidAP.c_str()))
//reset and try again, or maybe put it to deep sleep

//read updated parameters
strcpy(host, custom_host.getValue());
strcpy(mqtt_server, custom_mqtt_server.getValue());
strcpy(mqtt_port, custom_mqtt_port.getValue());
strcpy(mqtt_topic, custom_mqtt_topic.getValue());
strcpy(mqtt_isAuthentication, custom_mqtt_isAuthentication.getValue());
strcpy(mqtt_username, custom_mqtt_username.getValue());
strcpy(mqtt_password, custom_mqtt_password.getValue());
strcpy(update_username, custom_update_username.getValue());
strcpy(update_password, custom_update_password.getValue());
strcpy(update_path, custom_device_path.getValue());

//save the custom parameters to FS
if (shouldSaveConfig)
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.createObject();
json[“host”] = host;
json[“mqtt_server”] = mqtt_server;
json[“mqtt_port”] = mqtt_port;
json[“mqtt_topic”] = mqtt_topic;
json[“mqtt_isAuthentication”] = mqtt_isAuthentication;
json[“mqtt_username”] = mqtt_username;
json[“mqtt_password”] = mqtt_password;
json[“update_username”] = update_username;
json[“update_password”] = update_password;
json[“update_path”] = update_path;

File configFile ="/config.json", "w");
if (!configFile) 

//end save



if(digitalRead(0) == LOW || String(host).length() == 0 || String(mqtt_server).length() == 0 || String(mqtt_topic).length() == 0 || String(update_username).length() == 0 || String(update_password).length() == 0)

mqttDeviceID = host;
client.begin(mqtt_server, atoi(mqtt_port), net);



httpUpdater.setup(&httpServer, update_path, update_username, update_password);

httpServer.on("/", {
if(!httpServer.authenticate(update_username, update_password))
return httpServer.requestAuthentication();
httpServer.send(200, “text/plain”, "Hostname: " + String(host) + "\nMQTT Server: " + String(mqtt_server) + "\nMQTT Port: " + String(mqtt_port) + "\nMQTT Authentication: " + String(mqtt_isAuthentication) + "\nMQTT Out Topic: " + String(mqtt_topic) + “\nTo update firmware go to: http://”+ String(host) + “.local” + String(update_path) + “\nTo reset device settings restart the device and quickly move the jumper from RUN to PGM, wait 10 seconds and put the jumper back to RUN.”);

MDNS.addService(“http”, “tcp”, 80);


void connect()
while (WiFi.status() != WL_CONNECTED)

//If authentication true then connect with username and password
while (!client.connect(mqttDeviceID, mqtt_username, mqtt_password))
while (!client.connect(mqttDeviceID))


void loop()



//Sensor Detection

if(digitalRead(sensorPin) == HIGH)
//makes sure we wait for a transition to LOW before any further output is made:
lockLow = false;
client.publish(String(mqtt_topic), “No Fire Detected”);
takeLowTime = true;

if(digitalRead(sensorPin) == LOW)
lowIn = millis(); //save the time of the transition from high to LOW
takeLowTime = false; //make sure this is only done at the start of a LOW phase
//if the sensor is low for more than the given pause,
//we assume that no more detection is going to happen
if(!lockLow && millis() - lowIn > pause)
//makes sure this block of code is only executed again after
//a new detection sequence has been detected
lockLow = true;
client.publish(String(mqtt_topic), “FIRE DETECTED!”);

void messageReceived(String &topic, String &payload)
//This sensor does not recieve anything from MQTT Server so this is blank

voltage meter code :

float correctionfactor = 26; // 77
int analogInput = A0;
float vout = 0;
int vin = 0;

// if we add 428k ohm resistor in series with the module
// we can monitor the line voltage upto 310.048

float R1 = 30000 + 428000; // these are the 30k and 428k resistors
float R2 = 7500; // 7.5 k
int value = 0;

void loop() {



void Voltage()
// read the value at analog input
value = analogRead(analogInput);
vout = (value * 5.0) / 1023.0; // see text
vin = vout / (R2/(R1+R2));

vin = vin + correctionfactor; 


the question now :
what are the modifications that should be applied to the fire sensor code to work as a voltage meter ?

This is not an ESP programming forum. It is for openHAB only, not for other software that may be required for your purposes.

Making suggestions on items involving lethal electricity have liability concerns that mose volunteers do not desire.

  • the Ac voltage is converted into Dc . Also i’m using a resistor to drop the input voltage of the ESP to nearly 3.3 v . So i think it is far away electricity risks .
  • also i’m going to use optocupler to completely isolate the sesnsor from the esp module .

The only remaining thing for me is :
If i removed the sensing part from the fire sensor code and inserted the voltage meter code .
What are the modifications to make these readings that are measured by the sensor and the esp to be published to the mqtt broker ?

I think you need to be more specific, please take a look at my espbutton pusher, which is using mqtt.
I don’t see any harm in discussing esp8266 here, the border between home automation and other technologies are somewhat blurry. For instance we often post things in depth related to bashscripting etc.

My esp post:

The official datasheet for ESP8266

Hardware Design The input voltage range is 0 to 1.0 V when TOUT is connected to external circuit.

So 3v is too high

You can use tasmota on your 8266 as it has calibration and other stuff in the software to make it send the exact data to mqtt and easier to setup in openHAB

This topic was automatically closed 41 days after the last reply. New replies are no longer allowed.