Pomiar czasu spadku swobodnego

Typ_projektu
microPython
Zdjecie główne
Krótki opis projektu

Układ umożliwia pomiar czasu spadku swobodnego. Po podłączeniu płytki do laptopa i uruchomieniu programu zrzucany przedmiot umieszcza się przed fotorezystorem, zrzuca a następnie układ wyświetla czas w jakim przedmiot spadł.

Niezbędne elementy

1. ESP8266

2. wyświetlacz OLED niebieski graficzny 0,96'' 128x64px I2C

3. Przycisk

4. Czujnik odległości HC-SR04

5. Rezystor 330 Ohm

6. Przewody męsko-męskie i męsko-żeńskie

7. 2 przewody 1.5m

8. Przewód microUSB

 

Sprzęt

1. Laptop z systemem Windows 10 (na innych nie ma gwarancji działania) i programem Thonny

2. Lutownica

3. Kombinerki

Opis projektu

Na wyświetlaczu OLED pokazuje się tekst powitalny. Po naciśnięciu przycisku należy zbliżyć zrzucany przedmiot do fotorezystora, umieszczonego na pewnej wysokości dokładnie nad czujnikiem odległości. Układ mierzy czas spadku swobodnego poprzez rozpoznanie przez fotorezystor momentu upuszczenia przedmiotu, a ultradźwiękowy czujnik odległości rozpoznaje moment upadku. Upuszczane przedmioty powinny mieć wymiary większe niż 10cm. Po rozpoznaniu upadku na wyświetlaczu pojawia się czas spadania w milisekundach, po czym można powtórzyć pomiar naciskając przycisk.

kod programu
import time
from machine import Pin, I2C, ADC
import ssd1306
class HCSR04:
    def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
        self.echo_timeout_us = echo_timeout_us
        # Init trigger pin (out)
        self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
        self.trigger.value(0)
        # Init echo pin (in)
        self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)
    def _send_pulse_and_wait(self):
        self.trigger.value(0) # Stabilize the sensor
        time.sleep_us(5)
        self.trigger.value(1)
        # Send a 10us pulse.
        time.sleep_us(10)
        self.trigger.value(0)
        try:
            pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)
            return pulse_time
        except OSError as ex:
            if ex.args[0] == 110: # 110 = ETIMEDOUT
                raise OSError('Out of range')
            raise ex
    def distance_mm(self):
        pulse_time = self._send_pulse_and_wait()
        mm = pulse_time * 100 // 582
        return mm
    def distance_cm(self):
        pulse_time = self._send_pulse_and_wait()
        cms = (pulse_time / 2) / 29.1
        return cms
button=Pin(2,Pin.IN,Pin.PULL_UP)
 
i2c=I2C(scl=Pin(5),sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128,64,i2c)
sensor = HCSR04(trigger_pin=0, echo_pin=14, echo_timeout_us=10000)
adc = ADC(0)

mes='Witaj, aby '
oled.text(mes,0,0,1)
mes='zmierzyc czas'
oled.text(mes,0,10,1)
mes='spadku'
oled.text(mes,0,20,1)
mes='swobodnego'
oled.text(mes,0,30,1)
mes='wcisnij'
oled.text(mes,0,40,1)
mes='przycisk 1.'
oled.text(mes,0,50,1)
oled.show()
status=1
 
while status!=0:
    time.sleep(0.1)
    status=button.value()
status=1
oled.fill(0)
normalLightLvl=adc.read()
fall=1
start=0
while True:
    while True:
        oled.fill(0)
        mes='Ustaw przedmiot'
        oled.text(mes,0,0,1)
        mes='przed czujka'
        oled.text(mes,0,10,1)
        oled.show()
        while adc.read()>normalLightLvl/2:
            suma=0
            for i in range(2):
                suma+=sensor.distance_cm()
                time.sleep(0.01)
            suma=suma/5
            print(suma)
            if suma<10 and suma>0:
                fall=0
                stop= time.time_ns()
                break
        if fall==0:
            break  
        oled.fill(0)
        mes='Upusc przedmiot'
        oled.text(mes,0,0,1)
        oled.show()
        while adc.read()<=normalLightLvl/2:
            time.sleep(0.1)
        start=time.time_ns()
       
    fall=1
    duration=stop-start
    duration=duration/1000000.0
    oled.fill(0)
    mes='Czas upadku: '
    oled.text(mes,0,0,1)
    mes=str(duration)+' ms'
    oled.text(mes,0,10,1)
    mes='Nacisnij 1.'
    oled.text(mes,0,20,1)
    mes='aby powtorzyc'
    oled.text(mes,0,30,1)
    oled.show()
   
    while status!=0:
        time.sleep(0.1)
        status=button.value()
    status=1
Pliki_projektu
Schemat
Tagi
microPython spadek pomiar