Showing
8 changed files
with
284 additions
and
11 deletions
hardware/rpi.py
deleted
100644 → 0
1 | -from bluetooth import * | ||
2 | - | ||
3 | -socket = BluetoothSocket( RFCOMM ) | ||
4 | -socket.connect(("04:A3:16:99:C7:42", 1)) | ||
5 | -print("bluetooth connected!") | ||
6 | - | ||
7 | -msg = input("send message : ") | ||
8 | -socket.send(msg) | ||
9 | - | ||
10 | -print("finished") | ||
11 | -socket.close() | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
hardware/rpi4/rpi.py
0 → 100644
1 | +from bluetooth import * | ||
2 | +import time | ||
3 | + | ||
4 | +client_socket = BluetoothSocket( RFCOMM ) | ||
5 | +client_socket.connect(("00:18:91:D8:24:39", 1)) | ||
6 | +print("bluetooth connected!") | ||
7 | + | ||
8 | +def _send_data(msg:str): | ||
9 | + client_socket.send(msg) | ||
10 | + | ||
11 | +def _recv_data(): | ||
12 | + # 소켓에 2초간 받을 수 있는 시간을 준다 | ||
13 | + client_socket.settimeout(2) | ||
14 | + | ||
15 | + # 데이터 받을 변수 | ||
16 | + data = '' | ||
17 | + | ||
18 | + try: | ||
19 | + timeout_start = time.time() | ||
20 | + timeout = 2 | ||
21 | + while time.time() < timeout_start + timeout: | ||
22 | + data += client_socket.recv(1024).decode('utf-8') | ||
23 | + except: | ||
24 | + print("INFO: DATA RECV TIMEOUT") | ||
25 | + finally: | ||
26 | + return data | ||
27 | + | ||
28 | + | ||
29 | +while True: | ||
30 | + sel_mode = input("SELECT MODE: ") | ||
31 | + | ||
32 | + if sel_mode == 'W': | ||
33 | + msg = input("send message : ") | ||
34 | + _send_data(msg) | ||
35 | + | ||
36 | + elif sel_mode == 'WR': | ||
37 | + msg = input("send message : ") | ||
38 | + _send_data(msg) | ||
39 | + | ||
40 | + data = _recv_data() | ||
41 | + print(f"Received: {data}") | ||
42 | + | ||
43 | +client_socket.close() | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
hardware/rpi_pico/bluetoooth.py
0 → 100644
1 | +import uos | ||
2 | +import machine | ||
3 | +import utime | ||
4 | + | ||
5 | +uart0 = machine.UART(0,baudrate=9600) | ||
6 | + | ||
7 | +# --------------------------------------------------- # | ||
8 | +# INTERNAL FUNCTIONS | ||
9 | +# --------------------------------------------------- # | ||
10 | +def _clartBuf(uart=uart0): | ||
11 | + ''' Clear Buffer | ||
12 | + ''' | ||
13 | + while uart.any(): | ||
14 | + print(uart.read(1)) | ||
15 | + | ||
16 | +# --------------------------------------------------- # | ||
17 | +# FUNCTIONS | ||
18 | +# --------------------------------------------------- # | ||
19 | +def send_data_bt(sdata:str): | ||
20 | + ''' Send string data using Bluetooth | ||
21 | + ''' | ||
22 | + _clartBuf() | ||
23 | + uart0.write(sdata) | ||
24 | + | ||
25 | + | ||
26 | +def recv_data_bt(): | ||
27 | + ''' Receive string data using Bluetooth | ||
28 | + ''' | ||
29 | + _clartBuf() | ||
30 | + prvMills = utime.ticks_ms() | ||
31 | + received_data = '' | ||
32 | + | ||
33 | + while (utime.ticks_ms()-prvMills)<2000: | ||
34 | + if uart0.any(): | ||
35 | + single_data = uart0.read(1) | ||
36 | + received_data += single_data.decode('utf-8') | ||
37 | + | ||
38 | + return received_data | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
hardware/rpi_pico/dht.py
0 → 100644
1 | +''' Original code from https://www.raspberrypi.org/forums/viewtopic.php?t=303606 | ||
2 | +''' | ||
3 | +import utime | ||
4 | +import rp2 | ||
5 | +from rp2 import PIO, asm_pio | ||
6 | +from machine import Pin | ||
7 | + | ||
8 | +# --------------------------------------------------- # | ||
9 | +# INIT | ||
10 | +# --------------------------------------------------- # | ||
11 | +# For VCC | ||
12 | +dht_pwr = Pin(14, Pin.OUT) | ||
13 | +# For data | ||
14 | +dht_data = Pin(15, Pin.IN, Pin.PULL_UP) | ||
15 | + | ||
16 | +# Power on | ||
17 | +dht_pwr.value(1) | ||
18 | +# Create empty state | ||
19 | +sm=rp2.StateMachine(1) | ||
20 | +# Wait for DHT22 to start up | ||
21 | +utime.sleep(2) | ||
22 | + | ||
23 | +# --------------------------------------------------- # | ||
24 | +# INIT2 | ||
25 | +# --------------------------------------------------- # | ||
26 | +@asm_pio(set_init=(PIO.OUT_HIGH),autopush=True, push_thresh=8) #output one byte at a time | ||
27 | +def DHT22(): | ||
28 | + #drive output low for at least 20ms | ||
29 | + set(pindirs,1) #set pin to output | ||
30 | + set(pins,0) #set pin low | ||
31 | + set(y,31) #prepare countdown, y*x*100cycles | ||
32 | + label ('waity') | ||
33 | + set(x,31) | ||
34 | + label ('waitx') | ||
35 | + nop() [30] | ||
36 | + jmp(x_dec,'waitx') #decrement x reg every 100 cycles | ||
37 | + jmp(y_dec,'waity') #decrement y reg every time x reaches zero | ||
38 | + | ||
39 | + #begin reading from device | ||
40 | + set(pindirs,0) #set pin to input | ||
41 | + wait(1,pin,0) #check pin is high before starting | ||
42 | + wait(0,pin,0) | ||
43 | + wait(1,pin,0) | ||
44 | + wait(0,pin,0) #wait for start of data | ||
45 | + | ||
46 | + #read databit | ||
47 | + label('readdata') | ||
48 | + set(x,21) #reset x register to count down from 20 | ||
49 | + wait(1,pin,0) #wait for high signal | ||
50 | + label('countdown') | ||
51 | + jmp(pin,'continue') #if pin still high continue counting | ||
52 | + #pin is low before countdown is complete - bit '0' detected | ||
53 | + set(y,0) | ||
54 | + in_(y, 1) #shift '0' into the isr | ||
55 | + jmp('readdata') #read the next bit | ||
56 | + | ||
57 | + label('continue') | ||
58 | + jmp(x_dec,'countdown') #decrement x reg and continue counting if x!=0 | ||
59 | + #pin is still high after countdown complete - bit '1' detected | ||
60 | + set(y,1) | ||
61 | + in_(y, 1) #shift one bit into the isr | ||
62 | + wait(0,pin,0) #wait for low signal (next bit) | ||
63 | + jmp('readdata') #read the next bit | ||
64 | + | ||
65 | + | ||
66 | +# --------------------------------------------------- # | ||
67 | +# FUNCTIONS | ||
68 | +# --------------------------------------------------- # | ||
69 | +def work_dht(): | ||
70 | + data=[] | ||
71 | + total=0 | ||
72 | + sm.init(DHT22,freq=1600000,set_base=dht_data,in_base=dht_data,jmp_pin=dht_data) | ||
73 | + sm.active(1) | ||
74 | + for i in range(5): #data should be 40 bits (5 bytes) long | ||
75 | + data.append(sm.get()) #read byte | ||
76 | + | ||
77 | + #check checksum (lowest 8 bits of the sum of the first 4 bytes) | ||
78 | + for i in range(4): | ||
79 | + total=total+data[i] | ||
80 | + if((total & 255) == data[4]): | ||
81 | + humidity=((data[0]<<8) + data[1])/10.0 | ||
82 | + temperature=(((data[2] &0x7f) << 8) + data[3]) /10.0 | ||
83 | + if (data[2] & 0x80) == 0x80: | ||
84 | + temperature = -temperature | ||
85 | + return [humidity, temperature] | ||
86 | + else: | ||
87 | + return False | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
hardware/rpi_pico/main.py
0 → 100644
1 | +import array, utime | ||
2 | +from machine import Pin | ||
3 | +import rp2 | ||
4 | + | ||
5 | +import neopixel | ||
6 | +import dht | ||
7 | +import bluetoooth as bto | ||
8 | + | ||
9 | +# --------------------------------------------------- # | ||
10 | +# INIT | ||
11 | +# --------------------------------------------------- # | ||
12 | + | ||
13 | + | ||
14 | +# --------------------------------------------------- # | ||
15 | +# ENTRYPOINT | ||
16 | +# --------------------------------------------------- # | ||
17 | +def _run(): | ||
18 | + while True: | ||
19 | + input_data = bto.recv_data_bt() | ||
20 | + if input_data != '': | ||
21 | + input_data = input_data.strip() | ||
22 | + print('INPUT FOUND ', input_data) | ||
23 | + print(len(input_data)) | ||
24 | + if input_data == 'A': | ||
25 | + neopixel.work_led(0.2) | ||
26 | + elif input_data == 'B': | ||
27 | + dht_data = dht.work_dht() | ||
28 | + if dht_data == False: | ||
29 | + print("ERROR: DHT22 NOT WORKING") | ||
30 | + else: | ||
31 | + print("INFO: HUMI ", dht_data[0]) | ||
32 | + print("INFO: TEMP ", dht_data[1]) | ||
33 | + send_string = str(dht_data[0]) + ',' + str(dht_data[1]) | ||
34 | + print(send_string) | ||
35 | + bto.send_data_bt(send_string) | ||
36 | + else: | ||
37 | + print('WRONG INPUT') | ||
38 | + | ||
39 | +if __name__ == '__main__': | ||
40 | + _run() | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
hardware/rpi_pico/neopixel.py
0 → 100644
1 | +''' Original code from https://core-electronics.com.au/tutorials/how-to-use-ws2812b-rgb-leds-with-raspberry-pi-pico.html | ||
2 | +''' | ||
3 | +import array, utime | ||
4 | +from machine import Pin | ||
5 | +import rp2 | ||
6 | + | ||
7 | +# --------------------------------------------------- # | ||
8 | +# INIT | ||
9 | +# --------------------------------------------------- # | ||
10 | +NUM_LEDS = 8 | ||
11 | +PIN_NUM = 22 | ||
12 | + | ||
13 | +BLACK = (0, 0, 0) | ||
14 | +RED = (255, 0, 0) | ||
15 | +YELLOW = (255, 150, 0) | ||
16 | +GREEN = (0, 255, 0) | ||
17 | +CYAN = (0, 255, 255) | ||
18 | +BLUE = (0, 0, 255) | ||
19 | +PURPLE = (180, 0, 255) | ||
20 | +WHITE = (255, 255, 255) | ||
21 | +COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE, BLACK) | ||
22 | + | ||
23 | +# --------------------------------------------------- # | ||
24 | +# INIT2 | ||
25 | +# --------------------------------------------------- # | ||
26 | +@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24) | ||
27 | +def ws2812(): | ||
28 | + T1 = 2 | ||
29 | + T2 = 5 | ||
30 | + T3 = 3 | ||
31 | + wrap_target() | ||
32 | + label("bitloop") | ||
33 | + out(x, 1) .side(0) [T3 - 1] | ||
34 | + jmp(not_x, "do_zero") .side(1) [T1 - 1] | ||
35 | + jmp("bitloop") .side(1) [T2 - 1] | ||
36 | + label("do_zero") | ||
37 | + nop() .side(0) [T2 - 1] | ||
38 | + wrap() | ||
39 | + | ||
40 | +# Create the StateMachine with the ws2812 program, outputting on pin | ||
41 | +sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(PIN_NUM)) | ||
42 | +# Start the StateMachine, it will wait for data on its FIFO. | ||
43 | +sm.active(1) | ||
44 | +# Display a pattern on the LEDs via an array of LED RGB values. | ||
45 | +ar = array.array("I", [0 for _ in range(NUM_LEDS)]) | ||
46 | + | ||
47 | +# --------------------------------------------------- # | ||
48 | +# INTERNAL FUNCTIONS | ||
49 | +# --------------------------------------------------- # | ||
50 | +def _pixels_show(brightness:int = 0.2): | ||
51 | + dimmer_ar = array.array("I", [0 for _ in range(NUM_LEDS)]) | ||
52 | + for i,c in enumerate(ar): | ||
53 | + r = int(((c >> 8) & 0xFF) * brightness) | ||
54 | + g = int(((c >> 16) & 0xFF) * brightness) | ||
55 | + b = int((c & 0xFF) * brightness) | ||
56 | + dimmer_ar[i] = (g<<16) + (r<<8) + b | ||
57 | + sm.put(dimmer_ar, 8) | ||
58 | + utime.sleep_ms(10) | ||
59 | + | ||
60 | +def _pixels_set(i, color): | ||
61 | + ar[i] = (color[1]<<16) + (color[0]<<8) + color[2] | ||
62 | + | ||
63 | +def _pixels_fill(color): | ||
64 | + for i in range(len(ar)): | ||
65 | + _pixels_set(i, color) | ||
66 | + | ||
67 | + | ||
68 | +# --------------------------------------------------- # | ||
69 | +# FUNCTIONS | ||
70 | +# --------------------------------------------------- # | ||
71 | +def work_led(brightness:int = 0.2): | ||
72 | + for color in COLORS: | ||
73 | + _pixels_fill(color) | ||
74 | + _pixels_show(brightness) | ||
75 | + utime.sleep(0.4) |
-
Please register or login to post a comment