MainsFrequency: Difference between revisions

From RevSpace
Jump to navigation Jump to search
No edit summary
m (done!)
Line 3: Line 3:
   |Picture=dropper_opto.png
   |Picture=dropper_opto.png
   |Omschrijving=A simple mains frequency counter
   |Omschrijving=A simple mains frequency counter
   |Status=In progress
   |Status=Completed
   |Contact=bertrik
   |Contact=bertrik
  |Contact2=Peetz0r
   }}
   }}



Revision as of 22:38, 20 May 2018

Project MainsFrequency
Dropper opto.png
A simple mains frequency counter
Status Completed
Contact bertrik, Peetz0r
Last Update 2018-05-20


Introduction

This page is about creating a simple frequency counter for mains power and publish the frequency over MQTT.

It's based on the Arduino platform, using an ESP8266 to do the wifi/network/MQTT stuff.

The frequency measurement principle is to count the number of mains cycles in a fixed period. To get a resolution of 0.01 Hz, the period is 100 seconds.

To keep the measurement circuit relatively safe, only a part of the electronics is actually connected to mains and the low-voltage side is isolated with an optocoupler.

Graph of the AC main frequency as measured at RevSpace

Status

Received/collected most of the parts:

  • 100 nF X2 capacitors.
  • piece of breadboard
  • connectors (we have those at the space)
  • got a polyfuse from User:benadski
  • optocoupler (forgot the part number)

Hardware

The plan is to use an ESP8266 because it can easily publish the measured value over wifi/MQTT.

I'm looking at various ways of actually getting the mains signal into the microcontroller. The simplest way appears to be an optocoupler in series with R, C and a diode anti-parallel over the optocoupler's LED.

How it's finally built:

  • Used the Aliexpress circuit, removed the capacitor and put heatshrink wrap around it. This makes it a 100 Hz signal.
  • Used a nodemcu v3 instead of a Wemos D1 mini (this was what was available at the hacker space)
  • pin D4: used by the built-in LED
  • pin D5: mains input

Aliexpress circuit

The circuit as reverse engineered is shown on the right. Basically, the mains is rectified through a high-value high-power resistor and a bridge rectifier, then stabilized with a zener to 5.1V, which lights the green LED and activates the optocoupler to pull the output low when mains is present. The 47k pull-up makes the signal high when there is no mains power available.

So this circuit doesn't actually do what I want: the opto is activated all the time when 230V is present, it's not flashing at 50 Hz.

2018-05-17: If we remove the capacitor from the board, the AC is no longer smoothed and we should see a 100 Hz waveform coming from the optocoupler, maybe worth a try?

Circuit

The circuit I plan to use

The circuit on the right is the one I plan to use.

The capacitor drops most of the voltage. It should be an x-rated type, you can tell by the marking "X2". The resistor (1k or so) limits the inrush current. The diode (1N4148 probably) protects the optocoupler (4N27 or 4N35) from reverse voltage. The resistor on the right is a pull-up resistor, possibly not even needed if I use the built-in pull-up of the microcontroller.

The X-capacitor, even though it is designed for connection to mains voltage and referred to as a "safety capacitor", has a failure mode to most likely fail as a short. This means additional components are needed to make it actually safe to use in this circuit, like a fuse in series that blows when the capacitor fails.

At 50 Hz, the capacitor has a reactance of about 32 kOhm, so the LED current should be something like 230V/32kOhm = 7 mA, well below the maximum of 60 mA mentioned in the data sheet. Possibly, a bleeder resistor could be put parallel to the capacitor, to make sure that the capacitor doesn't stay charged when the circuit is powered off. Power consumed in the series resistor is R*I*I so about 50 mW, so we can probably use the very common 250 mW type there.

Software

The Arduino source is available on the github page, but has not been tested on actual hardware yet.

You can build it with platformio ('pio run').

The working principle is that we count the number of cycles in a 100 second period, this should nominally be 5000. A cycle count is done every second and the result is put in a circular buffer of 100 bins. The average of these 100 bins then provides the frequency over the past 100 seconds. The circular buffer is initialized with a value of 50 for each bin.

The accuracy of the frequency count depends on the accuracy of the crystal (among other things). To get 0.01 Hz error at 50 Hz, we need an time reference with at most 0.01 / 50 = 200 ppm frequency deviation. This is probably doable with the built-in crystal on a typical ESP8266 board (like a Wemos D1 mini).

References

Online mains frequency. NOTE: don't leave this site open for too long, it'll ban your IP for 'traffic exceeded' reasons!

Other interesting projects/documents: