├── .gitignore ├── 1.基础实验 ├── 1.点亮第1个LED │ └── LED.py ├── 2.流水灯 │ ├── v1.0 │ │ └── LEDs.py │ └── v2.0 │ │ └── LEDs.py ├── 3.按键 │ └── KEY.py ├── 4.外部中断 │ └── Interrupt.py ├── 5.蜂鸣器 │ └── BEEP.py ├── 6.ADC │ └── ADC.py ├── 7.OLED显示屏(I2C) │ └── oled.py ├── 8.UART │ └── UART.py └── 9.系统信息显示 │ └── system_data.py ├── 2.传感器实验 ├── 1.温度传感器DS18B20 │ └── ds18b20.py ├── 2.温湿度传感器DHT11 │ └── DTH11.py ├── 3.人体红外感应传感器 │ └── Motion.py ├── 4.光敏传感器 │ └── Light.py ├── 5.土壤湿度传感器 │ └── soil_humidity.py ├── 6.水位传感器 │ └── Water_level.py ├── 7.大气压强传感器 │ ├── bmp280.py │ └── main.py └── 8.超声波传感器 │ └── Distance.py ├── 3.拓展模块 ├── 1.舵机 │ ├── 1.180度 │ │ ├── AngularServo.py │ │ └── 防抖动例程 │ │ │ └── Servo.py │ └── 2.360度连续旋转 │ │ └── Servo.py ├── 2.WS2812B灯带 │ └── main.py └── 3.摄像头模块 │ ├── 1.拍摄照片 │ └── photo.py │ └── 2.视频录制 │ └── video.py ├── 4.网络应用 ├── 1.Socket通信 │ └── Socket.py └── 2.MQTT通信 │ ├── 1.发布者 │ └── publish.py │ └── 2.订阅者 │ └── subscribe.py ├── 5.Opencv └── 01-人脸检测 │ ├── face_detection.py │ ├── faces.jpg │ └── result.jpg ├── LICENSE ├── README.md ├── RaspBerryPi_01Studio.png └── Raspberry_demos.jpg /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /1.基础实验/1.点亮第1个LED/LED.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:点亮LED 3 | 版本:v1.0 4 | 日期:2019.9 5 | 作者:01Studio 6 | 实验目的:学习led点亮。 7 | ''' 8 | from gpiozero import LED #从gpiozero库导入LED模块 9 | 10 | LED_R= LED(4) #红灯初始化,连接的是树莓派引脚4(BCM编码) 11 | 12 | LED_R.on() #点亮红灯 13 | 14 | #阻塞线程,让程序持续执行 15 | while True: 16 | pass -------------------------------------------------------------------------------- /1.基础实验/2.流水灯/v1.0/LEDs.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:流水灯 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | ''' 7 | 8 | from gpiozero import LED #导入LED模块 9 | from time import sleep #导入延时模块 10 | 11 | #LED初始化 12 | LED_R= LED(4) 13 | LED_Y= LED(5) 14 | LED_G= LED(6) 15 | 16 | while True: #while True表示一直循环 17 | 18 | #打开LED,延时1秒后关闭 19 | LED_R.on() 20 | sleep(1) #延时1秒 21 | LED_R.off() 22 | 23 | LED_Y.on() 24 | sleep(1) 25 | LED_Y.off() 26 | 27 | LED_G.on() 28 | sleep(1) 29 | LED_G.off() 30 | -------------------------------------------------------------------------------- /1.基础实验/2.流水灯/v2.0/LEDs.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:流水灯 3 | 版本:v2.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | ''' 7 | 8 | from gpiozero import LED #导入LED模块 9 | from time import sleep #导入延时模块 10 | 11 | #LED初始化 12 | LED_R= LED(4) 13 | LED_Y= LED(5) 14 | LED_G= LED(6) 15 | 16 | #定义数组方便循环语句调用 17 | LED=[LED_R, LED_Y, LED_G] 18 | 19 | while True: #while True表示一直循环 20 | 21 | for i in range(0,3): #循环3次 22 | 23 | LED[i].on() #点亮LED 24 | sleep(1) 25 | LED[i].off() #关闭LED 26 | -------------------------------------------------------------------------------- /1.基础实验/3.按键/KEY.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称: 按键 3 | 版本: v1.0 4 | 日期: 2020.3 5 | 作者: 01Studio 6 | 社区: www.01studio.org 7 | ''' 8 | 9 | from gpiozero import Button,LED #导入相关模块 10 | 11 | #KEY为IO12,LED为IO4 (BCM编码) 12 | KEY1 = Button(12) 13 | LED_R = LED(4) 14 | 15 | while True: 16 | 17 | #判断安静KEY1是否被按下 18 | if KEY1.is_pressed: 19 | LED_R.on() 20 | print("KEY1 is pressed") 21 | 22 | else: 23 | LED_R.off() 24 | print("KEY1 is not pressed") -------------------------------------------------------------------------------- /1.基础实验/4.外部中断/Interrupt.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:外部中断 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 社区:www.01studio.org 7 | ''' 8 | 9 | from gpiozero import Button,LED 10 | 11 | KEY1 = Button(12) 12 | LED_R=LED(4) 13 | 14 | def fun(): 15 | 16 | LED_R.toggle() #LED红灯状态翻转 17 | 18 | #设置按键中断 19 | KEY1.when_pressed = fun 20 | 21 | #阻塞线程,让程序持续执行 22 | while True: 23 | pass -------------------------------------------------------------------------------- /1.基础实验/5.蜂鸣器/BEEP.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:有源蜂鸣器 3 | 版本:v1.0 4 | 日期:2023.3 5 | 作者:01Studio 6 | 说明:让有源蜂鸣器发出滴滴响声 7 | 社区:www.01studio.org 8 | ''' 9 | 10 | from gpiozero import Buzzer 11 | import time 12 | 13 | #引脚16,底电平发出响声 14 | beep = Buzzer(16,active_high=False) 15 | 16 | while True: 17 | 18 | #循环发出响声 19 | beep.on() 20 | time.sleep(1) 21 | beep.off() 22 | time.sleep(1) 23 | -------------------------------------------------------------------------------- /1.基础实验/6.ADC/ADC.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:ADC-电压测量 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 说明:通过对ADC数据采集,转化成电压并打印数据 7 | 社区:www.01studio.org 8 | ''' 9 | 10 | #导入相关模块 11 | from gpiozero import MCP3004 12 | from time import sleep 13 | 14 | #初始化ADC模块 15 | adc = MCP3004(channel=0) 16 | 17 | while True: 18 | 19 | V = adc.value*3.3 #采集范围:0-1,转成电压值 0-3.3V 20 | print("%.2f"%V + ' V') #保留2位小数 21 | sleep(1) 22 | -------------------------------------------------------------------------------- /1.基础实验/7.OLED显示屏(I2C)/oled.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:OLED显示屏(I2C总线) 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 参考链接: https://luma-oled.readthedocs.io/en/latest/python-usage.html 7 | ''' 8 | #导入luma相关库 9 | from luma.core.render import canvas 10 | from luma.oled.device import ssd1306 11 | 12 | #初始化oled,I2C接口1,oled地址是0x3c 13 | device = ssd1306(port=1, address=0x3C) 14 | 15 | #显示字符,with...as...使用好处是可以自动处理异常 16 | with canvas(device) as draw: 17 | draw.text((0, 0), 'Hello World!', fill="white") 18 | draw.text((0, 20), 'Raspberry Pi', fill="white") 19 | draw.text((0, 50), 'By 01Studio', fill="white") -------------------------------------------------------------------------------- /1.基础实验/8.UART/UART.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:串口通信 3 | 版本: v1.0 4 | 日期: 2020.3 5 | 作者: 01Studio 6 | 说明:通过编程实现串口通信,跟电脑串口助手实现数据收发。 7 | 社区:www.01studio.org 8 | ''' 9 | 10 | import serial 11 | import time 12 | 13 | # 配置串口 14 | com = serial.Serial("/dev/ttyS0", 115200) 15 | 16 | #发送提示字符 17 | com.write(b'Hello 01Studio!') 18 | 19 | while True: 20 | 21 | # 获得接收缓冲区字符个数 int 22 | count = com.inWaiting() 23 | 24 | if count != 0: 25 | # 读取内容并打印 26 | recv = com.read(count) 27 | print(recv) 28 | 29 | #发回数据 30 | com.write(recv) 31 | 32 | # 清空接收缓冲区 33 | com.flushInput() 34 | 35 | # 延时100ms,接收间隔 36 | time.sleep(0.1) -------------------------------------------------------------------------------- /1.基础实验/9.系统信息显示/system_data.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:系统信息显示 3 | 版本: v1.0 4 | 日期: 2020.3 5 | 作者: 01Studio 6 | 说明:通过编程采集树苺派系统信息,并在oled显示。 7 | 社区:www.01studio.org 8 | ''' 9 | 10 | #导入相关库 11 | import os 12 | 13 | #IP lib 14 | import socket, fcntl, struct 15 | 16 | #oled lib 17 | from luma.core.interface.serial import i2c 18 | from luma.core.render import canvas 19 | from luma.oled.device import ssd1306 20 | from time import sleep 21 | 22 | #oled 初始化 23 | device = ssd1306(port=1, address=0x3c) 24 | 25 | #采集CPU温度信息,返回字符 26 | def getCPUtemperature(): 27 | res = os.popen('vcgencmd measure_temp').readline() 28 | return(res.replace("temp=","").replace("'C\n","")) 29 | 30 | #返回CPU使用率百分比(%),字符类型 31 | def getCPUuse(): 32 | return(str(os.popen("top -b -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip())) 33 | 34 | # 采集RAM信息,返回单位是kB 35 | # Index 0: 总内存 36 | # Index 1: 已使用内存 37 | # Index 2: 剩余内存 38 | def getRAMinfo(): 39 | p = os.popen('free') 40 | i = 0 41 | while 1: 42 | i = i + 1 43 | line = p.readline() 44 | if i==2: 45 | return(line.split()[1:4]) 46 | 47 | # 返回SD卡容量大小,单位是GB 48 | # Index 0: 总容量 49 | # Index 1: 已用空间 50 | # Index 2: 剩余空间 51 | # Index 3: 使用率(%) 52 | def getDiskSpace(): 53 | p = os.popen("df -h /") 54 | i = 0 55 | while 1: 56 | i = i +1 57 | line = p.readline() 58 | if i==2: 59 | return(line.split()[1:5]) 60 | 61 | #获取本地IP地址,返回字符 62 | def getIP(ifname): 63 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 64 | 65 | #异常处理 66 | try: 67 | return socket.inet_ntoa(fcntl.ioctl( 68 | s.fileno(), 69 | 0x8915, # SIOCGIFADDR 70 | struct.pack('256s', ifname[:15].encode('utf-8')) 71 | )[20:24]) 72 | 73 | except OSError: 74 | return('0.0.0.0') 75 | 76 | while True: 77 | 78 | #采集CPU温度信息 79 | CPU_temp = getCPUtemperature() 80 | 81 | #采集CPU使用率 82 | CPU_usage = getCPUuse() 83 | 84 | #内存信息,转化成MB 85 | RAM_stats = getRAMinfo() 86 | RAM_total = int(int(RAM_stats[0]) / 1000) 87 | RAM_used = int(int(RAM_stats[1]) / 1000) 88 | RAM_free = int(int(RAM_stats[2]) / 1000) 89 | RAM_perc = str(round((RAM_used/RAM_total*100),1))+'%' 90 | 91 | #sd卡容量信息 92 | DISK_stats = getDiskSpace() 93 | DISK_total = DISK_stats[0] 94 | DISK_used = DISK_stats[1] 95 | DISK_perc = DISK_stats[3] #使用百分比 96 | 97 | #本地IP信息,可通过在终端运行ifconfig指令查看网卡名称 98 | IP=getIP("wlan0") 99 | 100 | #oled显示 101 | with canvas(device) as draw: 102 | 103 | draw.text((0, 0), 'CPU Temp: ' + CPU_temp + ' C', fill="white") 104 | draw.text((0, 10), 'CPU Used: ' + CPU_usage + ' %', fill="white") 105 | draw.text((0, 24), 'RAM:' + str(RAM_used) + '/' + str(RAM_total)+' MB' + ' '+RAM_perc, fill="white") 106 | draw.text((0, 38), 'DISK:' + str(DISK_used) + '/' + str(DISK_total) +' '+ DISK_perc, fill="white") 107 | draw.text((0, 52), 'IP:'+ IP, fill="white") 108 | 109 | sleep(0.5) #延时,数据更新间隔 -------------------------------------------------------------------------------- /2.传感器实验/1.温度传感器DS18B20/ds18b20.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:温度传感器DS18B20 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 说明:通过编程采集温度数据,并在oled显示。 7 | ''' 8 | #Sensor lib 9 | from w1thermsensor import W1ThermSensor 10 | 11 | #导入luma相关库,oled lib 12 | from luma.core.render import canvas 13 | from luma.oled.device import ssd1306 14 | 15 | from time import sleep 16 | 17 | #初始化oled,I2C接口1,oled地址是0x3c 18 | device = ssd1306(port=1, address=0x3C) 19 | 20 | #################DS18B20对象构建################################### 21 | #构建方法1:需要知道传感器地址 22 | #DS18B20 = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "000005e35af8") 23 | 24 | #构建方法2:无需知道传感器地址,只有1个传感器连接时适用 25 | DS18B20=W1ThermSensor() 26 | 27 | while True: 28 | 29 | temperature = DS18B20.get_temperature() #数据采集 30 | 31 | #oled显示温度信息,结果保留2位小数 32 | with canvas(device) as draw: 33 | draw.text((0, 0), '01Studio', fill="white") 34 | draw.text((0, 15), 'Temp test:', fill="white") 35 | draw.text((0, 40), '%.2f'%temperature+' C', fill="white") 36 | 37 | print('%.2f'%temperature) #打印显示 38 | 39 | sleep(2) #采集间隔2秒 -------------------------------------------------------------------------------- /2.传感器实验/2.温湿度传感器DHT11/DTH11.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:温湿度传感器DHT11 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 说明:通过编程采集温度数据,并在OLED显示。 7 | 社区:www.01studio.org 8 | ''' 9 | 10 | import Adafruit_DHT,time 11 | 12 | #导入luma相关库,oled lib 13 | from luma.core.render import canvas 14 | from luma.oled.device import ssd1306 15 | 16 | #初始化oled,I2C接口1,oled地址是0x3c 17 | device = ssd1306(port=1, address=0x3C) 18 | 19 | #设置传感器类型: 支持DHT11,DHT22和AM2302 20 | sensor=Adafruit_DHT.DHT11 21 | 22 | #设置GPIO 23 | gpio=19 24 | 25 | while True: 26 | 27 | #读取传感器数据,读取失败会重复15次,间隔2秒 28 | humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio) 29 | 30 | # 为了避免偶尔读取失败,先判断是否读取成功,再打印相关数据 31 | if humidity is not None and temperature is not None: 32 | #oled显示温度信息,结果保留2位小数 33 | with canvas(device) as draw: 34 | draw.text((0, 0), '01Studio', fill="white") 35 | draw.text((0, 15), 'DHT11 test:', fill="white") 36 | draw.text((0, 40), '%.1f'%temperature+' C'+' '+'%.1f'%humidity+' %', fill="white") 37 | print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity)) 38 | 39 | else: 40 | with canvas(device) as draw: 41 | draw.text((0, 0), '01Studio', fill="white") 42 | draw.text((0, 15), 'DHT11 test:', fill="white") 43 | draw.text((0, 40), 'Failed to read!', fill="white") 44 | 45 | print('Failed to get reading. Try again!') 46 | 47 | 48 | time.sleep(2) 49 | -------------------------------------------------------------------------------- /2.传感器实验/3.人体红外感应传感器/Motion.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:人体感应传感器 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 社区:www.01studio.org 7 | ''' 8 | 9 | from gpiozero import MotionSensor, LED 10 | from signal import pause 11 | 12 | #构建对象 13 | People = MotionSensor(18) 14 | LED_R = LED(4) 15 | 16 | def fun1(): 17 | LED_R.on() 18 | print('Got People!!!') 19 | 20 | def fun2(): 21 | LED_R.off() 22 | print('No People!!!') 23 | 24 | #定义动作执行,有人时候点亮LED 25 | People.when_motion = fun1 26 | People.when_no_motion = fun2 27 | 28 | #阻塞IO,让程序持续运行 29 | while True: 30 | pass -------------------------------------------------------------------------------- /2.传感器实验/4.光敏传感器/Light.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:光敏传感器 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 【www.01Studio.org】 6 | 说明:通过光敏传感器对外界环境光照强度测量并在oled显示。 7 | ''' 8 | 9 | #导入ADC模块 10 | from gpiozero import MCP3004 11 | 12 | #导入luma相关库,oled lib 13 | from luma.core.render import canvas 14 | from luma.oled.device import ssd1306 15 | 16 | from time import sleep 17 | 18 | #初始化oled,I2C接口1,oled地址是0x3c 19 | device = ssd1306(port=1, address=0x3C) 20 | 21 | #初始化ADC模块,传感器接到CH1 22 | adc = MCP3004(channel=1) 23 | 24 | while True: 25 | 26 | V = adc.value*3.3 #采集范围:0-1,转成电压值 0-3.3V 27 | 28 | #光线强度:强 29 | if 0 <= V <= 1.1: 30 | with canvas(device) as draw: 31 | draw.text((0, 0), '01Studio', fill="white") 32 | draw.text((0, 15), 'Light test:', fill="white") 33 | draw.text((0, 40), str("%.2f"%V) + 'V'+' Bright', fill="white") 34 | print("%.2f"%V + 'V'+' Bright') 35 | 36 | #光线强度:中 37 | if 1.1 < V <= 2.2: 38 | with canvas(device) as draw: 39 | draw.text((0, 0), '01Studio', fill="white") 40 | draw.text((0, 15), 'Light test:', fill="white") 41 | draw.text((0, 40), str("%.2f"%V) + 'V'+' Normal', fill="white") 42 | print("%.2f"%V + 'V'+' Normal') 43 | 44 | #光线强度:弱 45 | if 2.2 < V <=3.3: 46 | with canvas(device) as draw: 47 | draw.text((0, 0), '01Studio', fill="white") 48 | draw.text((0, 15), 'Light test:', fill="white") 49 | draw.text((0, 40), str("%.2f"%V) + 'V'+' Weak', fill="white") 50 | print("%.2f"%V + 'V'+' Weak') 51 | 52 | sleep(1) #采集间隔1秒 53 | -------------------------------------------------------------------------------- /2.传感器实验/5.土壤湿度传感器/soil_humidity.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:土壤湿度传感器 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 【www.01Studio.org】 6 | 说明:通过土壤湿度传感器对土壤湿度测量并在oled显示。 7 | ''' 8 | 9 | #导入ADC模块 10 | from gpiozero import MCP3004 11 | 12 | #导入luma相关库,oled lib 13 | from luma.core.render import canvas 14 | from luma.oled.device import ssd1306 15 | 16 | from time import sleep 17 | 18 | #初始化oled,I2C接口1,oled地址是0x3c 19 | device = ssd1306(port=1, address=0x3C) 20 | 21 | #初始化ADC模块,传感器接到CH1 22 | adc = MCP3004(channel=1) 23 | 24 | while True: 25 | 26 | V = adc.value*3.3 #采集范围:0-1,转成电压值 0-3.3V 27 | 28 | #土壤湿度:干 29 | if 0 <= V <= 1.1: 30 | with canvas(device) as draw: 31 | draw.text((0, 0), '01Studio', fill="white") 32 | draw.text((0, 15), 'Soil_humidity test:', fill="white") 33 | draw.text((0, 40), str("%.2f"%V) + 'V'+' Dry', fill="white") 34 | print("%.2f"%V + 'V'+' Dry') 35 | 36 | #土壤湿度:中 37 | if 1.1 < V <= 2.2: 38 | with canvas(device) as draw: 39 | draw.text((0, 0), '01Studio', fill="white") 40 | draw.text((0, 15), 'Soil_humidity test:', fill="white") 41 | draw.text((0, 40), str("%.2f"%V) + 'V'+' Normal', fill="white") 42 | print("%.2f"%V + 'V'+' Normal') 43 | 44 | #土壤湿度:湿 45 | if 2.2 < V <=3.3: 46 | with canvas(device) as draw: 47 | draw.text((0, 0), '01Studio', fill="white") 48 | draw.text((0, 15), 'Soil_humidity test:', fill="white") 49 | draw.text((0, 40), str("%.2f"%V) + 'V'+' Wet', fill="white") 50 | print("%.2f"%V + 'V'+' Wet') 51 | 52 | sleep(1) #采集间隔1秒 53 | -------------------------------------------------------------------------------- /2.传感器实验/6.水位传感器/Water_level.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:水位传感器 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 【www.01Studio.org】 6 | 说明:通过水位传感器测量水位(液位)高度并在oled显示。 7 | ''' 8 | 9 | #导入ADC模块 10 | from gpiozero import MCP3004 11 | 12 | #导入luma相关库,oled lib 13 | from luma.core.render import canvas 14 | from luma.oled.device import ssd1306 15 | 16 | from time import sleep 17 | 18 | #初始化oled,I2C接口1,oled地址是0x3c 19 | device = ssd1306(port=1, address=0x3C) 20 | 21 | #初始化ADC模块,传感器接到CH1 22 | adc = MCP3004(channel=1) 23 | 24 | while True: 25 | 26 | V = adc.value*3.3 #采集范围:0-1,转成电压值 0-3.3V 27 | 28 | #水位:0-1cm 29 | if 0 <= V <= 0.48: 30 | with canvas(device) as draw: 31 | draw.text((0, 0), '01Studio', fill="white") 32 | draw.text((0, 15), 'Water_level test:', fill="white") 33 | draw.text((0, 40), str("%.2f"%V) + 'V'+' 0-1cm', fill="white") 34 | print("%.2f"%V + 'V'+' 0-1cm') 35 | 36 | #水位:1-2cm 37 | if 0.48 < V <= 0.73: 38 | with canvas(device) as draw: 39 | draw.text((0, 0), '01Studio', fill="white") 40 | draw.text((0, 15), 'Water_level test:', fill="white") 41 | draw.text((0, 40), str("%.2f"%V) + 'V'+' 1-2cm', fill="white") 42 | print("%.2f"%V + 'V'+' 1-2cm') 43 | 44 | #水位:2-3cm 45 | if 0.73 < V <=0.97: 46 | with canvas(device) as draw: 47 | draw.text((0, 0), '01Studio', fill="white") 48 | draw.text((0, 15), 'Water_level test:', fill="white") 49 | draw.text((0, 40), str("%.2f"%V) + 'V'+' 2-3cm', fill="white") 50 | print("%.2f"%V + 'V'+' 2-3cm') 51 | 52 | #水位:3-4cm 53 | if 0.97 < V <=1.05: 54 | with canvas(device) as draw: 55 | draw.text((0, 0), '01Studio', fill="white") 56 | draw.text((0, 15), 'Water_level test:', fill="white") 57 | draw.text((0, 40), str("%.2f"%V) + 'V'+' 3-4cm', fill="white") 58 | print("%.2f"%V + 'V'+' 3-4cm') 59 | 60 | #水位:>4cm 61 | if 1.05 < V : 62 | with canvas(device) as draw: 63 | draw.text((0, 0), '01Studio', fill="white") 64 | draw.text((0, 15), 'Water_level test:', fill="white") 65 | draw.text((0, 40), str("%.2f"%V) + 'V'+' >4cm', fill="white") 66 | print("%.2f"%V + 'V'+' >4cm') 67 | 68 | sleep(1) #采集间隔1秒 69 | -------------------------------------------------------------------------------- /2.传感器实验/7.大气压强传感器/bmp280.py: -------------------------------------------------------------------------------- 1 | import smbus 2 | import time 3 | import subprocess 4 | import sys 5 | import os 6 | 7 | class BMP280(): 8 | 9 | def __init__(self,port=1): 10 | 11 | #I2C bus 12 | self.bus = smbus.SMBus(port) 13 | 14 | self.b1 = [] 15 | self.dig_T1 = 0 16 | self.dig_T2 = 0 17 | self.dig_T3 = 0 18 | self.data = 0 19 | self.adc_t = 0 20 | self.dig_P1 = 0 21 | self.dig_P2 = 0 22 | self.dig_P3 = 0 23 | self.dig_P4 = 0 24 | self.dig_P5 = 0 25 | self.dig_P6 = 0 26 | self.dig_P7 = 0 27 | self.dig_P8 = 0 28 | self.dig_P9 = 0 29 | 30 | #BMP280 address, 0x76(118) 31 | #Read data back from 0x88(136), 24 bytes 32 | try: 33 | self.b1 = self.bus.read_i2c_block_data(0x76, 0x88, 24) 34 | except IOError: 35 | subprocess.call(['i2cdetect', '-y', '1']) 36 | flag = 1 #optional flag to signal your code to resend or something 37 | 38 | def get(self): 39 | self.dig_T1 = self.b1[1] * 256 + self.b1[0] 40 | self.dig_T2 = self.b1[3] * 256 + self.b1[2] 41 | if self.dig_T2 > 32767: 42 | self.dig_T2 -= 65536 43 | self.dig_T3 = self.b1[5] * 256 + self.b1[4] 44 | if self.dig_T3 > 32767: 45 | self.dig_T3 -= 65536 46 | 47 | # Pressure coefficents 48 | self.dig_P1 = self.b1[7] * 256 + self.b1[6] 49 | self.dig_P2 = self.b1[9] * 256 + self.b1[8] 50 | if self.dig_P2 > 32767 : 51 | self.dig_P2 -= 65536 52 | self.dig_P3 = self.b1[11] * 256 + self.b1[10] 53 | if self.dig_P3 > 32767 : 54 | self.dig_P3 -= 65536 55 | self.dig_P4 = self.b1[13] * 256 + self.b1[12] 56 | if self.dig_P4 > 32767 : 57 | self.dig_P4 -= 65536 58 | self.dig_P5 = self.b1[15] * 256 + self.b1[14] 59 | if self.dig_P5 > 32767 : 60 | self.dig_P5 -= 65536 61 | self.dig_P6 = self.b1[17] * 256 + self.b1[16] 62 | if self.dig_P6 > 32767 : 63 | self.dig_P6 -= 65536 64 | self.dig_P7 = self.b1[19] * 256 + self.b1[18] 65 | if self.dig_P7 > 32767 : 66 | self.dig_P7 -= 65536 67 | self.dig_P8 = self.b1[21] * 256 + self.b1[20] 68 | if self.dig_P8 > 32767 : 69 | self.dig_P8 -= 65536 70 | self.dig_P9 = self.b1[23] * 256 + self.b1[22] 71 | if self.dig_P9 > 32767 : 72 | self.dig_P9 -= 65536 73 | 74 | self.write_data() 75 | # BMP280 address, 0x76(118) 76 | # Read data back from 0xF7(247), 8 bytes 77 | # Pressure MSB, Pressure LSB, Pressure xLSB, Temperature MSB, Temperature LSB 78 | # Temperature xLSB, Humidity MSB, Humidity LSB 79 | self.data = self.bus.read_i2c_block_data(0x76, 0xF7, 8) 80 | # Convert temperature data to 19-bits 81 | self.adc_t = ((self.data[3] * 65536) + (self.data[4] * 256) + (self.data[5] & 0xF0)) / 16 82 | 83 | # Temperature offset calculations 84 | self.var1 = ((self.adc_t) / 16384.0 - (self.dig_T1) / 1024.0) * (self.dig_T2) 85 | self.var2 = (((self.adc_t) / 131072.0 - (self.dig_T1) / 8192.0) * ((self.adc_t)/131072.0 - (self.dig_T1)/8192.0)) * (self.dig_T3) 86 | self.t_fine = (self.var1 + self.var2) 87 | self.cTemp = (self.var1 + self.var2) / 5120.0 88 | self.fTemp = self.cTemp * 1.8 + 32 89 | 90 | # Convert pressure and temperature data to 19-bits 91 | self.adc_p = ((self.data[0] * 65536) + (self.data[1] * 256) + (self.data[2] & 0xF0)) / 16 92 | # Pressure offset calculations 93 | self.var1 = (self.t_fine / 2.0) - 64000.0 94 | self.var2 = self.var1 * self.var1 * (self.dig_P6) / 32768.0 95 | self.var2 = self.var2 + self.var1 * (self.dig_P5) * 2.0 96 | self.var2 = (self.var2 / 4.0) + ((self.dig_P4) * 65536.0) 97 | self.var1 = ((self.dig_P3) * self.var1 * self.var1 / 524288.0 + ( self.dig_P2) * self.var1) / 524288.0 98 | self.var1 = (1.0 + self.var1 / 32768.0) * (self.dig_P1) 99 | self.p = 1048576.0 - self.adc_p 100 | self.p = (self.p - (self.var2 / 4096.0)) * 6250.0 / self.var1 101 | self.var1 = (self.dig_P9) * self.p * self.p / 2147483648.0 102 | self.var2 = self.p * (self.dig_P8) / 32768.0 103 | self.pressure = (self.p + (self.var1 + self.var2 + (self.dig_P7)) / 16.0) / 100 104 | 105 | return [self.cTemp,self.pressure] 106 | 107 | def getTemp(self): 108 | self.get() 109 | return self.cTemp 110 | 111 | def getPressure(self): 112 | self.get() 113 | return self.pressure 114 | 115 | # Calculating absolute altitude 116 | def getAltitude(self): 117 | return '%.2f'%(44330*(1-(self.getPressure()*100/101325)**(1/5.256))) 118 | 119 | def write_data(self): 120 | # BMP280 address, 0x76(118) 121 | # Select Control measurement register, 0xF4(244) 122 | # 0x27(39) Pressure and Temperature Oversampling rate = 1 123 | # Normal mode 124 | self.bus.write_byte_data(0x76, 0xF4, 0x27) 125 | # BMP280 address, 0x76(118) 126 | # Select Configuration register, 0xF5(245) 127 | # 0xA0(00) Stand_by time = 1000 ms 128 | self.bus.write_byte_data(0x76, 0xF5, 0xA0) 129 | 130 | time.sleep(0.3) 131 | 132 | -------------------------------------------------------------------------------- /2.传感器实验/7.大气压强传感器/main.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:水位传感器 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 【www.01Studio.org】 6 | 说明:通过水位传感器测量水位(液位)高度并在oled显示。 7 | ''' 8 | 9 | #bmp280 lib 10 | import bmp280 11 | 12 | #导入luma相关库,oled lib 13 | from luma.core.render import canvas 14 | from luma.oled.device import ssd1306 15 | 16 | import time 17 | 18 | #初始化oled,I2C接口1,oled地址是0x3c 19 | device = ssd1306(port=1, address=0x3c) 20 | 21 | #构建BMP280对象,I2C接口1 22 | b = bmp280.BMP280(port=1) 23 | 24 | while True: 25 | 26 | #获取温度 27 | Temp = b.getTemp() 28 | 29 | #获取大气压强 30 | Pressure = b.getPressure() 31 | 32 | #获取海拔高度 33 | Altitude = b.getAltitude() 34 | 35 | with canvas(device) as draw: 36 | draw.text((0, 0), '01Studio', fill="white") 37 | draw.text((0, 15), 'BMP280 test:', fill="white") 38 | draw.text((0, 35), str("%.2f"%Temp)+' C' , fill="white") 39 | draw.text((0, 45), str("%.2f"%Pressure)+' Pa' , fill="white") 40 | draw.text((0, 55), Altitude +' M', fill="white") 41 | 42 | #print values 43 | print("Temperature in Celsius : %.2f C" %Temp) 44 | print("Pressure : %.2f hPa " %Pressure) 45 | print('Altitude : ' + Altitude+' M') 46 | 47 | #sleep of 1s 48 | time.sleep(1) 49 | -------------------------------------------------------------------------------- /2.传感器实验/8.超声波传感器/Distance.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:超声波传感器 3 | 版本:v1.0 4 | 日期:20120.3 5 | 作者:01Studio 【www.01Studio.org】 6 | 说明:通过超声波传感器测距,并在OLED上显示。 7 | ''' 8 | 9 | from gpiozero import DistanceSensor 10 | 11 | #导入luma相关库,oled lib 12 | from luma.core.render import canvas 13 | from luma.oled.device import ssd1306 14 | 15 | from time import sleep 16 | 17 | #初始化oled,I2C接口1,oled地址是0x3c 18 | device = ssd1306(port=1, address=0x3c) 19 | 20 | #初始化超声波传感器:echo=15 , trig =14 21 | sensor = DistanceSensor(echo=15, trigger=14) 22 | 23 | while True: 24 | 25 | #将单位变成cm 26 | distance = sensor.distance *100 27 | 28 | #显示结果保留2位小数 29 | with canvas(device) as draw: 30 | draw.text((0, 0), '01Studio', fill="white") 31 | draw.text((0, 15), 'Distance test:', fill="white") 32 | draw.text((0, 35), str("%.2f"%distance)+' CM' , fill="white") 33 | 34 | print('Distance to nearest object is %.2f'%distance, 'CM') 35 | 36 | sleep(0.5) #采集间隔 -------------------------------------------------------------------------------- /3.拓展模块/1.舵机/1.180度/AngularServo.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:180度舵机 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 说明:通过编程让舵机转至不同角度。 7 | ''' 8 | 9 | from gpiozero import AngularServo 10 | from time import sleep 11 | 12 | #构建舵机对象 SG90 180' Servo 13 | servo = AngularServo(20, min_angle=-90, max_angle=90,min_pulse_width=0.0005, max_pulse_width=0.0025) 14 | 15 | while True: 16 | 17 | #转至不同角度 18 | servo.angle = -90 19 | sleep(1) 20 | 21 | servo.angle = -45 22 | sleep(1) 23 | 24 | servo.angle = 0 25 | sleep(1) 26 | 27 | servo.angle = 45 28 | sleep(1) 29 | 30 | servo.angle = 90 31 | sleep(1) -------------------------------------------------------------------------------- /3.拓展模块/1.舵机/1.180度/防抖动例程/Servo.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:180度舵机(树梅派防抖动版) 3 | 版本:v1.0 4 | 日期:2020.9 5 | 作者:01Studio 6 | 说明:通过编程让舵机转至不同角度。 7 | 先安装pigpio库,终端输入下面指令: 8 | sudo apt-get install python3-pigpio 9 | sudo pigpiod 10 | ''' 11 | 12 | #!/usr/bin/python3 13 | import RPi.GPIO as GPIO 14 | import pigpio 15 | import time 16 | 17 | servo = 20 18 | 19 | # more info at http://abyz.me.uk/rpi/pigpio/python.html#set_servo_pulsewidth 20 | 21 | pwm = pigpio.pi() 22 | pwm.set_mode(servo, pigpio.OUTPUT) 23 | 24 | pwm.set_PWM_frequency( servo, 50 ) 25 | while True: 26 | print( "0 deg" ) 27 | pwm.set_servo_pulsewidth( servo, 500 ) ; 28 | time.sleep( 1) 29 | 30 | print( "90 deg" ) 31 | pwm.set_servo_pulsewidth( servo, 1500 ) ; 32 | time.sleep( 1 ) 33 | 34 | print( "180 deg" ) 35 | pwm.set_servo_pulsewidth( servo, 2500 ) ; 36 | time.sleep( 1 ) 37 | 38 | #turning off servo 39 | #pwm.set_PWM_dutycycle(servo, 0) 40 | #pwm.set_PWM_frequency( servo, 0 ) 41 | -------------------------------------------------------------------------------- /3.拓展模块/1.舵机/2.360度连续旋转/Servo.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:360度连续旋转舵机 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 说明:通过编程让连续旋转舵机以不同速度转动。 7 | ''' 8 | 9 | from gpiozero import Servo 10 | from time import sleep 11 | 12 | #SG90 360' Servo 13 | servo = Servo(20) 14 | 15 | while True: 16 | 17 | #以不同速度旋转 18 | servo.value = -1.0 19 | sleep(2) 20 | 21 | servo.value = -0.5 22 | sleep(2) 23 | 24 | servo.value = None #停止 25 | sleep(2) 26 | 27 | servo.value = 0.5 28 | sleep(2) 29 | 30 | servo.value = 1.0 31 | sleep(2) -------------------------------------------------------------------------------- /3.拓展模块/2.WS2812B灯带/main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # NeoPixel 库标准测试例程 3 | # 作者: Tony DiCola 4 | # 说明:在灯带中展示各种花式控制 5 | # 6 | #翻译和注释:01studio (www.01studio.org) 7 | 8 | import time 9 | from rpi_ws281x import PixelStrip, Color 10 | import argparse 11 | 12 | # LED灯带配置: 13 | LED_COUNT = 30 # LED灯珠数量. 14 | LED_PIN = 18 # 树莓派GPIO引脚 (18 使用 PWM). 15 | #LED_PIN = 10 # 树莓派GPIO引脚 (10 使用 SPI /dev/spidev0.0). 16 | LED_FREQ_HZ = 800000 # LED信号频率(Hz) (通常是 800khz) 17 | LED_DMA = 10 # 直接存储器存取通道用来产生信号(尝试10) 18 | LED_BRIGHTNESS = 255 # 0:最暗,255:最亮。 19 | LED_INVERT = False # True:信号反转 (when using NPN transistor level shift) 20 | LED_CHANNEL = 0 # 设置 1 :为 GPIOs 13, 19, 41, 45 or 53 21 | 22 | 23 | # 定义LED动作函数. 24 | 25 | def colorWipe(strip, color, wait_ms=50): 26 | """逐个LED灯珠点亮""" 27 | for i in range(strip.numPixels()): 28 | strip.setPixelColor(i, color) 29 | strip.show() 30 | time.sleep(wait_ms / 1000.0) 31 | 32 | 33 | def theaterChase(strip, color, wait_ms=50, iterations=10): 34 | """电影院灯光风格""" 35 | for j in range(iterations): 36 | for q in range(3): 37 | for i in range(0, strip.numPixels(), 3): 38 | strip.setPixelColor(i + q, color) 39 | strip.show() 40 | time.sleep(wait_ms / 1000.0) 41 | for i in range(0, strip.numPixels(), 3): 42 | strip.setPixelColor(i + q, 0) 43 | 44 | 45 | def wheel(pos): 46 | """生成跨越0-255个位置的彩虹颜色.""" 47 | if pos < 85: 48 | return Color(pos * 3, 255 - pos * 3, 0) 49 | elif pos < 170: 50 | pos -= 85 51 | return Color(255 - pos * 3, 0, pos * 3) 52 | else: 53 | pos -= 170 54 | return Color(0, pos * 3, 255 - pos * 3) 55 | 56 | 57 | def rainbow(strip, wait_ms=20, iterations=1): 58 | """绘制彩虹,淡出所有像素一次.""" 59 | for j in range(256 * iterations): 60 | for i in range(strip.numPixels()): 61 | strip.setPixelColor(i, wheel((i + j) & 255)) 62 | strip.show() 63 | time.sleep(wait_ms / 1000.0) 64 | 65 | 66 | def rainbowCycle(strip, wait_ms=20, iterations=5): 67 | """绘制均匀分布在所有像素的彩虹。.""" 68 | for j in range(256 * iterations): 69 | for i in range(strip.numPixels()): 70 | strip.setPixelColor(i, wheel( 71 | (int(i * 256 / strip.numPixels()) + j) & 255)) 72 | strip.show() 73 | time.sleep(wait_ms / 1000.0) 74 | 75 | 76 | def theaterChaseRainbow(strip, wait_ms=50): 77 | """彩虹电影院灯光风格的.""" 78 | for j in range(256): 79 | for q in range(3): 80 | for i in range(0, strip.numPixels(), 3): 81 | strip.setPixelColor(i + q, wheel((i + j) % 255)) 82 | strip.show() 83 | time.sleep(wait_ms / 1000.0) 84 | for i in range(0, strip.numPixels(), 3): 85 | strip.setPixelColor(i + q, 0) 86 | 87 | 88 | # 主函数: 89 | if __name__ == '__main__': 90 | 91 | #终端执行参数 92 | parser = argparse.ArgumentParser() 93 | parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit') 94 | args = parser.parse_args() 95 | 96 | #根据参数构建灯带对象. 97 | strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL) 98 | 99 | # 灯带初始化 100 | strip.begin() 101 | 102 | print('Press Ctrl-C to quit.') 103 | if not args.clear: 104 | print('Use "-c" argument to clear LEDs on exit') 105 | 106 | try: 107 | 108 | while True: 109 | #逐个点亮 110 | print('Color wipe animations.') 111 | colorWipe(strip, Color(255, 0, 0)) # 红色 112 | colorWipe(strip, Color(0, 255, 0)) # 绿色 113 | colorWipe(strip, Color(0, 0, 255)) # 蓝色 114 | 115 | #电影院模式 116 | print('Theater chase animations.') 117 | theaterChase(strip, Color(127, 127, 127)) # White theater chase 118 | theaterChase(strip, Color(127, 0, 0)) # Red theater chase 119 | theaterChase(strip, Color(0, 0, 127)) # Blue theater chase 120 | 121 | #彩虹模式 122 | print('Rainbow animations.') 123 | rainbow(strip) 124 | rainbowCycle(strip) 125 | theaterChaseRainbow(strip) 126 | 127 | #指令中断:Ctrl+C 128 | except KeyboardInterrupt: 129 | if args.clear: 130 | colorWipe(strip, Color(0, 0, 0), 10) 131 | -------------------------------------------------------------------------------- /3.拓展模块/3.摄像头模块/1.拍摄照片/photo.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:摄像头模块 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 说明:使用摄像头模块拍照并保存 7 | 社区:www.01studio.org 8 | ''' 9 | 10 | #导入相关库 11 | from picamera import PiCamera 12 | from time import sleep 13 | 14 | #构建摄像头 15 | camera = PiCamera() 16 | 17 | #打开摄像头 18 | camera.start_preview() 19 | 20 | sleep(3) #等待摄像头稳定 21 | 22 | #拍摄照片5张并保存到桌面 23 | for i in range(5): 24 | camera.capture('/home/pi/Desktop/'+str(i)+'.jpg') 25 | 26 | #关闭摄像头 27 | camera.stop_preview() -------------------------------------------------------------------------------- /3.拓展模块/3.摄像头模块/2.视频录制/video.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:录制视频 3 | 版本: v1.0 4 | 日期: 2020.3 5 | 作者: 01Studio 6 | 说明:通过编程实现摄像头模块录制视频 7 | 社区:www.01studio.org 8 | ''' 9 | 10 | #导入相关库 11 | from picamera import PiCamera 12 | from time import sleep 13 | 14 | #构建摄像头 15 | camera = PiCamera() 16 | 17 | #打开摄像头 18 | camera.start_preview() 19 | 20 | sleep(3) #等待摄像头稳定 21 | 22 | 23 | #录制视频,10秒 24 | camera.start_recording('/home/pi/Desktop/video.h264') 25 | sleep(10) 26 | camera.stop_recording() 27 | 28 | #关闭摄像头 29 | camera.stop_preview() -------------------------------------------------------------------------------- /4.网络应用/1.Socket通信/Socket.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:Socket通信 3 | 版本: v1.0 4 | 日期: 2020.3 5 | 作者: 01Studio 6 | 说明:跟电脑网络助手进行Socket通信 7 | 社区:www.01studio.org 8 | ''' 9 | import socket 10 | import time 11 | 12 | #构建socket对象s 13 | s=socket.socket() 14 | 15 | addr=('192.168.1.111',10000) 16 | s.connect(addr) 17 | 18 | #发送测试 19 | s.send(b'Hello 01Studio!') 20 | 21 | while True: 22 | 23 | text=s.recv(128) #单次最多接收128字节数据 24 | 25 | #接收为空 26 | if text == '': 27 | pass 28 | 29 | #接收到数据,打印并回传 30 | else: 31 | print(text) 32 | s.send(text) 33 | 34 | time.sleep(0.1) #100ms查询间隔 -------------------------------------------------------------------------------- /4.网络应用/2.MQTT通信/1.发布者/publish.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:MQTT通信 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:01Studio 6 | 说明:编程实现MQTT通信:发布者(publish)。 7 | ''' 8 | 9 | import paho.mqtt.client as mqtt 10 | import time 11 | 12 | #服务器和主题信息 13 | host = 'mqtt.p2hp.com' 14 | port = 1883 15 | topic = '/public/01Studio/1' 16 | 17 | #构建mqtt客户端对象 18 | client = mqtt.Client() 19 | 20 | #发起连接 21 | client.connect(host,port) 22 | 23 | while True: 24 | 25 | #发布信息 26 | client.publish(topic,'Hello 01Studio!') 27 | 28 | time.sleep(1) #延时1秒,发送间隔 29 | -------------------------------------------------------------------------------- /4.网络应用/2.MQTT通信/2.订阅者/subscribe.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:MQTT通信 3 | 版本:v1.0 4 | 日期:2020.3 5 | 作者:eclipse(官方demo) 6 | 翻译和注释:01Studio 7 | 说明:编程实现MQTT通信: 订阅者(subscribe)。 8 | ''' 9 | 10 | import paho.mqtt.client as mqtt 11 | import time 12 | 13 | #服务器和主题信息 14 | host = 'mqtt.p2hp.com' 15 | port = 1883 16 | topic = '/public/01Studio/1' 17 | 18 | #客户端从服务器接收到1个CONNACK响应时执行的回调函数. 19 | def on_connect(client, userdata, flags, rc): 20 | print("Connected with result code "+str(rc)) 21 | # 在on_connect()中使使用订阅主题意味着如果我们失去连接并重新连接,订阅将被更新。 22 | client.subscribe(topic) 23 | 24 | # 当从服务器中收到其他设备的发布信息时,执行这个回调函数. 25 | def on_message(client, userdata, msg): 26 | print(msg.topic+" "+str(msg.payload)) 27 | 28 | #构建MQTT客户端 29 | client = mqtt.Client() 30 | 31 | #配置连接和接收信息的回调函数 32 | client.on_connect = on_connect 33 | client.on_message = on_message 34 | 35 | #连接服务器 36 | client.connect(host, port) 37 | 38 | # 处理网络流量、分派回调和处理重新连接的阻塞调用。 39 | client.loop_forever() -------------------------------------------------------------------------------- /5.Opencv/01-人脸检测/face_detection.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 实验名称:Opencv人脸检测 3 | 版本: v1.0 4 | 日期: 2020.9 5 | 作者: 01Studio 6 | 说明:使用openmv库对图片进行人脸检测 7 | 社区:www.01studio.org 8 | Openmv库简易安装教程:https://www.jb51.net/article/171599.htm/ 9 | ''' 10 | 11 | import cv2 12 | image=cv2.imread("faces.jpg") #要识别的图片 13 | faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 14 | gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) 15 | faces = faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(5,5)) 16 | print(faces) 17 | 18 | for(x,y,w,h) in faces: 19 | cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2) 20 | 21 | cv2.imshow("dect",image) #缓冲显示 22 | cv2.imwrite("result.jpg",image) #保存结果 23 | 24 | cv2.waitKey(0) 25 | cv2.destroyAllWindows() 26 | -------------------------------------------------------------------------------- /5.Opencv/01-人脸检测/faces.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/01studio-lab/RaspberryPi_Examples/e0cd206477d57d3e583a49ba6e61e53ffc787929/5.Opencv/01-人脸检测/faces.jpg -------------------------------------------------------------------------------- /5.Opencv/01-人脸检测/result.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/01studio-lab/RaspberryPi_Examples/e0cd206477d57d3e583a49ba6e61e53ffc787929/5.Opencv/01-人脸检测/result.jpg -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 01Studio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RaspberryPi_Examples 2 | RaspberryPi Examples For 01Studio RaspberryPi Development Board 3 | 4 | http://www.01studio.org 5 | 6 | ![01Studio](https://github.com/01studio-lab/RaspberryPi_Examples/blob/master/RaspBerryPi_01Studio.png) 7 | 8 | ![Demos](https://github.com/01studio-lab/RaspberryPi_Examples/blob/master/Raspberry_demos.jpg) 9 | -------------------------------------------------------------------------------- /RaspBerryPi_01Studio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/01studio-lab/RaspberryPi_Examples/e0cd206477d57d3e583a49ba6e61e53ffc787929/RaspBerryPi_01Studio.png -------------------------------------------------------------------------------- /Raspberry_demos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/01studio-lab/RaspberryPi_Examples/e0cd206477d57d3e583a49ba6e61e53ffc787929/Raspberry_demos.jpg --------------------------------------------------------------------------------