I have a Delta Solivia 3kw solar inverter that I'd like an Ardiuno to monitor and wirelessly transmit the status once per second.
What I think I'll need:
- A lower power Arduino Uno
- RS485 interface
- nRF24L01 transmitter
I have a USB-RS485 adapter, know the Delta inverter protocol and have written a program in C# to query the inverter and display information. I'm intending on porting it to Arduino.
The problem is there's no mains power near the inverter and no sunlight nearby (large buildings) so I can't run a small solar panel to keep a battery charged. I don't want to tap into the hardwired wiring (DC solar supply or AC output), so this leads me to stealing power from the RS485 port.
I'm very new to RS485 so please help if I've made any mistakes. I googled the protocol and found this page
http://www.lammertbies.nl/comm/info/RS-485.html
That says RS485 should have a driver load impedance of 54 ohms. I put the scope on the RS485 wires between my inverter and the USB adapter, here's the waveform:
The 0-3v waveform is the laptop sending the query, the 7v peak to peak -3.5 - +3.5v waveform (zoomed in) is the inverter response with a 68 ohm resistor sitting across the RS485 twisted pair.
Another problem is the RS485 output from the inverter shuts down about 10 minutes after solar power ceases. This means I need a very low power monitor to check if the RS485 port is alive, perhaps once per minute. An elegant solution is here (minus the voltage reg since the atmega328 will run from 1.8v - 5.5v)
So, if I use the Arduino to switch the inverter response signal (via a FET and 68 ohm resistor) into a bridge rectifier, this will provide up to 100mw of power for approximately 5ms for every 20ms query/response, approx 25% duty cycle, therefore approximately 25mw of average power.
I'll need some form of charging circuitry to keep the battery topped up. I could be very simple and use a 3.9v zener diode across a LiPo battery (keep it well under 4.2v to increase the battery lifespan 3-4x more since charging LiPo battery's to 100% harms them), wasting excess energy as heat. Lets be generous and write off a 50% loss in energy, leaving us with approximately 12mw of power.
Page 310 of the atmega328 datasheet says it can run at 10MHz @ 2.7v so the minimum a LiPo battery would ever fall to is 3.3v before a protection circuit opened up. Lets say we replace the crystal with 4MHz to conserve power. That's a maximum of 3.5mw draw for the uP.
The lowest amount of solar power provided in my location per day is about 5 hours. This means the charging circuit would need to provide enough energy to the battery, to start the Arduino (without the transmitter) for two seconds, once per minute to check if the inverter has started. The circuit linked above uses approx 1.5uA in standby, plus our approx 3.5mw for two seconds per minute, resulting in 0.1mw average consumption while solar isn't available.
If the USB interface is isolated from the circuit and the power LED unsoldered, would that leave sufficient power to recharge a LiPo battery and transmit approximately 130 bytes (excluding protocol overhead) once per second? I have no idea how much power an nRF24L01 consumes during transmission, the only specs I can find is it consumes under 1uA in standby.
I'm going to take a wild guess and say the nRF24L01 averages 1mw of power, leaving us with around 8mw of power to keep a battery topped up.
A quick dot point of power
- 25mw from RS485 physical layer
- 3.5mw for ATMega328
- 'x' mw for Arduino <-> RS485 interface? Any ideas?
- 1mw for nRF24L01
If my numbers are right, I've got about a 5mw window of freedom.
I believe that could keep a 100mAh 3.7v LiPo cell (0.37Wh (370mWh)) cell charged. We'd have about 250mWh usable (maximizing LiPo lifespan by never exceeding 80% recharge and 20% discharge), with no more than a few mWh discharge overnight.
Am I completely dreaming or does this sound plausible?
Thanks for reading this far!