在构建项目时,传感器是至关重要的东西之一。智能手机内置了大多数基本传感器,如接近度、加速度计、光、磁力计、陀螺仪等,我们实际上可以在我们的 Arduino 项目中使用这些传感器。
所以在这个项目中,我将向您展示这些传感器是如何使用的,并且可以通过有线连接与 Arduino 通信。
零件清单:
- Arduino
- USB 电缆(B 型)
- OTG线
- OLED 显示模块
第 1 步:设置串行通信
Arduino 和 android 之间的串行通信与计算机和 Arduino 之间的串行通信相同。发送方逐位发送数据,接收方逐位接收。
串行通讯
- 登录 MIT 应用程序发明者并开始一个新项目
- 要建立串行连接,我们需要从连接选项卡中包含串行,拖放该项目
- 确保 buad 速率与用于在 Arduino 中初始化串行的 buad 速率相同
- 导入两个按钮并连接和断开与 Arduino 的连接以及一个用于直观表示设备已连接的复选框。(您可以重命名组件并更改文本)
- 添加另外两个按钮来打开和关闭 LED
- 让我们在块面板中进行块编码,我们发现与各种组件相关的各种事件
- 放置每个按钮的点击事件
- 当按下连接按钮时,它将初始化串行连接并打开一个串行连接,如果它成功打开,它将选中复选框
- 当按下断开按钮时,它关闭串行通信并取消选中复选框
- 现在,只要按下 on 按钮,它就会发送一个代表 1 的数据字节,只有在串行通信打开时才会打开
- 按下关闭时也会发生同样的情况,但将发送 0 而不是 1,指示 LED 应关闭
- 这就是设计的全部
- 现在保存项目
- 通过二维码或从构建选项卡下载我们的应用程序的 apk 文件
- 在您的手机上下载该应用程序并使用 apk 安装该应用程序
- 手机可能会说该应用程序的来源可能会损害您的手机,但无论如何安装它都是安全的
Arduino代码
- 首先,我们声明一个变量来存储 LED 状态,然后在设置中初始化串行通信并将引脚 13 定义为输出,因为我们将使用内置 LED
- 然后在循环中,我们检查手机是否发送了任何数据,如果是,则等待大约 400 毫秒以使事情稳定下来
- 然后解析传入的数据——它做什么检查是否有任何 int 类型数据可用,并等待大约 1000 毫秒来检查是有更多数据到来——这是在内部完成的
- 并存储在变量中
- 并根据变量的内容设置led的状态
int ledState = 0;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop()
{
if (Serial.available() > 0)
{
delay(400);
ledState = Serial.parseInt();
digitalWrite(13, ledState);
}
}
|
硬件连接
- 首先使用 OTG 电缆将 Arduino 连接到手机
- 然后打开我们的应用程序
- 然后按连接,会弹出一条消息,说是否允许我们访问 USB 设备
- 再次按连接以实际连接到 Arduino - 应选中该复选框
- 按下按钮和UNO的内置LED应亮起,按下后应熄灭
第 2 步:接近传感器
该传感器位于前置摄像头附近,用于检测传感器附近是否有物体。这种传感器的应用是当一个人将手机靠近耳朵说话时,它会检测并关闭屏幕,这样屏幕在被任何身体部位触摸时不会接受任何不必要的输入通常,该传感器的输出高低取决于物体是否在附近,所以我们可以使用接近传感器使 LED 闪烁应用
- 包括按钮和复选框以建立串行通信
- 还包括接近传感器形式的传感器选项卡
- 取消选中接近传感器的启用复选框,这样当应用程序第一次运行时传感器不会产生输出
- 接近传感器有一个事件,根据物体是否在附近输出高或低
- 每当接近传感器的值发生变化时,我们都会发送 0 或 1 来指示变化
- 此外,还包含一个滑动开关来启用传感器,否则它会在我们不想要的时候不断发送数据
- 滑动开关有一个事件,如果开关打开或未打开,则返回 true
Arduino代码
- 这里使用的代码与我们收到 1 和 0 并打开和关闭 LED 时闪烁相同
第 3 步:光传感器

该传感器检测落在屏幕上的光量。这用于改变屏幕的亮度,环境光落在屏幕上越多,屏幕的亮度应该越大,屏幕上的光越少,亮度越低,这有助于用户在任何条件下都没有任何问题。
传感器的输出以勒克斯为单位,这是光的亮度单位。
我们使用的事件是在每次传感器上的光强度发生变化时触发的事件,因此每次落在传感器上的光强度发生变化时都会触发事件,我们会将测量的光强度发送到 Arduino 以将其显示在 oled 上展示。
要考虑的其他参数是传感器更新其值的频率,对于某些可能长达 1000 毫秒,而对于某些可能小至 1 毫秒。我们通过一个特定的函数来检查这一点。
此外,一些 android 设备可以灵活地降低或增加此采样率,这也可以做到。
应用
- 包括连接、断开连接按钮和用于串行通信的复选框
- 包括一个滑动开关,以便传感器仅在我们需要时发送数据
- 还包括一个标签,以便我们了解传感器检测到的值和 Arduino 选择的值是否相同
- 我们已经完成了设计
- 接下来包括我们之前包括的串行连接的相同块,对应于连接和断开按钮
- 接下来包括一个事件 .LightChanged 块,它在传感器生成的值发生变化时发生
- 在这个块中,我们首先检查串口是否打开,如果是,则发送此时测量的勒克斯值
- 包括与滑动开关 Slide.Changed 对应的事件,当滑动处于 on 位置时返回 true
- 并下载应用程序
Arduino代码
- 首先我们需要初始化各种参数来设置oled显示器
- 现在,如果您没有 oled 显示器,您可以随时使用不同的显示器
- 在 setup 函数中,我们设置了一些 oled 参数,如文本大小、颜色和光标位置
- 在循环部分,我们检查是否有任何数据传入
- 如果是,我们将首先将数据解析为浮点数
- 解析后,我们将传递给 oled 来显示
void loop() {
if (Serial.available() > 0) {
delay(400);
data = Serial.parseFloat();
display.clearDisplay();
display.setCursor(0, 0);
display.print("Intensity = ");
display.print(data);
display.print(" Lx");
display.display();
}
}
|
硬件
使用跳线和面包板将 oled 显示器连接到 Arduino
oled 显示器的引脚 => Arduino 引脚(这些连接用于 Arduino uno)
VCC => 5V
GND => GND
SCL => A5
SDA => A4
|
- 现在使用 otg 电缆将手机连接到 android
- 启动应用程序并通过按下连接按钮初始化连接,然后切换滑动开关
- 尝试在前置摄像头周围挥手,这是传感器所在的位置
- 更改值应出现在 oled 显示屏上以及应用程序中的滑动开关下方
第 4 步:加速度传感器

该传感器用于确定手机的方向。广泛用于游戏和其他互动应用。
它测量沿 x、y 和 z 3 轴的加速度。考虑的单位是 SI 单位,即 ms^-2。值的范围是 -9.8 到 +9.8。
xAccel:手机静止在平面上时为0,手机向右倾斜(即左侧抬起)时为正,手机向左倾斜时为负(即其右侧尺寸为提高)。
yAccel:手机静止在平面上时为0,底部抬起时为正,顶部抬起时为负。
zAccel:等于-9.8(设备静止时与地面平行且显示器朝上时的地球重力,以米/秒为单位,垂直于地面时为0,面朝下时为+9.8。该值也可以是受重力或反重力加速的影响。
我们感兴趣的事件是acceleration.Changed,当传感器测量到与之前测量不同的值时触发。
要将值传递给 Arduino,我们不会使用它,但会使用计时器事件,该事件是在每个指定时间过后触发的元素。
加速度计的采样率非常高,因此如果我们在测量到的值与以前不同时发送数据,将会发生的情况是应用程序将尝试发送新数据,而不管 Arduino 是否接收到以前的数据,因此我们是要发送的定时器数据。
因此,我们将包含一个计时器,它以毫秒为单位在每个指定时间滴答滴答,当它滴答滴答时,我们将通过串行发送数据。
应用
- 包括连接、断开按钮和复选框以初始化串行通信。
- 还包括一个滑块开关,用于启用和禁用加速度计以及计时器。
- 然后使用布局选项卡中可用的水平排列放置 6 个标签,其中 2 个彼此相邻。
- 还包括一个滑块,我们将使用它来设置计时器滴答周期。
- 分别保持滑块 1 和 1000 的最小值和最大值,这样我们就不需要映射它们,因为计时器的时间将从 1 到 1000 毫秒。
- 在块编码中添加用于连接和断开连接的事件。
- 对于滑动开关,它与光传感器相同,当滑动开关处于打开位置并启用加速度计和计时器时,函数返回真。
- 加速度计会自动更新自身,因此需要特殊事件。
- 滑块更改事件将计时器间隔设置为拇指的位置。
- 当计时器滴答时,它会通过串行向 Arduino 发送沿 x、y、z 的加速度,并根据串行是否打开来更新标签。
Arduino代码
- 我们解析 3 次以读取 3 个轴值并使用某种格式打印它们。
- 由于我们已经解析了这些值,因此它们现在被视为浮点数,因此我们现在可以直接在其他应用程序中使用它们。
void loop(){
if (Serial.available() > 0)
{
delay(400);
data1 = Serial.parseFloat();
data2 = Serial.parseFloat();
data3 = Serial.parseFloat();
display.clearDisplay();
display.setCursor(0, 0);
display.print("x-axis : ");
display.print(data1);
display.println(" m/s^2");
display.print("y-axis : ");
display.print(data2);
display.println(" m/s^2");
display.print("z-axis : ");
display.print(data3);
display.println(" m/s^2");
display.display();
}
}
|
第 5 步:陀螺仪
该传感器沿 x、y 和 z 三个轴测量旋转速度。测量单位是度每秒。
应用
- 包括连接、断开连接按钮和复选框来操作串行通信。
- 还包括一个滑动开关来启用和禁用陀螺仪以及计时器。
- 包括 6 个标签,每个标签水平排列 2 个。
- 包括一个滑块来更改计时器的滴答时间。
- 在块编码中添加用于连接和断开连接的事件。
- 对于滑动开关,当开关处于打开位置时返回 true 的函数,然后启用陀螺仪。
- 当计时器滴答时,它会将值从陀螺仪发送到 Arduino 并更新标签。
- 滑块会根据其拇指位置更改滴答时间。
Arduino代码
void loop(){
if (Serial.available() > 0)
{
delay(400);
data1 = Serial.parseFloat();
data2 = Serial.parseFloat();
data3 = Serial.parseFloat();
display.clearDisplay();
display.setCursor(0, 0);
display.print("x-axis : ");
display.print(data1);
display.println(" deg/s");
display.print("y-axis : ");
display.print(data2);
display.println(" deg/s");
display.print("z-axis : ");
display.print(data3);
display.println(" deg/s");
display.display();
}
}
|
第 6 步:磁力计
该传感器以特斯拉为单位测量沿三个轴的磁场值。
主要用于数字罗盘以显示方向。安装在手机中的传感器足够灵敏,可以测量地磁强度,但我们也可以使用家用磁铁(冰箱磁铁)。
应用
- 包括用于串行通信的连接和断开连接按钮和复选框。
- 包括滑动开关以启用和禁用磁力计和计时器。
- 用于更改计时器滴答时间的滑块。
- 在块编码中添加连接和断开连接事件。
- 添加 switch.Changed 事件,如果开关打开,则启用传感器或禁用传感器。
- 包括将测量值从传感器发送到 Arduino 并更新标签的计时器事件。
Arduino代码
void loop(){
if (Serial.available() > 0)
{
delay(400);
data1 = Serial.parseFloat();
data2 = Serial.parseFloat();
data3 = Serial.parseFloat();
display.clearDisplay();
display.setCursor(0, 0);
display.print("x-axis : ");
display.print(data1);
display.println(" T");
display.print("y-axis : ");
display.print(data2);
display.println(" T");
display.print("z-axis : ");
display.print(data3);
display.println(" T");
display.display();
}
}
|
希望您能够喜欢这个项目!
讨论