# bits.py - binair, hexadecimaal, de ADC en bemonsteren in een paar functies


def naar_binair(getal, bits=8):
    """Deel telkens door 2: de resten zijn de bits, van achter naar voor."""
    resten = []
    for _ in range(bits):
        resten.append(getal % 2)
        getal = getal // 2
    return "".join(str(b) for b in reversed(resten))


def adc(u, u_ref=5.0, bits=10):
    """Zoals de ADC: 2**bits niveaus, naar beneden afgerond, nooit meer dan het hoogste niveau."""
    return min(int(u / u_ref * 2 ** bits), 2 ** bits - 1)


def schijnbaar(f, fs):
    """Schijnbare frequentie na bemonsteren met fs: de afstand tot het dichtste veelvoud van fs."""
    k = round(f / fs)
    return abs(f - k * fs)


for g in (5, 182, 200, 255):
    print(f"{g:4d} = {naar_binair(g)} = 0x{g:02X}")
print(f"1023 = {naar_binair(1023, 10)} = 0x{1023:X}")

for u in (0.75, 1.25, 3.20, 4.999, 6.0):
    n = adc(u)
    print(f"U = {u:5.3f} V  ->  N = {n:4d} = {naar_binair(n, 10)}")

for f in (0.2, 9.0, 11.0, 50.0):
    print(f"{f:4.1f} Hz, 10 keer per seconde gemeten: lijkt {schijnbaar(f, 10.0):.1f} Hz")
