Доброго дня.
Если я правильно понял, то, алгоритма то не требуется (можно применить сжатие LZW, но, боюсь, Ардуинка половину времени будет вычислять его, что явно не устроит).
По-моему, проще будет пробежаться по байтам и вместо 0 0 0 0 0 вставлять 0 N, где N - их количество (если не хотите возиться со сдвигом массива, то вместо остальных ставьте любое значение, потом только при парсинге поставите обратно).
Но вот если 0 действительно один, то всё равно придётся вставлять дополнительно 0 1, иначе будет не отличить где один, а где несколько.
И вообще "0" - хреновый разделитель, т.к., по-моему, самое часто встречающееся значение в потоке обмена. Лучше уж 42.