I've been following this thread for a couple of years now. Standing on the shoulders of giants such as meatlover and stinkygoalieguy, I've been sniffing out the code on the 24v greenworks batteries. I have a little mower that I actually really like for some reason, so I'd really like to power it with something north of 4aH.
here's what the waveform looks like by the way. I'm hoping this is all correct because I connected it to a 24v 3d printer heating bed, so who knows I guess. I'll update when this inevitably fails.

anyway, here's my code, written with the help of Gemini because God knows I can't write code to save my life.
// Greenworks 24V Omega Port Spoof
// Timing: 97.2ms Interval | Sync: 648us | Data: PWM Encoded
// Based on Logan's Saleae Captures (March 2026)
#define OMEGA_PIN 3
const unsigned long PACKET_INTERVAL = 97; // Your measured 97.2ms (rounded)
unsigned long lastPacketTime = 0;
void setup() {
pinMode(OMEGA_PIN, OUTPUT);
digitalWrite(OMEGA_PIN, HIGH); // Idle high
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastPacketTime >= PACKET_INTERVAL) {
lastPacketTime = currentTime;
// 1. SEND THE SYNC PULSE
sendPulse(648);
// 2. SEND THE PWM DATA BURST (L=~40us, S=~20us)
// Sequence derived from your Saleae measurement list:
sendPulse(42); // Long
sendPulse(40); // Long
sendPulse(16); // Short
sendPulse(38); // Long
sendPulse(20); // Short
sendPulse(39); // Long
sendPulse(46); // Long
sendPulse(33); // Long
sendPulse(44); // Long
sendPulse(35); // Long
sendPulse(25); // Short
sendPulse(44); // Long
digitalWrite(OMEGA_PIN, HIGH); // Ensure it returns high for the idle gap
}
}
void sendPulse(int lowTime) {
digitalWrite(OMEGA_PIN, LOW);
delayMicroseconds(lowTime);
digitalWrite(OMEGA_PIN, HIGH);
delayMicroseconds(15); // Average high-time gap observed
}