如何使用Mu和CircuitPython上的光传感器绘制光照水平

电子说

1.2w人已加入

描述

灯光

我们将使用CircuitPython,Mu和Circuit Playground Express上的光传感器绘制光照水平。下面有一个简单的九行代码。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的传感器数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器和绘图仪

使用Mu编辑器将以下内容保存为Circuit Playground Express板上的 code.py :

下载:Project Zip 或 light.py | 在Github上查看

复制代码

import time

import analogio

import board

light = analogio.AnalogIn(board.LIGHT)

while True:

print((light.value,))

time.sleep(0.1)

import time

import analogio

import board

light = analogio.AnalogIn(board.LIGHT)

while True:

print((light.value,))

time.sleep(0.1)

在我们导入的前几行analogio,board和time,然后设置我们的光传感器。在我们的while循环中,我们正在print()-照明水平。 time.sleep()是为了防止滥发结果-如果它们过快,将难以阅读!

请注意,Mu绘图仪会寻找元组值打印。 Python中的元组在圆括号()中带有逗号分隔符。如果您有两个值,则元组的外观应为(1.0, 3.14)。由于我们只有一个值,因此需要像(1.0,)那样打印出来。请注意括号 中的数字,以及数字后的逗号。因此,print((light.value,))中的多余括号和逗号。

一旦一切设置完成并运行,请尝试将手放在Circuit Playground Express上,观察绘图仪立即做出反应!当您阻止光线到达CPX时,绘图仪绘图线会下降。如果您将手电筒照亮以增加光线,绘图仪就会升起!

这是一种非常简单的方法,可以测试您的传感器并了解CircuitPython中的模拟读数!

请注意,在左侧输入REPL,然后将绘图仪的大小调整为大而在右侧,如上所示。这样,您可以同时看到数字和图形。绘图仪将根据光线水平自动重新缩放。

温度

我们将使用CircuitPython,Mu和Circuit Playground Express中内置的温度传感器绘制温度变化图。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的传感器数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器和绘图仪

使用Mu编辑器将以下内容保存为Circuit Playground Express板上的 code.py :

下载:Project Zip 或 temperature.py | 在Github上查看

复制代码

import time

import adafruit_thermistor

import board

thermistor = adafruit_thermistor.Thermistor(

board.TEMPERATURE, 10000, 10000, 25, 3950)

while True:

print((thermistor.temperature,))

# print(((thermistor.temperature * 9 / 5 + 32),)) # Fahrenheit

time.sleep(0.25)

import time

import adafruit_thermistor

import board

thermistor = adafruit_thermistor.Thermistor(

board.TEMPERATURE, 10000, 10000, 25, 3950)

while True:

print((thermistor.temperature,))

# print(((thermistor.temperature * 9 / 5 + 32),)) # Fahrenheit

time.sleep(0.25)

我们的代码非常简单。我们导入adafruit_thermistor,board和time。然后,我们设置温度传感器。在我们的while循环中,我们将温度print摄氏度。

如果您想查看华氏温度,请在# (#+空格)之前print((thermistor.temperature,))行,并删除# 行之前的print(((thermistor.temperature * 9 / 5 + 32),))。温度默认情况下为摄氏,因此我们添加了一些数学运算( * 9 / 5 + 32)将其转换为华氏温度。

请注意,Mu绘图仪会寻找 tuple 要打印的值。 Python中的元组在圆括号()中带有逗号分隔符。如果您有两个值,则元组看起来像(1.0, 3.14)。由于只有一个值,因此需要像(1.0,)那样打印出来,注意数字的括号 ,数字后的逗号。因此,print((thermistor.temperature,))中的多余括号和逗号。

一旦您已加载并运行了所有程序,您就可以将手指放在温度传感器上,以查看绘图仪立即做出反应!尝试呼吸CPX温度传感器以提高温度并观察绘图仪上升!尝试将其放在凉爽的表面上以观察绘图仪掉下来!

这是一种很好的方式来告知温度和绘图温度以摄氏度(或华氏度)为单位的变化。

光传感器

按钮和开关

我们将使用CircuitPython,Mu和Circuit Playground Express上的两个按钮和一个开关来绘制按钮按和开关位置。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器和绘图仪。

使用Mu编辑器将以下内容保存为Circuit Playground Express板上的 code.py :

下载:项目Zip 或 buttons_switch.py | 在Github上查看

复制代码

import time

import board

import digitalio

button_a = digitalio.DigitalInOut(board.BUTTON_A)

button_a.direction = digitalio.Direction.INPUT

button_a.pull = digitalio.Pull.DOWN

button_b = digitalio.DigitalInOut(board.BUTTON_B)

button_b.direction = digitalio.Direction.INPUT

button_b.pull = digitalio.Pull.DOWN

switch = digitalio.DigitalInOut(board.SLIDE_SWITCH)

switch.direction = digitalio.Direction.INPUT

switch.pull = digitalio.Pull.UP

while True:

if button_a.value:

print((1,))

elif button_b.value:

print((2,))

elif switch.value:

print((-1,))

else:

print((0,))

time.sleep(0.1)

import time

import board

import digitalio

button_a = digitalio.DigitalInOut(board.BUTTON_A)

button_a.direction = digitalio.Direction.INPUT

button_a.pull = digitalio.Pull.DOWN

button_b = digitalio.DigitalInOut(board.BUTTON_B)

button_b.direction = digitalio.Direction.INPUT

button_b.pull = digitalio.Pull.DOWN

switch = digitalio.DigitalInOut(board.SLIDE_SWITCH)

switch.direction = digitalio.Direction.INPUT

switch.pull = digitalio.Pull.UP

while True:

if button_a.value:

print((1,))

elif button_b.value:

print((2,))

elif switch.value:

print((-1,))

else:

print((0,))

time.sleep(0.1)

我们的代码非常简单。首先,我们导入digitalio,board和time。然后,创建button_a,button_b和switch对象。

我们的主循环由if,elif和else语句。 elif语句说“否则,如果”发生某事,请执行某项操作。 else语句表示“以其他方式执行”某件事,无论发生了什么。因此,主循环显示为:如果按下按钮A,print 1,否则,如果按下按钮B,print 2,否则,如果开关向右移动,print -1,否则print0。因此,它将一直print 0,直到您按下按钮或移动开关为止。然后,我们有一个time.sleep(0.1)可以防止向结果发送垃圾邮件-如果它们移动得太快,则很难阅读!

请注意,Mu绘图仪会寻找元组要打印的值。 Python中的元组在括号()中带有逗号分隔符。如果您有两个值,则元组的外观应为(1.0, 3.14)。由于我们只有一个值,因此需要像(1.0,)那样打印出来。请注意括号 中的数字,以及数字后的逗号。因此,print((1,)),print((2,))等中的多余括号和逗号。

设置并运行完所有内容后,请尝试按Circuit Playground Express上的按钮之一,然后观看绘图仪立即做出反应!当您按下按钮A或按钮B时,绘图仪线上升。如果将开关向右移动,则绘图仪线会上升!

这是一种测试按钮并打开Circuit Playground Express并通过简单地打印它们来绘制不同数字的好方法!

光传感器

运动

我们将使用CircuitPython,Mu和Circuit Playground Express中内置的加速度计来绘制运动。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的运动数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器和绘图仪

使用Mu编辑器将以下内容保存为Circuit Playground Express板上的 code.py :

下载:项目Zip 或 acceleration.py | 在Github上查看

复制代码

import time

import board

import adafruit_lis3dh

import busio

i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)

lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, address=0x19)

lis3dh.range = adafruit_lis3dh.RANGE_8_G

while True:

x, y, z = lis3dh.acceleration

print((x, y, z))

time.sleep(0.1)

import time

import board

import adafruit_lis3dh

import busio

i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)

lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, address=0x19)

lis3dh.range = adafruit_lis3dh.RANGE_8_G

while True:

x, y, z = lis3dh.acceleration

print((x, y, z))

time.sleep(0.1)

我们的代码非常简单。我们导入time,board,adafruit_lis3dh和busio。然后我们设置加速度计。在while循环内,我们将x, y, z分配为运动值。然后我们print我们的运动值。 time.sleep(0.1)会稍微降低读数的速度-否则读数太快了!

请注意,Mu绘图仪会寻找要打印的 tuple 值。 Python中的元组在圆括号()中带有逗号分隔符。如果您有两个值,则元组看起来像(1.0, 3.14)。我们有三个值(x, y, z),并请注意,元组本身具有自己的括号。因此,print((x, y, z))中的多余括号。

一旦一切就绪,请尝试移动电路板以查看绘图仪立即做出反应!加速度计位于电路板的中央,并且根据您围绕电路板移动的轴的不同,x,y或z值也会发生变化。尝试仅向一个方向移动以观察单个值的变化!试着摇晃一下,以查看所有值都发生显着变化!

这是查看运动值并在移动木板时绘制运动的好方法!

光传感器

声音

我们将使用CircuitPython,Mu和Circuit Playground Express中内置的声音传感器来绘制声级。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的传感器数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器和绘图仪

使用Mu编辑器将以下内容保存为Circuit Playground Express板上的 code.py :

下载:Project Zip 或 audio.py | 在Github上查看

复制代码

import array

import math

import time

import audiobusio

import board

def mean(values):

return sum(values) / len(values)

def normalized_rms(values):

minbuf = int(mean(values))

sum_of_samples = sum(

float(sample - minbuf) * (sample - minbuf)

for sample in values

return math.sqrt(sum_of_samples / len(values))

mic = audiobusio.PDMIn(

board.MICROPHONE_CLOCK,

board.MICROPHONE_DATA,

sample_rate=16000,

bit_depth=16

samples = array.array(‘H’, [0] * 160)

mic.record(samples, len(samples))

while True:

mic.record(samples, len(samples))

magnitude = normalized_rms(samples)

print(((magnitude),))

time.sleep(0.1)

import array

import math

import time

import audiobusio

import board

def mean(values):

return sum(values) / len(values)

def normalized_rms(values):

minbuf = int(mean(values))

sum_of_samples = sum(

float(sample - minbuf) * (sample - minbuf)

for sample in values

return math.sqrt(sum_of_samples / len(values))

mic = audiobusio.PDMIn(

board.MICROPHONE_CLOCK,

board.MICROPHONE_DATA,

sample_rate=16000,

bit_depth=16

samples = array.array(‘H’, [0] * 160)

mic.record(samples, len(samples))

while True:

mic.record(samples, len(samples))

magnitude = normalized_rms(samples)

print(((magnitude),))

time.sleep(0.1)

让我们看看代码!

首先,我们导入audiobusio,time,board,array和math。然后,我们有两个辅助函数。第一个使用数学返回平均值或平均值。在第二个助手中使用它。第二个使用数学方法返回归一化的均方根平均值。我们使用这些功能可以非常快速地采集多个声音样本,并将它们取平均值,以获得更准确的读数。

接下来,我们设置麦克风对象和样本变量。然后初始化麦克风对象,以便在我们准备好时就可以准备好。

然后,我们使用麦克风对象开始采集声音样本。我们使用归一化的均方根来找到给定样本集的平均值,我们称magnitude。最后,我们print magnitude进入串行控制台。

请注意,Mu绘图仪会寻找要打印的 tuple 值。 Python中的元组在圆括号()中带有逗号分隔符。如果您有两个值,则元组的外观应为(1.0, 3.14)。由于我们只有一个值,因此需要像(1.0,)那样打印出来。请注意括号 中的数字,以及数字后的逗号。因此,print(((magnitude),))中的多余括号和逗号。

一旦一切设置完成并运行,请尝试对着Circuit Playground Express讲话,并观察绘图仪立即做出反应!进一步远离电路板,以使绘图仪线的变化较小。

这是一种非常简单的测试麦克风并查看其如何读取Circuit Playground Express上声音变化的简单方法!

光传感器

电容式触摸

我们将使用CircuitPython,Mu和Circuit Playground Express中内置的电容触摸板来绘制原始电容接触价值。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的电容式触摸数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器。和绘图仪

使用Mu编辑器将以下内容保存为Circuit Playground Express板上的 code.py :

下载:Project Zip 或 touch.py | 在Github上查看

复制代码

import time

import board

import touchio

touch_A1 = touchio.TouchIn(board.A1)

touch_A2 = touchio.TouchIn(board.A2)

touch_A5 = touchio.TouchIn(board.A5)

touch_A6 = touchio.TouchIn(board.A6)

while True:

value_A1 = touch_A1.raw_value

value_A2 = touch_A2.raw_value

value_A5 = touch_A5.raw_value

value_A6 = touch_A6.raw_value

print((value_A1, value_A2, value_A5, value_A6))

time.sleep(0.1)

import time

import board

import touchio

touch_A1 = touchio.TouchIn(board.A1)

touch_A2 = touchio.TouchIn(board.A2)

touch_A5 = touchio.TouchIn(board.A5)

touch_A6 = touchio.TouchIn(board.A6)

while True:

value_A1 = touch_A1.raw_value

value_A2 = touch_A2.raw_value

value_A5 = touch_A5.raw_value

value_A6 = touch_A6.raw_value

print((value_A1, value_A2, value_A5, value_A6))

time.sleep(0.1)

我们的代码非常简单。首先,我们导入time,touchio和board。接下来,我们设置四个触摸板,分别为A1,A2,A5和A6。在我们的while循环中,我们为每个焊盘将value_PadName分配给raw_value。 value_A1 = touch_A1.raw_value,依此类推。然后,我们print将这些值存储在元组中。最后,我们有一个time.sleep(0.1)来减慢值的读取速度-如果速度太快,则很难读取!

请注意,Mu绘图仪会寻找 tuple 要打印的值。 Python中的元组在圆括号()中带有逗号分隔符。如果您有两个值,则元组看起来像(1.0, 3.14)。我们有四个值(value_A1, value_A2, value_A5, value_A6),并且请注意,元组本身具有自己的括号。这样,print((value_A1, value_A2, value_A5, value_A6))中的多余括号就可以了。

一旦一切就绪,请尝试触摸四个垫A1,A2,A5或A6中的任何一个,以查看绘图仪是否立即做出反应!尝试仅触摸一个打击垫以查看绘图仪中的四行。尝试一次触摸多个垫,以查看多条线的运动。触摸垫的力度越大,绘图仪线就会越高!

这是测试电容式触摸垫并绘制触摸不同垫时变化的好方法!

光传感器

电位计

我们将使用CircuitPython,Mu和带有Circuit Playground Express的电位计来绘制电压电平。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的电压数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器和绘图仪

首先,让电位计连接到Circuit Playground Express!

要将电位计连接到Circuit Playground Express:

连接左上的引脚到Circuit Playground Express上的 GND 。

连接中间 引脚电位计上的到Circuit Playground Express上的 A1 。

连接电位计上的右 引脚到Circuit Playground Express上的 3.3V 。

使用以下命令将以下内容另存为 code.py 在Circuit Playground Express板上Mu编辑器:

下载:Project Zip 或 potentiometer.py | 在Github上查看

复制代码

import time

import analogio

import board

potentiometer = analogio.AnalogIn(board.A1)

def get_voltage(pin):

return (pin.value * 3.3) / 65536

while True:

print((get_voltage(potentiometer),))

time.sleep(0.1)

import time

import analogio

import board

potentiometer = analogio.AnalogIn(board.A1)

def get_voltage(pin):

return (pin.value * 3.3) / 65536

while True:

print((get_voltage(potentiometer),))

time.sleep(0.1)

让我们看一下代码!

首先我们导入time,analogio和board。接下来,我们创建potentiometer对象并将其分配给引脚A1。

然后,我们具有get_voltage()辅助函数。默认情况下,模拟读数的范围为0(最小)至65535(最大)。该助手将转换pin.value的0-65535读数并将其转换为0-3.3V的电压读数。

我们的主循环非常简单。在我们的print语句中,我们调用get_voltage()帮助器,并为其提供potentiometer对象。然后我们有一个time.sleep(0.1)来减慢打印结果的速度-否则它们将太快以致于无法读取!

请注意,Mu绘图仪会寻找 tuple 值来打印。 Python中的元组在括号()中带有逗号分隔符。如果您有两个值,则元组的外观应为(1.0, 3.14)。由于我们只有一个值,因此需要像(1.0,)那样打印出来。请注意括号 中的数字,以及数字后的逗号。因此,print((get_voltage(potentiometer),))中的多余括号和逗号。

一旦您已完成所有设置并运行,请尝试旋转连接Circuit Playground Express的电位计旋钮,并观察绘图仪立即做出反应!向左旋转以查看绘图仪下降。

这是查看电位器产生的电压变化并在移动旋钮时绘制变化的一种好方法!

光传感器

颜色

我们将使用CircuitPython,Mu和Circuit Playground Express上的光传感器绘制颜色级别。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的颜色数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器和绘图仪

使用Mu编辑器将以下内容保存为Circuit Playground Express板上的 code.py :

下载:Project Zip 或 color.py | 在Github上查看

复制代码

import analogio

import board

import neopixel

pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=1.0)

light = analogio.AnalogIn(board.LIGHT)

while True:

pixels.fill((0, 0, 0))

pixels[1] = (255, 0, 0)

raw_red = light.value

red = int(raw_red * (255 / 65535))

pixels[1] = (0, 255, 0)

raw_green = light.value

green = int(raw_green * (255 / 65535))

pixels[1] = (0, 0, 255)

raw_blue = light.value

blue = int(raw_blue * (255 / 65535))

pixels.fill((0, 0, 0))

# Printed to match the color lines on the Mu plotter!

# The orange line represents red.

print((green, blue, red))

import analogio

import board

import neopixel

pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=1.0)

light = analogio.AnalogIn(board.LIGHT)

while True:

pixels.fill((0, 0, 0))

pixels[1] = (255, 0, 0)

raw_red = light.value

red = int(raw_red * (255 / 65535))

pixels[1] = (0, 255, 0)

raw_green = light.value

green = int(raw_green * (255 / 65535))

pixels[1] = (0, 0, 255)

raw_blue = light.value

blue = int(raw_blue * (255 / 65535))

pixels.fill((0, 0, 0))

# Printed to match the color lines on the Mu plotter!

# The orange line represents red.

print((green, blue, red))

让我们看一下代码!

首先,我们导入neopixel,analogio,time和board。接下来,我们为NeoPixels创建pixels对象,为光传感器创建light对象。

使用 r 的组合设置LED颜色ed, g reen和 b lue,格式为( R , G , B )元组。元组的每个成员设置为0到255之间的数字,该数字确定存在的每种颜色的数量。红色,绿色和蓝色的不同组合可以创建彩虹中的所有颜色!因此,例如,要将LED设置为红色,则元组将为(255,0,0),其具有最大的红色级别,而没有绿色或蓝色。绿色将是(0,255,0),依此类推。对于它们之间的颜色,您可以设置一个组合,例如青色(0,255,255),并且绿色和蓝色的数量相等。

通过使用与其相邻的NeoPixel(像素1)闪烁红色,绿色和蓝色,然后记录每种颜色的反射光水平,以确定要紧靠它的物体的颜色,该光传感器用作颜色传感器。因此,在主循环中,我们需要闪烁红色,绿色和蓝色,记录反射光的强度,然后使用数学方法确定每种颜色的强度。

在主结构中要做的第一件事循环操作确保使用pixels.fill((0, 0, 0))关闭NeoPixels。接下来,我们从红色开始。通过将pixel[1]分配为(255, 0, 0)秒,将其闪烁为0.5红色。然后,我们获取光传感器的值并将其分配给raw_red。

光传感器返回一个介于0到65535之间的值。由于颜色值为0-255,因此我们需要使用数学来缩放原始光传感器的值降低到可行的颜色值。因此,为了获得红色值,我们使用red = int(raw_red * (255/65535))。这将采用光传感器提供的任何值,并返回0到255之间的等效值。现在我们有了红色级别!

我们对绿色然后对蓝色重复完全相同的步骤。

我们要做的最后一件事是以元组的形式print我们的red,green和blue值,因此我们可以在绘图仪上看到它们!我们将顺序更改为print((green, blue, red)),以便绘图仪上的线条颜色与它们代表的颜色匹配:绿色代表绿色,蓝色代表蓝色,橙色代表红色。

一旦您完成所有设置并运行后,尝试将彩色物品拿到Circuit Playground Express的光传感器上,观察绘图仪立即做出反应!按住绿色项目,观察绿色线比蓝色或红色线高。按住红色项,然后观察橙色线高于绿色或蓝色!

这是一种很好的方式,可以使用光传感器查看色阶,并在按住不等时绘制变化颜色!

光传感器

》心跳脉冲

我们将使用CircuitPython,Mu和Circuit Playground Express上的光传感器绘制脉冲感应图。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的脉冲数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器和绘图仪

使用Mu编辑器将以下内容保存为Circuit Playground Express板上的 code.py :

下载:项目Zip 或 pulse.py | 在Github上查看

复制代码

import time

import analogio

import board

import neopixel

pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=1.0)

light = analogio.AnalogIn(board.LIGHT)

# Turn only pixel #1 green

pixels[1] = (0, 255, 0)

# How many light readings per sample

NUM_OVERSAMPLE = 10

# How many samples we take to calculate ‘average’

NUM_SAMPLES = 20

samples = [0] * NUM_SAMPLES

while True:

for i in range(NUM_SAMPLES):

# Take NUM_OVERSAMPLE number of readings really fast

oversample = 0

for s in range(NUM_OVERSAMPLE):

oversample += float(light.value)

# and save the average from the oversamples

samples[i] = oversample / NUM_OVERSAMPLE # Find the average

mean = sum(samples) / float(len(samples)) # take the average

print((samples[i] - mean,)) # ‘center’ the reading

time.sleep(0.025) # change to go faster/slower

import time

import analogio

import board

import neopixel

pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=1.0)

light = analogio.AnalogIn(board.LIGHT)

# Turn only pixel #1 green

pixels[1] = (0, 255, 0)

# How many light readings per sample

NUM_OVERSAMPLE = 10

# How many samples we take to calculate ‘average’

NUM_SAMPLES = 20

samples = [0] * NUM_SAMPLES

while True:

for i in range(NUM_SAMPLES):

# Take NUM_OVERSAMPLE number of readings really fast

oversample = 0

for s in range(NUM_OVERSAMPLE):

oversample += float(light.value)

# and save the average from the oversamples

samples[i] = oversample / NUM_OVERSAMPLE # Find the average

mean = sum(samples) / float(len(samples)) # take the average

print((samples[i] - mean,)) # ‘center’ the reading

time.sleep(0.025) # change to go faster/slower

详细了解LED脉冲的方式感测有效,请查看本文。

我们必须做两件事。

首先,脉冲感测产生的值通常很吵或抖动:有些值太高,有些太低,因此我们通过取平均值来平滑它们。我们尽可能快地获取10个读数(比我们所需的更快),找到平均值,然后消除噪音。这就是所谓的过采样。

第二,我们希望将读数居中于零附近。原始样本的所有值均为正(大于或等于零)。为了使值在零附近居中,我们找到平均值并将所有值向下移动。 因此,值将始终大于零,而不是始终大于零,而是在零以上和以下变化。这称为信号上的“消除直流偏置”。要了解有关直流偏置的更多信息,请查看本文。

光传感器

由于信号不断变化,因此平均值也将不断变化。因此,我们保留最后20个样本并计算其平均值。当下一个样本出现时,我们删除最早的样本,然后再次重新计算20个最新值的平均值。这称为“移动平均线”。想象一下一个移动窗口,该窗口宽20个样本,沿着我们正在采集的样本数据流移动。有关移动平均线的更多详细信息,请查看本文。

我们通过导入所需的模块来开始代码:neopixel,analogio,time和board。接下来,我们为NeoPixels创建pixels对象,为光传感器创建light对象。

然后,将光传感器旁边的像素变为绿色。请注意,我们将像素编号“ 1”变为绿色,但这实际上是板上的第二个像素。这是因为Python从0开始计数,所以第一个像素是像素编号“ 0”。

接下来,我们分配NUM_OVERSAMPLE = 10来指定每个样本要读取的光读数,并且NUM_SAMPLES = 20指定要计算去掉直流偏置所需的平均值的采样数量。然后我们在samples = [0] * NUMSAMPLES中创建一个移动平均值样本存储位置。

现在,我们开始读取样本。外循环 for i in range(NUM_SAMPLES):告诉代码在20个值的范围内循环,因此i保持连续在0到19之间运行。

如上所述,我们还将尽可能快地获取10个样本,并对它们进行平均以消除噪声。内部循环 for s in range(NUM_OVERSAMPLE):从光传感器读取10个值。我们使用oversample += float(light.value)汇总所有这些过采样的值,直到我们累加了NUM_SAMPLES个值。然后 除以10,以求出超采样值的平均值,并将该值存储在samples[i] = oversample / NUM_OVERSAMPLE中。

计算过采样平均值后,我们用mean = sum(samples) / float(len(samples))计算移动平均值。窗口环绕samples数组。例如,如果i为3,则最新样本在samples[3]中,而先前的样本在samples[2],samples[1],samples[0]中,然后回绕到samples[19],samples[18]等,一直返回到最早的值samples[4]。该图像提供了直观的说明。

光传感器

我们从采样值中减去平均值,并使用samples[i] - mean,将读数居中在零附近,或者消除直流偏置。

记住,我们用samples = [0] * NUMSAMPLES初始化了移动平均样本数组。您会注意到绘图仪在一开始就没有正确响应。这是因为我们在前20个样本仍在移动窗口中时所获取的移动平均值包括在主循环之前开始的零。因此,直到我们超过了前20个样本,我们的平均值才会倾斜。

然后,我们将print作为元组print((samples[i] - mean,)) 。

请注意,Mu绘图仪会寻找要打印的元组值。 Python中的元组在圆括号()中带有逗号分隔符。如果您有两个值,则元组看起来像(1.0, 3.14)。由于只有一个值,因此需要像(1.0,)那样打印出来,注意数字的括号 ,数字后的逗号。因此,print((samples[i] - mean,))中的多余括号和逗号。

最后,我们包括time.sleep(0.025),以使读数略有延迟。

设置并运行完毕后,尝试将手指按在绿色LED和Circuit Playground Express上的光传感器上,然后观察绘图仪的反应!如果您用力按压,有时它不会响应。但是,如果轻按一下,您会在绘图上看到与您的脉冲相匹配的波形!

这是使用光传感器感应您的脉冲并观察按下时的变化的好方法

光传感器

土壤湿度

我们将使用CircuitPython,Mu和Circuit Playground Express上的电容式触摸板绘制土壤湿度传感图。我们将在Circuit Playground Express上运行此代码,并使用Mu绘制CircuitPython打印出的土壤水分数据。

访问“欢迎使用CircuitPython”页面,了解如何安装Mu编辑器&绘图仪

该项目所需的硬件是Circuit Playground Express,鳄鱼夹和钉子。您还需要至少两个土壤样品,一个湿的,一个干的,以校准代码。

组装就像将鳄鱼夹的一端连接到Circuit Playground Express的A1垫上一样简单,

将以下内容另存为 code.py 在Circuit Playground Express板上,使用Mu编辑器:

下载:Project Zip 或 soil_moisture。 py | 在Github上查看

复制代码

import time

from adafruit_circuitplayground.express import cpx

import touchio

import simpleio

import board

cpx.pixels.brightness = 0.2

touch = touchio.TouchIn(board.A1)

DRY_VALUE = 1500 # calibrate this by hand!

WET_VALUE = 2100 # calibrate this by hand!

while True:

value_A1 = touch.raw_value

print((value_A1,))

# fill the pixels from red to green based on soil moisture

percent_wet = int(simpleio.map_range(value_A1, DRY_VALUE, WET_VALUE, 0, 100))

cpx.pixels.fill((100-percent_wet, percent_wet, 0))

time.sleep(0.5)

import time

from adafruit_circuitplayground.express import cpx

import touchio

import simpleio

import board

cpx.pixels.brightness = 0.2

touch = touchio.TouchIn(board.A1)

DRY_VALUE = 1500 # calibrate this by hand!

WET_VALUE = 2100 # calibrate this by hand!

while True:

value_A1 = touch.raw_value

print((value_A1,))

# fill the pixels from red to green based on soil moisture

percent_wet = int(simpleio.map_range(value_A1, DRY_VALUE, WET_VALUE, 0, 100))

cpx.pixels.fill((100-percent_wet, percent_wet, 0))

time.sleep(0.5)

首先,我们导入所需的库。第一个库是time。接下来,您将看到我们通过说from adafruit_circuitplayground.express import cpx导入第二个库的特定部分。这样,我们可以通过键入cpx而不是较长的库名称来调用该库。然后导入touchio,simpleio和board。

我们设置像素亮度。像素亮度由0到1之间的数字设置,表示0-100%,即0.3将为30%。因此,我们使用cpx.pixels.brightness = 0.2将亮度设置为20%。然后,我们创建touch对象,以便可以将其用作湿度传感器。在该项目中,我们将使用引脚A1,因此我们提供board.A1。

要检测土壤是干还是湿,我们将使用来自传感器的原始电容触摸值。 Circuit Playground Express上的电容式触摸板。我们创建两个变量DRY_VALUE和WET_VALUE,并将它们分配给与干,湿土壤相关的原始电容式触摸值。

我们在主循环中找到这些值。我们分配value_A1 = touch.raw_value,然后分配print value_A1的结果。这使我们可以在串行输出中查看原始电容式触摸值的结果。湿土壤比干土壤具有更高的原始电容触摸值,我们可以使用它来跟踪土壤是湿的还是干的。该代码带有这两个变量的默认值,但是,您的实际结果可能有所不同。因此,您应该首先校准这些值。

请注意,Mu绘图仪会寻找要打印的 tuple 值。 Python中的元组在圆括号()中带有逗号分隔符。如果您有两个值,则元组看起来像(1.0, 3.14)。由于只有一个值,因此需要像(1.0,)那样打印出来,注意数字的括号 ,数字后的逗号。因此,print((value_A1,))中的多余括号和逗号。

DRY_VALUE和WET_VALUE都需要手动校准。要校准它们,请将钉子放入土壤样品中,然后在Mu中打开串行控制台(REPL)。然后,您可以看到返回的值是什么,并且可以更改变量以反映它。

光传感器

首先将指甲放入干燥的土壤样品中。

如您所见,干燥值我们要返回的内容与默认数字有所不同。因此,让我们更改DRY_VALUE来反映我们的结果。

现在,我们将执行相同的操作以获取湿值。

光传感器

将指甲放入潮湿的土壤样品中。

现在查看串行输出中的值。我们的湿值有些不同,所以我们也更改WET_VALUE

我们确定了干湿两用值。现在,我们将使用这些值在土壤100%潮湿时使LED变为绿色,而在土壤干燥或0%潮湿时使LED变为红色。这就是您要知道植物需要浇水的方式!

LED颜色是使用 r ed, g reen和 b lue,以( R , G , B )元组的形式。元组的每个成员设置为0到255之间的数字,该数字确定存在的每种颜色的数量。红色,绿色和蓝色的不同组合可以创建彩虹中的所有颜色!因此,例如,要将LED设置为红色,则元组将为(255,0,0),其具有最大的红色级别,而没有绿色或蓝色。绿色为(0,255,0),等等。

因此,我们将需要映射原始电容式触摸值以适合RGB元组所需的值。为此,我们将使用simpleio.map_range。通过提供我们将要使用的值(value_A1),我们期望的value_A1的最小值(即DRY_VALUE),我们期望的value_A1的最大值来起作用(WET_VALUE),然后是我们要匹配的最小和最大数字,分别是0和100。通过分配percent_wet = int(simpleio.map_range(value_A1, DRY_VALUE, WET_VALUE, 0, 100)),我们将获取原始电容式触摸值并将其映射到0到100之间的整数(int)以获得百分比。

我们使用此百分比将LED设置为干时为红色,湿时为绿色,并且随着土壤逐渐变干,它们之间的颜色为淡黄色。我们使用cpx.pixels.fill((100-percent_wet, percent_wet, 0))点亮所有像素,该像素使用从上一行获得的percent_wet。

当土壤100%湿润时,元组的第一个成员是0(如果100-percent_wet = 100为0,则为percent_wet),第二个成员为100(因为percent_wet = 100)。因此,当土壤潮湿时,元组为(0,100,0),这意味着LED将为绿色。这就是您知道不需要浇水的方式!

当土壤湿度为0%时,元组的第一个成员为100(如果100-percent_wet = 0为100),第二个成员为percent_wet(因为0 = 0)。因此,当土壤潮湿时,元组为percent_wet,这意味着LED将为红色。这就是您知道该给土壤浇水的时候了!

但是,当土壤有点湿又有点干怎么办?当土壤湿度为50%时,元组的第一个成员为(100, 0, 0)(如果50 = 50为50,则为100-percent_wet),第二个成员为percent_wet(因为50 = 50)。因此,当土壤半干时,元组为(50,50,0),这意味着LED将为黄色。当您的土壤从潮湿到缓慢变干时,黄色的范围从绿黄色到红黄色。这就是您将很快要浇水的方式!

最后,我们添加了percent_wet来减慢读取数据的速度。土壤会慢慢变干,因此无需超快速地读取数据。

一旦完成所有设置并运行,尝试将钉子放在潮湿的土壤中,观察绘图仪立即做出反应!将指甲放在干燥的土壤中,以观察绘图仪掉落的情况。将其放到只有一点点湿的土壤中才能观察到它有点上升将它放回湿的土壤中并看着它上升得更高!

这是一种使用电容式电容查看土壤湿度的好方法触摸板,并绘制土壤慢慢变干的变化!

光传感器

责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分