from machine import Pin, Timer, PWM, ADC # importovat použité třídy from utime import sleep, sleep_ms # piny pro LED, PWM a tlačítko lze nastavit libovolně, AD převodník funguje jen na třech - GPIO 26, 27 a 28 inbuiltLed = 25 # na desce Raspberry Pi PICO je zelená LED, připojená na GPIO 25 led = Pin(inbuiltLed, Pin.OUT) # nastavíme její pin jako digitální výstup button = Pin(16,Pin.IN,Pin.PULL_UP) # nastavíme GPIO 16 jako vstupní digitální pin ledT = Pin(4, Pin.OUT) # další GPIO nastavíme jako výstupní pro připojení externí LED (musíme do série přidat i R = 470 Ohm) voltage = ADC(28) # vstup AD převodníku pro měření napětí (rozsah měření 0 - 3.3V) trimvoltage = ADC(27) # ještě jeden vstup pro měření napětí timerr = Timer() # vytvoříme si časovač, který bude pravidelně volat funkci voltages = [0.0, 0.0, 0.0,0.0] # pole čtyř čísel, které využijeme pro průměrování naměřených hodnot array_position = 0 # pozice v poli - 0 až 3 time_stamp = 0 # čas v sekundách, který budeme posílat do programu DataPlotter, ovlivní zobrazení na ose X buzzer = PWM(Pin(15)) # na GPIO 15 připojíme modul PWM generátoru buzzer.freq(500) # frekvence PWM bude 500 Hz (nebude to tak hlasité, jako kdybychom zvolili například 4000 Hz = peklo*) # * - protože okolo 4000 Hz má použitý PIEZOměnič nejvyšší hlasitost def meas(timerr): # definice funkce kterou budeme pravidelně spouštět časovačem každých 10 ms global time_stamp # definujeme jako global, aby se zachovala hodnota i když funkce skončí global array_position global voltages trimV=(3.3 * trimvoltage.read_u16())/65536 # změříme napětí na GPIO 27. převod na Volty je 3.3 *(x/65536), kde x je hdonota naměřená interním AD převodníkem voltages[array_position] = (3.3 * voltage.read_u16())/65536 # změříme napětí na GPIO 28 a uložíme ho do pole, na pozici "array_position" array_position +=1 # v příštím cyklu uložíme hodnotu na další pozici if array_position == 4: # pokud jsme už uložili 4 hdonoty array_position =0 # tak opět nastavíme pozici na začátek a = 0 # a vypočítáme průměr z uložených 4 hodnot (abychom potlačili síťové 50 Hz rušení) sum_voltage = 0 while a < 4: # postupně připočteme 4 napětí sum_voltage += voltages[a] a += 1 sum_voltage /=4 # vydělíme 4.. time_stamp += 0.04 # inkrementujeme čas o 40 ms / můžete zkusit nastavit frekvenci 200 Hz a inkrementovat po 20 ms print("$$P",time_stamp,",",sum_voltage,",",trimV,";",sep='',end='') # pošleme data na sériovou linku (v tomto případě přes USB) v DataPlotter formátu # sep='',end='' odstraňuje mezery mezi čísly a také odřádkování na konci, které nemá program DataPlotter rád # "$$P" znamená přidání bodu nebo bodů do grafu / čas / napětí jedna / napětí dvě v tomto případě led.toggle() # změníme stav interní LED, abychom viděli, že zařízení "žije" (pokud svítila, tak ji zhasneme a naopak) if sum_voltage > trimV: # pokud je změřená hodnota na GPIO 28 vyšší než na GPIO27 ledT.value(1) # tak rozsvítíme LED buzzer.duty_u16(32768) # a zapneme PWM výstup - bude to pískat else: ledT.value(0) # jinak LED zhasneme buzzer.duty_u16(0) # stejně jako PWM timerr.init(freq=100, mode=Timer.PERIODIC, callback=meas) # přiřazení funkce "meas" k časovačí, funkce bude volána přesně 100x za sekundu while True: # hlavní smyčka programu - zde se program v podstatě nudí.. čeká na aktivaci funkce meas, nebo ukončení... if button.value() == 0: # jestliže je stisknuté tlačítko sys.exit() # tak ukončíme program / to nám pomůže při ladění v Thonny sleep_ms(10) # mohli bychom to kontrolovat hodně často, takto to kontrolujeme 100x za sekundu